mirror of
https://github.com/immich-app/immich
synced 2026-08-22 13:13:05 +00:00
Merge remote-tracking branch 'origin/main' into fix/29853-thumbnail-decode-size-wt
# Conflicts: # mobile/android/app/src/main/kotlin/app/alextran/immich/images/RemoteImages.g.kt # mobile/ios/Runner/Images/RemoteImages.g.swift # mobile/lib/infrastructure/loaders/remote_image_request.dart # mobile/lib/platform/remote_image_api.g.dart # mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart # mobile/lib/providers/asset_viewer/asset_viewer.provider.dart
This commit is contained in:
commit
f3ff91cf29
1524 changed files with 26661 additions and 368943 deletions
|
|
@ -83,7 +83,7 @@
|
|||
}
|
||||
},
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/docker-in-docker:2": {
|
||||
"ghcr.io/devcontainers/features/docker-in-docker:4": {
|
||||
// https://github.com/devcontainers/features/issues/1466
|
||||
"moby": false
|
||||
}
|
||||
|
|
|
|||
14
.gitattributes
vendored
14
.gitattributes
vendored
|
|
@ -1,29 +1,15 @@
|
|||
mobile/openapi/**/*.md -diff -merge
|
||||
mobile/openapi/**/*.md linguist-generated=true
|
||||
mobile/openapi/**/*.dart -diff -merge
|
||||
mobile/openapi/**/*.dart linguist-generated=true
|
||||
|
||||
mobile/lib/**/*.g.dart -diff -merge
|
||||
mobile/lib/**/*.g.dart linguist-generated=true
|
||||
|
||||
mobile/android/**/*.g.kt -diff -merge
|
||||
mobile/android/**/*.g.kt linguist-generated=true
|
||||
|
||||
mobile/ios/**/*.g.swift -diff -merge
|
||||
mobile/ios/**/*.g.swift linguist-generated=true
|
||||
|
||||
mobile/lib/**/*.drift.dart -diff -merge
|
||||
mobile/lib/**/*.drift.dart linguist-generated=true
|
||||
|
||||
mobile/drift_schemas/main/drift_schema_*.json -diff -merge
|
||||
mobile/drift_schemas/main/drift_schema_*.json linguist-generated=true
|
||||
|
||||
mobile/lib/infrastructure/repositories/db.repository.steps.dart -diff -merge
|
||||
mobile/lib/infrastructure/repositories/db.repository.steps.dart linguist-generated=true
|
||||
|
||||
mobile/test/drift/main/generated/** -diff -merge
|
||||
mobile/test/drift/main/generated/** linguist-generated=true
|
||||
|
||||
packages/sdk/fetch-client.ts -diff -merge
|
||||
packages/sdk/fetch-client.ts linguist-generated=true
|
||||
|
||||
|
|
|
|||
2
.github/workflows/auto-close.yml
vendored
2
.github/workflows/auto-close.yml
vendored
|
|
@ -15,7 +15,7 @@ jobs:
|
|||
outputs:
|
||||
uses_template: ${{ steps.check.outputs.uses_template }}
|
||||
steps:
|
||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
sparse-checkout: .github/pull_request_template.md
|
||||
sparse-checkout-cone-mode: false
|
||||
|
|
|
|||
43
.github/workflows/build-mobile.yml
vendored
43
.github/workflows/build-mobile.yml
vendored
|
|
@ -87,14 +87,14 @@ jobs:
|
|||
permission-contents: read
|
||||
permission-pull-requests: write
|
||||
|
||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
ref: ${{ inputs.ref }}
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
working_directory: ./mobile
|
||||
|
|
@ -106,14 +106,14 @@ jobs:
|
|||
working-directory: ./mobile
|
||||
run: printf "%s" $KEY_JKS | base64 -d > android/key.jks
|
||||
|
||||
- uses: actions/setup-java@0f481fcb613427c0f801b606911222b5b6f3083a # v5.5.0
|
||||
- uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: '17'
|
||||
|
||||
- name: Restore Gradle Cache
|
||||
id: cache-gradle-restore
|
||||
uses: actions/cache/restore@caa296126883cff596d87d8935842f9db880ef25 # v5.1.0
|
||||
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
|
|
@ -127,16 +127,11 @@ jobs:
|
|||
with:
|
||||
packages: ''
|
||||
|
||||
- name: Get Packages
|
||||
working-directory: ./mobile
|
||||
run: flutter pub get
|
||||
- name: Install dependencies
|
||||
run: mise //mobile:install:ci
|
||||
|
||||
- name: Generate translation file
|
||||
run: mise //mobile:codegen:translation
|
||||
|
||||
- name: Generate platform APIs
|
||||
run: mise //mobile:codegen:pigeon
|
||||
working-directory: ./mobile
|
||||
- name: Perform codegen
|
||||
run: mise //mobile:codegen
|
||||
|
||||
- name: Build Android App Bundle
|
||||
working-directory: ./mobile
|
||||
|
|
@ -184,7 +179,7 @@ jobs:
|
|||
|
||||
- name: Save Gradle Cache
|
||||
id: cache-gradle-save
|
||||
uses: actions/cache/save@caa296126883cff596d87d8935842f9db880ef25 # v5.1.0
|
||||
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
if: github.ref == 'refs/heads/main'
|
||||
with:
|
||||
path: |
|
||||
|
|
@ -201,7 +196,7 @@ jobs:
|
|||
contents: read
|
||||
# Run on main branch or workflow_dispatch, or on PRs/other branches (build only, no upload)
|
||||
if: ${{ !github.event.pull_request.head.repo.fork && fromJSON(needs.pre-job.outputs.should_run).mobile == true }}
|
||||
runs-on: macos-15
|
||||
runs-on: macos-26
|
||||
|
||||
steps:
|
||||
- id: token
|
||||
|
|
@ -215,33 +210,29 @@ jobs:
|
|||
run: sudo xcode-select -s /Applications/Xcode_26.2.app/Contents/Developer
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
ref: ${{ inputs.ref || github.sha }}
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
working_directory: ./mobile
|
||||
|
||||
- name: Install Flutter dependencies
|
||||
working-directory: ./mobile
|
||||
run: flutter pub get
|
||||
- name: Install dependencies
|
||||
run: mise //mobile:install:ci
|
||||
|
||||
- name: Generate translation files
|
||||
run: mise //mobile:codegen:translation
|
||||
|
||||
- name: Generate platform APIs
|
||||
run: mise //mobile:codegen:pigeon
|
||||
- name: Perform codegen
|
||||
run: mise //mobile:codegen
|
||||
|
||||
- name: Resolve iOS Swift Packages
|
||||
working-directory: ./mobile
|
||||
run: flutter build ios --config-only --no-codesign
|
||||
|
||||
- name: Setup Ruby
|
||||
uses: ruby/setup-ruby@d45b1a4e94b71acab930e56e79c6aa188764e7f9 # v1.316.0
|
||||
uses: ruby/setup-ruby@95ef2b042f9d7a56d8268cba8559e2842e2ad01b # v1.321.0
|
||||
with:
|
||||
ruby-version: '3.3'
|
||||
bundler-cache: true
|
||||
|
|
|
|||
2
.github/workflows/cache-cleanup.yml
vendored
2
.github/workflows/cache-cleanup.yml
vendored
|
|
@ -27,7 +27,7 @@ jobs:
|
|||
permission-actions: write
|
||||
|
||||
- name: Check out code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
|
|
|||
13
.github/workflows/check-openapi.yml
vendored
13
.github/workflows/check-openapi.yml
vendored
|
|
@ -20,12 +20,12 @@ jobs:
|
|||
contents: read
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check for breaking API changes
|
||||
uses: oasdiff/oasdiff-action/breaking@291b6594ce617f22f49af5898ee038ed0b46e8fe # v0.1.5
|
||||
uses: oasdiff/oasdiff-action/breaking@0ab8ad204b00d25acc5ae87106281433e288d0c1 # v0.1.10
|
||||
with:
|
||||
base: https://raw.githubusercontent.com/${{ github.repository }}/main/open-api/immich-openapi-specs.json
|
||||
revision: open-api/immich-openapi-specs.json
|
||||
|
|
@ -38,19 +38,18 @@ jobs:
|
|||
contents: read
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ github.token }}
|
||||
working_directory: ./mobile
|
||||
|
||||
- name: Get packages
|
||||
working-directory: ./mobile
|
||||
run: flutter pub get
|
||||
- name: Install dependencies
|
||||
run: mise //mobile:install:ci
|
||||
|
||||
- name: Fetch base spec from main
|
||||
run: |
|
||||
|
|
|
|||
8
.github/workflows/cli.yml
vendored
8
.github/workflows/cli.yml
vendored
|
|
@ -38,13 +38,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -71,7 +71,7 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
|
@ -83,7 +83,7 @@ jobs:
|
|||
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
if: ${{ !github.event.pull_request.head.repo.fork }}
|
||||
with:
|
||||
registry: ghcr.io
|
||||
|
|
|
|||
2
.github/workflows/close-duplicates.yml
vendored
2
.github/workflows/close-duplicates.yml
vendored
|
|
@ -39,7 +39,7 @@ jobs:
|
|||
needs: [get_body, should_run]
|
||||
if: ${{ needs.should_run.outputs.should_run == 'true' }}
|
||||
container:
|
||||
image: ghcr.io/immich-app/mdq:main@sha256:e3fe456f346b02c2f479462100763aee3ba8245768dfeac3c4262acb068e5c62
|
||||
image: ghcr.io/immich-app/mdq:main@sha256:d603f5618c1fc9f2b4d506ffed54ba6bcfec83d56b893b5fa8b3f899a402fa0a
|
||||
outputs:
|
||||
checked: ${{ steps.get_checkbox.outputs.checked }}
|
||||
steps:
|
||||
|
|
|
|||
8
.github/workflows/codeql-analysis.yml
vendored
8
.github/workflows/codeql-analysis.yml
vendored
|
|
@ -51,14 +51,14 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
|
||||
uses: github/codeql-action/init@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
|
|
@ -71,7 +71,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@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
|
||||
uses: github/codeql-action/autobuild@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4
|
||||
|
||||
# ℹ️ 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
|
||||
|
|
@ -84,6 +84,6 @@ jobs:
|
|||
# ./location_of_script_within_repo/buildscript.sh
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
|
||||
uses: github/codeql-action/analyze@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4
|
||||
with:
|
||||
category: '/language:${{matrix.language}}'
|
||||
|
|
|
|||
4
.github/workflows/docker.yml
vendored
4
.github/workflows/docker.yml
vendored
|
|
@ -61,7 +61,7 @@ jobs:
|
|||
suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn']
|
||||
steps:
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
|
|
@ -91,7 +91,7 @@ jobs:
|
|||
suffix: ['']
|
||||
steps:
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
|
|
|
|||
4
.github/workflows/docs-build.yml
vendored
4
.github/workflows/docs-build.yml
vendored
|
|
@ -62,13 +62,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
|
|||
4
.github/workflows/docs-deploy.yml
vendored
4
.github/workflows/docs-deploy.yml
vendored
|
|
@ -137,13 +137,13 @@ jobs:
|
|||
permission-pull-requests: write
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
|
|||
4
.github/workflows/docs-destroy.yml
vendored
4
.github/workflows/docs-destroy.yml
vendored
|
|
@ -25,13 +25,13 @@ jobs:
|
|||
permission-pull-requests: write
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
|
|||
2
.github/workflows/fdroid.yml
vendored
2
.github/workflows/fdroid.yml
vendored
|
|
@ -14,7 +14,7 @@ jobs:
|
|||
contents: read
|
||||
steps:
|
||||
- name: Checkout pubspec for versionCode
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
ref: ${{ github.event.release.tag_name }}
|
||||
persist-credentials: false
|
||||
|
|
|
|||
4
.github/workflows/fix-format.yml
vendored
4
.github/workflows/fix-format.yml
vendored
|
|
@ -23,14 +23,14 @@ jobs:
|
|||
permission-pull-requests: write
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
persist-credentials: true
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
|
|||
2
.github/workflows/pr-labeler.yml
vendored
2
.github/workflows/pr-labeler.yml
vendored
|
|
@ -19,6 +19,6 @@ jobs:
|
|||
permission-contents: read
|
||||
permission-pull-requests: write
|
||||
|
||||
- uses: actions/labeler@b8dd2d9be0f68b860e7dae5dae7d772984eacd6d # v6.2.0
|
||||
- uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13 # v7.0.0
|
||||
with:
|
||||
repo-token: ${{ steps.token.outputs.token }}
|
||||
|
|
|
|||
10
.github/workflows/prepare-release.yml
vendored
10
.github/workflows/prepare-release.yml
vendored
|
|
@ -61,20 +61,20 @@ jobs:
|
|||
permission-contents: write
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
persist-credentials: true
|
||||
ref: main
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
# TODO move to mise
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
||||
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
||||
|
||||
- name: Bump version
|
||||
env:
|
||||
|
|
@ -140,7 +140,7 @@ jobs:
|
|||
permission-actions: read
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
persist-credentials: false
|
||||
|
|
@ -152,7 +152,7 @@ jobs:
|
|||
github-token: ${{ steps.generate-token.outputs.token }}
|
||||
|
||||
- name: Create draft release
|
||||
uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
|
||||
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
|
||||
with:
|
||||
draft: true
|
||||
prerelease: ${{ needs.bump_version.outputs.rc }}
|
||||
|
|
|
|||
4
.github/workflows/sdk.yml
vendored
4
.github/workflows/sdk.yml
vendored
|
|
@ -23,13 +23,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
|
|||
38
.github/workflows/static_analysis.yml
vendored
38
.github/workflows/static_analysis.yml
vendored
|
|
@ -58,52 +58,26 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
working_directory: ./mobile
|
||||
|
||||
- name: Install dependencies
|
||||
run: flutter pub get
|
||||
run: mise //mobile:install:ci
|
||||
|
||||
- name: Install dependencies for UI package
|
||||
run: flutter pub get
|
||||
run: flutter pub get --enforce-lockfile
|
||||
working-directory: ./mobile/packages/ui
|
||||
|
||||
- name: Generate translation files
|
||||
run: mise //mobile:codegen:translation
|
||||
|
||||
- name: Run Build Runner
|
||||
run: mise //mobile:codegen:dart
|
||||
|
||||
- name: Generate platform API
|
||||
run: mise //mobile:codegen:pigeon
|
||||
|
||||
- name: Find file changes
|
||||
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
|
||||
id: verify-changed-files
|
||||
with:
|
||||
files: |
|
||||
mobile/**/*.g.dart
|
||||
mobile/**/*.gr.dart
|
||||
mobile/**/*.drift.dart
|
||||
mobile/**/*.g.swift
|
||||
mobile/**/*.g.kt
|
||||
|
||||
- name: Verify files have not changed
|
||||
if: steps.verify-changed-files.outputs.files_changed == 'true'
|
||||
env:
|
||||
CHANGED_FILES: ${{ steps.verify-changed-files.outputs.changed_files }}
|
||||
run: |
|
||||
echo "ERROR: Generated files not up to date! Run 'mise //mobile:codegen:dart' and 'mise //mobile:codegen:pigeon'"
|
||||
echo "Changed files: ${CHANGED_FILES}"
|
||||
exit 1
|
||||
- name: Perform codegen
|
||||
run: mise //mobile:codegen
|
||||
|
||||
- name: Run analyze
|
||||
run: mise //mobile:analyze
|
||||
|
|
|
|||
88
.github/workflows/test.yml
vendored
88
.github/workflows/test.yml
vendored
|
|
@ -85,13 +85,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -114,13 +114,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -146,13 +146,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -178,13 +178,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -223,13 +223,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -262,13 +262,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -291,13 +291,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -342,13 +342,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -375,14 +375,14 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: 'recursive'
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -412,7 +412,7 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: 'recursive'
|
||||
|
|
@ -422,7 +422,7 @@ jobs:
|
|||
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
cache: 'pnpm'
|
||||
|
|
@ -441,6 +441,7 @@ jobs:
|
|||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Start Docker Compose
|
||||
id: docker
|
||||
run: docker compose up -d --build --renew-anon-volumes --force-recreate --remove-orphans --wait --wait-timeout 300
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
|
|
@ -448,13 +449,13 @@ jobs:
|
|||
env:
|
||||
VITEST_DISABLE_DOCKER_SETUP: true
|
||||
run: pnpm test
|
||||
if: ${{ !cancelled() }}
|
||||
if: ${{ !cancelled() && steps.docker.outcome == 'success' }}
|
||||
|
||||
- name: Run e2e tests (maintenance)
|
||||
env:
|
||||
VITEST_DISABLE_DOCKER_SETUP: true
|
||||
run: pnpm test:maintenance
|
||||
if: ${{ !cancelled() }}
|
||||
if: ${{ !cancelled() && steps.docker.outcome == 'success' }}
|
||||
|
||||
- name: Capture Docker logs
|
||||
if: always()
|
||||
|
|
@ -490,7 +491,7 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: 'recursive'
|
||||
|
|
@ -500,7 +501,7 @@ jobs:
|
|||
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
cache: 'pnpm'
|
||||
|
|
@ -519,6 +520,7 @@ jobs:
|
|||
if: ${{ !cancelled() }}
|
||||
|
||||
- name: Docker build
|
||||
id: docker
|
||||
run: docker compose up -d --build --renew-anon-volumes --force-recreate --remove-orphans --wait --wait-timeout 300
|
||||
if: ${{ !cancelled() }}
|
||||
|
||||
|
|
@ -526,7 +528,7 @@ jobs:
|
|||
env:
|
||||
PLAYWRIGHT_DISABLE_WEBSERVER: true
|
||||
run: pnpm test:web
|
||||
if: ${{ !cancelled() }}
|
||||
if: ${{ !cancelled() && steps.docker.outcome == 'success' }}
|
||||
|
||||
- name: Archive e2e test (web) results
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
|
|
@ -539,7 +541,7 @@ jobs:
|
|||
env:
|
||||
PLAYWRIGHT_DISABLE_WEBSERVER: true
|
||||
run: pnpm test:web:ui
|
||||
if: ${{ !cancelled() }}
|
||||
if: ${{ !cancelled() && steps.docker.outcome == 'success' }}
|
||||
|
||||
- name: Archive ui test (web) results
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
|
|
@ -552,7 +554,7 @@ jobs:
|
|||
env:
|
||||
PLAYWRIGHT_DISABLE_WEBSERVER: true
|
||||
run: pnpm test:web:maintenance
|
||||
if: ${{ !cancelled() }}
|
||||
if: ${{ !cancelled() && steps.docker.outcome == 'success' }}
|
||||
|
||||
- name: Archive maintenance tests (web) results
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
|
|
@ -598,23 +600,22 @@ jobs:
|
|||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
permission-contents: read
|
||||
|
||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
working_directory: ./mobile
|
||||
|
||||
- name: Install dependencies
|
||||
run: flutter pub get
|
||||
working-directory: ./mobile
|
||||
run: mise //mobile:install:ci
|
||||
|
||||
- name: Generate translation files
|
||||
run: mise //mobile:codegen:translation
|
||||
- name: Perform codegen
|
||||
run: mise //mobile:codegen
|
||||
|
||||
- name: Run tests
|
||||
run: mise //mobile:test
|
||||
|
|
@ -637,13 +638,13 @@ jobs:
|
|||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
permission-contents: read
|
||||
|
||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -669,13 +670,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -699,7 +700,7 @@ jobs:
|
|||
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
permission-contents: read
|
||||
|
||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
|
@ -722,13 +723,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -743,7 +744,6 @@ jobs:
|
|||
id: verify-changed-files
|
||||
with:
|
||||
files: |
|
||||
mobile/openapi
|
||||
packages/sdk
|
||||
open-api/immich-openapi-specs.json
|
||||
|
||||
|
|
@ -781,13 +781,13 @@ jobs:
|
|||
permission-contents: read
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
uses: immich-app/devtools/actions/use-mise@06a9ef925332c91be647d6256642b86b398592c8 # use-mise-action-v3.2.1
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
|
@ -920,6 +920,6 @@ jobs:
|
|||
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||
# disable-animations: true
|
||||
# script: |
|
||||
# flutter pub get
|
||||
# flutter pub get --enforce-lockfile
|
||||
# flutter test integration_test
|
||||
# attempt_limit: 3
|
||||
|
|
|
|||
5
.gitignore
vendored
5
.gitignore
vendored
|
|
@ -11,13 +11,10 @@ docker/library
|
|||
uploads
|
||||
coverage
|
||||
|
||||
mobile/generated
|
||||
mobile/gradle.properties
|
||||
mobile/openapi/pubspec.lock
|
||||
mobile/*.jks
|
||||
mobile/libisar.dylib
|
||||
mobile/openapi/test
|
||||
mobile/openapi/doc
|
||||
mobile/openapi/.openapi-generator/FILES
|
||||
mobile/ios/build
|
||||
|
||||
packages/**/build
|
||||
|
|
|
|||
4
.vscode/extensions.json
vendored
4
.vscode/extensions.json
vendored
|
|
@ -12,6 +12,8 @@
|
|||
"editorconfig.editorconfig",
|
||||
"foxundermoon.shell-format",
|
||||
"timonwong.shellcheck",
|
||||
"bluebrown.yamlfmt"
|
||||
"bluebrown.yamlfmt",
|
||||
// TODO TS 7 while it's still in preview
|
||||
"typescriptteam.native-preview"
|
||||
]
|
||||
}
|
||||
|
|
|
|||
40
.vscode/settings.json
vendored
40
.vscode/settings.json
vendored
|
|
@ -29,9 +29,6 @@
|
|||
"editor.formatOnSave": true,
|
||||
"tailwindCSS.lint.suggestCanonicalClasses": "ignore"
|
||||
},
|
||||
"svelte.plugin.svelte.compilerWarnings": {
|
||||
"state_referenced_locally": "ignore"
|
||||
},
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.formatOnSave": true
|
||||
|
|
@ -43,37 +40,42 @@
|
|||
"eslint.useFlatConfig": true,
|
||||
"eslint.validate": ["javascript", "typescript", "svelte"],
|
||||
"eslint.workingDirectories": [
|
||||
{ "directory": "cli", "changeProcessCWD": true },
|
||||
{ "directory": "e2e", "changeProcessCWD": true },
|
||||
{ "directory": "server", "changeProcessCWD": true },
|
||||
{ "directory": "web", "changeProcessCWD": true }
|
||||
{ "changeProcessCWD": true, "directory": "cli" },
|
||||
{ "changeProcessCWD": true, "directory": "e2e" },
|
||||
{ "changeProcessCWD": true, "directory": "server" },
|
||||
{ "changeProcessCWD": true, "directory": "web" }
|
||||
],
|
||||
"files.watcherExclude": {
|
||||
"**/.jj/**": true,
|
||||
"**/.git/**": true,
|
||||
"**/node_modules/**": true,
|
||||
"**/build/**": true,
|
||||
"**/dist/**": true,
|
||||
"**/.svelte-kit/**": true
|
||||
},
|
||||
"explorer.fileNesting.enabled": true,
|
||||
"explorer.fileNesting.patterns": {
|
||||
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
|
||||
"*.ts": "${capture}.spec.ts,${capture}.mock.ts",
|
||||
"*.js": "${capture}.spec.js,${capture}.mock.js",
|
||||
"*.ts": "${capture}.spec.ts,${capture}.mock.ts",
|
||||
"package.json": "package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb, bun.lock, pnpm-workspace.yaml, .pnpmfile.cjs"
|
||||
},
|
||||
"files.watcherExclude": {
|
||||
"**/.git/**": true,
|
||||
"**/.jj/**": true,
|
||||
"**/.svelte-kit/**": true,
|
||||
"**/build/**": true,
|
||||
"**/dist/**": true,
|
||||
"**/node_modules/**": true
|
||||
},
|
||||
// TODO remove once the ts7 extension is stable
|
||||
"js/ts.experimental.useTsgo": true,
|
||||
"js/ts.preferences.importModuleSpecifier": "non-relative",
|
||||
"search.exclude": {
|
||||
"**/node_modules": true,
|
||||
"**/.svelte-kit": true,
|
||||
"**/build": true,
|
||||
"**/dist": true,
|
||||
"**/.svelte-kit": true,
|
||||
"**/node_modules": true,
|
||||
"**/open-api/typescript-sdk/src": true
|
||||
},
|
||||
"svelte.enable-ts-plugin": true,
|
||||
"svelte.plugin.svelte.compilerWarnings": {
|
||||
"state_referenced_locally": "ignore"
|
||||
},
|
||||
"tailwindCSS.experimental.configFile": {
|
||||
"web/src/app.css": "web/src/**"
|
||||
},
|
||||
"js/ts.preferences.importModuleSpecifier": "non-relative",
|
||||
"vitest.maximumConfigs": 10
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,13 @@ We usually do not assign issues to new contributors, since it happens often that
|
|||
|
||||
## Use of generative AI
|
||||
|
||||
We ask you not to open PRs generated with an LLM. We find that code generated like this tends to need a large amount of back-and-forth, which is a very inefficient use of our time. If we want LLM-generated code, it's much faster for us to use an LLM ourselves than to go through an intermediary via a pull request.
|
||||
We ask you not to open PRs generated with an LLM. We find that code generated like this tends to need a large amount of back-and-forth, which is a very inefficient use of our time. Even a one line change can have significant impact. We cannot have any confidence in an LLM, so if it's non-trivial for us to verify it works and you don't show that you fully understand all implications of the change, reviewing the PR is not worth our time. If we want LLM-generated code, it's much faster for us to use an LLM ourselves than to go through an intermediary via a pull request.
|
||||
|
||||
If you use an LLM to translate a PR description or title, that is fine. Please make sure however that you stick to the PR template and that the text is written concisely.
|
||||
|
||||
LLMs must not be used to fix GitHub issues labelled good first issue. These issues are generally not urgent, and are intended to be learning opportunities for new contributors to get familiar with the codebase. Whether you are a newcomer or not, fully automating the process of fixing this issue squanders the learning opportunity and doesn’t add much value to the project. Using LLMs to fix issues labelled as “good first issue” is forbidden, and those PRs will be closed automatically.
|
||||
|
||||
Misrepresenting LLM use, contribution farming (automated low-effort PRs), or repeatedly hitting auto-close rules may be grounds for a block at maintainer discretion.
|
||||
|
||||
## Feature freezes
|
||||
|
||||
|
|
@ -38,7 +44,7 @@ All our translations are done through [Weblate](https://hosted.weblate.org/proje
|
|||
|
||||
### Datasets
|
||||
|
||||
Help us improve our [Immich Datasets](https://datasets.immich.app) by submitting photos and videos taken from a variety of devices, including smartphones, DSLRs, and action cameras, as well as photos with unique features, such as panoramas, burst photos, and photo spheres. These datasets will be publically available for anyone to use, do not submit private/sensitive photos.
|
||||
Help us improve our [Immich Datasets](https://datasets.immich.app) by submitting photos and videos taken from a variety of devices, including smartphones, DSLRs, and action cameras, as well as photos with unique features, such as panoramas, burst photos, and photo spheres. These datasets will be publicly available for anyone to use, do not submit private/sensitive photos.
|
||||
|
||||
### Community support
|
||||
|
||||
|
|
|
|||
58
Makefile
58
Makefile
|
|
@ -1,58 +0,0 @@
|
|||
dev:
|
||||
@printf "This command has been removed. Please use:\n\n mise dev # or mise //:dev from another directory\n\n" >&2 && exit 1
|
||||
|
||||
dev-down:
|
||||
@printf "This command has been removed. Please use:\n\n mise dev-down # or mise //:dev-down from another directory\n\n" >&2 && exit 1
|
||||
|
||||
dev-update:
|
||||
@printf "This command has been removed. Please use:\n\n mise dev-update # or mise //:dev-update from another directory\n\n" >&2 && exit 1
|
||||
|
||||
dev-scale:
|
||||
@printf "This command has been removed. Please use:\n\n mise dev-scale # or mise //:dev-scale from another directory\n\n" >&2 && exit 1
|
||||
|
||||
dev-docs:
|
||||
npm --prefix docs run start
|
||||
|
||||
.PHONY: e2e
|
||||
e2e:
|
||||
@printf "This command has been removed. Please use:\n\n mise e2e # or mise //:e2e from another directory\n\n" >&2 && exit 1
|
||||
|
||||
e2e-dev:
|
||||
@printf "This command has been removed. Please use:\n\n mise e2e-dev # or mise //:e2e-dev from another directory\n\n" >&2 && exit 1
|
||||
|
||||
e2e-update:
|
||||
@printf "This command has been removed. Please use:\n\n mise e2e-update # or mise //:e2e-update from another directory\n\n" >&2 && exit 1
|
||||
|
||||
e2e-down:
|
||||
@printf "This command has been removed. Please use:\n\n mise e2e-down # or mise //:e2e-down from another directory\n\n" >&2 && exit 1
|
||||
|
||||
prod:
|
||||
@printf "This command has been removed. Please use:\n\n mise prod # or mise //:prod from another directory\n\n" >&2 && exit 1
|
||||
|
||||
prod-down:
|
||||
@printf "This command has been removed. Please use:\n\n mise prod-down # or mise //:prod-down from another directory\n\n" >&2 && exit 1
|
||||
|
||||
prod-scale:
|
||||
@printf "This command has been removed. Please use:\n\n mise prod-scale # or mise //:prod-scale from another directory\n\n" >&2 && exit 1
|
||||
|
||||
.PHONY: open-api
|
||||
open-api:
|
||||
@printf "This command has been removed. Please use:\n\n mise open-api # or mise //:open-api from another directory\n\n" >&2 && exit 1
|
||||
|
||||
sql:
|
||||
@printf "This command has been removed. Please use:\n\n mise sql # or mise //:sql from another directory\n\n" >&2 && exit 1
|
||||
|
||||
|
||||
renovate:
|
||||
LOG_LEVEL=debug pnpm exec renovate --platform=local --repository-cache=reset
|
||||
|
||||
# Include .env file if it exists
|
||||
-include docker/.env
|
||||
|
||||
MODULES = e2e server web cli sdk docs .github
|
||||
|
||||
test-e2e:
|
||||
@printf "This command has been removed. Please use:\n\n mise //e2e:test # or mise //e2e:test-web for web tests, respectively\n\n" >&2 && exit 1
|
||||
|
||||
clean:
|
||||
@printf "This command has been removed. Please use:\n\n mise clean # or mise //:clean from another directory\n\n" >&2 && exit 1
|
||||
|
|
@ -32,6 +32,7 @@
|
|||
<a href="readme_i18n/README_zh_TW.md">正體中文</a>
|
||||
<a href="readme_i18n/README_uk_UA.md">Українська</a>
|
||||
<a href="readme_i18n/README_ru_RU.md">Русский</a>
|
||||
<a href="readme_i18n/README_bg_BG.md">Български</a>
|
||||
<a href="readme_i18n/README_pt_BR.md">Português Brasileiro</a>
|
||||
<a href="readme_i18n/README_sv_SE.md">Svenska</a>
|
||||
<a href="readme_i18n/README_ar_JO.md">العربية</a>
|
||||
|
|
|
|||
|
|
@ -1,43 +1,43 @@
|
|||
# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html
|
||||
|
||||
[[tools.opentofu]]
|
||||
version = "1.11.6"
|
||||
version = "1.12.5"
|
||||
backend = "aqua:opentofu/opentofu"
|
||||
|
||||
[tools.opentofu."platforms.linux-arm64"]
|
||||
checksum = "sha256:d4f2ab15776925864b049bb329d69682851de6f5204f256e9fa86d07a0308850"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_arm64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/391536382"
|
||||
checksum = "sha256:e67e9da2b1ddf5050ebee62a584cb826eafe1dfd3827d7ec20899ac62791ed1a"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.12.5/tofu_1.12.5_linux_arm64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/484602545"
|
||||
|
||||
[tools.opentofu."platforms.linux-arm64-musl"]
|
||||
checksum = "sha256:d4f2ab15776925864b049bb329d69682851de6f5204f256e9fa86d07a0308850"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_arm64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/391536382"
|
||||
checksum = "sha256:e67e9da2b1ddf5050ebee62a584cb826eafe1dfd3827d7ec20899ac62791ed1a"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.12.5/tofu_1.12.5_linux_arm64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/484602545"
|
||||
|
||||
[tools.opentofu."platforms.linux-x64"]
|
||||
checksum = "sha256:02800fafa2753a9f50c38483e2fdf5bc353fd62895eb9e25eec9a5145df3a69e"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_amd64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/391536401"
|
||||
checksum = "sha256:a6894d45ae7a17ce83189cce8fe04b5a65f68cefceb62455b5a6a89fa53ab38f"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.12.5/tofu_1.12.5_linux_amd64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/484602624"
|
||||
|
||||
[tools.opentofu."platforms.linux-x64-musl"]
|
||||
checksum = "sha256:02800fafa2753a9f50c38483e2fdf5bc353fd62895eb9e25eec9a5145df3a69e"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_linux_amd64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/391536401"
|
||||
checksum = "sha256:a6894d45ae7a17ce83189cce8fe04b5a65f68cefceb62455b5a6a89fa53ab38f"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.12.5/tofu_1.12.5_linux_amd64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/484602624"
|
||||
|
||||
[tools.opentofu."platforms.macos-arm64"]
|
||||
checksum = "sha256:62d7fa8539e13b444827aa0a3b90c5972da5c47e8f8882d9dcf2e430e78840c1"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_darwin_arm64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/391536399"
|
||||
checksum = "sha256:2ae38150a667f5c0bd57b318d18ad8091d08f93fcca40345f3d88998661de5a9"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.12.5/tofu_1.12.5_darwin_arm64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/484602544"
|
||||
|
||||
[tools.opentofu."platforms.macos-x64"]
|
||||
checksum = "sha256:1408cdef1c380f914565e6b4bb70794c6b163f195fcb233357f3d6c5745906b6"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_darwin_amd64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/391536384"
|
||||
checksum = "sha256:1012d8f3d4567bcbcd1f2c7d766feca39a30bced32fb8be47e1887fbbee2456d"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.12.5/tofu_1.12.5_darwin_amd64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/484602621"
|
||||
|
||||
[tools.opentofu."platforms.windows-x64"]
|
||||
checksum = "sha256:27323f70c875b8251bfd7e61a4cffc3ebff4e56ed1e611b955016f0c7077367e"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_windows_amd64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/391536406"
|
||||
checksum = "sha256:af11850b496f3720e0184084c56d8b43aa74ea92d2338978bf368d70c96473f1"
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.12.5/tofu_1.12.5_windows_amd64.tar.gz"
|
||||
url_api = "https://api.github.com/repos/opentofu/opentofu/releases/assets/484602547"
|
||||
|
||||
[[tools.terragrunt]]
|
||||
version = "1.0.3"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
[tools]
|
||||
terragrunt = "1.0.3"
|
||||
opentofu = "1.11.6"
|
||||
terragrunt = "1.1.1"
|
||||
opentofu = "1.12.5"
|
||||
|
||||
[tasks."tg:fmt"]
|
||||
run = "terragrunt hclfmt"
|
||||
|
|
|
|||
|
|
@ -2,37 +2,35 @@
|
|||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
||||
version = "4.52.7"
|
||||
constraints = "4.52.7"
|
||||
version = "4.52.8"
|
||||
constraints = "4.52.8"
|
||||
hashes = [
|
||||
"h1:+O72J3QYiZtYmYYZM/Eh0f4NNfl1BvjX1eju43qTQsQ=",
|
||||
"h1:0oqjYIPXcXh7XiDiKI085cHDYQQ5mh8kDl9dmBtvtog=",
|
||||
"h1:4b4ESb87MGv5bnadgYe7sK5rEkKMZhbkQcwPubQTsR4=",
|
||||
"h1:6mTr3eA1Ddb348lLmJuyvn98z4KF+ejqaUEJ76D1rzQ=",
|
||||
"h1:9/3YH+9k9HqsvFtbmBf7SO2+xqZeZrXNKzLkjNuhUEA=",
|
||||
"h1:Jcq4tBWgyH4/2JsojNBSRaN0mcItVMchO+lynonrlqc=",
|
||||
"h1:Y4Vv/2RdP0Q+uxqhOxzOdKxuuEMjXPDcU0vPc5bCQzI=",
|
||||
"h1:a0gW8FBKsbP9Fi0HEDoy49WIbEWVHk9+BR4/iwuBdDQ=",
|
||||
"h1:gElv6iqJtg8OKN77gbw+MjrkrQmJHPkkMEi1J+0xkpU=",
|
||||
"h1:oslXUugD/NQ+duJgT4BhKQyfGbuFOANknMvR73fiOeM=",
|
||||
"h1:pPItIWii5oymR+geZB219ROSPuSODPLTlM4S/u8xLvM=",
|
||||
"h1:u67GWw8GwD9NDlDzp9Y5VRnSQGcCrE8rSpkGPaBpDl0=",
|
||||
"h1:uUUa9dY0XQOycI8pxg16PFFtL0WCTi9uEJz8trTQ7pU=",
|
||||
"h1:y3rV8KF2q6GEMANNlf5EkKJurlfbKlIKpjGcdxoy7pQ=",
|
||||
"zh:0c904ce31a4c6c4a5b3bf7ff1560e77c0cc7e2450c8553ded8e8c90398e1418b",
|
||||
"zh:36183d310c36373fe4cb936b83c595c6fd3b0a94bc7827f28e5789ccbf59752e",
|
||||
"zh:556a568a6f0235e8f41647de9e4d3a1e7b1d6502df8b19b54ec441f1c653ea10",
|
||||
"zh:633ebbd5b0245e75e500ef9be4d9e62288f97e8da3baaa51323892a786d90285",
|
||||
"zh:6acfe60cf52a65ba8f044f748548d2119e7f4fd7f8ebcb14698960d87c68f529",
|
||||
"h1:2uxVaMaGPDJljXqYzuD6xtyfOKdNudtGIgawRTkFJIs=",
|
||||
"h1:34HL1GDpqYdn2iEC+85pCi+NddZf30qH3fJ8y3P6CAM=",
|
||||
"h1:4Z+uD+YY/7HrqdypM7DyUK+RtWepoLBc9fqtRQYZx4I=",
|
||||
"h1:8Ss6wlJL2BHvkIZU1iaHvyUntqNhPFZ0fl6mjsxhctc=",
|
||||
"h1:AYeWWMTWaNg01N3hivxr/6YlG41j1RietMnft9vLjUI=",
|
||||
"h1:BGRNOzo8NUgbx5RwpWkWmr38f/s3txb7mzQhqfM5blI=",
|
||||
"h1:EEXRMdC8bPlpLuOU8u+dE8mFJe3BpquFdH6vXcKseY4=",
|
||||
"h1:ENp29e6O6OnaHJlbtmRlyjlAmm3Wt4mGctWUpBY3d0g=",
|
||||
"h1:IAtBAbGVe1npj/n1NvCIZkSYGl7qaPYT+FnVdZ2CZ00=",
|
||||
"h1:QRGGKngrxLORr4CImKXLDDJL5s67zUNBDAgk6FIIFNk=",
|
||||
"h1:bNql6cC+MfDbaJK3q7a8C1m3A21o7e5mrjBIGtk0RdI=",
|
||||
"h1:gmNv+PEOkYDdu+c15bfpcoAE3EI7pgmov9RMf3GZLsI=",
|
||||
"h1:yieZ7NWRYQcLYHUevzDDrrmDkoQICM+3ZeX4i/mw9ME=",
|
||||
"zh:08b305329a680a9213b2d8e642fbce7e4d97a524b1d2cef59e190ba9d678c477",
|
||||
"zh:47975bd711ee18a46e589822171fa87474a552b332bfc8dea8fd1a64504eed8d",
|
||||
"zh:5640d0d226bbafff3395542456c29feb942ca9c55ac01b4245a34c0590a33363",
|
||||
"zh:5b0ad839fafba938c60a95d6b4a865843643591e97573ed2b9c4af3754064f74",
|
||||
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
||||
"zh:904acc31ebb9d6ef68c792074b30532ee61bf515f19e0a3c75b46f126cca1f13",
|
||||
"zh:a1d0a81246afc8750286d3f6fe7a8fbe6460dd2662407b28dbfbabb612e5fa9d",
|
||||
"zh:a41a36fe253fc365fe2b7ffc749624688b2693b4634862fda161179ab100029f",
|
||||
"zh:a7ef269e77ffa8715c8945a2c14322c7ff159ea44c15f62505f3cbb2cae3b32d",
|
||||
"zh:b01aa3bed30610633b762df64332b26f8844a68c3960cebcb30f04918efc67fe",
|
||||
"zh:b069cc2cd18cae10757df3ae030508eac8d55de7e49eda7a5e3e11f2f7fe6455",
|
||||
"zh:b2d2c6313729ebb7465dceece374049e2d08bda34473901be9ff46a8836d42b2",
|
||||
"zh:db0e114edaf4bc2f3d4769958807c83022bfbc619a00bdf4c4bd17faa4ab2d8b",
|
||||
"zh:ecc0aa8b9044f664fd2aaf8fa992d976578f78478980555b4b8f6148e8d1a5fe",
|
||||
"zh:93a9bc1139f5c02a44fdbf51fb2ce0891e2a42033b66febb928ccf72e870408f",
|
||||
"zh:977f75cdf365686aa16ae02dcc0fc1769bae6f86be6e165393756c940bfb4af0",
|
||||
"zh:9afcda2660b3dc6ee6329acea532a719225bd1f6cf46f695feb2d77160847c1b",
|
||||
"zh:9e3da67b1b05b03d1f0c18b8677edf3797815b5dd49629f10eb2f457dccbed30",
|
||||
"zh:b8d7da230f5266367c1b6b1cf31aa39087e231a87d55b71bb9d5c854ca1fcfe6",
|
||||
"zh:cc96e7cd7350456b7a11a53d1c76c73a542de8359f9750f637ff865e8e77be91",
|
||||
"zh:da1f58d067def243047bb7178cb197e2b9c3a791a9eb380ad92b73290615ae29",
|
||||
"zh:ed5f3e1f59a338bcdce0a2537a8a2f299cfe18c168626799b2a9c97af3d8d3cb",
|
||||
"zh:f16cc31f73a58a26ffe2d93223eddb7c340623a4e2ef38c6091766fd611e3e11",
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ terraform {
|
|||
required_providers {
|
||||
cloudflare = {
|
||||
source = "cloudflare/cloudflare"
|
||||
version = "4.52.7"
|
||||
version = "4.52.8"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,37 +2,35 @@
|
|||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "registry.opentofu.org/cloudflare/cloudflare" {
|
||||
version = "4.52.7"
|
||||
constraints = "4.52.7"
|
||||
version = "4.52.8"
|
||||
constraints = "4.52.8"
|
||||
hashes = [
|
||||
"h1:+O72J3QYiZtYmYYZM/Eh0f4NNfl1BvjX1eju43qTQsQ=",
|
||||
"h1:0oqjYIPXcXh7XiDiKI085cHDYQQ5mh8kDl9dmBtvtog=",
|
||||
"h1:4b4ESb87MGv5bnadgYe7sK5rEkKMZhbkQcwPubQTsR4=",
|
||||
"h1:6mTr3eA1Ddb348lLmJuyvn98z4KF+ejqaUEJ76D1rzQ=",
|
||||
"h1:9/3YH+9k9HqsvFtbmBf7SO2+xqZeZrXNKzLkjNuhUEA=",
|
||||
"h1:Jcq4tBWgyH4/2JsojNBSRaN0mcItVMchO+lynonrlqc=",
|
||||
"h1:Y4Vv/2RdP0Q+uxqhOxzOdKxuuEMjXPDcU0vPc5bCQzI=",
|
||||
"h1:a0gW8FBKsbP9Fi0HEDoy49WIbEWVHk9+BR4/iwuBdDQ=",
|
||||
"h1:gElv6iqJtg8OKN77gbw+MjrkrQmJHPkkMEi1J+0xkpU=",
|
||||
"h1:oslXUugD/NQ+duJgT4BhKQyfGbuFOANknMvR73fiOeM=",
|
||||
"h1:pPItIWii5oymR+geZB219ROSPuSODPLTlM4S/u8xLvM=",
|
||||
"h1:u67GWw8GwD9NDlDzp9Y5VRnSQGcCrE8rSpkGPaBpDl0=",
|
||||
"h1:uUUa9dY0XQOycI8pxg16PFFtL0WCTi9uEJz8trTQ7pU=",
|
||||
"h1:y3rV8KF2q6GEMANNlf5EkKJurlfbKlIKpjGcdxoy7pQ=",
|
||||
"zh:0c904ce31a4c6c4a5b3bf7ff1560e77c0cc7e2450c8553ded8e8c90398e1418b",
|
||||
"zh:36183d310c36373fe4cb936b83c595c6fd3b0a94bc7827f28e5789ccbf59752e",
|
||||
"zh:556a568a6f0235e8f41647de9e4d3a1e7b1d6502df8b19b54ec441f1c653ea10",
|
||||
"zh:633ebbd5b0245e75e500ef9be4d9e62288f97e8da3baaa51323892a786d90285",
|
||||
"zh:6acfe60cf52a65ba8f044f748548d2119e7f4fd7f8ebcb14698960d87c68f529",
|
||||
"h1:2uxVaMaGPDJljXqYzuD6xtyfOKdNudtGIgawRTkFJIs=",
|
||||
"h1:34HL1GDpqYdn2iEC+85pCi+NddZf30qH3fJ8y3P6CAM=",
|
||||
"h1:4Z+uD+YY/7HrqdypM7DyUK+RtWepoLBc9fqtRQYZx4I=",
|
||||
"h1:8Ss6wlJL2BHvkIZU1iaHvyUntqNhPFZ0fl6mjsxhctc=",
|
||||
"h1:AYeWWMTWaNg01N3hivxr/6YlG41j1RietMnft9vLjUI=",
|
||||
"h1:BGRNOzo8NUgbx5RwpWkWmr38f/s3txb7mzQhqfM5blI=",
|
||||
"h1:EEXRMdC8bPlpLuOU8u+dE8mFJe3BpquFdH6vXcKseY4=",
|
||||
"h1:ENp29e6O6OnaHJlbtmRlyjlAmm3Wt4mGctWUpBY3d0g=",
|
||||
"h1:IAtBAbGVe1npj/n1NvCIZkSYGl7qaPYT+FnVdZ2CZ00=",
|
||||
"h1:QRGGKngrxLORr4CImKXLDDJL5s67zUNBDAgk6FIIFNk=",
|
||||
"h1:bNql6cC+MfDbaJK3q7a8C1m3A21o7e5mrjBIGtk0RdI=",
|
||||
"h1:gmNv+PEOkYDdu+c15bfpcoAE3EI7pgmov9RMf3GZLsI=",
|
||||
"h1:yieZ7NWRYQcLYHUevzDDrrmDkoQICM+3ZeX4i/mw9ME=",
|
||||
"zh:08b305329a680a9213b2d8e642fbce7e4d97a524b1d2cef59e190ba9d678c477",
|
||||
"zh:47975bd711ee18a46e589822171fa87474a552b332bfc8dea8fd1a64504eed8d",
|
||||
"zh:5640d0d226bbafff3395542456c29feb942ca9c55ac01b4245a34c0590a33363",
|
||||
"zh:5b0ad839fafba938c60a95d6b4a865843643591e97573ed2b9c4af3754064f74",
|
||||
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
|
||||
"zh:904acc31ebb9d6ef68c792074b30532ee61bf515f19e0a3c75b46f126cca1f13",
|
||||
"zh:a1d0a81246afc8750286d3f6fe7a8fbe6460dd2662407b28dbfbabb612e5fa9d",
|
||||
"zh:a41a36fe253fc365fe2b7ffc749624688b2693b4634862fda161179ab100029f",
|
||||
"zh:a7ef269e77ffa8715c8945a2c14322c7ff159ea44c15f62505f3cbb2cae3b32d",
|
||||
"zh:b01aa3bed30610633b762df64332b26f8844a68c3960cebcb30f04918efc67fe",
|
||||
"zh:b069cc2cd18cae10757df3ae030508eac8d55de7e49eda7a5e3e11f2f7fe6455",
|
||||
"zh:b2d2c6313729ebb7465dceece374049e2d08bda34473901be9ff46a8836d42b2",
|
||||
"zh:db0e114edaf4bc2f3d4769958807c83022bfbc619a00bdf4c4bd17faa4ab2d8b",
|
||||
"zh:ecc0aa8b9044f664fd2aaf8fa992d976578f78478980555b4b8f6148e8d1a5fe",
|
||||
"zh:93a9bc1139f5c02a44fdbf51fb2ce0891e2a42033b66febb928ccf72e870408f",
|
||||
"zh:977f75cdf365686aa16ae02dcc0fc1769bae6f86be6e165393756c940bfb4af0",
|
||||
"zh:9afcda2660b3dc6ee6329acea532a719225bd1f6cf46f695feb2d77160847c1b",
|
||||
"zh:9e3da67b1b05b03d1f0c18b8677edf3797815b5dd49629f10eb2f457dccbed30",
|
||||
"zh:b8d7da230f5266367c1b6b1cf31aa39087e231a87d55b71bb9d5c854ca1fcfe6",
|
||||
"zh:cc96e7cd7350456b7a11a53d1c76c73a542de8359f9750f637ff865e8e77be91",
|
||||
"zh:da1f58d067def243047bb7178cb197e2b9c3a791a9eb380ad92b73290615ae29",
|
||||
"zh:ed5f3e1f59a338bcdce0a2537a8a2f299cfe18c168626799b2a9c97af3d8d3cb",
|
||||
"zh:f16cc31f73a58a26ffe2d93223eddb7c340623a4e2ef38c6091766fd611e3e11",
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ terraform {
|
|||
required_providers {
|
||||
cloudflare = {
|
||||
source = "cloudflare/cloudflare"
|
||||
version = "4.52.7"
|
||||
version = "4.52.8"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ services:
|
|||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:9@sha256:4963247afc4cd33c7d3b2d2816b9f7f8eeebab148d29056c2ca4d7cbc966f2d9
|
||||
image: docker.io/valkey/valkey:9@sha256:3acc0687f2a2e1091fae6450d7842dd658c941338cf0a873ddd9e14b9e4ea4dd
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ services:
|
|||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:9@sha256:4963247afc4cd33c7d3b2d2816b9f7f8eeebab148d29056c2ca4d7cbc966f2d9
|
||||
image: docker.io/valkey/valkey:9@sha256:3acc0687f2a2e1091fae6450d7842dd658c941338cf0a873ddd9e14b9e4ea4dd
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
restart: always
|
||||
|
|
@ -85,7 +85,7 @@ services:
|
|||
container_name: immich_prometheus
|
||||
ports:
|
||||
- 9090:9090
|
||||
image: prom/prometheus@sha256:3c42b892cf723fa54d2f262c37a0e1f80aa8c8ddb1da7b9b0df9455a35a7f893
|
||||
image: prom/prometheus@sha256:508729e0e2d18e11fd742a5a5ca70e557b940a93948c3c95fd0123a6fd538b69
|
||||
volumes:
|
||||
- ./prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
|
|
@ -97,7 +97,7 @@ services:
|
|||
command: ['./run.sh', '-disable-reporting']
|
||||
ports:
|
||||
- 3000:3000
|
||||
image: grafana/grafana:12.4.4-ubuntu@sha256:df2e7ef5f32f771794cf76bad5f2bceac227036460a2cc269a9045e5662abc58
|
||||
image: grafana/grafana:12.4.6-ubuntu@sha256:124ddf024f95e61b562a02112b47bc64de75973370cf440b1356d31cd8178844
|
||||
volumes:
|
||||
- grafana-data:/var/lib/grafana
|
||||
|
||||
|
|
|
|||
|
|
@ -51,8 +51,6 @@ services:
|
|||
- NET_RAW
|
||||
volumes:
|
||||
- ./ml-model-cache:/cache
|
||||
- ./ml-dotcache:/.cache
|
||||
- ./ml-config:/.config
|
||||
env_file:
|
||||
- .env
|
||||
restart: always
|
||||
|
|
@ -61,7 +59,7 @@ services:
|
|||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:9@sha256:4963247afc4cd33c7d3b2d2816b9f7f8eeebab148d29056c2ca4d7cbc966f2d9
|
||||
image: docker.io/valkey/valkey:9@sha256:3acc0687f2a2e1091fae6450d7842dd658c941338cf0a873ddd9e14b9e4ea4dd
|
||||
user: '1000:1000'
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ services:
|
|||
|
||||
redis:
|
||||
container_name: immich_redis
|
||||
image: docker.io/valkey/valkey:9@sha256:4963247afc4cd33c7d3b2d2816b9f7f8eeebab148d29056c2ca4d7cbc966f2d9
|
||||
image: docker.io/valkey/valkey:9@sha256:3acc0687f2a2e1091fae6450d7842dd658c941338cf0a873ddd9e14b9e4ea4dd
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
restart: always
|
||||
|
|
|
|||
|
|
@ -409,12 +409,10 @@ To decrease Redis logs, you can add the following line to the `redis:` section o
|
|||
|
||||
You can change the user in the container by setting the `user` argument in `docker-compose.yml` for each service.
|
||||
|
||||
[Example docker-compose.yml file](https://github.com/immich-app/immich/blob/main/docker/docker-compose.rootless.yml)
|
||||
[Example docker-compose.rootless.yml file](https://github.com/immich-app/immich/blob/main/docker/docker-compose.rootless.yml)
|
||||
|
||||
You may need to add mount points or docker volumes for the following internal container paths:
|
||||
|
||||
- `immich-machine-learning:/.config`
|
||||
- `immich-machine-learning:/.cache`
|
||||
- `redis:/data`
|
||||
|
||||
The non-root user/group needs read/write access to the volume mounts, including `UPLOAD_LOCATION` and `/cache` for machine-learning.
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 8.9 KiB |
|
|
@ -280,7 +280,7 @@ Configuration of OAuth in Immich System Settings
|
|||
| ---------------------------- | ----------------------------------------------------- |
|
||||
| Issuer URL | `https://<KEYCLOAK_DOMAIN>/realms/<YOUR_REALM>` |
|
||||
| Client ID | immich |
|
||||
| Client Secret | can be optained from Clients -> immich -> Credentials |
|
||||
| Client Secret | can be obtained from Clients -> immich -> Credentials |
|
||||
| Scope | openid email profile |
|
||||
| Signing Algorithm | RS256 |
|
||||
| Storage Label Claim | preferred_username |
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ Found Admin:
|
|||
- Email=admin@example.com
|
||||
- Name=Immich Admin
|
||||
? Please choose a new password (optional) immich-is-cool
|
||||
? Invalidate existing sessions? Yes
|
||||
The admin password has been updated.
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -10,4 +10,4 @@ OpenAPI is used to generate the client (Typescript, Dart) SDK. `openapi-generato
|
|||
mise open-api
|
||||
```
|
||||
|
||||
You can find the generated client SDK in the `packages/sdk/client` for Typescript SDK and `mobile/openapi` for Dart SDK.
|
||||
You can find the generated client SDK in the `packages/sdk/client` for Typescript SDK and `mobile/generated/openapi` for Dart SDK.
|
||||
|
|
|
|||
|
|
@ -6,14 +6,18 @@ sidebar_position: 100
|
|||
|
||||
A config file can be provided as an alternative to the UI configuration.
|
||||
|
||||
:::note Interaction with the web UI
|
||||
While the config file does not need to include all keys from the below example, specifying `IMMICH_CONFIG_FILE` will disable the ability to edit other properties from the Immich web UI.
|
||||
:::
|
||||
|
||||
### Step 1 - Create a new config file
|
||||
|
||||
In JSON format, create a new config file (e.g. `immich.json`) and put it in a location mounted in the container that can be accessed by Immich.
|
||||
In JSON format, create a new config file (e.g. `immich-config.json`) and put it in a location mounted in the container that can be accessed by Immich.
|
||||
YAML-formatted config files are also supported.
|
||||
The default configuration looks like this:
|
||||
|
||||
<details>
|
||||
<summary>immich.json</summary>
|
||||
<summary>immich-config.json</summary>
|
||||
|
||||
```json
|
||||
{
|
||||
|
|
@ -250,6 +254,10 @@ So you can just grab it from there, paste it into a file and you're pretty much
|
|||
|
||||
### Step 2 - Specify the file location
|
||||
|
||||
:::note
|
||||
If you have any `microservices` workers, they will also need to have the config file mounted to their container.
|
||||
:::
|
||||
|
||||
In your `.env` file, set the variable `IMMICH_CONFIG_FILE` to the path of your config.
|
||||
For more information, refer to the [Environment Variables](/install/environment-variables.md) section.
|
||||
|
||||
|
|
@ -261,7 +269,7 @@ It is recommended to reuse this variable in your `docker-compose.yml`:
|
|||
|
||||
```yaml
|
||||
volumes:
|
||||
- ./configuration.yml:${IMMICH_CONFIG_FILE}
|
||||
- ./immich-config.json:${IMMICH_CONFIG_FILE}
|
||||
```
|
||||
|
||||
:::
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ These environment variables are used by the `docker-compose.yml` file and do **N
|
|||
| `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 |
|
||||
| `IMMICH_ALLOW_SETUP` | When `false` disables the `/auth/admin-sign-up` and `/admin/database-backups/start-restore` endpoints | `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.
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ sidebar_position: 85
|
|||
:::note
|
||||
This is a community contribution and not officially supported by the Immich team, but included here for convenience.
|
||||
|
||||
Community support can be found in the dedicated channel on the [Discord Server](https://discord.immich.app/).
|
||||
Community support should be directed to Synology-specific support platforms.
|
||||
:::
|
||||
|
||||
Immich can easily be installed on a Synology NAS using Container Manager within DSM. If you have not installed Container Manager already, you can install it in the Packages Center. Refer to the [Container Manager docs](https://kb.synology.com/en-us/DSM/help/ContainerManager/docker_desc?version=7) for more information on using Container Manager.
|
||||
|
|
|
|||
|
|
@ -1,13 +1,19 @@
|
|||
---
|
||||
sidebar_position: 60
|
||||
sidebar_position: 70
|
||||
---
|
||||
|
||||
# Unraid
|
||||
# Unraid [ Community ]
|
||||
|
||||
:::note
|
||||
This is a community contribution and not officially supported by the Immich team, but included here for convenience.
|
||||
|
||||
Community support can be found in the dedicated channel on the [Discord Server](https://discord.immich.app/).
|
||||
:::
|
||||
|
||||
Immich can easily be installed and updated on Unraid via:
|
||||
|
||||
1. [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/) plugin from the Unraid Community Apps
|
||||
2. Community made template on the Unraid Community Apps
|
||||
1. Community made template on the Unraid Community Apps
|
||||
2. [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/) plugin from the Unraid Community Apps
|
||||
|
||||
## Community Applications Template
|
||||
|
||||
|
|
@ -23,7 +29,7 @@ Once you have Redis and PostgreSQL running, search for Immich on the Unraid CA,
|
|||
|
||||
For more information about setting up the community image see [here](https://github.com/imagegenius/docker-immich#application-setup)
|
||||
|
||||
## Docker-Compose Method (Official)
|
||||
## Docker-Compose Method
|
||||
|
||||
:::info
|
||||
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ const config = {
|
|||
},
|
||||
{
|
||||
label: 'Privacy Policy',
|
||||
to: '/privacy-policy',
|
||||
href: 'https://immich.app/privacy-policy',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
|
|
|||
|
|
@ -28,4 +28,4 @@ run = "prettier --write ."
|
|||
run = "wrangler pages deploy build --project-name=${PROJECT_NAME} --branch=${BRANCH_NAME}"
|
||||
|
||||
[tools]
|
||||
wrangler = "4.110.0"
|
||||
wrangler = "4.114.0"
|
||||
|
|
|
|||
|
|
@ -40,7 +40,8 @@
|
|||
"@docusaurus/tsconfig": "^3.10.0",
|
||||
"@docusaurus/types": "^3.10.0",
|
||||
"prettier": "^3.7.4",
|
||||
"typescript": "^6.0.0"
|
||||
"@typescript/native": "npm:typescript@^7.0.2",
|
||||
"typescript": "npm:@typescript/typescript6@^6.0.2"
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
|
|
|
|||
|
|
@ -1,78 +0,0 @@
|
|||
import useIsBrowser from '@docusaurus/useIsBrowser';
|
||||
import { mdiCheckboxBlankCircle, mdiCheckboxMarkedCircle } from '@mdi/js';
|
||||
import Icon from '@mdi/react';
|
||||
import React from 'react';
|
||||
|
||||
export type Item = {
|
||||
icon: string;
|
||||
iconColor: string;
|
||||
title: string;
|
||||
description?: string;
|
||||
link?: { url: string; text: string };
|
||||
done?: false;
|
||||
getDateLabel: (language: string) => string;
|
||||
};
|
||||
|
||||
interface Props {
|
||||
items: Item[];
|
||||
}
|
||||
|
||||
export function Timeline({ items }: Props): JSX.Element {
|
||||
const isBrowser = useIsBrowser();
|
||||
|
||||
return (
|
||||
<ul className="flex flex-col pl-4">
|
||||
{items.map((item, index) => {
|
||||
const isFirst = index === 0;
|
||||
const isLast = index === items.length - 1;
|
||||
const done = item.done ?? true;
|
||||
const dateLabel = item.getDateLabel(isBrowser ? navigator.language : 'en-US');
|
||||
const timelineIcon = done ? mdiCheckboxMarkedCircle : mdiCheckboxBlankCircle;
|
||||
const cardIcon = item.icon;
|
||||
|
||||
return (
|
||||
<li key={index} className={`flex min-h-24 w-[700px] max-w-[90vw] ${done ? '' : 'italic'}`}>
|
||||
<div className="md:flex justify-start w-36 mr-8 items-center dark:text-immich-dark-primary text-immich-primary hidden">
|
||||
{dateLabel}
|
||||
</div>
|
||||
<div className={`${isFirst && 'relative top-[50%]'} ${isLast && 'relative bottom-[50%]'}`}>
|
||||
<div
|
||||
className={`h-full border-solid border-4 border-immich-primary dark:border-immich-dark-primary ${
|
||||
isFirst && 'rounded rounded-t-full'
|
||||
} ${isLast && 'rounded rounded-b-full'}`}
|
||||
></div>
|
||||
</div>
|
||||
<div className="z-10 flex items-center bg-immich-primary dark:bg-immich-dark-primary border-2 border-solid rounded-full dark:text-black text-white relative top-[50%] left-[-3px] translate-y-[-50%] translate-x-[-50%] w-8 h-8 shadow-lg ">
|
||||
{<Icon path={timelineIcon} size={1.25} />}
|
||||
</div>
|
||||
<section className=" dark:bg-immich-dark-gray bg-immich-gray dark:border-0 border-gray-200 border border-solid rounded-2xl flex flex-row w-full gap-2 p-4 md:ml-4 my-2 hover:bg-immich-primary/10 dark:hover:bg-immich-dark-primary/10 transition-all">
|
||||
<div className="flex flex-col flex-grow justify-between gap-2">
|
||||
<div className="flex gap-2 items-center">
|
||||
{cardIcon === 'immich' ? (
|
||||
<img src="/img/immich-logo.svg" height="30" className="rounded-none" />
|
||||
) : (
|
||||
<Icon path={cardIcon} size={1} color={item.iconColor} />
|
||||
)}
|
||||
<p className="m-0 mt-1 text-lg items-start flex gap-2 place-items-center content-center">
|
||||
<span>{item.title}</span>
|
||||
</p>
|
||||
</div>
|
||||
<p className="m-0 text-sm text-gray-600 dark:text-gray-300">{item.description}</p>
|
||||
</div>
|
||||
<div className="flex flex-col justify-between place-items-end">
|
||||
<span className="dark:text-immich-dark-primary text-immich-primary">
|
||||
{item.link && (
|
||||
<a href={item.link.url} target="_blank" rel="noopener">
|
||||
[{item.link.text}]
|
||||
</a>
|
||||
)}
|
||||
</span>
|
||||
<div className="md:hidden text-sm text-right">{dateLabel}</div>
|
||||
</div>
|
||||
</section>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
);
|
||||
}
|
||||
|
|
@ -1,110 +0,0 @@
|
|||
import React from 'react';
|
||||
import Layout from '@theme/Layout';
|
||||
function HomepageHeader() {
|
||||
return (
|
||||
<header>
|
||||
<section className="max-w-[900px] m-4 p-4 md:p-6 md:m-auto md:my-12 border border-red-400 rounded-2xl bg-slate-200 dark:bg-immich-dark-gray">
|
||||
<section>
|
||||
<h1>Privacy Policy</h1>
|
||||
<p>Last updated: July 31st 2024</p>
|
||||
<p>
|
||||
Welcome to Immich. We are committed to respecting your privacy. This Privacy Policy sets out how we collect,
|
||||
use, and share information when you use our Immich app.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
{/* 1. Scope of This Policy */}
|
||||
<section>
|
||||
<h2>1. Scope of This Policy</h2>
|
||||
<p>
|
||||
This Privacy Policy applies to the Immich app ("we", "our", or "us") and covers our collection, use, and
|
||||
disclosure of your information. This Policy does not cover any third-party websites, services, or
|
||||
applications that can be accessed through our app, or third-party services you may access through Immich.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
{/* 2. Information We Collect */}
|
||||
<section>
|
||||
<h2>2. Information We Collect</h2>
|
||||
<div>
|
||||
<p>
|
||||
<strong>Locally Stored Data</strong>: Immich stores all your photos, albums, settings, and locally on your
|
||||
device. We do not have access to this data, nor do we transmit or store it on any of our servers.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p>
|
||||
<strong>Purchase Information:</strong> When you make a purchase within the{' '}
|
||||
<a href="https://buy.immich.app">https://buy.immich.app</a>, we collect the following information for tax
|
||||
calculation purposes:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Country of origin</li>
|
||||
<li>Postal code (if the user is from Canada or the United States)</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* 3. Use of Your Information */}
|
||||
<section>
|
||||
<h2>3. Use of Your Information</h2>
|
||||
<p>
|
||||
<strong>Tax Calculation:</strong> The country of origin and postal code (for users from Canada or the United
|
||||
States) are collected solely for determining the applicable tax rates on your purchase.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
{/* 4. Sharing of Your Information */}
|
||||
<section>
|
||||
<h2>4. Sharing of Your Information</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Tax Authorities:</strong> The purchase information may be shared with tax authorities as required
|
||||
by law.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Payment Providers:</strong> The purchase information may be shared with payment providers where
|
||||
required.
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
{/* 5. Changes to This Policy */}
|
||||
<section>
|
||||
<h2>5. Changes to This Policy</h2>
|
||||
<p>
|
||||
We may update our Privacy Policy from time to time. If we make any changes, we will notify you by revising
|
||||
the "Last updated" date at the top of this policy. It's encouraged that users frequently check this page for
|
||||
any changes to stay informed about how we are helping to protect the personal information we collect.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
{/* 6. Contact Us */}
|
||||
<section>
|
||||
<h2>6. Contact Us</h2>
|
||||
<p>
|
||||
If you have any questions about this Privacy Policy, please contact us at{' '}
|
||||
<a href="mailto:immich@futo.org">immich@futo.org</a>
|
||||
</p>
|
||||
</section>
|
||||
</section>
|
||||
</header>
|
||||
);
|
||||
}
|
||||
|
||||
export default function Home(): JSX.Element {
|
||||
return (
|
||||
<Layout
|
||||
title="Home"
|
||||
description="immich Self-hosted photo and video backup solution directly from your mobile phone "
|
||||
noFooter={true}
|
||||
>
|
||||
<HomepageHeader />
|
||||
<div className="flex flex-col place-items-center place-content-center">
|
||||
<p>This project is available under GNU AGPL v3 license.</p>
|
||||
<p className="text-xs">Privacy should not be a luxury</p>
|
||||
</div>
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
1
docs/static/_redirects
vendored
1
docs/static/_redirects
vendored
|
|
@ -36,3 +36,4 @@
|
|||
/overview/welcome /overview/quick-start 307
|
||||
/docs/* /:splat 307
|
||||
/features/automatic-backup /features/mobile-backup 307
|
||||
/privacy-policy https://immich.app/privacy-policy 307
|
||||
|
|
|
|||
4
docs/static/archived-versions.json
vendored
4
docs/static/archived-versions.json
vendored
|
|
@ -1,4 +1,8 @@
|
|||
[
|
||||
{
|
||||
"label": "v3.1.0",
|
||||
"url": "https://docs.v3.1.0.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v3.0.3",
|
||||
"url": "https://docs.v3.0.3.archive.immich.app"
|
||||
|
|
|
|||
|
|
@ -11,15 +11,9 @@ module.exports = {
|
|||
colors: {
|
||||
// Light Theme
|
||||
'immich-primary': '#4250af',
|
||||
'immich-bg': '#f9f8fb',
|
||||
'immich-fg': 'black',
|
||||
'immich-gray': '#F6F6F4',
|
||||
|
||||
// Dark Theme
|
||||
'immich-dark-primary': '#adcbfa',
|
||||
'immich-dark-bg': '#000000',
|
||||
'immich-dark-fg': '#e5e7eb',
|
||||
'immich-dark-gray': '#111111',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ services:
|
|||
|
||||
redis:
|
||||
container_name: immich-e2e-redis
|
||||
image: docker.io/valkey/valkey:9@sha256:4963247afc4cd33c7d3b2d2816b9f7f8eeebab148d29056c2ca4d7cbc966f2d9
|
||||
image: docker.io/valkey/valkey:9@sha256:3acc0687f2a2e1091fae6450d7842dd658c941338cf0a873ddd9e14b9e4ea4dd
|
||||
healthcheck:
|
||||
test: redis-cli ping || exit 1
|
||||
|
||||
|
|
|
|||
|
|
@ -41,9 +41,18 @@ export default typescriptEslint.config([
|
|||
'@typescript-eslint/no-floating-promises': 'error',
|
||||
'unicorn/prefer-module': 'off',
|
||||
'unicorn/import-style': 'off',
|
||||
'unicorn/consistent-boolean-name': 'off',
|
||||
'unicorn/no-non-function-verb-prefix': 'off',
|
||||
'unicorn/no-unreadable-for-of-expression': 'off',
|
||||
'unicorn/max-nested-calls': 'off',
|
||||
'unicorn/prefer-uint8array-base64': 'off',
|
||||
'unicorn/isolated-functions': 'off',
|
||||
'unicorn/prefer-promise-with-resolvers': 'off',
|
||||
'unicorn/no-declarations-before-early-exit': 'off',
|
||||
'unicorn/prefer-simple-condition-first': 'off',
|
||||
curly: 2,
|
||||
'prettier/prettier': 0,
|
||||
'unicorn/prevent-abbreviations': 'off',
|
||||
'unicorn/name-replacements': 'off',
|
||||
'unicorn/filename-case': 'off',
|
||||
'unicorn/no-null': 'off',
|
||||
'unicorn/prefer-top-level-await': 'off',
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
[tasks.install]
|
||||
run = "pnpm install --filter immich-e2e --frozen-lockfile"
|
||||
run = "pnpm install --filter immich-e2e... --frozen-lockfile"
|
||||
|
||||
[tasks.build]
|
||||
dir = "{{ config_root }}"
|
||||
|
|
@ -40,18 +40,19 @@ run = "tsc --noEmit"
|
|||
|
||||
|
||||
[tasks.ci-setup]
|
||||
depends = [
|
||||
"//:sdk:install",
|
||||
"//:sdk:build",
|
||||
"//packages/cli:install",
|
||||
"//packages/cli:build",
|
||||
run = [
|
||||
{ task = "//:sdk:install" },
|
||||
{ task = "//:sdk:build" },
|
||||
{ task = "//packages/cli:install" },
|
||||
{ task = "//packages/cli:build" },
|
||||
{ task = ":install" },
|
||||
]
|
||||
run = { task = ":install" }
|
||||
|
||||
|
||||
[tasks.ci-unit]
|
||||
depends = ["//:sdk:install", "//:sdk:build"]
|
||||
run = [
|
||||
{ task = "//:sdk:install" },
|
||||
{ task = "//:sdk:build" },
|
||||
{ task = ":install" },
|
||||
{ task = ":format" },
|
||||
{ task = ":lint" },
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "immich-e2e",
|
||||
"version": "3.0.3",
|
||||
"version": "3.1.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
|
|
@ -40,7 +40,7 @@
|
|||
"eslint": "^10.0.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
"eslint-plugin-unicorn": "^64.0.0",
|
||||
"eslint-plugin-unicorn": "^72.0.0",
|
||||
"exiftool-vendored": "^35.0.0",
|
||||
"globals": "^17.0.0",
|
||||
"luxon": "^3.4.4",
|
||||
|
|
@ -51,7 +51,8 @@
|
|||
"sharp": "^0.34.5",
|
||||
"socket.io-client": "^4.7.4",
|
||||
"supertest": "^7.0.0",
|
||||
"typescript": "^6.0.0",
|
||||
"@typescript/native": "npm:typescript@^7.0.2",
|
||||
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
||||
"typescript-eslint": "^8.28.0",
|
||||
"utimes": "^5.2.1",
|
||||
"vitest": "^4.0.0"
|
||||
|
|
|
|||
|
|
@ -38,9 +38,6 @@ export const errorDto = {
|
|||
incorrectLogin: {
|
||||
message: 'Incorrect email or password',
|
||||
},
|
||||
alreadyHasAdmin: {
|
||||
message: 'The server already has an admin',
|
||||
},
|
||||
};
|
||||
|
||||
export const signupResponseDto = {
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ describe('/admin/database-backups', () => {
|
|||
const { status, body } = await request(app).post('/admin/database-backups/start-restore').send();
|
||||
|
||||
expect(status).toBe(400);
|
||||
expect(body).toEqual(errorDto.badRequest('The server already has an admin'));
|
||||
expect(body).toEqual(errorDto.badRequest('Admin setup is not available'));
|
||||
});
|
||||
|
||||
it.sequential('should enter maintenance mode in "database restore mode"', async () => {
|
||||
|
|
@ -118,7 +118,7 @@ describe('/admin/database-backups', () => {
|
|||
|
||||
expect(status).toBe(201);
|
||||
|
||||
cookie = headers['set-cookie'][0].split(';')[0];
|
||||
cookie = headers['set-cookie'][0].split(';', 1)[0];
|
||||
|
||||
await expect
|
||||
.poll(
|
||||
|
|
@ -224,7 +224,7 @@ describe('/admin/database-backups', () => {
|
|||
});
|
||||
|
||||
expect(status).toBe(201);
|
||||
cookie = headers['set-cookie'][0].split(';')[0];
|
||||
cookie = headers['set-cookie'][0].split(';', 1)[0];
|
||||
|
||||
await expect
|
||||
.poll(
|
||||
|
|
@ -295,7 +295,7 @@ describe('/admin/database-backups', () => {
|
|||
});
|
||||
|
||||
expect(status).toBe(201);
|
||||
cookie = headers['set-cookie'][0].split(';')[0];
|
||||
cookie = headers['set-cookie'][0].split(';', 1)[0];
|
||||
|
||||
await expect
|
||||
.poll(
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ describe('/admin/maintenance', () => {
|
|||
|
||||
expect(status).toBe(201);
|
||||
|
||||
cookie = headers['set-cookie'][0].split(';')[0];
|
||||
cookie = headers['set-cookie'][0].split(';', 1)[0];
|
||||
expect(cookie).toEqual(
|
||||
expect.stringMatching(/^immich_maintenance_token=[A-Za-z0-9-_]*\.[A-Za-z0-9-_]*\.[A-Za-z0-9-_]*$/),
|
||||
);
|
||||
|
|
@ -149,7 +149,7 @@ describe('/admin/maintenance', () => {
|
|||
const { status, body } = await request(app)
|
||||
.post('/admin/maintenance/login')
|
||||
.send({
|
||||
token: cookie!.split('=')[1].trim(),
|
||||
token: cookie!.split('=', 2)[1].trim(),
|
||||
});
|
||||
expect(status).toBe(201);
|
||||
expect(body).toEqual(
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ test.describe('Maintenance', () => {
|
|||
test('maintenance shows no options to users until they authenticate', async ({ page }) => {
|
||||
const setCookie = await utils.enterMaintenance(admin.accessToken);
|
||||
const cookie = setCookie
|
||||
?.map((cookie) => cookie.split(';')[0].split('='))
|
||||
?.map((cookie) => cookie.split(';', 1)[0].split('='))
|
||||
?.find(([name]) => name === 'immich_maintenance_token');
|
||||
|
||||
expect(cookie).toBeTruthy();
|
||||
|
|
|
|||
|
|
@ -120,6 +120,7 @@ describe('/albums', () => {
|
|||
}),
|
||||
]);
|
||||
|
||||
// eslint-disable-next-line unicorn/no-unreadable-array-destructuring
|
||||
[user2Albums[0]] = await Promise.all([
|
||||
getAlbumInfo({ id: user2Albums[0].id }, { headers: asBearerAuth(user2.accessToken) }),
|
||||
deleteUserAdmin({ id: user3.userId, userAdminDeleteDto: {} }, { headers: asBearerAuth(admin.accessToken) }),
|
||||
|
|
|
|||
|
|
@ -781,7 +781,7 @@ describe('/asset', () => {
|
|||
exifImageWidth: 4032,
|
||||
exifImageHeight: 3024,
|
||||
latitude: 41.2203,
|
||||
longitude: -96.071_625,
|
||||
longitude: -96.071625,
|
||||
make: 'Apple',
|
||||
model: 'iPhone 7',
|
||||
lensModel: 'iPhone 7 back camera 3.99mm f/1.8',
|
||||
|
|
@ -973,9 +973,9 @@ describe('/asset', () => {
|
|||
fileSizeInByte: 31_175_472,
|
||||
focalLength: 18.3,
|
||||
iso: 100,
|
||||
latitude: 36.613_24,
|
||||
latitude: 36.61324,
|
||||
lensModel: '18.3mm F2.8',
|
||||
longitude: -121.897_85,
|
||||
longitude: -121.89785,
|
||||
make: 'RICOH IMAGING COMPANY, LTD.',
|
||||
model: 'RICOH GR III',
|
||||
orientation: '1',
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ describe('/map', () => {
|
|||
country: 'United States of America',
|
||||
id: expect.any(String),
|
||||
lat: expect.closeTo(39.115),
|
||||
lon: expect.closeTo(-108.400_968),
|
||||
lon: expect.closeTo(-108.400968),
|
||||
state: 'Colorado',
|
||||
},
|
||||
{
|
||||
|
|
@ -83,7 +83,7 @@ describe('/map', () => {
|
|||
country: 'United States of America',
|
||||
id: expect.any(String),
|
||||
lat: expect.closeTo(41.2203),
|
||||
lon: expect.closeTo(-96.071_625),
|
||||
lon: expect.closeTo(-96.071625),
|
||||
state: 'Nebraska',
|
||||
},
|
||||
]);
|
||||
|
|
@ -123,7 +123,7 @@ describe('/map', () => {
|
|||
country: 'United States of America',
|
||||
id: expect.any(String),
|
||||
lat: expect.closeTo(39.115),
|
||||
lon: expect.closeTo(-108.400_968),
|
||||
lon: expect.closeTo(-108.400968),
|
||||
state: 'Colorado',
|
||||
},
|
||||
{
|
||||
|
|
@ -131,7 +131,7 @@ describe('/map', () => {
|
|||
country: 'United States of America',
|
||||
id: expect.any(String),
|
||||
lat: expect.closeTo(41.2203),
|
||||
lon: expect.closeTo(-96.071_625),
|
||||
lon: expect.closeTo(-96.071625),
|
||||
state: 'Nebraska',
|
||||
},
|
||||
]);
|
||||
|
|
@ -188,20 +188,20 @@ describe('/map', () => {
|
|||
const reverseGeocodeTestCases = [
|
||||
{
|
||||
name: 'Vaucluse',
|
||||
lat: -33.858_977_058_663_13,
|
||||
lon: 151.278_490_730_270_48,
|
||||
lat: -33.85897705866313,
|
||||
lon: 151.27849073027048,
|
||||
results: [{ city: 'Vaucluse', state: 'New South Wales', country: 'Australia' }],
|
||||
},
|
||||
{
|
||||
name: 'Ravenhall',
|
||||
lat: -37.765_732_399_174_75,
|
||||
lon: 144.752_453_164_883_3,
|
||||
lat: -37.76573239917475,
|
||||
lon: 144.7524531648833,
|
||||
results: [{ city: 'Ravenhall', state: 'Victoria', country: 'Australia' }],
|
||||
},
|
||||
{
|
||||
name: 'Scarborough',
|
||||
lat: -31.894_346_156_789_997,
|
||||
lon: 115.757_617_103_904_64,
|
||||
lat: -31.894346156789997,
|
||||
lon: 115.75761710390464,
|
||||
results: [{ city: 'Scarborough', state: 'Western Australia', country: 'Australia' }],
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ const loginWithOAuth = async (sub: OAuthUser | string, redirectUri?: string) =>
|
|||
});
|
||||
|
||||
// login
|
||||
const response1 = await redirect(url.replace(authServer.internal, authServer.external));
|
||||
const response1 = await redirect(url.replace(authServer.internal, () => authServer.external));
|
||||
const response2 = await request(authServer.external + response1.location)
|
||||
.post('')
|
||||
.set('Cookie', response1.cookies)
|
||||
|
|
|
|||
|
|
@ -87,23 +87,23 @@ describe('/search', () => {
|
|||
|
||||
// note: the coordinates here are not the actual coordinates of the images and are random for most of them
|
||||
const coordinates = [
|
||||
{ latitude: 48.853_41, longitude: 2.3488 }, // paris
|
||||
{ latitude: 35.6895, longitude: 139.691_71 }, // tokyo
|
||||
{ latitude: 52.524_37, longitude: 13.410_53 }, // berlin
|
||||
{ latitude: 1.314_663_1, longitude: 103.845_409_3 }, // singapore
|
||||
{ latitude: 41.013_84, longitude: 28.949_66 }, // istanbul
|
||||
{ latitude: 5.556_02, longitude: -0.1969 }, // accra
|
||||
{ latitude: 37.544_270_6, longitude: -4.727_752_8 }, // andalusia
|
||||
{ latitude: 23.133_02, longitude: -82.383_04 }, // havana
|
||||
{ latitude: 41.694_11, longitude: 44.833_68 }, // tbilisi
|
||||
{ latitude: 31.222_22, longitude: 121.458_06 }, // shanghai
|
||||
{ latitude: 48.85341, longitude: 2.3488 }, // paris
|
||||
{ latitude: 35.6895, longitude: 139.69171 }, // tokyo
|
||||
{ latitude: 52.52437, longitude: 13.41053 }, // berlin
|
||||
{ latitude: 1.3146631, longitude: 103.8454093 }, // singapore
|
||||
{ latitude: 41.01384, longitude: 28.94966 }, // istanbul
|
||||
{ latitude: 5.55602, longitude: -0.1969 }, // accra
|
||||
{ latitude: 37.5442706, longitude: -4.7277528 }, // andalusia
|
||||
{ latitude: 23.13302, longitude: -82.38304 }, // havana
|
||||
{ latitude: 41.69411, longitude: 44.83368 }, // tbilisi
|
||||
{ latitude: 31.22222, longitude: 121.45806 }, // shanghai
|
||||
{ latitude: 38.9711, longitude: -109.7137 }, // thompson springs
|
||||
{ latitude: 40.714_27, longitude: -74.005_97 }, // new york
|
||||
{ latitude: 47.040_57, longitude: 9.068_04 }, // glarus
|
||||
{ latitude: 32.771_52, longitude: -89.116_73 }, // philadelphia
|
||||
{ latitude: 31.634_16, longitude: -7.999_94 }, // marrakesh
|
||||
{ latitude: 38.523_735_4, longitude: -78.488_619_4 }, // tanners ridge
|
||||
{ latitude: 59.938_63, longitude: 30.314_13 }, // st. petersburg
|
||||
{ latitude: 40.71427, longitude: -74.00597 }, // new york
|
||||
{ latitude: 47.04057, longitude: 9.06804 }, // glarus
|
||||
{ latitude: 32.77152, longitude: -89.11673 }, // philadelphia
|
||||
{ latitude: 31.63416, longitude: -7.99994 }, // marrakesh
|
||||
{ latitude: 38.5237354, longitude: -78.4886194 }, // tanners ridge
|
||||
{ latitude: 59.93863, longitude: 30.31413 }, // st. petersburg
|
||||
{ latitude: 0, longitude: 0 }, // null island
|
||||
];
|
||||
|
||||
|
|
@ -112,7 +112,7 @@ describe('/search', () => {
|
|||
);
|
||||
|
||||
await Promise.all(updates);
|
||||
for (const [i] of coordinates.entries()) {
|
||||
for (const i of coordinates.keys()) {
|
||||
await utils.waitForWebsocketEvent({ event: 'assetUpdate', id: assets[i].id });
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import {
|
||||
LoginResponseDto,
|
||||
Permission,
|
||||
QueueName,
|
||||
createStack,
|
||||
deleteUserAdmin,
|
||||
|
|
@ -358,6 +359,31 @@ describe('/admin/users', () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe('GET /admin/users/:id/calendar-heatmap', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).get(`/admin/users/${nonAdmin.userId}/calendar-heatmap`);
|
||||
expect(status).toBe(401);
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
it('should require admin permissions', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get(`/admin/users/${nonAdmin.userId}/calendar-heatmap`)
|
||||
.set('Authorization', `Bearer ${nonAdmin.accessToken}`);
|
||||
expect(status).toBe(403);
|
||||
expect(body).toEqual(errorDto.forbidden);
|
||||
});
|
||||
|
||||
it('should require the AdminUserRead permission', async () => {
|
||||
const { secret } = await utils.createApiKey(admin.accessToken, [Permission.UserRead]);
|
||||
const { status, body } = await request(app)
|
||||
.get(`/admin/users/${nonAdmin.userId}/calendar-heatmap`)
|
||||
.set('x-api-key', secret);
|
||||
expect(status).toBe(403);
|
||||
expect(body).toEqual(errorDto.forbidden);
|
||||
});
|
||||
});
|
||||
|
||||
describe('POST /admin/users/:id/restore', () => {
|
||||
it('should require authentication', async () => {
|
||||
const { status, body } = await request(app).post(`/admin/users/${userToDelete.userId}/restore`);
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ describe(`immich login`, () => {
|
|||
it('should login and save auth.yml with 600', async () => {
|
||||
const admin = await utils.adminSetup();
|
||||
const key = await utils.createApiKey(admin.accessToken, [Permission.All]);
|
||||
const { stdout, stderr, exitCode } = await immichCli(['login', app, `${key.secret}`]);
|
||||
const { stdout, stderr, exitCode } = await immichCli(['login', app, key.secret]);
|
||||
expect(stdout.split('\n')).toEqual([
|
||||
'Logging in to http://127.0.0.1:2285/api',
|
||||
'Logged in as admin@immich.cloud',
|
||||
|
|
@ -48,7 +48,7 @@ describe(`immich login`, () => {
|
|||
it('should login without /api in the url', async () => {
|
||||
const admin = await utils.adminSetup();
|
||||
const key = await utils.createApiKey(admin.accessToken, [Permission.All]);
|
||||
const { stdout, stderr, exitCode } = await immichCli(['login', app.replaceAll('/api', ''), `${key.secret}`]);
|
||||
const { stdout, stderr, exitCode } = await immichCli(['login', app.replaceAll('/api', ''), key.secret]);
|
||||
expect(stdout.split('\n')).toEqual([
|
||||
'Logging in to http://127.0.0.1:2285',
|
||||
'Discovered API at http://127.0.0.1:2285/api',
|
||||
|
|
|
|||
|
|
@ -119,7 +119,9 @@ describe(`immich upload`, () => {
|
|||
const baseDir = `/tmp/upload/`;
|
||||
|
||||
const testPaths = Object.keys(files).map((filePath) => `${baseDir}/${filePath}`);
|
||||
testPaths.map((filePath) => utils.createImageFile(filePath));
|
||||
for (const filePath of testPaths) {
|
||||
utils.createImageFile(filePath);
|
||||
}
|
||||
|
||||
const commandLine = paths.map((argument) => `${baseDir}/${argument}`);
|
||||
|
||||
|
|
@ -135,7 +137,9 @@ describe(`immich upload`, () => {
|
|||
const assets = await getAssetStatistics({}, { headers: asKeyAuth(key) });
|
||||
expect(assets.total).toBe(expectedCount);
|
||||
|
||||
testPaths.map((filePath) => utils.removeImageFile(filePath));
|
||||
for (const filePath of testPaths) {
|
||||
utils.removeImageFile(filePath);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -646,7 +650,7 @@ describe(`immich upload`, () => {
|
|||
]);
|
||||
|
||||
expect(stdout).toBe('');
|
||||
expect(stderr).toEqual(`error: option '-n, --dry-run' cannot be used with option '-h, --skip-hash'`);
|
||||
expect(stderr).toEqual(`error: option '-n, --dry-run' cannot be used with option '--skip-hash'`);
|
||||
expect(exitCode).not.toBe(0);
|
||||
|
||||
const assets = await getAssetStatistics({}, { headers: asKeyAuth(key) });
|
||||
|
|
|
|||
|
|
@ -65,6 +65,10 @@ describe(`immich-admin`, () => {
|
|||
child.stdout.on('data', (chunk) => {
|
||||
data += chunk;
|
||||
if (data.includes('Please choose a new password (optional)')) {
|
||||
child.stdin.write('\n');
|
||||
}
|
||||
|
||||
if (data.includes('Invalidate existing sessions?')) {
|
||||
child.stdin.end('\n');
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export const randomImageFromString = async (
|
|||
let seedNumber = 0;
|
||||
for (let i = 0; i < seed.length; i++) {
|
||||
seedNumber = (seedNumber << 5) - seedNumber + (seed.codePointAt(i) ?? 0);
|
||||
seedNumber = seedNumber & seedNumber; // Convert to 32bit integer
|
||||
seedNumber &= seedNumber; // Convert to 32bit integer
|
||||
}
|
||||
return randomImage(new SeededRandom(Math.abs(seedNumber)), { width, height });
|
||||
};
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ export function generateAsset(
|
|||
const asset: MockTimelineAsset = {
|
||||
id: assetId,
|
||||
ownerId,
|
||||
ratio: Number.parseFloat(ratio.split(':')[0]) / Number.parseFloat(ratio.split(':')[1]),
|
||||
ratio: Number(ratio.split(':', 1)[0]) / Number(ratio.split(':', 2)[1]),
|
||||
thumbhash: generateThumbhash(rng),
|
||||
localDateTime: date.toISOString(),
|
||||
fileCreatedAt: date.toISOString(),
|
||||
|
|
@ -214,7 +214,7 @@ export function generateTimelineData(config: TimelineConfig): MockTimelineData {
|
|||
}
|
||||
|
||||
// Create a mock album from random assets
|
||||
const allAssets = [...buckets.values()].flat();
|
||||
const allAssets = buckets.values().toArray().flat();
|
||||
|
||||
// Select 10-30 random assets for the album (or all assets if less than 10)
|
||||
const albumSize = Math.min(allAssets.length, globalRng.nextInt(10, 31));
|
||||
|
|
|
|||
|
|
@ -172,11 +172,7 @@ function shouldIncludeAsset(
|
|||
if (isArchived !== undefined && actuallyArchived !== isArchived) {
|
||||
return false;
|
||||
}
|
||||
if (isFavorite !== undefined && actuallyFavorited !== isFavorite) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return isFavorite === undefined || actuallyFavorited === isFavorite;
|
||||
}
|
||||
/**
|
||||
* Get summary for all buckets (mimics getTimeBuckets API)
|
||||
|
|
@ -361,7 +357,7 @@ export function getAsset(
|
|||
owner?: UserResponseDto,
|
||||
): AssetResponseDto | undefined {
|
||||
// Search through all buckets for the asset
|
||||
const buckets = [...timelineData.buckets.values()];
|
||||
const buckets = timelineData.buckets.values().toArray();
|
||||
for (const assets of buckets) {
|
||||
const asset = assets.find((a) => a.id === assetId);
|
||||
if (asset) {
|
||||
|
|
@ -395,7 +391,7 @@ export function getAlbum(
|
|||
|
||||
// Get the actual asset objects from the timeline data
|
||||
const albumAssets: AssetResponseDto[] = [];
|
||||
const allAssets = [...timelineData.buckets.values()].flat();
|
||||
const allAssets = timelineData.buckets.values().toArray().flat();
|
||||
|
||||
for (const assetId of album.assetIds) {
|
||||
const assetConfig = allAssets.find((a) => a.id === assetId);
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ export function validateTimelineConfig(config: TimelineConfig): void {
|
|||
}
|
||||
|
||||
// Validate seed if provided
|
||||
if (config.seed !== undefined && (config.seed < 0 || !Number.isInteger(config.seed))) {
|
||||
if (config.seed !== undefined && (config.seed < 0 || !Number.isSafeInteger(config.seed))) {
|
||||
throw new Error('Seed must be a non-negative integer');
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -153,11 +153,8 @@ export function getMockAsset(
|
|||
const isInDifferentPeriod = (date1: DateTime, date2: DateTime): boolean => {
|
||||
if (unit === 'day') {
|
||||
return !date1.startOf('day').equals(date2.startOf('day'));
|
||||
} else if (unit === 'month') {
|
||||
return date1.year !== date2.year || date1.month !== date2.month;
|
||||
} else {
|
||||
return date1.year !== date2.year;
|
||||
}
|
||||
return unit === 'month' ? date1.year !== date2.year || date1.month !== date2.month : date1.year !== date2.year;
|
||||
};
|
||||
|
||||
if (direction === 'next') {
|
||||
|
|
|
|||
|
|
@ -40,7 +40,8 @@ export const setupTimelineMockApiRoutes = async (
|
|||
contentType: 'application/json',
|
||||
json: getTimeBuckets(timelineRestData, isTrashed, isArchived, isFavorite, albumId, changes),
|
||||
});
|
||||
} else if (pathname === '/api/timeline/bucket') {
|
||||
}
|
||||
if (pathname === '/api/timeline/bucket') {
|
||||
const timeBucket = url.searchParams.get('timeBucket');
|
||||
if (!timeBucket) {
|
||||
return route.continue();
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ test.describe('asset-viewer', () => {
|
|||
assets.push(...timeBucket);
|
||||
}
|
||||
for (const yearMonth of timelineRestData.buckets.keys()) {
|
||||
const [year, month] = yearMonth.split('-');
|
||||
const [year, month] = yearMonth.split('-', 2);
|
||||
yearMonths.push(`${year}-${Number(month)}`);
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
/* eslint-disable unicorn/no-this-outside-of-class */
|
||||
import type { AssetResponseDto } from '@immich/sdk';
|
||||
import { expect, Page } from '@playwright/test';
|
||||
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ test.describe('Timeline', () => {
|
|||
assets.push(...timeBucket);
|
||||
}
|
||||
for (const yearMonth of timelineRestData.buckets.keys()) {
|
||||
const [year, month] = yearMonth.split('-');
|
||||
const [year, month] = yearMonth.split('-', 2);
|
||||
yearMonths.push(`${year}-${Number(month)}`);
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ export const sleep = (ms: number) => {
|
|||
};
|
||||
|
||||
export const padYearMonth = (yearMonth: string) => {
|
||||
const [year, month] = yearMonth.split('-');
|
||||
const [year, month] = yearMonth.split('-', 2);
|
||||
return `${year}-${month.padStart(2, '0')}`;
|
||||
};
|
||||
|
||||
|
|
@ -72,6 +72,7 @@ export const thumbnailUtils = {
|
|||
},
|
||||
async queryThumbnailInViewport(page: Page, collector: (assetId: string) => boolean) {
|
||||
const assetIds: string[] = [];
|
||||
// eslint-disable-next-line unicorn/no-this-outside-of-class
|
||||
for (const thumb of await this.locator(page).all()) {
|
||||
const box = await thumb.boundingBox();
|
||||
if (box) {
|
||||
|
|
@ -151,6 +152,7 @@ export const timelineUtils = {
|
|||
page.evaluate(() => {
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
|
||||
return document.querySelector('#asset-grid').scrollTop;
|
||||
});
|
||||
await expect.poll(queryTop).toBeGreaterThan(0);
|
||||
|
|
@ -177,6 +179,7 @@ export const assetViewerUtils = {
|
|||
page.evaluate(() => {
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
// eslint-disable-next-line unicorn/no-optional-chaining-on-undeclared-variable
|
||||
return document.activeElement?.dataset?.asset;
|
||||
});
|
||||
await expect(poll(page, activeElement, (result) => result === assetId)).resolves.toBe(assetId);
|
||||
|
|
@ -220,7 +223,7 @@ export const pageUtils = {
|
|||
await section.locator('.w-8').click();
|
||||
},
|
||||
async pauseTestDebug() {
|
||||
console.log('NOTE: pausing test indefinately for debug');
|
||||
console.log('NOTE: pausing test indefinitely for debug');
|
||||
await new Promise(() => void 0);
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
/* eslint-disable unicorn/no-top-level-assignment-in-function */
|
||||
import {
|
||||
AssetMediaCreateDto,
|
||||
AssetMediaResponseDto,
|
||||
|
|
@ -177,7 +178,7 @@ export const utils = {
|
|||
resetDatabase: async (tables?: string[]) => {
|
||||
client = await utils.connectDatabase();
|
||||
|
||||
tables = tables || [
|
||||
tables ||= [
|
||||
// TODO e2e test for deleting a stack, since it is quite complex
|
||||
'stack',
|
||||
'library',
|
||||
|
|
@ -304,7 +305,7 @@ export const utils = {
|
|||
},
|
||||
|
||||
adminSetup: async (options?: AdminSetupOptions) => {
|
||||
options = options || { onboarding: true };
|
||||
options ||= { onboarding: true };
|
||||
|
||||
await signUpAdmin({ signUpDto: signupDto.admin });
|
||||
const response = await login({ loginCredentialDto: loginDto.admin });
|
||||
|
|
@ -545,6 +546,7 @@ export const utils = {
|
|||
{
|
||||
headers: asBearerAuth(accessToken),
|
||||
fetch: (...args: Parameters<typeof fetch>) =>
|
||||
// eslint-disable-next-line unicorn/no-invalid-argument-count, unicorn/prefer-await
|
||||
fetch(...args).then((response) => {
|
||||
setCookie = response.headers.getSetCookie();
|
||||
return response;
|
||||
|
|
@ -674,7 +676,7 @@ export const utils = {
|
|||
|
||||
cliLogin: async (accessToken: string) => {
|
||||
const key = await utils.createApiKey(accessToken, [Permission.All]);
|
||||
await immichCli(['login', app, `${key.secret}`]);
|
||||
await immichCli(['login', app, key.secret]);
|
||||
return key.secret;
|
||||
},
|
||||
|
||||
|
|
@ -706,6 +708,7 @@ export const utils = {
|
|||
},
|
||||
};
|
||||
|
||||
// eslint-disable-next-line unicorn/no-top-level-side-effects
|
||||
utils.initSdk();
|
||||
|
||||
if (!existsSync(`${testAssetDir}/albums`)) {
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
"allowSyntheticDefaultImports": true,
|
||||
"resolveJsonModule": true,
|
||||
"target": "es2023",
|
||||
"lib": ["dom", "ESNext"],
|
||||
"sourceMap": true,
|
||||
"outDir": "./dist",
|
||||
"incremental": true,
|
||||
|
|
|
|||
25
i18n/af.json
25
i18n/af.json
|
|
@ -23,6 +23,7 @@
|
|||
"add_location": "Voeg ligging toe",
|
||||
"add_partner": "Voeg vennoot toe",
|
||||
"add_photos": "Voeg foto’s toe",
|
||||
"add_step": "Voeg stap by",
|
||||
"add_tag": "Voeg etiket toe",
|
||||
"add_to": "Voeg toe tot…",
|
||||
"add_to_album": "Voeg toe tot album",
|
||||
|
|
@ -49,6 +50,7 @@
|
|||
"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_1_description": "kopie in die wolk of op 'n ander fisiese plek.",
|
||||
"backup_onboarding_2_description": "plaaslike kopieë op verskillende toestelle. Dit sluit die hooflêers en ’n rugsteun van daardie lêers plaaslik in.",
|
||||
"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 <backblaze-link>3-2-1-rugsteunstrategie</backblaze-link> 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.",
|
||||
|
|
@ -71,6 +73,7 @@
|
|||
"cron_expression_description": "Stel die skanderingsinterval in met die cron-formaat. Kyk gerus na bv. <link>Crontab Guru</link> vir meer inligting",
|
||||
"cron_expression_presets": "Cron-uitdrukking voorafinstellings",
|
||||
"disable_login": "Deaktiveer aantekening",
|
||||
"download_csv": "Laai CSV af",
|
||||
"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.",
|
||||
"export_config_as_json_description": "Laai die huidige stelselkonfigurasie af as ’n JSON‑lêer",
|
||||
|
|
@ -84,12 +87,18 @@
|
|||
"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_fullsize_enabled_description": "Genereer 'n volformaat-beeld vir formate wat nie webvriendelik is nie. Wanneer \"Verkies ingebedde voorskou\" geaktiveer is, word ingebedde voorskoue direk gebruik sonder omskakeling. Dit het geen invloed op webvriendelike formate soos JPEG nie.",
|
||||
"image_fullsize_quality_description": "Beeldgehalte op volle grootte van 1 tot 100. Hoër is beter, maar lewer groter lêers op.",
|
||||
"image_fullsize_title": "Instellings vir volformaat-beeld",
|
||||
"image_prefer_embedded_preview": "Verkies ingebedde voorskou",
|
||||
"image_prefer_embedded_preview_setting_description": "Gebruik ingebedde voorskoue in RAW-foto's as invoer vir beeldverwerking wanneer dit beskikbaar is. Dit kan vir sommige beelde akkurater kleure lewer, maar die gehalte van die voorskou hang van die kamera af en die beeld kan meer kompressie-artefakte vertoon.",
|
||||
"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_progressive": "Progresiewe",
|
||||
"image_progressive_description": "Kodeer JPEG-beelde progressief vir geleidelike laai en vertoning. Dit het geen uitwerking op WebP-beelde nie.",
|
||||
"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 die toep vertraag.",
|
||||
|
|
@ -98,6 +107,22 @@
|
|||
"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",
|
||||
"import_config_from_json_description": "Voer stelselkonfigurasie in deur 'n JSON-konfigurasielêer op te laai",
|
||||
"integrity_checks_checksum_files": "kontrolesomlêer",
|
||||
"integrity_checks_checksum_files_description": "Konfigureer die kontrolesom-kontrole",
|
||||
"integrity_checks_checksum_files_enable_description": "Aktiveer die kontrolesom-kontrolering",
|
||||
"integrity_checks_checksum_files_percentage_limit": "Persentasie limiet",
|
||||
"integrity_checks_checksum_files_percentage_limit_description": "Konfigureer die maksimum persentasie tussen 0.01 en 1 vir die mate waarin die kontrolesom-kontrole tydens elke interval uitgevoer moet word.",
|
||||
"integrity_checks_checksum_files_time_limit": "Tyd limiet",
|
||||
"integrity_checks_checksum_files_time_limit_description": "Konfigureer die maksimum duur waarvoor die kontrolesom-kontrole tydens elke interval moet loop. (ms)",
|
||||
"integrity_checks_missing_files": "Ontbrekende lêers",
|
||||
"integrity_checks_missing_files_description": "Konfigureer die frekwensie en aktiveer of deaktiveer die kontrole vir ontbrekende lêers",
|
||||
"integrity_checks_missing_files_enable_description": "Aktiveer die kontrole vir ontbrekende lêers",
|
||||
"integrity_checks_settings": "integriteitskontroles",
|
||||
"integrity_checks_settings_description": "Bestuur tussenposes vir integriteitskontroles",
|
||||
"integrity_checks_untracked_files": "Ongevokgde lêers",
|
||||
"integrity_checks_untracked_files_description": "Konfigureer die frekwensie en aktiveer of deaktiveer die kontrole vir ongevolgde lêers",
|
||||
"integrity_checks_untracked_files_enable_description": "Aktiveer die kontrole van ongevolgde lêers",
|
||||
"job_concurrency": "{job} gelyktydigheid",
|
||||
"job_created": "Taak geskep",
|
||||
"job_not_concurrency_safe": "Hierdie taak kan nie gelyktydig uitgevoer word nie.",
|
||||
|
|
|
|||
55
i18n/ar.json
55
i18n/ar.json
|
|
@ -108,6 +108,21 @@
|
|||
"image_thumbnail_quality_description": "تتراوح جودة الصورة المصغرة من 1 إلى 100. كلما كانت الجودة أعلى كان ذلك أفضل، ولكنها تنتج ملفات أكبر وقد تقلل من استجابة التطبيق.",
|
||||
"image_thumbnail_title": "إعدادات الصورة المصغرة",
|
||||
"import_config_from_json_description": "استيراد اعدادات النظام بتحميل ملف اعدادات بصيغة JSON",
|
||||
"integrity_checks_checksum_files": "ملفات الجمع التحققي",
|
||||
"integrity_checks_checksum_files_description": "ضبط التحقق من الجمع التحققي",
|
||||
"integrity_checks_checksum_files_enable_description": "تفعيل التحقق من الجمع التحققي",
|
||||
"integrity_checks_checksum_files_percentage_limit": "حد النسبه المئويه",
|
||||
"integrity_checks_checksum_files_percentage_limit_description": "ضبط الحد الاعلى النسبه المئويه بين 0.01 و 1 لتحديد كم يجب ان يعمل التحقق من الجمع التحققي بكل فتره.",
|
||||
"integrity_checks_checksum_files_time_limit": "الحد الزمني",
|
||||
"integrity_checks_checksum_files_time_limit_description": "قم بضبط الحد الأقصى للمدة التي يجب أن تستغرقها عملية التحقق من المجموع الاختباري (checksum) في كل فاصل زمني. (بالملي ثانية)",
|
||||
"integrity_checks_missing_files": "ملفات مفقودة",
|
||||
"integrity_checks_missing_files_description": "ضبط وتيرة الفحص وتفعيل أو تعطيل فحص الملفات المفقودة",
|
||||
"integrity_checks_missing_files_enable_description": "تفعيل فحص الملفات المفقودة",
|
||||
"integrity_checks_settings": "فحوصات السلامه",
|
||||
"integrity_checks_settings_description": "إدارة فترات التحقق من السلامة",
|
||||
"integrity_checks_untracked_files": "ملفات غير متعقبه",
|
||||
"integrity_checks_untracked_files_description": "قم بضبط التردد وتفعيل أو تعطيل فحص الملفات غير المتعقبة",
|
||||
"integrity_checks_untracked_files_enable_description": "قم بتمكين فحص الملفات غير المتعقبة",
|
||||
"job_concurrency": "تزامن {job}",
|
||||
"job_created": "تم إنشاء الوظيفة",
|
||||
"job_not_concurrency_safe": "هذه الوظيفة غير آمنة للتشغيل المتزامن.",
|
||||
|
|
@ -416,6 +431,10 @@
|
|||
"transcoding_realtime_description": "يتيح إجراء تحويل الترميز في الوقت الفعلي أثناء بث الفيديو. كما يمكّن من تبديل الجودة، ولكنه قد يتسبب في زيادة زمن تأخير التشغيل وحدوث تقطيع، اعتماداً على قدرات الخادم.",
|
||||
"transcoding_realtime_enabled": "تفعيل تحويل الترميز في الوقت الفعلي",
|
||||
"transcoding_realtime_enabled_description": "في حال تعطيله، سيرفض الخادم بدء جلسات تحويل ترميز جديدة في الوقت الفعلي.",
|
||||
"transcoding_realtime_resolutions": "دقق",
|
||||
"transcoding_realtime_resolutions_description": "الدقة المتاحة للتحويل الفوري للترميز. قد تتسبب الدقة الأعلى في مشاكل في التشغيل إذا لم يتمكن الخادم من تحويلها بالسرعة الكافية.",
|
||||
"transcoding_realtime_video_codecs": "ترميزات الفيديو",
|
||||
"transcoding_realtime_video_codecs_description": "برامج ترميز الفيديو المقدمة لتحويل الترميز في الوقت الحقيقي. سيختار العملاء الخيار الأفضل الذي يدعمونه أثناء التشغيل. AV1 أكثر كفاءة من HEVC، وهو أكثر كفاءة من H.264. عند استخدام تسريع الأجهزة، حدد فقط برامج الترميز التي يمكن للمسرع تشفيرها. عند استخدام تحويل ترميز البرنامج، لاحظ أن H.264 أسرع من AV1، وهو أسرع من HEVC.",
|
||||
"transcoding_reference_frames": "الإطارات المرجعية",
|
||||
"transcoding_reference_frames_description": "عدد الإطارات التي يجب الرجوع إليها عند ضغط إطار معين. تعمل القيم الأعلى على تحسين كفاءة الضغط، ولكنها تبطئ عملية التشفير. 0 يضبط هذه القيمة تلقائيًا.",
|
||||
"transcoding_required_description": "فقط مقاطع الفيديو ذات التنسيق غير المقبول",
|
||||
|
|
@ -578,6 +597,7 @@
|
|||
"asset_viewer_settings_title": "عارض الأصول",
|
||||
"assets": "المحتويات",
|
||||
"assets_added_to_album_count": "تمت إضافة {count, plural, one {# الأصل} other {# الأصول}} إلى الألبوم",
|
||||
"assets_added_to_album_partial_count": "تمت إضافة {successCount} من أصل {totalCount} {totalCount, plural, one {asset} other {assets}} إلى الألبوم",
|
||||
"assets_added_to_albums_count": "تمت اضافة {assetTotal, plural, one {# اصل} other {# اصول}} to {albumTotal, plural, one {# البوم} other {# البومات}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Asset} other {Assets}} لايمكن اضافته الى الالبوم",
|
||||
"assets_cannot_be_added_to_albums": "{count, plural, one {اصل} other {اصول}} لا يمكن إضافته إلى أي من الألبومات",
|
||||
|
|
@ -733,7 +753,7 @@
|
|||
"confirm_delete_face": "هل أنت متأكد من حذف وجه {name} من الأصول؟",
|
||||
"confirm_delete_shared_link": "هل أنت متأكد أنك تريد حذف هذا الرابط المشترك؟",
|
||||
"confirm_keep_this_delete_others": "سيتم حذف جميع الأصول الأخرى في المجموعة باستثناء هذا الأصل. هل أنت متأكد من أنك تريد المتابعة؟",
|
||||
"confirm_new_pin_code": "ثبت رمز PIN الجديد",
|
||||
"confirm_new_pin_code": "تأكيد رمز PIN الجديد",
|
||||
"confirm_password": "تأكيد كلمة المرور",
|
||||
"confirm_tag_face": "هل تريد وضع علامة على هذا الوجه {name}؟",
|
||||
"confirm_tag_face_unnamed": "هل تريد وضع علامة على هذا الوجه؟",
|
||||
|
|
@ -794,7 +814,6 @@
|
|||
"custom_date": "تاريخ مخصص",
|
||||
"custom_locale": "لغة مخصصة",
|
||||
"custom_locale_description": "تنسيق التواريخ, الأوقات والأرقام بناءً على اللغة والمنطقة المختاره",
|
||||
"custom_url": "رابط مخصص",
|
||||
"cutoff_date_description": "احتفظ بالصور من آخر…",
|
||||
"cutoff_day": "{count, plural, one {يوم} other {ايام}}",
|
||||
"cutoff_year": "{count, plural, one {سنة} other {سنوات}}",
|
||||
|
|
@ -1303,9 +1322,9 @@
|
|||
"login_form_failed_login": "خطأ في تسجيل الدخول ، تحقق من عنوان URL للخادم والبريد الإلكتروني وكلمة المرور",
|
||||
"login_form_handshake_exception": "كان هناك استثناء مصافحة مع الخادم.تمكين دعم الشهادة الموقعة ذاتيا في الإعدادات إذا كنت تستخدم شهادة موقعة ذاتيا.",
|
||||
"login_form_password_hint": "كلمة المرور",
|
||||
"login_form_server_empty": "أدخل عنوان URL الخادم.",
|
||||
"login_form_server_error": "تعذر الاتصال بالخادم.",
|
||||
"login_has_been_disabled": "تم تعطيل تسجيل الدخول.",
|
||||
"login_form_server_empty": "أدخل عنوان URL الخادم",
|
||||
"login_form_server_error": "تعذر الاتصال بالخادم",
|
||||
"login_has_been_disabled": "تم تعطيل تسجيل الدخول",
|
||||
"login_password_changed_error": "كان هناك خطأ في تحديث كلمة المرور الخاصة بك",
|
||||
"login_password_changed_success": "تم تحديث كلمة السر بنجاح",
|
||||
"logout_all_device_confirmation": "هل أنت متأكد أنك تريد تسجيل الخروج من جميع الأجهزة؟",
|
||||
|
|
@ -1356,6 +1375,7 @@
|
|||
"map_location_picker_page_use_location": "استخدم هذا الموقع",
|
||||
"map_location_service_disabled_content": "يجب تمكين خدمة الموقع لعرض الأصول من موقعك الحالي.هل تريد تمكينه الآن؟",
|
||||
"map_location_service_disabled_title": "خدمة الموقع معطل",
|
||||
"map_marker_for_image": "علامة على الخريطة للصورة الملتقطة في {city}, {country}",
|
||||
"map_marker_with_image": "علامة الخريطة مع الصورة",
|
||||
"map_no_location_permission_content": "هناك حاجة إلى إذن الموقع لعرض الأصول من موقعك الحالي.هل تريد السماح به الآن؟",
|
||||
"map_no_location_permission_title": "تم رفض إذن الموقع",
|
||||
|
|
@ -1460,6 +1480,7 @@
|
|||
"never": "أبداً",
|
||||
"new_album": "البوم جديد",
|
||||
"new_api_key": "مفتاح API جديد",
|
||||
"new_feature": "ميزة جديدة",
|
||||
"new_password": "كلمة المرور الجديدة",
|
||||
"new_person": "شخص جديد",
|
||||
"new_pin_code": "رمز PIN الجديد",
|
||||
|
|
@ -1503,9 +1524,13 @@
|
|||
"not_available": "غير متاح",
|
||||
"not_in_any_album": "ليست في أي ألبوم",
|
||||
"not_selected": "لم يختار",
|
||||
"not_set": "غير محدد",
|
||||
"notes": "ملاحظات",
|
||||
"nothing_here_yet": "لا يوجد شيء هنا بعد",
|
||||
"notification_backup_reliability": "فعل الإشعارات للزيادة من استقرار النسخ الاحتياطي في الخلفية",
|
||||
"notification_enabled_list_tile_content": "يستخدم تطبيق Immich الإشعارات لإجراء النسخ الاحتياطي في الخلفية. يمكنك إدارتها من إعدادات جهازك.",
|
||||
"notification_enabled_list_tile_open_button": "افتح الاعدادات",
|
||||
"notification_enabled_list_tile_title": "تم تفعيل الاشعارات",
|
||||
"notification_permission_dialog_content": "لتمكين الإخطارات ، انتقل إلى الإعدادات و اختار السماح.",
|
||||
"notification_permission_list_tile_content": "منح إذن لتمكين الإخطارات.",
|
||||
"notification_permission_list_tile_enable_button": "تمكين الإخطارات",
|
||||
|
|
@ -1517,6 +1542,8 @@
|
|||
"obtainium_configurator": "مُهيئ Obtainium",
|
||||
"obtainium_configurator_instructions": "استخدم Obtainium لتثبيت تطبيق Android وتحديثه مباشرةً من صفحة إصدارات Immich على GitHub. أنشئ مفتاح API واختر الإصدار المناسب لإنشاء رابط تهيئة Obtainium الخاص بك",
|
||||
"ocr": "التعرف البصري على الحروف",
|
||||
"ocr_body": "Immich الآن بقراءة النصوص الموجودة داخل صورك، لذا يمكنك البحث عنها من خلال ما تقوله.",
|
||||
"ocr_title": "ابحث عن النص في صورك",
|
||||
"official_immich_resources": "الموارد الرسمية لشركة Immich",
|
||||
"offline": "غير متصل",
|
||||
"offset": "ازاحة",
|
||||
|
|
@ -1535,6 +1562,8 @@
|
|||
"open": "فتح",
|
||||
"open_calendar": "افتح الرزنامة",
|
||||
"open_in_browser": "فتح في متصفح",
|
||||
"open_in_immich_body": "قم بتعيين Immich كمعرض الصور الخاص بك على Android لفتح الصور مباشرة من التطبيقات الأخرى.",
|
||||
"open_in_immich_title": "افتح الصور في Immich",
|
||||
"open_in_map_view": "فتح في عرض الخريطة",
|
||||
"open_in_openstreetmap": "فتح في OpenStreetMap",
|
||||
"open_the_search_filters": "افتح مرشحات البحث",
|
||||
|
|
@ -1693,7 +1722,10 @@
|
|||
"recent": "حديث",
|
||||
"recent_searches": "عمليات البحث الأخيرة",
|
||||
"recently_added": "اضيف مؤخرا",
|
||||
"recently_added_body": "انتقل مباشرةً إلى كل ما أضفته مؤخراً على صفحة مخصصة.",
|
||||
"recently_added_description": "تصفح ممتلكاتك مرتبة حسب تاريخ تحميلها إلى Immich",
|
||||
"recently_added_page_title": "أضيف مؤخرا",
|
||||
"recently_added_title": "إضاف مؤخراً",
|
||||
"recently_taken": "تم التقاطها مؤخرًا",
|
||||
"refresh": "تحديث",
|
||||
"refresh_encoded_videos": "تحديث مقاطع الفيديو المشفرة",
|
||||
|
|
@ -1900,6 +1932,8 @@
|
|||
"share_link": "مشاركة رابط",
|
||||
"share_original": "استخدام الملف الأصلي",
|
||||
"share_preview": "استخدام الصورة المصغرة",
|
||||
"share_quality_body": "اضغط مع الاستمرار على زر المشاركة لاختيار جودة الصورة قبل مشاركتها.",
|
||||
"share_quality_title": "اختر جودة المشاركة التي تناسبك",
|
||||
"shared": "مُشتَرك",
|
||||
"shared_album_activities_input_disable": "التعليق معطل",
|
||||
"shared_album_activity_remove_content": "هل تريد حذف هذا النشاط؟",
|
||||
|
|
@ -1915,6 +1949,8 @@
|
|||
"shared_link_clipboard_copied_massage": "نسخ إلى الحافظة",
|
||||
"shared_link_create_error": "خطأ أثناء إنشاء رابط مشترك",
|
||||
"shared_link_custom_url_description": "الوصول إلى هذا الرابط المشترك باستخدام عنوان URL مخصص",
|
||||
"shared_link_custom_url_title": "عنوان URL مخصص",
|
||||
"shared_link_custom_url_warning": "تحذير: قد لا يتصرف اسم عنوان URL المخصص الذي يحتوي على شرطة مائلة للأمام كما تتوقع.",
|
||||
"shared_link_edit_description_hint": "أدخل وصف المشاركة",
|
||||
"shared_link_edit_expire_after_option_day": "يوم 1",
|
||||
"shared_link_edit_expire_after_option_days": "{count} ايام",
|
||||
|
|
@ -1981,16 +2017,19 @@
|
|||
"sign_out": "خروج",
|
||||
"sign_up": "التسجيل",
|
||||
"size": "الحجم",
|
||||
"skip": "تخطي",
|
||||
"skip_to_content": "تخطي إلى المحتوى",
|
||||
"skip_to_folders": "تخطي إلى المجلدات",
|
||||
"skip_to_tags": "تخطي إلى العلامات",
|
||||
"slideshow": "عرض الشرائح",
|
||||
"slideshow_body": "استرخِ وشاهد صورك تُعرض في عرض الشرائح بملء الشاشة.",
|
||||
"slideshow_metadata_overlay_mode": "محتوى التراكب",
|
||||
"slideshow_metadata_overlay_mode_description_only": "وصف فقط",
|
||||
"slideshow_metadata_overlay_mode_full": "كامل",
|
||||
"slideshow_repeat": "اعادة عرض الشرائح",
|
||||
"slideshow_repeat_description": "العودة إلى البداية عند انتهاء عرض الشرائح",
|
||||
"slideshow_settings": "إعدادات عرض الشرائح",
|
||||
"slideshow_title": "عرض الشرائح",
|
||||
"smart_album": "ألبوم ذكي",
|
||||
"some_assets_already_have_a_location_warning": "بعض الملفات المحددة تحتوي بالفعل على موقع جغرافي",
|
||||
"sort_albums_by": "رتب الألبومات حسب...",
|
||||
|
|
@ -2118,6 +2157,7 @@
|
|||
"unknown": "غير معروف",
|
||||
"unknown_country": "بلد غير معروف",
|
||||
"unknown_date": "تاريخ غير معروف",
|
||||
"unknown_schema": "مخطط غير معروف",
|
||||
"unknown_year": "سنة غير معروفة",
|
||||
"unlimited": "غير محدود",
|
||||
"unlink_motion_video": "إلغاء ربط فيديو الحركة",
|
||||
|
|
@ -2153,6 +2193,8 @@
|
|||
"upload_status_errors": "الأخطاء",
|
||||
"upload_status_uploaded": "تم الرفع",
|
||||
"upload_success": "تم الرفع بنجاح، قم بتحديث الصفحة لرؤية المحتويات المرفوعة الجديدة.",
|
||||
"upload_to_album_body": "بالنسبة للمستخدمين الذين لا يستخدمون ميزة التحميل اليدوي، يمكنك الآن اختيار إضافة الصور المحلية مباشرة إلى الألبوم أثناء تحميلها، ولا داعي للتحميل ثم الإضافة إلى ألبوم لاحقًا بعد الآن.",
|
||||
"upload_to_album_title": "قم بالتحميل مباشرة إلى ألبوم",
|
||||
"upload_to_immich": "الرفع الىImmich ({count})",
|
||||
"uploading": "جاري الرفع",
|
||||
"uploading_media": "رفع الوسائط",
|
||||
|
|
@ -2220,6 +2262,9 @@
|
|||
"week": "أسبوع",
|
||||
"welcome": "مرحباً",
|
||||
"welcome_to_immich": "مرحباً بك في Immich",
|
||||
"whats_new": "ما الجديد",
|
||||
"whats_new_settings_subtitle": "تعرف على كل ما هو جديد في Immich",
|
||||
"whats_new_version": "الإصدار {version}",
|
||||
"when": "عندما",
|
||||
"width": "عُرض",
|
||||
"wifi_name": "اسم شبكة Wi-Fi",
|
||||
|
|
|
|||
56
i18n/az.json
56
i18n/az.json
|
|
@ -23,6 +23,7 @@
|
|||
"add_location": "Məkan əlavə et",
|
||||
"add_partner": "Partnyor əlavə et",
|
||||
"add_photos": "Şəkillər əlavə et",
|
||||
"add_step": "Addım əlavə et",
|
||||
"add_tag": "Etiket əlavə et",
|
||||
"add_to": "Bura əlavə et…",
|
||||
"add_to_album": "Alboma əlavə et",
|
||||
|
|
@ -44,7 +45,7 @@
|
|||
"authentication_settings": "Səlahiyyətləndirmə parametrləri",
|
||||
"authentication_settings_description": "Şifrə, OAuth və digər səlahiyyətləndirmə parametrləri",
|
||||
"authentication_settings_disable_all": "Bütün giriş etmə metodlarını söndürmək istədiyinizdən əminsinizmi? Giriş etmə funksiyası tamamilə söndürüləcəkdir.",
|
||||
"authentication_settings_reenable": "Yenidən aktiv etmək üçün <link> Server Əmri</link>-ni istifadə edin.",
|
||||
"authentication_settings_reenable": "Yenidən aktiv etmək üçün <link>Server Əmri</link> istifadə edin.",
|
||||
"background_task_job": "Arxa plan tapşırıqları",
|
||||
"backup_database": "Verilənlər bazasının dump-ını yaradın",
|
||||
"backup_database_enable_description": "Verilənlər bazasının artıq nüsxələrini aktiv et",
|
||||
|
|
@ -57,10 +58,11 @@
|
|||
"backup_onboarding_parts_title": "3-2-1 ehtiyat nüsxəsinə aşağıdakılar daxildir:",
|
||||
"backup_onboarding_title": "Ehtiyat surətlər",
|
||||
"backup_settings": "Bazanın Dump Parametrləri",
|
||||
"backup_settings_description": "Verilənlər bazasının ehtiyat nüsxə parametrlərini idarə et",
|
||||
"backup_settings_description": "Verilənlər bazasının ehtiyat nüsxə parametrləri.",
|
||||
"cleared_jobs": "{job} üçün tapşırıqlar silindi",
|
||||
"config_set_by_file": "Konfiqurasiya hal-hazırda konfiqurasiya faylı ilə təyin olunub",
|
||||
"confirm_delete_library": "{library} kitabxanasını silmək istədiyinizə əminmisiniz?",
|
||||
"confirm_delete_library_assets": "Bu kitabxananı silmək istədiyinizə əminsiniz? {count, plural, one {# contained asset} other {all # contained assets}} Immich-dən silinəcək və geri qaytarmaq mümkün olmayacaq. Fayllar diskdə qalacaq.",
|
||||
"confirm_email_below": "Təsdiqləmək üçün aşağıya {email} yazın",
|
||||
"confirm_reprocess_all_faces": "Bütün üzləri yenidən emal etmək istədiyinizə əminsiniz? Bu, həmçinin adlandırılmış şəxsləri siləcək.",
|
||||
"confirm_user_password_reset": "{user} adlı istifadəçinin şifrəsini sıfırlamaq istədiyinizdən əminmisiniz?",
|
||||
|
|
@ -71,11 +73,14 @@
|
|||
"cron_expression_description": "Cron formatından istifadə edərək skan intervalını təyin edin. Ətraflı məlumat üçün nümunələrə baxa bilərsiniz. <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Cron ifadəsi ön ayarları",
|
||||
"disable_login": "Giriş etməni söndür",
|
||||
"download_csv": "CSV endir",
|
||||
"duplicate_detection_job_description": "Bənzər şəkilləri tapmaq üçün maşın öyrənməsini işə salın. Bu prosses Smart Search funksiyasına əsaslanır",
|
||||
"exclusion_pattern_description": "İstisna nümunələri kitabxananızı skan edərkən faylları və qovluqları nəzərə almamağa imkan verir. Bu, RAW faylları kimi idxal etmək istəmədiyiniz faylları olan qovluqlarınız olduqda faydalıdır.",
|
||||
"export_config_as_json_description": "Cari sistem konfiqurasiyasını JSON faylı kimi endirin",
|
||||
"external_libraries_page_description": "Admin xarici kitabxana səhifəsi",
|
||||
"face_detection": "Üz tanıma",
|
||||
"face_detection_description": "Maşın öyrənməsindən istifadə edərək aktivlərdəki üzləri aşkar edilsin. Videolar üçün yalnız eskiz nəzərə alınır. \"Yeniləyin\" bütün elementləri emal edir. \"Sıfırlayın\" əlavə olaraq bütün cari üz məlumatlarını silir. \"Yarımçıq\" hələ emal olunmamış aktivləri növbəyə qoyur. Aşkar edilmiş üzlər Üz Aşkarlama tamamlandıqdan sonra Üz Tanıma üçün növbəyə qoyulacaq və onları mövcud və ya yeni insanlara qruplaşdıracaq.",
|
||||
"facial_recognition_job_description": "Aşkarlanmış üzləri insanlara qruplaşdırın. Bu addım Üz Aşkarlanması tamamlandıqdan sonra icra olunur. \"Sıfırla\" bütün üzləri (simaları) yenidən qruplaşdırır. \"Çatışmayan\" növbələnmiş amma şəxs təyin olmayan üzləri göstərir.",
|
||||
"failed_job_command": "{command} əmri {job} işi üçün uğursuz oldu",
|
||||
"force_delete_user_warning": "XƏBƏRDARLIQ: Bu əməliyyat istifadəçi və bütün məlumatları siləcəkdir. Bu prossesi və silinən faylları geri qaytarmaq olmaz.",
|
||||
"image_format": "Format",
|
||||
|
|
@ -85,13 +90,39 @@
|
|||
"image_fullsize_enabled_description": "Veb üçün uyğun olmayan formatlar üçün tam ölçülü şəkil yaradın. “Daxili önizləməyə üstünlük ver” aktiv olduqda, daxili önizləmələr çevrilmədən birbaşa istifadə olunur. JPEG kimi veb üçün uyğun formatlara təsir etmir.",
|
||||
"image_fullsize_quality_description": "Tam ölçülü şəkil keyfiyyəti (1-100). Daha yüksək dəyər daha yaxşı keyfiyyət verir, lakin daha böyük ölçülü fayl yaradır.",
|
||||
"image_fullsize_title": "Tam ölçülü şəkil tənzimləmələri",
|
||||
"image_prefer_embedded_preview": "Yerləşdirilmiş önizləməyə üstünlük ver",
|
||||
"image_prefer_embedded_preview_setting_description": "RAW fotoşəkillərində təsvir emalı üçün giriş kimi və mümkün olduqda daxil edilmiş önizləmələrdən istifadə edin. Bu, bəzi şəkillər üçün daha dəqiq rənglər yarada bilər, lakin önizləmənin keyfiyyəti kameradan asılıdır və təsvirdə daha çox sıxılma artefaktları ola bilər.",
|
||||
"image_prefer_wide_gamut": "Geniş qammaya üstünlük ver",
|
||||
"image_prefer_wide_gamut_setting_description": "Miniatürlər üçün Display P3 istifadə edin. Bu, geniş rəng diapazonu ilə şəkillərin canlılığını daha yaxşı qoruyur, lakin köhnə brauzer versiyası olan köhnə cihazlarda şəkillər fərqli görünə bilər. Rəng dəyişikliklərinin qarşısını almaq üçün sRGB şəkilləri sRGB olaraq saxlanılır.",
|
||||
"image_preview_description": "Tək bir elementə baxarkən və maşın öyrənməsi üçün istifadə edilən, metaməlumatları silinmiş orta ölçülü şəkil",
|
||||
"image_preview_quality_description": "1-100 arasında önizləmə keyfiyyəti. Daha yüksək olan daha yaxşıdır, lakin daha böyük fayllar yaradır və tətbiqin cəldliyini zəiflədə bilər. Aşağı dəyərin təyin edilməsi maşın öyrənməsinin keyfiyyətinə təsir göstərə bilər.",
|
||||
"image_preview_title": "Önizləmə parametrləri",
|
||||
"image_progressive": "Proqressiv",
|
||||
"image_progressive_description": "Tədricən yüklənmə ekranı üçün JPEG şəkillərini tədricən (proqressiv) kodlaşdırın. Bunun WebP şəkillərinə heç bir təsiri yoxdur.",
|
||||
"image_quality": "Keyfiyyət",
|
||||
"image_resolution": "Çözümlülük",
|
||||
"image_resolution_description": "Yüksək çözümlülükdə daha çox detallar vardır, lakin onları kodlaşdırmaq da daha çox vaxt alır, daha böyük həcmə sahib olurlar və tətbiqin işləmə sürətini yavaşladır.",
|
||||
"image_settings": "Şəklin parametrləri",
|
||||
"image_settings_description": "Hazırlanan şəkillərin keyfiyyətini və çözümlülüyünü idarə et",
|
||||
"image_thumbnail_description": "Əsas zaman xətti kimi foto qruplarına baxarkən istifadə edilən, metaməlumatları silinmiş kiçik eskiz",
|
||||
"image_thumbnail_quality_description": "1-100 arasında eskiz keyfiyyəti. Daha yüksək keyfiyyət daha yaxşıdır, lakin daha böyük fayllar yaradır və tətbiqin cəldliyini zəiflədə bilər.",
|
||||
"image_thumbnail_title": "Önizləmə parametrləri",
|
||||
"import_config_from_json_description": "JSON konfiqurasiya faylını yükləməklə sistem konfiqurasiyasını idxal edin",
|
||||
"integrity_checks_checksum_files": "Yoxlama cəmi (checksum) faylları",
|
||||
"integrity_checks_checksum_files_description": "Yoxlama cəmi (checksum) yoxlamasını konfiqurasiya et",
|
||||
"integrity_checks_checksum_files_enable_description": "Yoxlama cəmi (checksum) yoxlamasını aktivləşdir",
|
||||
"integrity_checks_checksum_files_percentage_limit": "Faiz limiti",
|
||||
"integrity_checks_checksum_files_percentage_limit_description": "Yoxlama cəmi (checksum) yoxlamasının hər intervalda nə qədər işləməli olduğunun maksimum faizini 0,01 ilə 1 arasında təyin edin.",
|
||||
"integrity_checks_checksum_files_time_limit": "Zaman limiti",
|
||||
"integrity_checks_checksum_files_time_limit_description": "Yoxlama cəmi yoxlamasının hər intervalda işləməli olduğu maksimum müddəti təyin edin. (millisaniyə)",
|
||||
"integrity_checks_missing_files": "Çatışmayan fayllar",
|
||||
"integrity_checks_missing_files_description": "Tezliyi təyin et və çatışmayan faylların yoxlanılmasını aktiv/deaktiv et",
|
||||
"integrity_checks_missing_files_enable_description": "Çatışmayan faylların yoxlanmasını aktiv et",
|
||||
"integrity_checks_settings": "Tamlıq yoxlamaları",
|
||||
"integrity_checks_settings_description": "Tamlıq yoxlamalarının intervalını təyin et",
|
||||
"integrity_checks_untracked_files": "İzlənməyən fayllar",
|
||||
"integrity_checks_untracked_files_description": "İzlənməyən faylların axtarışını aktiv/deaktiv et və tezliyini təyin et",
|
||||
"integrity_checks_untracked_files_enable_description": "İzlənməyən faylların axtarışını aktiv et",
|
||||
"job_concurrency": "{job}paralellik",
|
||||
"job_created": "Tapşırıq yaradıldı",
|
||||
"job_not_concurrency_safe": "Bu iş eyni vaxtda icra üçün təhlükəsiz deyil.",
|
||||
|
|
@ -99,21 +130,35 @@
|
|||
"job_settings_description": "Parallel şəkildə fəaliyyət göstərən tapşırıqları idarə et",
|
||||
"jobs_delayed": "{jobCount, plural, other {# gecikməli}}",
|
||||
"jobs_failed": "{jobCount, plural, other {# uğursuz}}",
|
||||
"jobs_over_time": "Tapşırıqların qrafiki",
|
||||
"library_created": "{library} kitabxanası yaradıldı",
|
||||
"library_deleted": "Kitabxana silindi",
|
||||
"library_details": "Kitabxana parametrləri",
|
||||
"library_folder_description": "İdxal qovluğunu göstərin. Bu qovluqda, alt qovluqlarla birlikdə, şəkil və videolar axtarılacaq.",
|
||||
"library_remove_exclusion_pattern_prompt": "Bu istisna şablonunu silmək istədiyinizə əminsiniz?",
|
||||
"library_remove_folder_prompt": "Bu idxal qovluğunu silmək istədiyinizə əminsiniz?",
|
||||
"library_scanning": "Periodik skan",
|
||||
"library_scanning_description": "Periodik kitabxana skanını confiqurasiya et",
|
||||
"library_scanning_enable_description": "Periodik kitabxana skanını aktivləşdir",
|
||||
"library_settings": "Xarici kitabxana",
|
||||
"library_settings_description": "Xarici kitabxana parametrlərini idarə et",
|
||||
"library_tasks_description": "Kitabxana tapşırıqlarını yerinə yetir",
|
||||
"library_tasks_description": "Xarici kitabxanalarda yenilikləri yoxla",
|
||||
"library_updated": "Yenilənmiş kitabxana",
|
||||
"library_watching_enable_description": "Fayl dəyişiklikləri üçün xarici kitabxanalara baxış keçirin",
|
||||
"library_watching_settings": "Kitabxana nəzarəti (EKSPERİMENTAL)",
|
||||
"library_watching_settings": "Kitabxana nəzarəti [EKSPERİMENTAL]",
|
||||
"library_watching_settings_description": "Dəyişdirilən faylları avtomatik olaraq yoxla",
|
||||
"logging_enable_description": "Jurnalı aktivləşdir",
|
||||
"logging_level_description": "Aktiv edildikdə hansı jurnal səviyyəsi istifadə olunur.",
|
||||
"logging_settings": "Tarixçə",
|
||||
"machine_learning_availability_checks": "Əlçatanlıq yoxlamaları",
|
||||
"machine_learning_availability_checks_description": "Əlçatan maşın öyrənmə serverlərini avtomatik tap və təyin et",
|
||||
"machine_learning_availability_checks_enabled": "Əlçatanlıq yoxlamalarını aktiv et",
|
||||
"machine_learning_availability_checks_interval": "Yoxlama intervalı",
|
||||
"machine_learning_availability_checks_interval_description": "Əlçatanlıq yoxlamaları arasında millisaniyələrlə interval",
|
||||
"machine_learning_availability_checks_timeout": "Sorğunun bitmə müddəti",
|
||||
"machine_learning_availability_checks_timeout_description": "Əlçatanlıq yoxlamaları üçün millisaniyələrlə limit",
|
||||
"machine_learning_clip_model": "CLIP modeli",
|
||||
"machine_learning_clip_model_description": "<link>Burada</link>qeyd olunan CLIP modelinin adı. Modeli dəyişdirdikdən sonra bütün şəkillər üçün 'Ağıllı Axtarış' funksiyasını yenidən işə salmalısınız.",
|
||||
"machine_learning_clip_model_description": "<link>Burada</link> qeyd olunan CLIP modelinin adı. Modeli dəyişdirdikdən sonra bütün şəkillər üçün 'Ağıllı Axtarış' funksiyasını yenidən işə salmalısınız.",
|
||||
"machine_learning_duplicate_detection": "Dublikat Aşkarlama",
|
||||
"machine_learning_duplicate_detection_enabled": "Dublikat aşkarlamanı aktiv etmək",
|
||||
"machine_learning_duplicate_detection_enabled_description": "Əgər deaktiv edilibsə, birə-bir eyni fayllar yenədə silinəcək.",
|
||||
|
|
@ -124,5 +169,6 @@
|
|||
"machine_learning_facial_recognition_description": "Şəkillərdəki üzləri aşkarla, tanı və qruplaşdır",
|
||||
"machine_learning_facial_recognition_model": "Üz tanıma modeli"
|
||||
},
|
||||
"discord": "Discord",
|
||||
"timeline": "Zaman şkalası"
|
||||
}
|
||||
|
|
|
|||
403
i18n/be.json
403
i18n/be.json
File diff suppressed because it is too large
Load diff
11
i18n/bg.json
11
i18n/bg.json
|
|
@ -597,6 +597,7 @@
|
|||
"asset_viewer_settings_title": "Преглед на изображения",
|
||||
"assets": "Елементи",
|
||||
"assets_added_to_album_count": "Добавен(и) са {count, plural, one {# актив} other {# актива}} в албума",
|
||||
"assets_added_to_album_partial_count": "Добавени са {successCount} от общо {totalCount} {totalCount, plural, one {елемент} other {елемента}} към албума",
|
||||
"assets_added_to_albums_count": "{assetTotal, plural, one {# обект е добавен} other {# обекта са добавени}} в {albumTotal, plural, one {# албум} other {# албума}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Обекта не може да се добави} other {Обектите не може да се добавят}} в албума",
|
||||
"assets_cannot_be_added_to_albums": "{count, plural, one {обект не може да бъде добавен} other {обекта не могат да бъдат добавени}} в никой от албумите",
|
||||
|
|
@ -607,7 +608,7 @@
|
|||
"assets_restore_confirmation": "Сигурни ли сте, че искате да възстановите всички активи в кошчето? Не можете да отмените това действие! Имайте предвид, че активи, които са офлайн, не могат да бъдат възстановени по този начин.",
|
||||
"assets_restored_count": "Възстановен(и) са {count, plural, one {# актив} other {# актива}}",
|
||||
"assets_trashed": "{count} обекта са преместени в коша",
|
||||
"assets_trashed_count": "Възстановен(и) са {count, plural, one {# файл} other {# файла}}",
|
||||
"assets_trashed_count": "{count, plural, one {# файл е преместен в кошчето} other {# файла са преместени в кошчето}}",
|
||||
"assets_were_part_of_album_count": "{count, plural, one {Файлът е} other {Файловете са}} вече част от албума",
|
||||
"assets_were_part_of_albums_count": "{count, plural, one {обект вече е} other {обекта вече са}} част от албумите",
|
||||
"authorized_devices": "Удостоверени устройства",
|
||||
|
|
@ -813,7 +814,6 @@
|
|||
"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 {години}}",
|
||||
|
|
@ -1524,6 +1524,7 @@
|
|||
"not_available": "Неналично",
|
||||
"not_in_any_album": "Не е в никой албум",
|
||||
"not_selected": "Не е избрано",
|
||||
"not_set": "Не е зададено",
|
||||
"notes": "Бележки",
|
||||
"nothing_here_yet": "Засега тук няма нищо",
|
||||
"notification_backup_reliability": "Позволете известията, за да подобрите надеждността на архивиране във фонов режим",
|
||||
|
|
@ -1620,7 +1621,7 @@
|
|||
"person": "Човек",
|
||||
"person_age_months": "{months, plural, one {# месец} other {# месеца}}",
|
||||
"person_age_year_months": "1 година и {months, plural, one {# месец} other {# месеца}}",
|
||||
"person_age_years": "{years, plural, other {# години}}",
|
||||
"person_age_years": "{years, plural, one {# година} other {# години}}",
|
||||
"person_birthdate": "Дата на раждане {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (скрит)} other {}}",
|
||||
"person_recognized": "Разпознато e лице",
|
||||
|
|
@ -1947,7 +1948,9 @@
|
|||
"shared_link_app_bar_title": "Споделени връзки",
|
||||
"shared_link_clipboard_copied_massage": "Копирано в клипборда",
|
||||
"shared_link_create_error": "Грешка при създаване на споделена връзка",
|
||||
"shared_link_custom_url_description": "Достъпете споделения линк с персонализиран URL адрес",
|
||||
"shared_link_custom_url_description": "Споделете достъп чрез този персонализиран URL линк",
|
||||
"shared_link_custom_url_title": "Персонализиран URL адрес",
|
||||
"shared_link_custom_url_warning": "Предупреждение: Персонализирано URL име с наклонени напред може да не работи според очакванията.",
|
||||
"shared_link_edit_description_hint": "Въведи описание на споделеното",
|
||||
"shared_link_edit_expire_after_option_day": "1 ден",
|
||||
"shared_link_edit_expire_after_option_days": "{count} дни",
|
||||
|
|
|
|||
1728
i18n/bn.json
1728
i18n/bn.json
File diff suppressed because it is too large
Load diff
3282
i18n/ca.json
3282
i18n/ca.json
File diff suppressed because it is too large
Load diff
10
i18n/cs.json
10
i18n/cs.json
|
|
@ -108,7 +108,7 @@
|
|||
"image_thumbnail_quality_description": "Kvalita miniatur od 1 do 100. Vyšší je lepší, ale vytváří větší soubory a může snížit odezvu aplikace.",
|
||||
"image_thumbnail_title": "Miniatury",
|
||||
"import_config_from_json_description": "Importujte konfiguraci systému nahráním konfiguračního JSON souboru",
|
||||
"integrity_checks_checksum_files": "Soubory s kontrolními součty",
|
||||
"integrity_checks_checksum_files": "Kontrolní součty souborů",
|
||||
"integrity_checks_checksum_files_description": "Nastavení kontroly kontrolního součtu",
|
||||
"integrity_checks_checksum_files_enable_description": "Zapnout kontrolu kontrolního součtu",
|
||||
"integrity_checks_checksum_files_percentage_limit": "Procentuální limit",
|
||||
|
|
@ -814,7 +814,6 @@
|
|||
"custom_date": "Vlastní datum",
|
||||
"custom_locale": "Vlastní lokalizace",
|
||||
"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ů}}",
|
||||
"cutoff_year": "{count, plural, one {rok} few {roky} other {let}}",
|
||||
|
|
@ -1525,6 +1524,7 @@
|
|||
"not_available": "Není k dispozici",
|
||||
"not_in_any_album": "Bez alba",
|
||||
"not_selected": "Není vybráno",
|
||||
"not_set": "Nenastaveno",
|
||||
"notes": "Poznámky",
|
||||
"nothing_here_yet": "Zatím zde nic není",
|
||||
"notification_backup_reliability": "Povolte oznámení pro zlepšení spolehlivosti zálohování na pozadí",
|
||||
|
|
@ -1621,7 +1621,7 @@
|
|||
"person": "Osoba",
|
||||
"person_age_months": "{months, plural, one {# měsíc} few {# měsíce} other {# měsíců}}",
|
||||
"person_age_year_months": "1 rok a {months, plural, one {# měsíc} few {# měsíce} other {# měsíců}}",
|
||||
"person_age_years": "{years, plural, one {# rok} few {# roky} other {# let}}",
|
||||
"person_age_years": "{years, plural, one {# rok} other {# let}} starý/á",
|
||||
"person_birthdate": "Narozen(a) {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (skryto)} other {}}",
|
||||
"person_recognized": "Osoba rozpoznána",
|
||||
|
|
@ -1948,7 +1948,9 @@
|
|||
"shared_link_app_bar_title": "Sdílené odkazy",
|
||||
"shared_link_clipboard_copied_massage": "Zkopírováno do schránky",
|
||||
"shared_link_create_error": "Chyba při vytváření sdíleného odkazu",
|
||||
"shared_link_custom_url_description": "Přístup k tomuto sdílenému odkazu pomocí vlastního URL",
|
||||
"shared_link_custom_url_description": "Otevřete tento sdílený odkaz pomocí vlastního názvu URL",
|
||||
"shared_link_custom_url_title": "Vlastní URL",
|
||||
"shared_link_custom_url_warning": "Upozornění: vlastní název URL obsahující lomítko se nemusí chovat tak, jak očekáváte.",
|
||||
"shared_link_edit_description_hint": "Zadejte popis sdílení",
|
||||
"shared_link_edit_expire_after_option_day": "1 den",
|
||||
"shared_link_edit_expire_after_option_days": "{count} dní",
|
||||
|
|
|
|||
58
i18n/da.json
58
i18n/da.json
|
|
@ -117,6 +117,12 @@
|
|||
"integrity_checks_checksum_files_time_limit_description": "Konfigurer den maksimale periode for hvilken checksum tjekket skal nå på hvert interval. (ms)",
|
||||
"integrity_checks_missing_files": "Mangler filer",
|
||||
"integrity_checks_missing_files_description": "Konfigurer frekvensen og tædn eller sluk for manglende filer tjek",
|
||||
"integrity_checks_missing_files_enable_description": "Aktivér tjekket for manglende filer",
|
||||
"integrity_checks_settings": "Integritetstjek",
|
||||
"integrity_checks_settings_description": "Administrer integritetstjeks intervaller",
|
||||
"integrity_checks_untracked_files": "Ikke-registreret filer",
|
||||
"integrity_checks_untracked_files_description": "Konfigurer hyppigheden og aktiver eller deaktiver kontrollen af ikke-registreret filer",
|
||||
"integrity_checks_untracked_files_enable_description": "Aktivér kontrol af ikke-registreret filer",
|
||||
"job_concurrency": "{job} samtidighed",
|
||||
"job_created": "opgaven er skabt",
|
||||
"job_not_concurrency_safe": "Denne opgave er ikke sikker at køre samtidigt med andre.",
|
||||
|
|
@ -425,6 +431,10 @@
|
|||
"transcoding_realtime_description": "Tillader transkodning i realtid, mens videoen streames. Muliggør kvalitetsskifte, men kan forårsage højere afspilningsforsinkelse og hakken afhængigt af serverens kapacitet.",
|
||||
"transcoding_realtime_enabled": "Aktiver real-time transkodning",
|
||||
"transcoding_realtime_enabled_description": "Hvis deaktiveret, kan serveren ikke starte nye realtids transkodningssessioner.",
|
||||
"transcoding_realtime_resolutions": "Opløsninger",
|
||||
"transcoding_realtime_resolutions_description": "Opløsninger tilgængelig for realtidstranskodning. Højere opløsninger kan forårsage afspilningsproblemer, hvis serveren ikke kan transkode dem hurtigt nok.",
|
||||
"transcoding_realtime_video_codecs": "Video codecs",
|
||||
"transcoding_realtime_video_codecs_description": "De video codecs, tilgængelig for realtidstranskodning. Klienter vælger den bedste mulighed, de understøtter under afspilning. AV1 er mere effektiv end HEVC, som er mere effektiv end H.264. Når du bruger hardwareacceleration, skal du kun vælge de codecs, som acceleratoren kan enkode. Når du bruger softwaretranskodning, skal du bemærke, at H.264 er hurtigere end AV1, som er hurtigere end HEVC.",
|
||||
"transcoding_reference_frames": "Referencerammer",
|
||||
"transcoding_reference_frames_description": "Antallet af frames, der skal refereres til, når en given frame komprimeres. Højere værdier forbedrer kompressionseffektiviteten, men gør indkodning langsommere. 0 sætter denne værdi automatisk.",
|
||||
"transcoding_required_description": "Kun videoer ikke i et godkendt format",
|
||||
|
|
@ -587,6 +597,7 @@
|
|||
"asset_viewer_settings_title": "Billedviser",
|
||||
"assets": "Objekter",
|
||||
"assets_added_to_album_count": "{count, plural, one {# mediefil} other {# mediefiler}} tilføjet til albummet",
|
||||
"assets_added_to_album_partial_count": "Tilføjede {successCount} ud af {totalCount} {totalCount, plural, one {mediefil} other {mediefiler}} til albummet",
|
||||
"assets_added_to_albums_count": "Tilføjet {assetTotal, plural, one {# asset} other {# assets}} til {albumTotal, plural, one {# album} other {# albums}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Billed} other {Billeder}} kan ikke blive tilføjet til album",
|
||||
"assets_cannot_be_added_to_albums": "{count, plural, one {Asset} other {Assets}} kan ikke føjes til i nogen af albummerne",
|
||||
|
|
@ -803,7 +814,6 @@
|
|||
"custom_date": "Brugerdefineret dato",
|
||||
"custom_locale": "Brugerdefineret lokale",
|
||||
"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}}",
|
||||
"cutoff_year": "{count, plural, one {år} other {år}}",
|
||||
|
|
@ -1185,16 +1195,16 @@
|
|||
"id": "ID",
|
||||
"idle": "Inaktiv",
|
||||
"image": "Billede",
|
||||
"image_alt_text_date": "{isVideo, select, true {Video} other {Image}} taget den {date}",
|
||||
"image_alt_text_date_1_person": "{isVideo, select, true {Video} other {Image}} taget med {person1} den {date}",
|
||||
"image_alt_text_date_2_people": "{isVideo, select, true {Video} other {Image}} taget med {person1} og {person2} den {date}",
|
||||
"image_alt_text_date_3_people": "{isVideo, select, true {Video} other {Image}} taget med {person1}, {person2}, og {person3} den {date}",
|
||||
"image_alt_text_date_4_or_more_people": "{isVideo, select, true {Video} other {Image}} taget med {person1}, {person2}, og {additionalCount, number} andre den {date}",
|
||||
"image_alt_text_date_place": "{isVideo, select, true {Video} other {Image}} taget i {city}, {country} den {date}",
|
||||
"image_alt_text_date_place_1_person": "{isVideo, select, true {Video} other {Image}} taget i {city}, {country} med {person1} den {date}",
|
||||
"image_alt_text_date_place_2_people": "{isVideo, select, true {Video} other {Image}} taget i {city}, {country} med {person1} og {person2} den {date}",
|
||||
"image_alt_text_date_place_3_people": "{isVideo, select, true {Video} other {Image}} taget i {city}, {country} med {person1}, {person2}, og {person3} den {date}",
|
||||
"image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {Video} other {Image}} taget i {city}, {country} med {person1}, {person2}, og {additionalCount, number} andre den {date}",
|
||||
"image_alt_text_date": "{isVideo, select, true {Video} other {Billede}} taget den {date}",
|
||||
"image_alt_text_date_1_person": "{isVideo, select, true {Video} other {Billede}} taget med {person1} den {date}",
|
||||
"image_alt_text_date_2_people": "{isVideo, select, true {Video} other {Billede}} taget med {person1} og {person2} den {date}",
|
||||
"image_alt_text_date_3_people": "{isVideo, select, true {Video} other {Billede}} taget med {person1}, {person2}, og {person3} den {date}",
|
||||
"image_alt_text_date_4_or_more_people": "{isVideo, select, true {Video} other {Billede}} taget med {person1}, {person2}, og {additionalCount, number} andre den {date}",
|
||||
"image_alt_text_date_place": "{isVideo, select, true {Video} other {Billede}} taget i {city}, {country} den {date}",
|
||||
"image_alt_text_date_place_1_person": "{isVideo, select, true {Video} other {Billede}} taget i {city}, {country} med {person1} den {date}",
|
||||
"image_alt_text_date_place_2_people": "{isVideo, select, true {Video} other {Billede}} taget i {city}, {country} med {person1} og {person2} den {date}",
|
||||
"image_alt_text_date_place_3_people": "{isVideo, select, true {Video} other {Billede}} taget i {city}, {country} med {person1}, {person2}, og {person3} den {date}",
|
||||
"image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {Video} other {Billede}} taget i {city}, {country} med {person1}, {person2}, og {additionalCount, number} andre den {date}",
|
||||
"immich_logo": "Immich logo",
|
||||
"immich_web_interface": "Immich webinterface",
|
||||
"import_from_json": "Importér fra JSON",
|
||||
|
|
@ -1470,6 +1480,7 @@
|
|||
"never": "Aldrig",
|
||||
"new_album": "Nyt album",
|
||||
"new_api_key": "Ny API-nøgle",
|
||||
"new_feature": "Ny Feature",
|
||||
"new_password": "Ny adgangskode",
|
||||
"new_person": "Ny person",
|
||||
"new_pin_code": "Ny PIN kode",
|
||||
|
|
@ -1513,6 +1524,7 @@
|
|||
"not_available": "ikke tilgængelig",
|
||||
"not_in_any_album": "Ikke i noget album",
|
||||
"not_selected": "Ikke valgt",
|
||||
"not_set": "Ikke angivet",
|
||||
"notes": "Noter",
|
||||
"nothing_here_yet": "Intet her endnu",
|
||||
"notification_backup_reliability": "Aktivér notifikationer for at forbedre pålideligheden af backup i baggrunden",
|
||||
|
|
@ -1530,6 +1542,8 @@
|
|||
"obtainium_configurator": "Obtainium-konfigurator",
|
||||
"obtainium_configurator_instructions": "Brug Obtainium til at installere og opdatere Android-appen direkte fra Immich-udgivelsen på GitHub. Opret en API-nøgle, og vælg en variant for at generere dit Obtainium-konfigurationslink",
|
||||
"ocr": "OCR",
|
||||
"ocr_body": "Immich læser nu teksten i dine billeder, så du kan søge efter dem ud fra, hvad de siger.",
|
||||
"ocr_title": "Søg tekst i dine fotos",
|
||||
"official_immich_resources": "Officielle Immich-ressourcer",
|
||||
"offline": "Offline",
|
||||
"offset": "Forskydning",
|
||||
|
|
@ -1548,6 +1562,8 @@
|
|||
"open": "Åben",
|
||||
"open_calendar": "Åbn kalender",
|
||||
"open_in_browser": "Åbn i browser",
|
||||
"open_in_immich_body": "Sæt Immich som dit galleri på Android for at åbne billeder direkte fra andre apps.",
|
||||
"open_in_immich_title": "Åbne billeder i Immich",
|
||||
"open_in_map_view": "Åben i kortvisning",
|
||||
"open_in_openstreetmap": "Åben i OpenStreetMap",
|
||||
"open_the_search_filters": "Åbn søgefiltre",
|
||||
|
|
@ -1605,7 +1621,7 @@
|
|||
"person": "Person",
|
||||
"person_age_months": "{months, plural, one {# month} other {# months}} gammel",
|
||||
"person_age_year_months": "1 år, {months, plural, one {# month} other {# months}} gammel",
|
||||
"person_age_years": "{years, plural, other {# years}} gammel",
|
||||
"person_age_years": "{years, plural, other {# år}} gammel",
|
||||
"person_birthdate": "Født den {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (skjult)} other {}}",
|
||||
"person_recognized": "Person genkendt",
|
||||
|
|
@ -1706,7 +1722,10 @@
|
|||
"recent": "For nylig",
|
||||
"recent_searches": "Seneste søgninger",
|
||||
"recently_added": "Senest tilføjet",
|
||||
"recently_added_body": "Gå direkte til alt, hvad du for nylig har tilføjet, på en dedikeret side.",
|
||||
"recently_added_description": "Gennemse dine mediefiler sorteret efter, hvornår de blev uploadet til Immich",
|
||||
"recently_added_page_title": "Nyligt tilføjet",
|
||||
"recently_added_title": "Senest tilføjet",
|
||||
"recently_taken": "Taget for nylig",
|
||||
"refresh": "Opdatér",
|
||||
"refresh_encoded_videos": "Opdater kodede videoer",
|
||||
|
|
@ -1913,6 +1932,8 @@
|
|||
"share_link": "Del link",
|
||||
"share_original": "Brug original (stor)",
|
||||
"share_preview": "Brug miniaturebillede (lille)",
|
||||
"share_quality_body": "Tryk og hold delingsknappen nede for at vælge billedkvaliteten, før du deler.",
|
||||
"share_quality_title": "Vælg din delingskvalitet",
|
||||
"shared": "Delt",
|
||||
"shared_album_activities_input_disable": "Kommentarer er deaktiveret",
|
||||
"shared_album_activity_remove_content": "Vil du slette denne aktivitet?",
|
||||
|
|
@ -1927,7 +1948,9 @@
|
|||
"shared_link_app_bar_title": "Delte links",
|
||||
"shared_link_clipboard_copied_massage": "Kopieret til udklipsholderen",
|
||||
"shared_link_create_error": "Der opstod en fejl i oprettelsen af et delt link",
|
||||
"shared_link_custom_url_description": "Adgang til dette delte link med en selvdefineret URL",
|
||||
"shared_link_custom_url_description": "Få adgang til dette delte link med et brugerdefineret URL-navn",
|
||||
"shared_link_custom_url_title": "Tilpasset URL",
|
||||
"shared_link_custom_url_warning": "Advarsel: Et brugerdefineret URL-navn med en skråstreg fungerer muligvis ikke som forventet.",
|
||||
"shared_link_edit_description_hint": "Indtast beskrivelse",
|
||||
"shared_link_edit_expire_after_option_day": "1 dag",
|
||||
"shared_link_edit_expire_after_option_days": "{count} dage",
|
||||
|
|
@ -1994,16 +2017,19 @@
|
|||
"sign_out": "Log af",
|
||||
"sign_up": "Tilmeld",
|
||||
"size": "Størrelse",
|
||||
"skip": "Spring over",
|
||||
"skip_to_content": "Spring frem til indhold",
|
||||
"skip_to_folders": "Spring til mapper",
|
||||
"skip_to_tags": "Spring til tags",
|
||||
"slideshow": "Diasshow",
|
||||
"slideshow_body": "Læn dig tilbage, og se dine fotos afspilles i et slideshow i fuld skærm.",
|
||||
"slideshow_metadata_overlay_mode": "Overlay indhold",
|
||||
"slideshow_metadata_overlay_mode_description_only": "Kun beskrivelse",
|
||||
"slideshow_metadata_overlay_mode_full": "Fuld",
|
||||
"slideshow_repeat": "Gentag diasshow",
|
||||
"slideshow_repeat_description": "Hop tilbage til begyndelsen når diasshow stopper",
|
||||
"slideshow_settings": "Diasshowindstillinger",
|
||||
"slideshow_title": "Slideshow",
|
||||
"smart_album": "Smart album",
|
||||
"some_assets_already_have_a_location_warning": "Nogle af de valgte aktiver har allerede en placering",
|
||||
"sort_albums_by": "Sortér albummer efter...",
|
||||
|
|
@ -2131,6 +2157,7 @@
|
|||
"unknown": "Ukendt",
|
||||
"unknown_country": "Ukendt land",
|
||||
"unknown_date": "Ukendt dato",
|
||||
"unknown_schema": "Ukendt skema",
|
||||
"unknown_year": "Ukendt år",
|
||||
"unlimited": "Ubegrænset",
|
||||
"unlink_motion_video": "Fjern link til bevægelsesvideo",
|
||||
|
|
@ -2166,6 +2193,8 @@
|
|||
"upload_status_errors": "Fejl",
|
||||
"upload_status_uploaded": "Uploadet",
|
||||
"upload_success": "Upload gennemført. Opdater siden for at se nye uploadaktiver.",
|
||||
"upload_to_album_body": "For brugere, der ikke bruger den manuelle uploadfunktion, kan du nu vælge at tilføje lokale fotos direkte til et album, når du uploader dem. Du behøver ikke længere at uploade og derefter føje dem til et album senere.",
|
||||
"upload_to_album_title": "Upload direkte til et album",
|
||||
"upload_to_immich": "Upload til Immich ({count})",
|
||||
"uploading": "Uploader",
|
||||
"uploading_media": "Uploader media",
|
||||
|
|
@ -2233,6 +2262,9 @@
|
|||
"week": "Uge",
|
||||
"welcome": "Velkommen",
|
||||
"welcome_to_immich": "Velkommen til Immich",
|
||||
"whats_new": "Hvad er nyt",
|
||||
"whats_new_settings_subtitle": "Se, hvad der er nyt i Immich",
|
||||
"whats_new_version": "Version {version}",
|
||||
"when": "Hvornår",
|
||||
"width": "Bredde",
|
||||
"wifi_name": "Wi-Fi navn",
|
||||
|
|
|
|||
10
i18n/de.json
10
i18n/de.json
|
|
@ -114,12 +114,12 @@
|
|||
"integrity_checks_checksum_files_percentage_limit": "Prozentuales Limit",
|
||||
"integrity_checks_checksum_files_percentage_limit_description": "Setze die maximale Prozentzahl zwischen 0.01 und 1, um zu bestimmen wie viel der Prüfsummen Test jedes Intervall prüfen soll.",
|
||||
"integrity_checks_checksum_files_time_limit": "Zeitlimit",
|
||||
"integrity_checks_checksum_files_time_limit_description": "Setze die maximale Dauer die der Prüfsummen Test jedes Intervall ausgeführt werden soll. (ms)",
|
||||
"integrity_checks_checksum_files_time_limit_description": "Setze die maximale Dauer, für die der Prüfsummen Test jedes Intervall ausgeführt werden soll. (ms)",
|
||||
"integrity_checks_missing_files": "Fehlende Dateien",
|
||||
"integrity_checks_missing_files_description": "Setze die Frequenz und (de)aktiviere den Test für fehlende Dateien",
|
||||
"integrity_checks_missing_files_enable_description": "Aktiviere den Test für fehlende Dateien",
|
||||
"integrity_checks_settings": "Integritätstests",
|
||||
"integrity_checks_settings_description": "Verwalten Intervalle der Integritätstests",
|
||||
"integrity_checks_settings_description": "Verwalten der Intervalle für die Integritätstests",
|
||||
"integrity_checks_untracked_files": "Nicht getrackte Dateien",
|
||||
"integrity_checks_untracked_files_description": "Setze die Frequenz und (de)aktiviere den Test für ungetrackte Dateien",
|
||||
"integrity_checks_untracked_files_enable_description": "Aktiviere den Test für ungetrackte Dateien",
|
||||
|
|
@ -162,7 +162,7 @@
|
|||
"machine_learning_duplicate_detection": "Duplikaterkennung",
|
||||
"machine_learning_duplicate_detection_enabled": "Duplikaterkennung aktivieren",
|
||||
"machine_learning_duplicate_detection_enabled_description": "Falls diese Option deaktiviert ist, werden exakt identische Dateien dennoch de-dupliziert.",
|
||||
"machine_learning_duplicate_detection_setting_description": "Verwendung von CLIP-Embeddings zum Erkennen möglicher Duplikate",
|
||||
"machine_learning_duplicate_detection_setting_description": "Verwendung von CLIP-Einbettungen zum Erkennen möglicher Duplikate",
|
||||
"machine_learning_enabled": "Maschinelles Lernen aktivieren",
|
||||
"machine_learning_enabled_description": "Wenn diese Option deaktiviert ist, werden alle ML-Funktionen unabhängig von den unten aufgeführten Einstellungen deaktiviert.",
|
||||
"machine_learning_facial_recognition": "Gesichtserkennung",
|
||||
|
|
@ -814,7 +814,6 @@
|
|||
"custom_date": "Benutzerdefiniertes Datum",
|
||||
"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}}",
|
||||
"cutoff_year": "{count, plural, one {Jahr} other {Jahre}}",
|
||||
|
|
@ -1525,6 +1524,7 @@
|
|||
"not_available": "N/A",
|
||||
"not_in_any_album": "In keinem Album",
|
||||
"not_selected": "Nicht ausgewählt",
|
||||
"not_set": "Nicht gesetzt",
|
||||
"notes": "Hinweise",
|
||||
"nothing_here_yet": "Noch nichts hier",
|
||||
"notification_backup_reliability": "Benachrichtigungen aktivieren, um die Zuverlässigkeit der Sicherung im Hintergrund zu verbessern",
|
||||
|
|
@ -1949,6 +1949,8 @@
|
|||
"shared_link_clipboard_copied_massage": "Link kopiert",
|
||||
"shared_link_create_error": "Fehler beim Erstellen der Linkfreigabe",
|
||||
"shared_link_custom_url_description": "Greife über eine benutzerdefinierte URL auf diesen Freigabelink zu",
|
||||
"shared_link_custom_url_title": "Benutzerdefinierte URL",
|
||||
"shared_link_custom_url_warning": "Warnung: eine benutzerdefinierte URL mit einem Schrägstrich verhält sich möglicherweise nicht wie erwartet.",
|
||||
"shared_link_edit_description_hint": "Beschreibung eingeben",
|
||||
"shared_link_edit_expire_after_option_day": "1 Tag",
|
||||
"shared_link_edit_expire_after_option_days": "{count} Tagen",
|
||||
|
|
|
|||
|
|
@ -113,8 +113,8 @@
|
|||
"job_not_concurrency_safe": "Diese Aufgabe kann nicht mehrmals parallel laufen gelassen werden.",
|
||||
"job_settings": "Aufgabeneinstellungen",
|
||||
"job_settings_description": "Gleichzeitige Ausführung von Aufgaben verwalten",
|
||||
"jobs_delayed": "Qualität",
|
||||
"jobs_failed": "{jobCount, plural, other {# failed}}",
|
||||
"jobs_delayed": "{jobCount, plural, other {# verzögert}}",
|
||||
"jobs_failed": "{jobCount, plural, other {# fehlgeschlagen}}",
|
||||
"jobs_over_time": "Jobs im Laufe der Zeit",
|
||||
"library_created": "Bibliothek erstellt: {library}",
|
||||
"library_deleted": "Bibliothek gelöscht",
|
||||
|
|
|
|||
188
i18n/el.json
188
i18n/el.json
|
|
@ -23,6 +23,7 @@
|
|||
"add_location": "Προσθήκη τοποθεσίας",
|
||||
"add_partner": "Προσθήκη συνεργάτη",
|
||||
"add_photos": "Προσθήκη φωτογραφιών",
|
||||
"add_step": "Προσθήκη βήματος",
|
||||
"add_tag": "Προσθήκη ετικέτας",
|
||||
"add_to": "Προσθήκη σε…",
|
||||
"add_to_album": "Προσθήκη σε άλμπουμ",
|
||||
|
|
@ -72,6 +73,7 @@
|
|||
"cron_expression_description": "Ορίστε το διάστημα σάρωσης χρησιμοποιώντας τη μορφή cron. Για περισσότερες πληροφορίες, ανατρέξτε π.χ. στο <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Προκαθορισμένες εκφράσεις cron",
|
||||
"disable_login": "Απενεργοποίηση σύνδεσης",
|
||||
"download_csv": "Μεταφόρτωση CSV",
|
||||
"duplicate_detection_job_description": "Εκτελέστε μηχανική μάθηση σε στοιχεία για να εντοπίσετε παρόμοιες εικόνες. Βασίζεται στην Έξυπνη Αναζήτηση",
|
||||
"exclusion_pattern_description": "Τα μοτίβα αποκλεισμού σας επιτρέπουν να αγνοείται αρχεία και φακέλους κατά τη σάρωση της βιβλιοθήκης σας. Αυτό είναι χρήσιμο εάν εχετε φακέλους που περιέχουν αρχεία που δεν θέλετε να εισάγετε, όπως αρχεία RAW.",
|
||||
"export_config_as_json_description": "Κατέβασε την τρέχουσα διαμόρφωση συστήματος ως αρχείο JSON",
|
||||
|
|
@ -106,6 +108,21 @@
|
|||
"image_thumbnail_quality_description": "Ποιότητα μικρογραφίας από 1 έως 100. Υψηλότερες τιμές είναι καλύτερες, αλλά παράγουν μεγαλύτερα αρχεία που μπορεί να μειώσουν την ταχύτητα απόκρισης της εφαρμογής.",
|
||||
"image_thumbnail_title": "Ρυθμίσεις Μικρογραφίας",
|
||||
"import_config_from_json_description": "Εισαγωγή διαμόρφωσης συστήματος με ανέβασμα αρχείου διαμόρφωσης JSON",
|
||||
"integrity_checks_checksum_files": "Αρχεία ελέγχου ακεραιότητας",
|
||||
"integrity_checks_checksum_files_description": "Ρύθμιση του ελέγχου ακεραιότητας",
|
||||
"integrity_checks_checksum_files_enable_description": "Ενεργοποίηση του ελέγχου ακεραιότητας",
|
||||
"integrity_checks_checksum_files_percentage_limit": "Όριο ποσοστού",
|
||||
"integrity_checks_checksum_files_percentage_limit_description": "Ρυθμίστε το μέγιστο ποσοστό μεταξύ 0,01 και 1 για το πόσο θα εκτελείται ο έλεγχος ακεραιότητας σε κάθε διάστημα.",
|
||||
"integrity_checks_checksum_files_time_limit": "Χρονικό όριο",
|
||||
"integrity_checks_checksum_files_time_limit_description": "Ρυθμίστε τη μέγιστη διάρκεια για την οποία θα εκτελείται ο έλεγχος ακεραιότητας σε κάθε διάστημα. (ms)",
|
||||
"integrity_checks_missing_files": "Ελλείποντα αρχεία",
|
||||
"integrity_checks_missing_files_description": "Ρυθμίστε τη συχνότητα και ενεργοποιήστε ή απενεργοποιήστε τον έλεγχο για τα ελλείποντα αρχεία",
|
||||
"integrity_checks_missing_files_enable_description": "Ενεργοποίηση ελέγχου για τα ελλείποντα αρχεία",
|
||||
"integrity_checks_settings": "Έλεγχοι ακεραιότητας",
|
||||
"integrity_checks_settings_description": "Διαχείριση διαστημάτων ελέγχων ακεραιότητας",
|
||||
"integrity_checks_untracked_files": "Αρχεία χωρίς παρακολούθηση",
|
||||
"integrity_checks_untracked_files_description": "Ρυθμίστε τη συχνότητα και ενεργοποιήστε ή απενεργοποιήστε τον έλεγχο για τα μη παρακολουθούμενα αρχεία",
|
||||
"integrity_checks_untracked_files_enable_description": "Ενεργοποίηση του ελέγχου για τα μη παρακολουθούμενα αρχεία",
|
||||
"job_concurrency": "Ταυτόχρονη εκτέλεση {job}",
|
||||
"job_created": "Εργασία δημιουργήθηκε",
|
||||
"job_not_concurrency_safe": "Αυτή η εργασία δεν είναι ασφαλής για ταυτόχρονη εκτέλεση.",
|
||||
|
|
@ -181,9 +198,25 @@
|
|||
"machine_learning_smart_search_enabled": "Ενεργοποίηση έξυπνης αναζήτησης",
|
||||
"machine_learning_smart_search_enabled_description": "Αν απενεργοποιηθεί, οι εικόνες δεν θα κωδικοποιούνται για έξυπνη αναζήτηση.",
|
||||
"machine_learning_url_description": "Η διεύθυνση URL του διακομιστή μηχανικής μάθησης. Αν δοθούν περισσότερες από μία διευθύνσεις URL, κάθε διακομιστής θα δοκιμάζεται διαδοχικά μέχρι να ανταποκριθεί ένας με επιτυχία, με τη σειρά από την πρώτη έως την τελευταία. Οι διακομιστές που δεν ανταποκρίνονται θα αγνοούνται προσωρινά μέχρι να επανέλθουν σε λειτουργία.",
|
||||
"maintenance_backup_management": "Διαχείριση αντιγράφων ασφαλείας",
|
||||
"maintenance_delete_backup": "Διαγραφή αντιγράφου ασφαλείας",
|
||||
"maintenance_delete_backup_description": "Αυτό το αρχείο θα διαγραφεί οριστικά και χωρίς δυνατότητα επαναφοράς.",
|
||||
"maintenance_delete_error": "Αποτυχία διαγραφής του αντιγράφου ασφαλείας.",
|
||||
"maintenance_integrity_check": "Έλεγχος",
|
||||
"maintenance_integrity_check_all": "Έλεγχος Όλων",
|
||||
"maintenance_integrity_checksum_mismatch": "Ασυμφωνία ελέγχου ακεραιότητας",
|
||||
"maintenance_integrity_checksum_mismatch_description": "Αρχεία των οποίων ο έλεγχος ακεραιότητας στο δίσκο δεν ταιριάζει με εκείνον που έχει αποθηκεύσει το Immich στη βάση δεδομένων του.",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Έλεγχος για ασυμφωνίες ελέγχου ακεραιότητας",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Ανανέωση αναφορών ασυμφωνιών ελέγχου ακεραιότητας",
|
||||
"maintenance_integrity_missing_file": "Ελλείποντα Αρχεία",
|
||||
"maintenance_integrity_missing_file_description": "Αρχεία που το Immich έχει καταχωρίσει στη βάση δεδομένων του αλλά δεν υπάρχουν στο σύστημα αρχείων.",
|
||||
"maintenance_integrity_missing_file_job": "Έλεγχος για ελλείποντα αρχεία",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Ανανέωση αναφορών ελλειπόντων αρχείων",
|
||||
"maintenance_integrity_report": "Αναφορά ακεραιότητας",
|
||||
"maintenance_integrity_untracked_file": "Μη παρακολουθούμενα αρχεία",
|
||||
"maintenance_integrity_untracked_file_description": "Αρχεία στους φακέλους του Immich για τα οποία το Immich δεν έχει καμία καταχώριση.",
|
||||
"maintenance_integrity_untracked_file_job": "Έλεγχος για μη παρακολουθούμενα αρχεία",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Ανανέωση αναφορών για μη παρακολουθούμενα αρχεία",
|
||||
"maintenance_restore_backup": "Επαναφορά αντιγράφου ασφαλείας",
|
||||
"maintenance_restore_backup_description": "Το Immich θα διαγραφεί πλήρως και θα επαναφερθεί από το επιλεγμένο αντίγραφο ασφαλείας. Θα δημιουργηθεί αντίγραφο ασφαλείας πριν τη συνέχεια.",
|
||||
"maintenance_restore_backup_different_version": "Αυτό το αντίγραφο ασφαλείας δημιουργήθηκε με διαφορετική έκδοση του Immich!",
|
||||
|
|
@ -298,6 +331,8 @@
|
|||
"refreshing_all_libraries": "Επαναφόρτωση όλων των βιβλιοθηκών",
|
||||
"registration": "Εγγραφή Διαχειριστή",
|
||||
"registration_description": "Δεδομένου ότι είστε ο πρώτος χρήστης στο σύστημα, θα ανατεθείτε ως Διαχειριστής και θα είστε υπεύθυνος για τις διαχειριστικές εργασίες, ενώ οι επιπλέον χρήστες θα δημιουργούνται από εσάς.",
|
||||
"release_channel_release_candidate": "Υποψήφια έκδοση",
|
||||
"release_channel_stable": "Σταθερή",
|
||||
"remove_failed_jobs": "Αφαίρεση αποτυχημένων εργασιών",
|
||||
"require_password_change_on_login": "Απαιτείται από τον χρήστη να αλλάξει τον κωδικό πρόσβασης κατά την πρώτη σύνδεση",
|
||||
"reset_settings_to_default": "Επαναφορά προεπιλεγμένων ρυθμίσεων",
|
||||
|
|
@ -392,6 +427,14 @@
|
|||
"transcoding_preferred_hardware_device_description": "Ισχύει μόνο για VAAPI και QSV. Ορίζει τον κόμβο DRI που χρησιμοποιείται για την επιτάχυνση υλικού κατά την κωδικοποίηση.",
|
||||
"transcoding_preset_preset": "Προκαθορισμένη ρύθμιση (-preset)",
|
||||
"transcoding_preset_preset_description": "Ταχύτητα συμπίεσης. Οι πιο αργές προκαθορισμένες ρυθμίσεις παράγουν μικρότερα αρχεία και βελτιώνουν την ποιότητα όταν στοχεύουν σε έναν συγκεκριμένο ρυθμό μετάδοσης (bitrate). Ο VP9 αγνοεί τις ταχύτητες πάνω από την 'πιο γρήγορη' (faster).",
|
||||
"transcoding_realtime": "Μετατροπή σε πραγματικό χρόνο [ΠΕΙΡΑΜΑΤΙΚΟ]",
|
||||
"transcoding_realtime_description": "Επιτρέπει τη επανακωδικοποίηση να εκτελείται σε πραγματικό χρόνο καθώς γίνεται η ροή του βίντεο. Ενεργοποιεί την αλλαγή ποιότητας, αλλά μπορεί να προκαλέσει μεγαλύτερη καθυστέρηση αναπαραγωγής και κολλήματα, ανάλογα με τις δυνατότητες του διακομιστή.",
|
||||
"transcoding_realtime_enabled": "Ενεργοποίηση επανακωδικοποίησης σε πραγματικό χρόνο",
|
||||
"transcoding_realtime_enabled_description": "Αν είναι απενεργοποιημένο, ο διακομιστής θα αρνείται την εκκίνηση νέων συνεδριών επανακωδικοποίησης σε πραγματικό χρόνο.",
|
||||
"transcoding_realtime_resolutions": "Αναλύσεις",
|
||||
"transcoding_realtime_resolutions_description": "Οι αναλύσεις που προσφέρονται για επανακωδικοποίηση σε πραγματικό χρόνο. Οι υψηλότερες αναλύσεις μπορεί να προκαλέσουν προβλήματα αναπαραγωγής, εάν ο διακομιστής δεν μπορεί να τις επανακωδικοποιήσει αρκετά γρήγορα.",
|
||||
"transcoding_realtime_video_codecs": "Κωδικοποιητές βίντεο",
|
||||
"transcoding_realtime_video_codecs_description": "Οι κωδικοποιητές βίντεο που προσφέρονται για επανακωδικοποίηση σε πραγματικό χρόνο. Οι συσκευές-πελάτες θα επιλέγουν την καλύτερη επιλογή που υποστηρίζουν κατά την αναπαραγωγή. Το AV1 είναι πιο αποδοτικό από το HEVC, το οποίο είναι πιο αποδοτικό από το H.264. Όταν χρησιμοποιείτε επιτάχυνση υλικού, επιλέξτε μόνο τους κωδικοποιητές που μπορεί να κωδικοποιήσει ο επιταχυντής. Όταν χρησιμοποιείτε επανακωδικοποίηση μέσω λογισμικού, σημειώστε ότι το H.264 είναι ταχύτερο από το AV1, το οποίο είναι ταχύτερο από το HEVC.",
|
||||
"transcoding_reference_frames": "Καρέ αναφοράς",
|
||||
"transcoding_reference_frames_description": "Ο αριθμός των καρέ που χρησιμοποιούνται ως αναφορά κατά τη συμπίεση ενός δεδομένου καρέ. Υψηλότερες τιμές βελτιώνουν την αποδοτικότητα της συμπίεσης, αλλά επιβραδύνουν την κωδικοποίηση. Η τιμή 0 ρυθμίζει αυτό τον αριθμό, αυτόματα.",
|
||||
"transcoding_required_description": "Μόνο βίντεο που δεν είναι σε αποδεκτή μορφή",
|
||||
|
|
@ -435,6 +478,8 @@
|
|||
"user_settings_description": "Διαχείριση ρυθμίσεων χρήστη",
|
||||
"user_successfully_removed": "Ο χρήστης {email} αφαιρέθηκε με επιτυχία.",
|
||||
"users_page_description": "Σελίδα χρηστών διαχειριστή",
|
||||
"version_check_channel": "Κανάλι έκδοσης",
|
||||
"version_check_channel_description": "Επιλέξτε το κανάλι έκδοσης για το οποίο θέλετε να λαμβάνετε ανακοινώσεις εκδόσεων",
|
||||
"version_check_enabled_description": "Ενεργοποίηση ελέγχου έκδοσης",
|
||||
"version_check_implications": "Η λειτουργία ελέγχου έκδοσης, εξαρτάται από την περιοδική επικοινωνία με το {server}",
|
||||
"version_check_settings": "Έλεγχος εκδοσης",
|
||||
|
|
@ -529,6 +574,7 @@
|
|||
"asset_added_to_album": "Προστέθηκε στο άλμπουμ",
|
||||
"asset_adding_to_album": "Προστίθεται στο άλμπουμ…",
|
||||
"asset_created": "Το στοιχείο δημιουργήθηκε",
|
||||
"asset_day_count": "{date}: {count, plural, one {# στοιχείο} other {# στοιχεία}}",
|
||||
"asset_description_updated": "Η περιγραφή του αντικειμένου έχει ενημερωθεί",
|
||||
"asset_hashing": "Δημιουργία κατακερματισμού…",
|
||||
"asset_list_group_by_sub_title": "Ομαδοποίηση κατά",
|
||||
|
|
@ -551,6 +597,7 @@
|
|||
"asset_viewer_settings_title": "Προβολή Στοιχείων",
|
||||
"assets": "Αντικείμενα",
|
||||
"assets_added_to_album_count": "Προστέθηκε {count, plural, one {# αρχείο} other {# αρχεία}} στο άλμπουμ",
|
||||
"assets_added_to_album_partial_count": "Προστέθηκαν {successCount} από τα {totalCount} {totalCount, plural, one {στοιχείο} other {στοιχεία}} στο άλμπουμ",
|
||||
"assets_added_to_albums_count": "Προστέθηκαν {assetTotal, plural, one {# αρχείο} other {# αρχεία}} σε {albumTotal, plural, one {# άλμπουμ} other {# άλμπουμ}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Στοιχείο} other {Στοιχεία}} δεν μπορούν να προστεθούν στο άλμπουμ",
|
||||
"assets_cannot_be_added_to_albums": "Δεν μπορεί να προστεθεί κανένα {count, plural, one {στοιχείο} other {στοιχεία}} σε κανένα από τα άλμπουμ",
|
||||
|
|
@ -604,12 +651,14 @@
|
|||
"backup_options": "Επιλογές αντιγράφου ασφαλείας",
|
||||
"backup_settings_subtitle": "Διαχείριση των ρυθμίσεων μεταφόρτωσης",
|
||||
"backward": "Προς τα πίσω",
|
||||
"battery_optimization_backup_reliability": "Η απενεργοποίηση των βελτιστοποιήσεων μπαταρίας μπορεί να βελτιώσει την αξιοπιστία των αντιγράφων ασφαλείας στο παρασκήνιο",
|
||||
"biometric_auth_enabled": "Βιομετρική ταυτοποίηση ενεργοποιήθηκε",
|
||||
"biometric_locked_out": "Είστε κλειδωμένοι εκτός της βιομετρικής ταυτοποίησης",
|
||||
"biometric_no_options": "Δεν υπάρχουν διαθέσιμοι τρόποι βιομετρικής ταυτοποίησης",
|
||||
"biometric_not_available": "Δεν υπάρχει διαθέσιμη βιομετρική ταυτοποίηση σε αυτή τη συσκευή",
|
||||
"birthdate_set_description": "Η ημερομηνία γέννησης χρησιμοποιείται για τον υπολογισμό της ηλικίας αυτού του ατόμου, τη χρονική στιγμή μιας φωτογραφίας.",
|
||||
"blurred_background": "Θολό φόντο",
|
||||
"browse_templates": "Περιήγηση σε πρότυπα",
|
||||
"bugs_and_feature_requests": "Σφάλματα & Αιτήματα Λειτουργιών",
|
||||
"build": "Κατασκευή",
|
||||
"build_image": "Κατασκευή Εικόνας",
|
||||
|
|
@ -629,6 +678,7 @@
|
|||
"cannot_update_the_description": "Αδύνατη η ενημέρωση της περιγραφής",
|
||||
"cast": "Προβολή",
|
||||
"cast_description": "Ρύθμιση των διαθέσιμων προορισμών casting",
|
||||
"change": "Αλλαγή",
|
||||
"change_date": "Αλλαγή ημερομηνίας",
|
||||
"change_description": "Αλλαγή περιγραφής",
|
||||
"change_display_order": "Αλλαγή σειράς εμφάνισης",
|
||||
|
|
@ -651,6 +701,7 @@
|
|||
"charging_requirement_mobile_backup": "Η δημιουργία αντιγράφων ασφάλειας στο παρασκήνιο απαιτεί η συσκευή να φορτίζει",
|
||||
"check_logs": "Ελέγξτε τα αρχεία καταγραφής",
|
||||
"checksum": "Έλεγχος ακεραιότητας",
|
||||
"choose": "Επιλογή",
|
||||
"choose_matching_people_to_merge": "Επιλέξτε τα αντίστοιχα άτομα για συγχώνευση",
|
||||
"city": "Πόλη",
|
||||
"cleanup_confirm_description": "Το Immich εντόπισε {count} αρχεία (δημιουργήθηκαν πριν από {date}) που έχουν ασφαλώς αντιγραφεί στον διακομιστή. Να διαγραφούν τα τοπικά αντίγραφα από αυτή τη συσκευή;",
|
||||
|
|
@ -668,6 +719,7 @@
|
|||
"clear": "Εκκαθάριση",
|
||||
"clear_all": "Εκκαθάριση όλων",
|
||||
"clear_all_recent_searches": "Εκκαθάριση όλων των πρόσφατων αναζητήσεων",
|
||||
"clear_failed_count": "Αποτυχία εκκαθάρισης ({count})",
|
||||
"clear_file_cache": "Εκκαθάριση της Προσωρινής Μνήμης Αρχείων",
|
||||
"clear_message": "Εκκαθάριση μηνύματος",
|
||||
"clear_value": "Εκκαθάριση τιμής",
|
||||
|
|
@ -695,6 +747,7 @@
|
|||
"comments_are_disabled": "Τα σχόλια είναι απενεργοποιημένα",
|
||||
"common_create_new_album": "Δημιουργία νέου άλμπουμ",
|
||||
"completed": "Ολοκληρώθηκε",
|
||||
"configuration": "Ρύθμιση",
|
||||
"confirm": "Επιβεβαίωση",
|
||||
"confirm_admin_password": "Επιβεβαίωση κωδικού Διαχειριστή",
|
||||
"confirm_delete_face": "Είστε σίγουροι ότι θέλετε να διαγράψετε το πρόσωπο του/της {name} από το στοιχείο;",
|
||||
|
|
@ -709,6 +762,7 @@
|
|||
"contain": "Περιέχει",
|
||||
"context": "Συμφραζόμενα",
|
||||
"continue": "Συνέχεια",
|
||||
"control_bottom_app_bar_add_tags": "Προσθήκη Ετικετών",
|
||||
"control_bottom_app_bar_delete_from_local": "Διαγραφή από τη συσκευή",
|
||||
"control_bottom_app_bar_edit_location": "Επεξεργασία Τοποθεσίας",
|
||||
"control_bottom_app_bar_edit_time": "Επεξεργασία Ημερομηνίας & Ώρας",
|
||||
|
|
@ -717,6 +771,7 @@
|
|||
"copied_to_clipboard": "Αντιγράφηκε στο πρόχειρο!",
|
||||
"copy_error": "Σφάλμα αντιγραφής",
|
||||
"copy_image": "Αντιγραφή Εικόνας",
|
||||
"copy_json": "Αντιγραφή JSON",
|
||||
"copy_link": "Αντιγραφή συνδέσμου",
|
||||
"copy_link_to_clipboard": "Αντιγραφή συνδέσμου στο πρόχειρο",
|
||||
"copy_password": "Αντιγραφή κωδικού",
|
||||
|
|
@ -759,7 +814,6 @@
|
|||
"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 {έτη}}",
|
||||
|
|
@ -769,11 +823,15 @@
|
|||
"date_after": "Ημερομηνία μετά",
|
||||
"date_and_time": "Ημερομηνία και ώρα",
|
||||
"date_before": "Ημερομηνία πριν",
|
||||
"date_of_birth": "Ημερομηνία γέννησης",
|
||||
"date_of_birth_saved": "Η ημερομηνία γέννησης αποθηκεύτηκε επιτυχώς",
|
||||
"date_range": "Εύρος ημερομηνιών",
|
||||
"date_time_original": "Ημερομηνία/Ώρα λήψης",
|
||||
"day": "Ημέρα",
|
||||
"days": "Ημέρες",
|
||||
"deduplicate_all": "Αφαίρεση όλων των διπλότυπων",
|
||||
"default_quality_subtitle": "Η ποιότητα που χρησιμοποιείται όταν πατάτε κοινή χρήση. Κρατήστε πατημένο το κουμπί κοινής χρήσης για να επιλέγετε κάθε φορά.",
|
||||
"default_share_quality": "Προεπιλεγμένη ποιότητα διαμοιρασμού",
|
||||
"delete": "Διαγραφή",
|
||||
"delete_action_confirmation_message": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αρχείο; Αυτή η ενέργεια θα το μετακινήσει στον κάδο απορριμμάτων του διακομιστή και θα εμφανιστεί μήνυμα για το αν θέλετε να το διαγράψετε και τοπικά",
|
||||
"delete_action_prompt": "{count} διαγράφηκαν",
|
||||
|
|
@ -835,7 +893,10 @@
|
|||
"downloading_asset_filename": "Λήψη στοιχείου {filename}",
|
||||
"downloading_from_icloud": "Λήψη από το iCloud",
|
||||
"downloading_media": "Λήψη πολυμέσων",
|
||||
"drag_to_reorder": "Σύρετε για αναδιάταξη",
|
||||
"drop_files_to_upload": "Σύρετε αρχεία εδώ για να τα ανεβάσετε",
|
||||
"duplicate": "Διπλότυπο",
|
||||
"duplicate_workflow": "Διπλότυπη ροή εργασίας",
|
||||
"duplicates": "Διπλότυπα",
|
||||
"duplicates_description": "Επιλύστε κάθε ομάδα υποδεικνύοντας ποιες, εάν υπάρχουν, είναι διπλότυπες.",
|
||||
"duration": "Διάρκεια",
|
||||
|
|
@ -930,6 +991,7 @@
|
|||
"failed_to_remove_product_key": "Αποτυχία αφαίρεσης κλειδιού προϊόντος",
|
||||
"failed_to_reset_pin_code": "Αποτυχία επαναφοράς του PIN",
|
||||
"failed_to_stack_assets": "Αποτυχία στην συμπίεση των στοιχείων",
|
||||
"failed_to_tag_assets": "Αποτυχία προσθήκης ετικετών στα στοιχεία",
|
||||
"failed_to_unstack_assets": "Αποτυχία στην αποσυμπίεση των στοιχείων",
|
||||
"failed_to_update_notification_status": "Αποτυχία ενημέρωσης της κατάστασης ειδοποίησης",
|
||||
"incorrect_email_or_password": "Λανθασμένο email ή κωδικός πρόσβασης",
|
||||
|
|
@ -1041,15 +1103,18 @@
|
|||
"export_as_json": "Εξαγωγή ως JSON",
|
||||
"export_database": "Εξαγωγή βάσης δεδομένων",
|
||||
"export_database_description": "Εξαγωγή της SQLite βάσης δεδομένων",
|
||||
"exposure_time": "Χρόνος Έκθεσης",
|
||||
"extension": "Επέκταση",
|
||||
"external": "Εξωτερικός",
|
||||
"external_libraries": "Εξωτερικές βιβλιοθήκες",
|
||||
"external_network": "Εξωτερικό δίκτυο",
|
||||
"external_network_sheet_info": "Όταν δεν είστε συνδεδεμένοι στο προτιμώμενο δίκτυο Wi-Fi, η εφαρμογή θα συνδεθεί με τον διακομιστή μέσω του πρώτου από τα παρακάτω URLs που μπορεί να βρει διαθέσιμο, ξεκινώντας από το πάνω προς το κάτω",
|
||||
"f_number": "Διάφραγμα",
|
||||
"face_unassigned": "Μη ανατεθειμένο",
|
||||
"failed": "Απέτυχε",
|
||||
"failed_count": "Αποτυχημένα: {count}",
|
||||
"failed_to_authenticate": "Αποτυχία ταυτοποίησης",
|
||||
"failed_to_delete_file": "Αποτυχία διαγραφής αρχείου",
|
||||
"failed_to_load_assets": "Αποτυχία φόρτωσης στοιχείων",
|
||||
"failed_to_load_folder": "Αποτυχία φόρτωσης φακέλου",
|
||||
"favorite": "Αγαπημένο",
|
||||
|
|
@ -1071,6 +1136,7 @@
|
|||
"filters": "Φίλτρα",
|
||||
"first": "Αρχικά",
|
||||
"fix_incorrect_match": "Διόρθωση λανθασμένης αντιστοίχισης",
|
||||
"focal_length": "Εστιακή Απόσταση",
|
||||
"folder": "Φάκελος",
|
||||
"folder_not_found": "Ο φάκελος δεν βρέθηκε",
|
||||
"folders": "Φάκελοι",
|
||||
|
|
@ -1081,6 +1147,7 @@
|
|||
"free_up_space_description": "Μετακινήστε τις φωτογραφίες και τα βίντεο που έχουν αντιγραφεί στον κάδο της συσκευής σας για να απελευθερώσετε χώρο. Τα αντίγραφά σας στο διακομιστή, παραμένουν ασφαλή.",
|
||||
"free_up_space_settings_subtitle": "Απελευθέρωση χώρου στη συσκευή",
|
||||
"full_path": "Πλήρης διαδρομή: {path}",
|
||||
"full_path_or_folder": "Πλήρης διαδρομή ή φάκελος",
|
||||
"gcast_enabled": "Μετάδοση περιεχομένου Google Cast",
|
||||
"gcast_enabled_description": "Αυτό το χαρακτηριστικό φορτώνει εξωτερικούς πόρους από τη Google για να λειτουργήσει.",
|
||||
"general": "Γενικά",
|
||||
|
|
@ -1152,6 +1219,7 @@
|
|||
"individual_share": "Μεμονωμένος διαμοιρασμός",
|
||||
"individual_shares": "Μεμονωμένες κοινοποιήσεις",
|
||||
"info": "Πληροφορίες",
|
||||
"integrity_checks": "Έλεγχοι Ακεραιότητας",
|
||||
"interval": {
|
||||
"day_at_onepm": "Κάθε μέρα στη 1μμ",
|
||||
"hours": "Κάθε {hours, plural, one {ώρα} other {{hours, number} ώρες}}",
|
||||
|
|
@ -1162,6 +1230,7 @@
|
|||
"invalid_date_format": "Μη έγκυρη μορφή ημερομηνίας",
|
||||
"invite_people": "Πρόσκληση Ατόμων",
|
||||
"invite_to_album": "Πρόσκληση σε άλμπουμ",
|
||||
"iso": "ISO",
|
||||
"items_count": "{count, plural, one {# αντικείμενο} other {# αντικείμενα}}",
|
||||
"jobs": "Εργασίες",
|
||||
"keep": "Διατήρηση",
|
||||
|
|
@ -1190,6 +1259,7 @@
|
|||
"leave": "Εγκατάλειψη",
|
||||
"leave_album": "Αποχώρηση από το άλμπουμ",
|
||||
"lens_model": "Μοντέλο φακού",
|
||||
"less": "Λιγότερα",
|
||||
"let_others_respond": "Επέτρεψε σε άλλους να απαντήσουν",
|
||||
"level": "Επίπεδο",
|
||||
"library": "Βιβλιοθήκη",
|
||||
|
|
@ -1210,6 +1280,8 @@
|
|||
"link_to_oauth": "Σύνδεση στον OAuth",
|
||||
"linked_oauth_account": "Ο OAuth λογαριασμός συνδέθηκε",
|
||||
"list": "Λίστα",
|
||||
"live": "Ζωντανά",
|
||||
"load_more": "Φόρτωση Περισσότερων",
|
||||
"loading": "Φόρτωση",
|
||||
"loading_search_results_failed": "Η φόρτωση αποτελεσμάτων αναζήτησης απέτυχε",
|
||||
"local": "Τοπικά",
|
||||
|
|
@ -1250,9 +1322,9 @@
|
|||
"login_form_failed_login": "Σφάλμα κατά τη σύνδεσή σας, ελέγξτε τη διεύθυνση URL του διακομιστή, το email και τον κωδικό πρόσβασης",
|
||||
"login_form_handshake_exception": "Υπήρξε σφάλμα χειραψίας με τον διακομιστή. Ενεργοποιήστε την υποστήριξη αυτο-υπογεγραμμένου πιστοποιητικού στις ρυθμίσεις εάν χρησιμοποιείτε αυτο-υπογεγραμμένο πιστοποιητικό.",
|
||||
"login_form_password_hint": "κωδικός πρόσβασης",
|
||||
"login_form_server_empty": "Εισαγάγετε μια διεύθυνση URL διακομιστή.",
|
||||
"login_form_server_error": "Δεν ήταν δυνατή η σύνδεση με τον διακομιστή.",
|
||||
"login_has_been_disabled": "Η σύνδεση έχει απενεργοποιηθεί.",
|
||||
"login_form_server_empty": "Εισαγάγετε μια διεύθυνση URL διακομιστή",
|
||||
"login_form_server_error": "Δεν ήταν δυνατή η σύνδεση με τον διακομιστή",
|
||||
"login_has_been_disabled": "Η σύνδεση έχει απενεργοποιηθεί",
|
||||
"login_password_changed_error": "Παρουσιάστηκε σφάλμα κατά την ενημέρωση του κωδικού πρόσβασής σας",
|
||||
"login_password_changed_success": "Ο κωδικός πρόσβασης ενημερώθηκε με επιτυχία",
|
||||
"logout_all_device_confirmation": "Είστε βέβαιοι ότι θέλετε να αποσυνδεθείτε από όλες τις συσκευές;",
|
||||
|
|
@ -1303,6 +1375,7 @@
|
|||
"map_location_picker_page_use_location": "Χρησιμοποιήστε αυτήν την τοποθεσία",
|
||||
"map_location_service_disabled_content": "Η υπηρεσία τοποθεσίας πρέπει να είναι ενεργοποιημένη για την εμφάνιση στοιχείων από την τρέχουσα τοποθεσία σας. Θέλετε να το ενεργοποιήσετε τώρα;",
|
||||
"map_location_service_disabled_title": "Η υπηρεσία τοποθεσίας απενεργοποιήθηκε",
|
||||
"map_marker_for_image": "Σήμανση στον χάρτη για φωτογραφία που τραβήχτηκε στο {city}, {country}",
|
||||
"map_marker_with_image": "Χάρτης δείκτη με εικόνα",
|
||||
"map_no_location_permission_content": "Απαιτείται άδεια τοποθεσίας για την εμφάνιση στοιχείων από την τρέχουσα τοποθεσία σας. Θέλετε να το επιτρέψετε τώρα;",
|
||||
"map_no_location_permission_title": "Η άδεια τοποθεσίας απορρίφθηκε",
|
||||
|
|
@ -1320,6 +1393,38 @@
|
|||
"marked_all_as_read": "Όλα επισημάνθηκαν ως αναγνωσμένα",
|
||||
"matches": "Αντιστοιχίες",
|
||||
"matching_assets": "Αντιστοιχία στοιχείων",
|
||||
"media_chrome": {
|
||||
"auto": "Αυτόματα",
|
||||
"captions": "Λεζάντες",
|
||||
"captions_off": "Κλειστό",
|
||||
"closed_captions": "υπότιτλοι για κωφούς/βαρήκοους",
|
||||
"decode_error": "Σφάλμα αποκωδικοποίησης",
|
||||
"disable_captions": "Απενεργοποίηση υπότιτλων",
|
||||
"enable_captions": "Ενεργοποίηση υπότιτλων",
|
||||
"enter_fullscreen_mode": "Είσοδος σε πλήρη οθόνη",
|
||||
"exit_fullscreen_mode": "Έξοδος από πλήρη οθόνη",
|
||||
"loop": "Επανάληψη",
|
||||
"media_error_description": "Ένα σφάλμα πολυμέσων προκάλεσε τη διακοπή της αναπαραγωγής. Το αρχείο πολυμέσων μπορεί να είναι κατεστραμμένο ή το πρόγραμμα περιήγησής σας δεν υποστηρίζει αυτήν τη μορφή.",
|
||||
"media_loading": "φόρτωση πολυμέσων",
|
||||
"mute": "Σίγαση",
|
||||
"network_error": "Σφάλμα δικτύου",
|
||||
"network_error_description": "Ένα σφάλμα δικτύου προκάλεσε την αποτυχία λήψης του αρχείου πολυμέσων.",
|
||||
"not_supported_error": "Η Πηγή Δεν Υποστηρίζεται",
|
||||
"playback_rate": "Ταχύτητα αναπαραγωγής",
|
||||
"playback_rate_current": "τρέχουσα ταχύτητα αναπαραγωγής",
|
||||
"playback_rate_value": "Ταχύτητα αναπαραγωγής {playbackRate}",
|
||||
"playback_time": "χρόνος αναπαραγωγής",
|
||||
"quality": "Ποιότητα",
|
||||
"second": "δευτερόλεπτο",
|
||||
"seconds": "δευτερόλεπτα",
|
||||
"time_value_of_total_time": "{currentTime} από {totalTime}",
|
||||
"time_value_remaining": "{time} υπολειπόμενος χρόνος",
|
||||
"unmute": "Ενεργοποίηση ήχου",
|
||||
"unsupported_error_description": "Παρουσιάστηκε ένα μη υποστηριζόμενο σφάλμα. Ο διακομιστής ή το δίκτυο απέτυχαν ή ο περιηγητής σας δεν υποστηρίζει αυτήν τη μορφή.",
|
||||
"video_not_loaded_unknown_time": "το βίντεο δεν φορτώθηκε, άγνωστη διάρκεια.",
|
||||
"video_player": "πρόγραμμα αναπαραγωγής βίντεο",
|
||||
"volume": "ένταση"
|
||||
},
|
||||
"media_type": "Τύπος πολυμέσου",
|
||||
"memories": "Αναμνήσεις",
|
||||
"memories_all_caught_up": "Συγχρονισμένα",
|
||||
|
|
@ -1336,6 +1441,8 @@
|
|||
"merge_people_prompt": "Θέλετε να συγχωνεύσετε αυτά τα άτομα; Αυτή η ενέργεια είναι μη αναστρέψιμη.",
|
||||
"merge_people_successfully": "Τα άτομα συγχωνεύθηκαν με επιτυχία",
|
||||
"merged_people_count": "Έγινε συγχώνευση {count, plural, one {# ατόμου} other {# ατόμων}}",
|
||||
"minFaces": "Ελάχιστος αριθμός προσώπων",
|
||||
"minFaces_description": "Ο ελάχιστος αριθμός αναγνωρισμένων προσώπων για την εμφάνιση ενός ατόμου",
|
||||
"minimize": "Ελαχιστοποίηση",
|
||||
"minute": "Λεπτό",
|
||||
"minutes": "Λεπτά",
|
||||
|
|
@ -1343,8 +1450,10 @@
|
|||
"mobile_app": "Εφαρμογή για κινητά",
|
||||
"mobile_app_download_onboarding_note": "Κατέβασε την συνοδευτική εφαρμογή για κινητά χρησιμοποιώντας τις παρακάτω επιλογές",
|
||||
"model": "Μοντέλο",
|
||||
"modify_date": "Ημερομηνία Τροποποίησης",
|
||||
"month": "Μήνας",
|
||||
"more": "Περισσότερα",
|
||||
"motion": "Κίνηση",
|
||||
"move": "Μετακίνηση",
|
||||
"move_off_locked_folder": "Μετακίνηση έξω από τον κλειδωμένο φάκελο",
|
||||
"move_to": "Μετακίνηση σε",
|
||||
|
|
@ -1371,6 +1480,7 @@
|
|||
"never": "Ποτέ",
|
||||
"new_album": "Νέο Άλμπουμ",
|
||||
"new_api_key": "Νέο API Key",
|
||||
"new_feature": "Νέα λειτουργία",
|
||||
"new_password": "Νέος κωδικός πρόσβασης",
|
||||
"new_person": "Νέο άτομο",
|
||||
"new_pin_code": "Νέος κωδικός PIN",
|
||||
|
|
@ -1408,6 +1518,7 @@
|
|||
"no_results": "Κανένα αποτέλεσμα",
|
||||
"no_results_description": "Δοκιμάστε ένα συνώνυμο ή πιο γενική λέξη-κλειδί",
|
||||
"no_shared_albums_message": "Δημιουργήστε ένα άλμπουμ για να μοιράζεστε φωτογραφίες και βίντεο με άτομα στο δίκτυό σας",
|
||||
"no_steps": "Δεν έχουν προστεθεί ακόμα βήματα",
|
||||
"none": "Κανένα",
|
||||
"not_allowed": "Δεν επιτρέπεται",
|
||||
"not_available": "Μ/Δ (Μη Διαθέσιμο)",
|
||||
|
|
@ -1415,6 +1526,10 @@
|
|||
"not_selected": "Δεν επιλέχθηκε",
|
||||
"notes": "Σημειώσεις",
|
||||
"nothing_here_yet": "Τίποτα εδώ ακόμα",
|
||||
"notification_backup_reliability": "Ενεργοποιήστε τις ειδοποιήσεις για να βελτιώσετε την αξιοπιστία του αντιγράφου ασφαλείας στο παρασκήνιο",
|
||||
"notification_enabled_list_tile_content": "Το Immich χρησιμοποιεί ειδοποιήσεις για την αξιόπιστη λειτουργία των αντιγράφων ασφαλείας στο παρασκήνιο. Μπορείτε να τις διαχειριστείτε από τις ρυθμίσεις της συσκευής σας.",
|
||||
"notification_enabled_list_tile_open_button": "Άνοιγμα ρυθμίσεων",
|
||||
"notification_enabled_list_tile_title": "Ειδοποιήσεις ενεργοποιημένες",
|
||||
"notification_permission_dialog_content": "Για να ενεργοποιήσετε τις ειδοποιήσεις, μεταβείτε στις Ρυθμίσεις και επιλέξτε να επιτρέπεται.",
|
||||
"notification_permission_list_tile_content": "Παραχωρήστε άδεια για ενεργοποίηση ειδοποιήσεων.",
|
||||
"notification_permission_list_tile_enable_button": "Ενεργοποίηση Ειδοποιήσεων",
|
||||
|
|
@ -1426,6 +1541,8 @@
|
|||
"obtainium_configurator": "Ρυθμιστής Obtainium",
|
||||
"obtainium_configurator_instructions": "Χρησιμοποίησε το Obtainium για να εγκαταστήσεις και να ενημερώσεις απευθείας την εφαρμογή Android από τα κυκλοφορίες του Immich στο GitHub. Δημιούργησε ένα API key και επέλεξε μια παραλλαγή για να δημιουργήσεις το σύνδεσμο ρύθμισης του Obtainium",
|
||||
"ocr": "OCR",
|
||||
"ocr_body": "Το Immich διαβάζει πλέον το κείμενο μέσα στις φωτογραφίες σας, ώστε να μπορείτε να τις αναζητάτε με βάση το περιεχόμενό τους.",
|
||||
"ocr_title": "Αναζήτηση κειμένου στις φωτογραφίες σας",
|
||||
"official_immich_resources": "Επίσημοι Πόροι του Immich",
|
||||
"offline": "Εκτός σύνδεσης",
|
||||
"offset": "Μετατόπιση",
|
||||
|
|
@ -1444,6 +1561,8 @@
|
|||
"open": "Άνοιγμα",
|
||||
"open_calendar": "Άνοιγμα ημερολογίου",
|
||||
"open_in_browser": "Άνοιγμα στο πρόγραμμα περιήγησης",
|
||||
"open_in_immich_body": "Ορίστε το Immich ως εφαρμογή συλλογής στο Android, ώστε να ανοίγετε φωτογραφίες απευθείας από άλλες εφαρμογές.",
|
||||
"open_in_immich_title": "Άνοιγμα φωτογραφιών στο Immich",
|
||||
"open_in_map_view": "Άνοιγμα σε προβολή χάρτη",
|
||||
"open_in_openstreetmap": "Άνοιγμα στο OpenStreetMap",
|
||||
"open_the_search_filters": "Ανοίξτε τα φίλτρα αναζήτησης",
|
||||
|
|
@ -1452,6 +1571,7 @@
|
|||
"organize_into_albums": "Οργάνωση σε άλμπουμ",
|
||||
"organize_into_albums_description": "Τοποθετείστε τις υπάρχουσες φωτογραφίες σε άλμπουμ χρησιμοποιώντας τις τρέχουσες ρυθμίσεις συγχρονισμού",
|
||||
"organize_your_library": "Οργανώστε τη βιβλιοθήκη σας",
|
||||
"orientation": "Προσανατολισμός",
|
||||
"original": "πρωτότυπο",
|
||||
"other": "Άλλες",
|
||||
"other_devices": "Άλλες συσκευές",
|
||||
|
|
@ -1500,7 +1620,7 @@
|
|||
"person": "Άτομο",
|
||||
"person_age_months": "{months, plural, one {# μήνας} other {# μήνες}} παλιά",
|
||||
"person_age_year_months": "1 χρόνος, {months, plural, one {# μήνας} other {# μήνες}} παλιά",
|
||||
"person_age_years": "{years, plural, other {# χρόνια}} παλιά",
|
||||
"person_age_years": "{years, plural, one {# έτους} other {# ετών}}",
|
||||
"person_birthdate": "Γεννηθείς στις {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (κρυφό)} other {}}",
|
||||
"person_recognized": "Άτομο αναγνωρίστηκε",
|
||||
|
|
@ -1526,6 +1646,8 @@
|
|||
"play_original_video_setting_description": "Προτίμησε την αναπαραγωγή των αρχικών βίντεο αντί των μετακωδικοποιημένων. Αν το αρχικό αρχείο δεν είναι συμβατό, ίσως να μην αναπαραχθεί σωστά.",
|
||||
"play_transcoded_video": "Αναπαραγωγή μετακωδικοποιημένου βίντεο",
|
||||
"please_auth_to_access": "Παρακαλώ πιστοποιηθείτε για να αποκτήσετε πρόσβαση",
|
||||
"plugin_method_filter_type": "Φίλτρο",
|
||||
"plugin_method_filter_type_description": "Αυτή η μέθοδος μπορεί να φιλτράρει συμβάντα και, ανάλογα με τις συνθήκες, να εμποδίζει την εκτέλεση των επόμενων βημάτων",
|
||||
"port": "Θύρα",
|
||||
"preferences_settings_subtitle": "Διαχειριστείτε τις προτιμήσεις της εφαρμογής",
|
||||
"preferences_settings_title": "Προτιμήσεις",
|
||||
|
|
@ -1546,6 +1668,7 @@
|
|||
"profile_drawer_readonly_mode": "Η λειτουργία μόνο-για-ανάγνωση ενεργοποιήθηκε. Κρατήστε πατημένο το εικονίδιο του χρήστη για απενεργοποίηση.",
|
||||
"profile_image_of_user": "Εικόνα προφίλ του χρήστη {user}",
|
||||
"profile_picture_set": "Ορισμός εικόνας προφίλ.",
|
||||
"projection_type": "Τύπος Προβολής",
|
||||
"public_album": "Δημόσιο άλμπουμ",
|
||||
"public_share": "Δημόσια Κοινή Χρήση",
|
||||
"purchase_account_info": "Υποστηρικτής",
|
||||
|
|
@ -1598,7 +1721,10 @@
|
|||
"recent": "Πρόσφατα",
|
||||
"recent_searches": "Πρόσφατες αναζητήσεις",
|
||||
"recently_added": "Προστέθηκαν πρόσφατα",
|
||||
"recently_added_body": "Μεταβείτε απευθείας σε όλα όσα έχετε προσθέσει πρόσφατα, σε μια αποκλειστική σελίδα.",
|
||||
"recently_added_description": "Περιηγηθείτε στα αρχεία σας, ταξινομημένα κατά ημερομηνία μεταφόρτωσής τους στο Immich",
|
||||
"recently_added_page_title": "Προστέθηκαν Πρόσφατα",
|
||||
"recently_added_title": "Προστέθηκαν πρόσφατα",
|
||||
"recently_taken": "Λήφθηκαν πρόσφατα",
|
||||
"refresh": "Ανανέωση",
|
||||
"refresh_encoded_videos": "Ανανέωση κωδικοποιημένων βίντεο",
|
||||
|
|
@ -1618,6 +1744,7 @@
|
|||
"remove_assets_shared_link_confirmation": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε {count, plural, one {# στοιχείο} other {# στοιχεία}} από αυτόν τον κοινόχρηστο σύνδεσμο;",
|
||||
"remove_assets_title": "Αφαίρεση στοιχείων;",
|
||||
"remove_custom_date_range": "Αφαίρεση προσαρμοσμένης χρονικής περιόδου",
|
||||
"remove_filter": "Αφαίρεση φίλτρου",
|
||||
"remove_from_album": "Αφαίρεση από το άλμπουμ",
|
||||
"remove_from_album_action_prompt": "{count} αφαιρέθηκαν από το άλμπουμ",
|
||||
"remove_from_favorites": "Αφαίρεση από τα αγαπημένα",
|
||||
|
|
@ -1689,6 +1816,8 @@
|
|||
"search_by_description_example": "Ημερήσια πεζοπορία στο Πάπιγκο",
|
||||
"search_by_filename": "Αναζήτηση βάσει ονόματος αρχείου ή επέκτασης αρχείου",
|
||||
"search_by_filename_example": "π.χ. IMG_1234.JPG ή PNG",
|
||||
"search_by_full_path": "Αναζήτηση με βάση την πλήρη διαδρομή ή το φάκελο",
|
||||
"search_by_full_path_example": "/Γιάννης/Projects/3D_Printing/2026-07-01 — μπορείτε να κάνετε αναζήτηση για όρους όπως Projects, 3D, Printing, 2026 κ.λπ.",
|
||||
"search_by_ocr": "Αναζήτηση κατά OCR",
|
||||
"search_by_ocr_example": "Λάτε",
|
||||
"search_camera_lens_model": "Αναζήτηση μοντέλου φακού...",
|
||||
|
|
@ -1732,7 +1861,7 @@
|
|||
"searching_locales": "Αναζήτηση τοποθεσιών...",
|
||||
"second": "Δευτερόλεπτο",
|
||||
"see_all_people": "Προβολή όλων των ατόμων",
|
||||
"select": "Επιλογή",
|
||||
"select": "Επιλέξτε",
|
||||
"select_album": "Επιλογή άλμπουμ",
|
||||
"select_album_cover": "Επιλέξτε εξώφυλλο άλμπουμ",
|
||||
"select_albums": "Επιλογή πολλών άλμπουμ",
|
||||
|
|
@ -1750,6 +1879,7 @@
|
|||
"select_person": "Επίλεξε άτομο",
|
||||
"select_person_to_tag": "Επιλέξτε ένα άτομο για επισήμανση",
|
||||
"select_photos": "Επιλέξτε φωτογραφίες",
|
||||
"select_quality": "Επιλέξτε ποιότητα",
|
||||
"select_trash_all": "Επιλέξτε διαγραφή όλων",
|
||||
"selected": "Επιλεγμένοι",
|
||||
"selected_count": "{count, plural, other {# επιλεγμένοι}}",
|
||||
|
|
@ -1799,6 +1929,10 @@
|
|||
"share": "Κοινοποίηση",
|
||||
"share_dialog_preparing": "Προετοιμασία...",
|
||||
"share_link": "Σύνδεσμος κοινοποίησης",
|
||||
"share_original": "Χρήση αρχικού (μεγάλο μέγεθος)",
|
||||
"share_preview": "Χρήση μικρογραφίας (μικρό μέγεθος)",
|
||||
"share_quality_body": "Κρατήστε πατημένο το κουμπί κοινοποίησης για να επιλέξετε την ποιότητα της εικόνας πριν την κοινοποιήσετε.",
|
||||
"share_quality_title": "Επιλέξτε την ποιότητα κοινοποίησης",
|
||||
"shared": "Σε κοινή χρήση",
|
||||
"shared_album_activities_input_disable": "Το σχόλιο είναι απενεργοποιημένο",
|
||||
"shared_album_activity_remove_content": "Θέλετε να διαγράψετε αυτήν τη δραστηριότητα;",
|
||||
|
|
@ -1813,7 +1947,9 @@
|
|||
"shared_link_app_bar_title": "Κοινόχρηστοι Σύνδεσμοι",
|
||||
"shared_link_clipboard_copied_massage": "Αντιγράφηκε στο πρόχειρο",
|
||||
"shared_link_create_error": "Σφάλμα κατά τη δημιουργία κοινόχρηστου συνδέσμου",
|
||||
"shared_link_custom_url_description": "Αποκτήστε πρόσβαση σε αυτόν τον κοινόχρηστο σύνδεσμο με μια προσαρμοσμένη διεύθυνση URL",
|
||||
"shared_link_custom_url_description": "Αποκτήστε πρόσβαση σε αυτόν τον κοινόχρηστο σύνδεσμο με ένα προσαρμοσμένο URL",
|
||||
"shared_link_custom_url_title": "Προσαρμοσμένο URL",
|
||||
"shared_link_custom_url_warning": "Προειδοποίηση: η χρήση κάθετου χαρακτήρα (/) σε προσαρμοσμένο όνομα URL ενδέχεται να προκαλέσει απρόβλεπτη συμπεριφορά.",
|
||||
"shared_link_edit_description_hint": "Εισαγάγετε την περιγραφή της κοινής χρήσης",
|
||||
"shared_link_edit_expire_after_option_day": "1 ημέρα",
|
||||
"shared_link_edit_expire_after_option_days": "{count} ημέρες",
|
||||
|
|
@ -1858,7 +1994,9 @@
|
|||
"show_in_timeline": "Εμφάνιση στο χρονολόγιο",
|
||||
"show_in_timeline_setting_description": "Εμφάνιση φωτογραφιών και βίντεο από αυτόν τον χρήστη στο χρονολόγιό σας",
|
||||
"show_keyboard_shortcuts": "Εμφάνιση συντομεύσεων πληκτρολογίου",
|
||||
"show_less": "Προβολή λιγότερων",
|
||||
"show_metadata": "Εμφάνιση μεταδεδομένων",
|
||||
"show_more_fields": "{count, plural, one {Εμφάνιση # επιπλέον πεδίου} other {Εμφάνιση # επιπλέον πεδίων}}",
|
||||
"show_or_hide_info": "Εμφάνιση ή απόκρυψη πληροφοριών",
|
||||
"show_password": "Εμφάνιση κωδικού",
|
||||
"show_person_options": "Εμφάνιση επιλογών ατόμου",
|
||||
|
|
@ -1866,6 +2004,7 @@
|
|||
"show_schema": "Εμφάνιση σχήματος",
|
||||
"show_search_options": "Εμφάνιση επιλογών αναζήτησης",
|
||||
"show_shared_links": "Εμφάνιση κοινών συνδέσμων",
|
||||
"show_slideshow_metadata_overlay": "Εμφάνιση επικάλυψης πληροφοριών εικόνας",
|
||||
"show_slideshow_transition": "Εμφάνιση μετάβασης παρουσίασης",
|
||||
"show_supporter_badge": "Σήμα υποστηρικτή",
|
||||
"show_supporter_badge_description": "Εμφάνιση σήματος υποστηρικτή",
|
||||
|
|
@ -1877,13 +2016,21 @@
|
|||
"sign_out": "Αποσύνδεση",
|
||||
"sign_up": "Εγγραφή",
|
||||
"size": "Μέγεθος",
|
||||
"skip": "Παράλειψη",
|
||||
"skip_to_content": "Μετάβαση στο περιεχόμενο",
|
||||
"skip_to_folders": "Παράκαμψη στους φακέλους",
|
||||
"skip_to_tags": "Παράκαμψη στις ετικέτες",
|
||||
"slideshow": "Παρουσίαση",
|
||||
"slideshow_body": "Καθίστε αναπαυτικά και απολαύστε τις φωτογραφίες σας να προβάλλονται σε μια παρουσίαση πλήρους οθόνης.",
|
||||
"slideshow_metadata_overlay_mode": "Περιεχόμενο επικάλυψης",
|
||||
"slideshow_metadata_overlay_mode_description_only": "Μόνο περιγραφή",
|
||||
"slideshow_metadata_overlay_mode_full": "Πλήρης",
|
||||
"slideshow_repeat": "Επανάληψη παρουσίασης",
|
||||
"slideshow_repeat_description": "Εκκίνηση από την αρχή όταν τελειώσει η παρουσίαση",
|
||||
"slideshow_settings": "Ρυθμίσεις παρουσίασης",
|
||||
"slideshow_title": "Παρουσίαση φωτογραφιών",
|
||||
"smart_album": "Έξυπνο άλμπουμ",
|
||||
"some_assets_already_have_a_location_warning": "Ορισμένα από τα επιλεγμένα στοιχεία έχουν ήδη δεδομένα τοποθεσίας",
|
||||
"sort_albums_by": "Ταξινόμηση άλμπουμ κατά...",
|
||||
"sort_created": "Ημερομηνία Δημιουργίας",
|
||||
"sort_items": "Αριθμός αντικειμένων",
|
||||
|
|
@ -1904,6 +2051,10 @@
|
|||
"start_date_before_end_date": "Η ημερομηνία έναρξης πρέπει να είναι πριν από την ημερομηνία λήξης",
|
||||
"state": "Νομός",
|
||||
"status": "Κατάσταση",
|
||||
"step_delete": "Διαγραφή βήματος",
|
||||
"step_delete_confirm": "Θέλετε σίγουρα να διαγράψετε αυτό το βήμα;",
|
||||
"step_details": "Λεπτομέρειες βήματος",
|
||||
"steps": "Βήματα",
|
||||
"stop_casting": "Διακοπή μετάδοσης",
|
||||
"stop_motion_photo": "Διέκοψε την Φωτογραφία Κίνησης",
|
||||
"stop_photo_sharing": "Διακοπή κοινής χρήσης των φωτογραφιών σας;",
|
||||
|
|
@ -1984,10 +2135,12 @@
|
|||
"trash_page_info": "Τα στοιχεία που έχουν απορριφθεί θα διαγραφούν οριστικά μετά από {days} ημέρες",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Τα στοιχεία που βρίσκονται στον κάδο απορριμμάτων θα διαγραφούν οριστικά μετά από {days, plural, one {# ημέρα} other {# ημέρες}}.",
|
||||
"trigger": "Ενεργοποιητής",
|
||||
"trigger_asset_uploaded": "Το στοιχείο ανέβηκε",
|
||||
"trigger_asset_metadata_extraction": "Εξαγωγή μεταδεδομένων στοιχείων",
|
||||
"trigger_asset_metadata_extraction_description": "Ενεργοποιείται αυτόματα όταν εξάγονται τα μεταδεδομένα EXIF ενός αρχείου",
|
||||
"trigger_asset_uploaded": "Μεταφόρτωση Στοιχείου",
|
||||
"trigger_asset_uploaded_description": "Ενεργοποιείται όταν ανεβαίνει ένα νέο στοιχείο",
|
||||
"trigger_person_recognized": "Άτομο Αναγνωρίστηκε",
|
||||
"trigger_person_recognized_description": "Ενεργοποιείται όταν ανιχνεύεται άτομο",
|
||||
"trigger_person_recognized_description": "Ενεργοποιείται αυτόματα όταν ανιχνεύεται ένα άτομο",
|
||||
"troubleshoot": "Επίλυση προβλημάτων",
|
||||
"type": "Τύπος",
|
||||
"unable_to_change_pin_code": "Αδυναμία αλλαγής κωδικού PIN",
|
||||
|
|
@ -2003,6 +2156,7 @@
|
|||
"unknown": "Άγνωστο",
|
||||
"unknown_country": "Άγνωστη Χώρα",
|
||||
"unknown_date": "Άγνωστη ημερομηνία",
|
||||
"unknown_schema": "Άγνωστη δομή",
|
||||
"unknown_year": "Άγνωστο Έτος",
|
||||
"unlimited": "Απεριόριστο",
|
||||
"unlink_motion_video": "Αποσυνδέστε το βίντεο κίνησης",
|
||||
|
|
@ -2027,6 +2181,7 @@
|
|||
"updated_password": "Ο κωδικός πρόσβασης ενημερώθηκε",
|
||||
"upload": "Μεταφόρτωση",
|
||||
"upload_concurrency": "Ταυτόχρονη μεταφόρτωση",
|
||||
"upload_day_count": "{date}: {count, plural, one {# μεταφόρτωση} other {# μεταφορτώσεις}}",
|
||||
"upload_details": "Λεπτομέρειες μεταφόρτωσης",
|
||||
"upload_error_with_count": "Σφάλμα μεταφόρτωσης για {count, plural, one {# αρχείο} other {# αρχεία}}",
|
||||
"upload_errors": "Η μεταφόρτωση ολοκληρώθηκε με {count, plural, one {# σφάλμα} other {# σφάλματα}}, ανανεώστε τη σελίδα για να δείτε νέα στοιχεία μεταφόρτωσης.",
|
||||
|
|
@ -2037,9 +2192,13 @@
|
|||
"upload_status_errors": "Σφάλματα",
|
||||
"upload_status_uploaded": "Μεταφορτώθηκαν",
|
||||
"upload_success": "Η μεταφόρτωση ολοκληρώθηκε, ανανεώστε τη σελίδα για να δείτε τα νέα αντικείμενα.",
|
||||
"upload_to_album_body": "Για χρήστες που δεν χρησιμοποιούν τη χειροκίνητη μεταφόρτωση, μπορείτε πλέον να προσθέτετε απευθείας τοπικές φωτογραφίες σε ένα άλμπουμ κατά τη μεταφόρτωσή τους. Δεν χρειάζεται πια να τις ανεβάζετε πρώτα και να τις προσθέτετε σε άλμπουμ αργότερα.",
|
||||
"upload_to_album_title": "Μεταφόρτωση απευθείας σε άλμπουμ",
|
||||
"upload_to_immich": "Μεταφόρτωση στο Immich ({count})",
|
||||
"uploading": "Μεταφορτώνεται",
|
||||
"uploading_media": "Μεταφόρτωση πολυμέσων",
|
||||
"uploads": "Μεταφορτώσεις",
|
||||
"uploads_count": "{count, plural, one {# μεταφόρτωση} other {# μεταφορτώσεις}}",
|
||||
"url": "URL",
|
||||
"usage": "Χρήση",
|
||||
"use_biometric": "Χρήση βιομετρικών στοιχείων",
|
||||
|
|
@ -2047,6 +2206,7 @@
|
|||
"use_browser_locale_description": "Μορφοποιήστε τις ημερομηνίες, τους χρόνους και τους αριθμούς σύμφωνα με τη γλώσσα του προγράμματος περιήγησής σας",
|
||||
"use_current_connection": "Χρήση τρέχουσας σύνδεσης",
|
||||
"use_custom_date_range": "Χρήση προσαρμοσμένου εύρους ημερομηνιών",
|
||||
"use_template": "Χρήση πρότυπου",
|
||||
"user": "Χρήστης",
|
||||
"user_has_been_deleted": "Αυτός ο χρήστης έχει διεγραφεί.",
|
||||
"user_id": "ID Χρήστη",
|
||||
|
|
@ -2074,6 +2234,7 @@
|
|||
"video": "Βίντεο",
|
||||
"video_hover_setting": "Προεπισκόπηση βίντεο με το δείκτη του ποντικιού",
|
||||
"video_hover_setting_description": "Προεπισκόπηση βίντεο όταν το ποντίκι βρίσκεται πάνω από το στοιχείο. Ακόμη και όταν είναι απενεργοποιημένη, η αναπαραγωγή μπορεί να ξεκινήσει τοποθετώντας το δείκτη του ποντικιού πάνω από το εικονίδιο αναπαραγωγής.",
|
||||
"video_quality": "Ποιότητα βίντεο",
|
||||
"videos": "Βίντεο",
|
||||
"videos_count": "{count, plural, one {# Βίντεο} other {# Βίντεο}}",
|
||||
"view": "Προβολή",
|
||||
|
|
@ -2100,9 +2261,14 @@
|
|||
"week": "Εβδομάδα",
|
||||
"welcome": "Καλωσορίσατε",
|
||||
"welcome_to_immich": "Καλωσορίσατε στο Ιmmich",
|
||||
"whats_new": "Τι νέο υπάρχει",
|
||||
"whats_new_settings_subtitle": "Δείτε τι νέο υπάρχει στο Immich",
|
||||
"whats_new_version": "Έκδοση {version}",
|
||||
"when": "Πότε",
|
||||
"width": "Πλάτος",
|
||||
"wifi_name": "Όνομα Wi-Fi",
|
||||
"workflow_delete_prompt": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή τη ροή εργασίας;",
|
||||
"workflow": "Ροή εργασίας",
|
||||
"workflow_delete_prompt": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτήω τη ροή εργασίας;",
|
||||
"workflow_deleted": "Η ροή εργασίας διαγράφηκε",
|
||||
"workflow_description": "Περιγραφή ροής εργασίας",
|
||||
"workflow_info": "Πληροφορίες ροής εργασίας",
|
||||
|
|
@ -2111,10 +2277,12 @@
|
|||
"workflow_name": "Όνομα ροής εργασίας",
|
||||
"workflow_navigation_prompt": "Είστε σίγουροι ότι θέλετε να φύγετε χωρίς να αποθηκεύσετε τις αλλαγές σας;",
|
||||
"workflow_summary": "Σύνοψη ροής εργασίας",
|
||||
"workflow_templates": "Πρότυπα ροών εργασίας",
|
||||
"workflow_update_success": "Η ροή εργασίας ενημερώθηκε με επιτυχία",
|
||||
"workflows": "Ροές εργασίας",
|
||||
"workflows_help_text": "Οι ροές εργασίας αυτοματοποιούν ενέργειες στα στοιχεία σας με βάση ενεργοποιητές και φίλτρα",
|
||||
"wrong_pin_code": "Λάθος κωδικός PIN",
|
||||
"x_of_total": "{x}/{total}",
|
||||
"year": "Έτος",
|
||||
"years_ago": "πριν από {years, plural, one {# χρόνο} other {# χρόνια}}",
|
||||
"yes": "Ναι",
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
"add_to_album_bottom_sheet_added": "Added to {album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
|
||||
"add_to_album_bottom_sheet_some_local_assets": "Some local assets could not be added to album",
|
||||
"add_to_album_item_count": "Add {count, plural, one {# item} other {# items}} to album",
|
||||
"add_to_albums": "Add to albums",
|
||||
"add_to_albums_count": "Add to albums ({count})",
|
||||
"add_to_bottom_bar": "Add to",
|
||||
|
|
@ -1524,6 +1525,7 @@
|
|||
"not_available": "N/A",
|
||||
"not_in_any_album": "Not in any album",
|
||||
"not_selected": "Not selected",
|
||||
"not_set": "Not set",
|
||||
"notes": "Notes",
|
||||
"nothing_here_yet": "Nothing here yet",
|
||||
"notification_backup_reliability": "Enable notifications to improve background backup reliability",
|
||||
|
|
@ -2184,7 +2186,7 @@
|
|||
"upload_day_count": "{date}: {count, plural, one {# upload} other {# uploads}}",
|
||||
"upload_details": "Upload Details",
|
||||
"upload_error_with_count": "Upload error for {count, plural, one {# asset} other {# assets}}",
|
||||
"upload_errors": "Upload completed with {count, plural, one {# error} other {# errors}}, refresh the page to see new upload assets.",
|
||||
"upload_errors": "Upload completed with {count, plural, one {# error} other {# errors}}.",
|
||||
"upload_finished": "Upload finished",
|
||||
"upload_progress": "Remaining {remaining, number} - Processed {processed, number}/{total, number}",
|
||||
"upload_skipped_duplicates": "Skipped {count, plural, one {# duplicate asset} other {# duplicate assets}}",
|
||||
|
|
|
|||
|
|
@ -814,7 +814,6 @@
|
|||
"custom_date": "Custom date",
|
||||
"custom_locale": "Custom locale",
|
||||
"custom_locale_description": "Format dates, times, and numbers based on the selected language and region",
|
||||
"custom_url": "Custom URL",
|
||||
"cutoff_date_description": "Keep photos from the last…",
|
||||
"cutoff_day": "{count, plural, one {day} other {days}}",
|
||||
"cutoff_year": "{count, plural, one {year} other {years}}",
|
||||
|
|
@ -1525,6 +1524,7 @@
|
|||
"not_available": "N/A",
|
||||
"not_in_any_album": "Not in any album",
|
||||
"not_selected": "Not selected",
|
||||
"not_set": "Not set",
|
||||
"notes": "Notes",
|
||||
"nothing_here_yet": "Nothing here yet",
|
||||
"notification_backup_reliability": "Enable notifications to improve background backup reliability",
|
||||
|
|
@ -1621,7 +1621,7 @@
|
|||
"person": "Person",
|
||||
"person_age_months": "{months, plural, one {# month} other {# months}} old",
|
||||
"person_age_year_months": "1 year, {months, plural, one {# month} other {# months}} old",
|
||||
"person_age_years": "{years, plural, other {# years}} old",
|
||||
"person_age_years": "{years, plural, one {# year} other {# years}} old",
|
||||
"person_birthdate": "Born on {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (hidden)} other {}}",
|
||||
"person_recognized": "Person recognised",
|
||||
|
|
@ -1948,7 +1948,9 @@
|
|||
"shared_link_app_bar_title": "Shared Links",
|
||||
"shared_link_clipboard_copied_massage": "Copied to clipboard",
|
||||
"shared_link_create_error": "Error while creating shared link",
|
||||
"shared_link_custom_url_description": "Access this shared link with a custom URL",
|
||||
"shared_link_custom_url_description": "Access this shared link with a custom URL name",
|
||||
"shared_link_custom_url_title": "Custom URL",
|
||||
"shared_link_custom_url_warning": "Warning: a custom URL name with a forward slash may not behave as you expect.",
|
||||
"shared_link_edit_description_hint": "Enter the share description",
|
||||
"shared_link_edit_expire_after_option_day": "1 day",
|
||||
"shared_link_edit_expire_after_option_days": "{count} days",
|
||||
|
|
|
|||
92
i18n/eo.json
92
i18n/eo.json
|
|
@ -813,7 +813,6 @@
|
|||
"custom_date": "Elekti propran daton",
|
||||
"custom_locale": "Propra lokaĵaro",
|
||||
"custom_locale_description": "Prezenti datojn, horojn kaj numerojn laŭ la elektita lingvo kaj regiono",
|
||||
"custom_url": "Propra URL",
|
||||
"cutoff_date_description": "Konservi fotojn el la lastaj…",
|
||||
"cutoff_day": "{count, plural, one {tago} other {tagoj}}",
|
||||
"cutoff_year": "{count, plural, one {jaro} other {jaroj}}",
|
||||
|
|
@ -1706,7 +1705,10 @@
|
|||
"recent": "Lastatempa(j)",
|
||||
"recent_searches": "Lastatempaj serĉoj",
|
||||
"recently_added": "Lastatempe aldonita(j)",
|
||||
"recently_added_body": "Iri rekte al ĉio, kion vi aldonis lastatempe en unu paĝo.",
|
||||
"recently_added_description": "Foliumi elementojn ordigitajn laŭ dato de alŝuto al Immich",
|
||||
"recently_added_page_title": "Lastatempe aldonita(j)",
|
||||
"recently_added_title": "Aldonitaj lastatempe",
|
||||
"recently_taken": "Lastatempe fotita(j)",
|
||||
"refresh": "Denove",
|
||||
"refresh_encoded_videos": "Renovigi koditajn videojn",
|
||||
|
|
@ -1893,7 +1895,26 @@
|
|||
"setting_image_viewer_help": "La detala montrilo unue montras la malgrandan bildeton, poste ŝargas la mezgrandan antaŭvidon (se ŝaltita), kaj fine ŝargas la originalan (se ŝaltita).",
|
||||
"setting_image_viewer_original_subtitle": "Ŝalti por ŝargi la originalan bildon (povas esti tre granda!) Malŝalti por ŝpareme uzi datumojn (de retkonekto kaj memoro en via aparato).",
|
||||
"setting_image_viewer_original_title": "Ŝargi originalan bildon",
|
||||
"setting_image_viewer_preview_subtitle": "Ŝalti por ŝargi mez-distingivan bildon. Malŝalti por ŝargi aŭ la originalon aŭ la bildeton.",
|
||||
"setting_image_viewer_preview_title": "Ŝargi antaŭvidan bildon",
|
||||
"setting_languages_apply": "Validigi",
|
||||
"setting_languages_subtitle": "Ŝanĝi lingvon de la apo",
|
||||
"setting_notifications_notify_minutes": "{count} minutoj",
|
||||
"setting_notifications_notify_seconds": "{count} sekundoj",
|
||||
"setting_notifications_subtitle": "Redakti viajn preferojn pri sciigoj",
|
||||
"setting_video_viewer_auto_play_subtitle": "Aŭtomate ekludi videojn tuj je malfermo",
|
||||
"setting_video_viewer_auto_play_title": "Aŭtomate ludi videojn",
|
||||
"setting_video_viewer_looping_title": "Ripeti",
|
||||
"settings": "Agordoj",
|
||||
"settings_saved": "Agordoj konservitaj",
|
||||
"setup_pin_code": "Krei PIN-kodon",
|
||||
"share": "Dividi",
|
||||
"share_dialog_preparing": "Preparado...",
|
||||
"share_link": "Dividi ligilon",
|
||||
"share_original": "Uzi originalon (grandan)",
|
||||
"share_preview": "Uzi bildeton (malgrandan)",
|
||||
"share_quality_body": "Premteni la dividi-butonon por elekti la kvaliton de bildo dividota.",
|
||||
"share_quality_title": "Elekti kvaliton dividotan",
|
||||
"shared": "Dividitaj",
|
||||
"shared_album_activities_input_disable": "Komentado estas malŝaltita",
|
||||
"shared_album_activity_remove_content": "Ĉu vi volas forigi tiun ĉi agon?",
|
||||
|
|
@ -1909,6 +1930,8 @@
|
|||
"shared_link_clipboard_copied_massage": "Kopiita al tondujo",
|
||||
"shared_link_create_error": "Okazis eraro dum kreo de dividita ligilo",
|
||||
"shared_link_custom_url_description": "Atingi la dividita ligilo per propra URL-o",
|
||||
"shared_link_custom_url_title": "Propra URL",
|
||||
"shared_link_custom_url_warning": "Atentu: propra URL, kiu inkluzivas suprenstrekon povus havi neatenditan rezulton.",
|
||||
"shared_link_edit_description_hint": "Tajpu priskribon de la dividaĵaro",
|
||||
"shared_link_edit_expire_after_option_day": "1 tago",
|
||||
"shared_link_edit_expire_after_option_days": "{count} tagoj",
|
||||
|
|
@ -1930,6 +1953,7 @@
|
|||
"shared_link_expires_never": "Neniam eksvalidiĝos",
|
||||
"shared_link_expires_second": "Eksvalidiĝos post {count} sekundo",
|
||||
"shared_link_expires_seconds": "Eksvalidiĝos post {count} sekundoj",
|
||||
"shared_link_individual_shared": "Unuope dividita",
|
||||
"shared_link_info_chip_metadata": "EXIF",
|
||||
"shared_link_manage_links": "Administri dividitajn ligilojn",
|
||||
"shared_link_options": "Agordoj pri dividitaj ligiloj",
|
||||
|
|
@ -1941,13 +1965,79 @@
|
|||
"shared_with_partner": "Dividitaj kun {partner}",
|
||||
"sharing": "Dividado",
|
||||
"sharing_enter_password": "Bonvolu tajpi la pasvorton por vidi tiun ĉi paĝon.",
|
||||
"shift_to_permanent_delete": "Tuŝu ⇧ por forigi porĉiame la elementon",
|
||||
"show_album_options": "Montri opciojn de albumo",
|
||||
"show_albums": "Montri albumojn",
|
||||
"show_all_people": "Montri ĉiujn homojn",
|
||||
"show_and_hide_people": "Montri kaj kaŝi homojn",
|
||||
"show_file_location": "Montri dosier-lokon",
|
||||
"show_gallery": "Montri galerion",
|
||||
"show_hidden_people": "Montri kaŝitajn homojn",
|
||||
"show_in_timeline": "Montri en tempolinio",
|
||||
"show_in_timeline_setting_description": "Montri fotojn kaj videojn de tiu uzanto en via tempolinio",
|
||||
"show_keyboard_shortcuts": "Montri fulmklavojn",
|
||||
"show_less": "Montri malpli",
|
||||
"show_metadata": "Montri metadatumojn",
|
||||
"show_more_fields": "{count, plural, one {Montri # plian kampon} other {Montri # pliajn kampojn}}",
|
||||
"show_or_hide_info": "Montri aŭ kaŝi informojn",
|
||||
"show_password": "Montri pasvorton",
|
||||
"show_person_options": "Montri opciojn pri homo",
|
||||
"show_progress_bar": "Montri plenumskalon",
|
||||
"show_schema": "Montri skemon",
|
||||
"show_search_options": "Montri opciojn pri serĉado",
|
||||
"show_shared_links": "Montri dividitajn ligilojn",
|
||||
"show_slideshow_metadata_overlay": "Montri pribildajn informojn super la bildo",
|
||||
"show_slideshow_transition": "Montri transpason dum bildserio",
|
||||
"show_supporter_badge": "Ŝildo de subtenanto",
|
||||
"show_supporter_badge_description": "Montri ŝildon de subtenanto",
|
||||
"show_text_recognition": "Montri rekonadon de teksto",
|
||||
"show_text_search_menu": "Montri menuon pri teksta serĉo",
|
||||
"shuffle": "Hazarda vicordo",
|
||||
"sidebar": "Flankpanelo",
|
||||
"sidebar_display_description": "Montri ligilon al la vido en la flankpanelo",
|
||||
"sign_out": "Elsaluti",
|
||||
"sign_up": "Registriĝi",
|
||||
"size": "Grandeco",
|
||||
"skip": "Preterlasi",
|
||||
"skip_to_content": "Salti rekte al enhavo",
|
||||
"skip_to_folders": "Salti rekte al dosierujoj",
|
||||
"skip_to_tags": "Salti rekte al etikedoj",
|
||||
"slideshow": "Bildserio",
|
||||
"slideshow_body": "Spekti viajn fotojn en plenekrana bildserio.",
|
||||
"slideshow_metadata_overlay_mode": "Supermeti elementojn",
|
||||
"slideshow_metadata_overlay_mode_description_only": "Nur priskribo",
|
||||
"slideshow_metadata_overlay_mode_full": "Plena",
|
||||
"slideshow_repeat": "Ripeti bildserion",
|
||||
"slideshow_repeat_description": "Remontri ekde la komenco post fino de bildserio",
|
||||
"slideshow_settings": "Agordoj pri bildserioj",
|
||||
"slideshow_title": "Bildserio",
|
||||
"smart_album": "Aktiva albumo",
|
||||
"some_assets_already_have_a_location_warning": "Kelkaj el la elektitaj elementoj jam havas lokon",
|
||||
"sort_albums_by": "Ordigi albumojn laŭ...",
|
||||
"sort_created": "Dato de kreo",
|
||||
"sort_items": "Nombro da elementoj",
|
||||
"sort_modified": "Dato de lasta ŝanĝo",
|
||||
"sort_oldest": "Plej malnova foto",
|
||||
"sort_people_by_similarity": "Ordigi homojn laŭ simileco",
|
||||
"sort_recent": "Plej lasta foto",
|
||||
"sort_title": "Titolo",
|
||||
"source": "Fonto",
|
||||
"stack": "Staki",
|
||||
"stack_action_prompt": "{count} stakitaj",
|
||||
"stack_duplicates": "Staki duoblaĵojn",
|
||||
"stack_selected_photos": "Staki elektitajn fotojn",
|
||||
"stacked_assets_count": "Stakis {count, plural, one {# elementon} other {# elementojn}}",
|
||||
"stacktrace": "Stak-spuro",
|
||||
"start": "Komenci",
|
||||
"start_date": "Komenca dato",
|
||||
"start_date_before_end_date": "Komenca dato devas esti antaŭ fina dato",
|
||||
"state": "Ŝtato/Regiono",
|
||||
"status": "Stato",
|
||||
"step_delete": "Forigi paŝon",
|
||||
"step_delete_confirm": "Ĉu vi certas, ke vi volas forigi tiun paŝon?",
|
||||
"step_details": "Detaloj pri paŝo",
|
||||
"steps": "Paŝoj",
|
||||
"stop_casting": "Ĉesi elsendi",
|
||||
"stop_photo_sharing": "Ĉu ĉesi dividi viajn fotojn?",
|
||||
"stop_photo_sharing_description": "{partner} ne plu rajtos atingi viajn fotojn.",
|
||||
"stop_sharing_photos_with_user": "Ĉesi dividi fotojn kun tiu ĉi uzanto",
|
||||
|
|
|
|||
|
|
@ -814,7 +814,6 @@
|
|||
"custom_date": "Fecha personalizada",
|
||||
"custom_locale": "Configuración regional personalizada",
|
||||
"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}}",
|
||||
"cutoff_year": "{count, plural, one {año} other {años}}",
|
||||
|
|
@ -1525,6 +1524,7 @@
|
|||
"not_available": "N/D",
|
||||
"not_in_any_album": "Sin álbum",
|
||||
"not_selected": "No seleccionado",
|
||||
"not_set": "No establecido",
|
||||
"notes": "Notas",
|
||||
"nothing_here_yet": "Sin nada aún",
|
||||
"notification_backup_reliability": "Activa las notificaciones para mejorar el funcionamiento de las copias de seguridad en segundo plano",
|
||||
|
|
@ -1621,7 +1621,7 @@
|
|||
"person": "Persona",
|
||||
"person_age_months": "hace {months, plural, one {# mes} other {# meses}}",
|
||||
"person_age_year_months": "1 año y {months, plural, one {# mes} other {# meses}}",
|
||||
"person_age_years": "{years, plural, other {# años}}",
|
||||
"person_age_years": "{years, plural, one {# año} other {# años}}",
|
||||
"person_birthdate": "Nacido el {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (oculto)} other {}}",
|
||||
"person_recognized": "Persona reconocida",
|
||||
|
|
@ -1948,7 +1948,9 @@
|
|||
"shared_link_app_bar_title": "Enlaces compartidos",
|
||||
"shared_link_clipboard_copied_massage": "Copiado al portapapeles",
|
||||
"shared_link_create_error": "Error creando el enlace compartido",
|
||||
"shared_link_custom_url_description": "Acceder a este enlace compartido con una URL personalizada",
|
||||
"shared_link_custom_url_description": "Accede a este enlace compartido mediante una URL personalizada",
|
||||
"shared_link_custom_url_title": "URL personalizada",
|
||||
"shared_link_custom_url_warning": "Advertencia: un nombre de URL personalizado con una barra inclinada puede no comportarse como esperas.",
|
||||
"shared_link_edit_description_hint": "Introduce la descripción del enlace",
|
||||
"shared_link_edit_expire_after_option_day": "1 día",
|
||||
"shared_link_edit_expire_after_option_days": "{count} días",
|
||||
|
|
|
|||
|
|
@ -809,7 +809,6 @@
|
|||
"custom_date": "Muu kuupäev",
|
||||
"custom_locale": "Kohandatud lokaat",
|
||||
"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}}",
|
||||
"cutoff_year": "{count, plural, one {aasta} other {aastat}}",
|
||||
|
|
@ -1610,7 +1609,7 @@
|
|||
"person": "Isik",
|
||||
"person_age_months": "{months, plural, one {# kuu} other {# kuud}} vana",
|
||||
"person_age_year_months": "1 aasta {months, plural, one {# kuu} other {# kuud}} vana",
|
||||
"person_age_years": "{years, plural, other {# aastat}} vana",
|
||||
"person_age_years": "{years, plural, one {# aasta} other {# aastat}} vana",
|
||||
"person_birthdate": "Sündinud {date}",
|
||||
"person_hidden": "{name}{hidden, select, true { (peidetud)} other {}}",
|
||||
"person_recognized": "Isik tuvastatud",
|
||||
|
|
|
|||
29
i18n/eu.json
29
i18n/eu.json
|
|
@ -562,11 +562,11 @@
|
|||
"app_update_available": "Aplikazioaren eguneratzea eskuragarri dago",
|
||||
"appears_in": "Hemen agertzen da",
|
||||
"apply_count": "Ezarri ({count, number})",
|
||||
"archive": "Artxibo",
|
||||
"archive": "Artxibategia",
|
||||
"archive_action_prompt": "{count} artxibategira bidalita",
|
||||
"archive_or_unarchive_photo": "Argazkia artxibatu edo berrezarri",
|
||||
"archive_size": "Artxibo tamaina",
|
||||
"archive_size_description": "Konfiguratu artxiboaren tamaina deskargak egiteko (GiB-tan)",
|
||||
"archive_size": "Fitxategi konprimatuaren tamaina",
|
||||
"archive_size_description": "Konfiguratu konprimitatutako fitxategiaren tamaina deskargak egiteko (GiB-tan)",
|
||||
"archived": "Artxibatua",
|
||||
"archived_count": "{count, plural, one {artxibatu bat} other {# artxibatu}}",
|
||||
"are_these_the_same_person": "Pertsona bera al dira hauek?",
|
||||
|
|
@ -597,7 +597,7 @@
|
|||
"asset_viewer_settings_title": "Baliabide ikuslea",
|
||||
"assets": "Baliabideak",
|
||||
"assets_added_to_album_count": "{count, plural, one {Baliabide bat} other {# baliabide}} albumera gehituta",
|
||||
"assets_added_to_album_partial_count": "{totalCount, number}-(e)tik {successCount, plural, one {baliabide bat gehitu da albumera} other {{successCount, number} baliabide gehitu dira albumera}}",
|
||||
"assets_added_to_album_partial_count": "{totalCount, number}-(e)tik baliabide {successCount, number, plural, one {bat gehitu da albumera} other {# gehitu dira albumera}}",
|
||||
"assets_added_to_albums_count": "Gehituta {assetTotal, plural, one {# asset} other {# assets}} to {albumTotal, plural, one {# album} other {# albums}}",
|
||||
"assets_cannot_be_added_to_album_count": "{count, plural, one {Baliabidea ezin izan da albumera gehitu} other {Baliabideak ezin izan dira albumera gehitu}}",
|
||||
"assets_cannot_be_added_to_albums": "{count, plural, one {Asset} other {Assets}} ezin izan da albumetara gehitu",
|
||||
|
|
@ -814,7 +814,6 @@
|
|||
"custom_date": "Data pertsonalizatua",
|
||||
"custom_locale": "Lokalizazio pertsonalizatua",
|
||||
"custom_locale_description": "Formateatu datak, orduak eta zenbakiak hautatutako hizkuntza eta eskualdearen arabera",
|
||||
"custom_url": "URL pertsonalizatua",
|
||||
"cutoff_date_description": "Mantendu epe honetan sartzen diren argazkiak…",
|
||||
"cutoff_day": "{count, plural, one {egun} other {egun}}",
|
||||
"cutoff_year": "{count, plural, one {urte} other {urte}}",
|
||||
|
|
@ -1325,7 +1324,7 @@
|
|||
"login_form_password_hint": "pasahitza",
|
||||
"login_form_server_empty": "Zerbitzari URL bat sartu",
|
||||
"login_form_server_error": "Ezin izan da zerbitzarira konektatu",
|
||||
"login_has_been_disabled": "Saioa hastea desgaitu da.",
|
||||
"login_has_been_disabled": "Saioa hastea desgaitu da",
|
||||
"login_password_changed_error": "Errore bat gertatu da pasahitza eguneratzean",
|
||||
"login_password_changed_success": "Pasahitza arrakastaz eguneratu",
|
||||
"logout_all_device_confirmation": "Ziur zaude gailu guztietan saioa amaitu nahi duzula?",
|
||||
|
|
@ -1481,6 +1480,7 @@
|
|||
"never": "Inoiz ez",
|
||||
"new_album": "Album berria",
|
||||
"new_api_key": "API gako berria",
|
||||
"new_feature": "Ezaugarri berria",
|
||||
"new_password": "Pasahitz berria",
|
||||
"new_person": "Pertsona berria",
|
||||
"new_pin_code": "PIN gako berria",
|
||||
|
|
@ -1541,6 +1541,8 @@
|
|||
"obtainium_configurator": "Obtainium kudeatzailea",
|
||||
"obtainium_configurator_instructions": "Erabili Obtainium Immich GitHub-en bertsiotik zuzenean Android aplikazioa instalatzeko eta eguneratzeko. Sortu API gako bat eta hautatu aldaera bat zure Obtainium konfigurazio esteka sortzeko",
|
||||
"ocr": "OCR",
|
||||
"ocr_body": "Immichek orain zure argazkien barruan dagoen testua irakurtzen du, haiek esaten dutenaren arabera bilatu ahal izateko.",
|
||||
"ocr_title": "Bilatu testua zure argazkietan",
|
||||
"official_immich_resources": "Immich-en baliabide ofizialak",
|
||||
"offline": "Lineaz kanpo",
|
||||
"offset": "Desbiderapena",
|
||||
|
|
@ -1559,6 +1561,8 @@
|
|||
"open": "Zabalik",
|
||||
"open_calendar": "Egutegia zabaldu",
|
||||
"open_in_browser": "Arakatzailean zabaldu",
|
||||
"open_in_immich_body": "Ezarri Immich zure galeria gisa Android-en argazkiak zuzenean irekitzeko beste aplikazioetatik.",
|
||||
"open_in_immich_title": "Ireki argazkiak Immich-en",
|
||||
"open_in_map_view": "Ireki maparen ikuspegian",
|
||||
"open_in_openstreetmap": "OpenStreetMap-en zabaldu",
|
||||
"open_the_search_filters": "Bilaketa-iragazkiak ireki",
|
||||
|
|
@ -1614,9 +1618,9 @@
|
|||
"permission": "Baimena",
|
||||
"permission_empty": "Zure baimenak ez du hutsik egon behar",
|
||||
"person": "Pertsona",
|
||||
"person_age_months": "Orain dela {months, plural, one {hilabete bat} other {# hilabete}}",
|
||||
"person_age_months": "Duela {months, plural, one {hilabete bat} other {# hilabete}}",
|
||||
"person_age_year_months": "Urte bat eta {months, plural, one {hilabete bat} other {# hilabete}}",
|
||||
"person_age_years": "Adina: {years, plural, other {# urte}}",
|
||||
"person_age_years": "{years, plural, one{Urte bat} other {# urte}}",
|
||||
"person_birthdate": "{date} -(a)n jaiota",
|
||||
"person_hidden": "{name}{hidden, select, true { (ezkutatuta)} other {}}",
|
||||
"person_recognized": "Pertsona ezagutua",
|
||||
|
|
@ -1717,7 +1721,10 @@
|
|||
"recent": "Berria",
|
||||
"recent_searches": "Duela gutxiko bilaketak",
|
||||
"recently_added": "Duela gutxi gehitutakoak",
|
||||
"recently_added_body": "Joan zuzenean azkenaldian gehitu duzun guztiari eskainitako orrialde batean.",
|
||||
"recently_added_description": "Arakatu zure fitxategiak Immich-en kargatzeko dataren arabera ordenatuta",
|
||||
"recently_added_page_title": "Duela gutxi gehitutakoak",
|
||||
"recently_added_title": "Duela gutxi gehituta",
|
||||
"recently_taken": "Duela gutxi ateratakoak",
|
||||
"refresh": "Freskatu",
|
||||
"refresh_encoded_videos": "Kodetutako bideoak freskatu",
|
||||
|
|
@ -1924,6 +1931,8 @@
|
|||
"share_link": "Esteka partekatu",
|
||||
"share_original": "Jatorrizkoa erabili (handia)",
|
||||
"share_preview": "Miniatura erabili (txikia)",
|
||||
"share_quality_body": "Eduki sakatuta partekatzeko botoia partekatu aurretik irudiaren kalitatea aukeratzeko.",
|
||||
"share_quality_title": "Aukeratu zure partekatzeko kalitatea",
|
||||
"shared": "Partekatuta",
|
||||
"shared_album_activities_input_disable": "Iruzkinak desgaituta daude",
|
||||
"shared_album_activity_remove_content": "Jarduera hau ezabatu nahi duzu?",
|
||||
|
|
@ -2133,7 +2142,7 @@
|
|||
"unable_to_check_version": "Ezin da egiaztatu aplikazioaren edo zerbitzariaren bertsioa",
|
||||
"unable_to_setup_pin_code": "Ezin izan da PIN kodea ezarri",
|
||||
"unarchive": "Desartxibatu",
|
||||
"unarchive_action_prompt": "{count} artxibotik kendu dira",
|
||||
"unarchive_action_prompt": "{count, plural, one {Artxibotik kendu da} other {# artxibotik kendu dira}}",
|
||||
"unarchived_count": "{count, plural, one {Artxibatu gabeko bat} other {# artxibatu gabeko}}",
|
||||
"undo": "Desegin",
|
||||
"unfavorite": "Gogokoetatik kendu",
|
||||
|
|
@ -2264,7 +2273,7 @@
|
|||
"wrong_pin_code": "PIN kode okerra",
|
||||
"x_of_total": "{total}-(e)tik {x}",
|
||||
"year": "Urtea",
|
||||
"years_ago": "Orain dela {years, plural, one {urte bat} other {# urte}}",
|
||||
"years_ago": "Duela {years, plural, one {urte bat} other {# urte}}",
|
||||
"yes": "Bai",
|
||||
"you_dont_have_any_shared_links": "Ez duzu partekatutako estekarik",
|
||||
"your_wifi_name": "Zure Wi-Fi izena",
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue