Merge branch 'main' into fix/save-album-sort

This commit is contained in:
Yaros 2025-09-22 19:16:59 +02:00 committed by GitHub
commit 161c7e0b8b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
198 changed files with 14006 additions and 3046 deletions

View File

@ -5,8 +5,7 @@
"immich-server",
"redis",
"database",
"immich-machine-learning",
"init"
"immich-machine-learning"
],
"dockerComposeFile": [
"../docker/docker-compose.dev.yml",

View File

@ -32,24 +32,18 @@ jobs:
permissions:
contents: read
outputs:
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
mobile:
- 'mobile/**'
workflow:
- '.github/workflows/build-mobile.yml'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
force-filters: |
- '.github/workflows/build-mobile.yml'
force-events: 'workflow_call,workflow_dispatch'
build-sign-android:
name: Build and sign Android
@ -57,7 +51,7 @@ jobs:
permissions:
contents: read
# Skip when PR from a fork
if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && needs.pre-job.outputs.should_run == 'true' }}
if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && fromJSON(needs.pre-job.outputs.should_run).mobile == true }}
runs-on: mich
steps:

View File

@ -20,15 +20,11 @@ jobs:
permissions:
contents: read
outputs:
should_run_server: ${{ steps.found_paths.outputs.server == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
server:
@ -38,14 +34,11 @@ jobs:
- 'i18n/**'
machine-learning:
- 'machine-learning/**'
workflow:
- '.github/workflows/docker.yml'
- '.github/workflows/multi-runner-build.yml'
- '.github/actions/image-build'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' }}" >> "$GITHUB_OUTPUT"
force-filters: |
- '.github/workflows/docker.yml'
- '.github/workflows/multi-runner-build.yml'
- '.github/actions/image-build'
force-events: 'workflow_dispatch,release'
retag_ml:
name: Re-Tag ML
@ -53,7 +46,7 @@ jobs:
permissions:
contents: read
packages: write
if: ${{ needs.pre-job.outputs.should_run_ml == 'false' && !github.event.pull_request.head.repo.fork }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).machine-learning == false && !github.event.pull_request.head.repo.fork }}
runs-on: ubuntu-latest
strategy:
matrix:
@ -82,7 +75,7 @@ jobs:
permissions:
contents: read
packages: write
if: ${{ needs.pre-job.outputs.should_run_server == 'false' && !github.event.pull_request.head.repo.fork }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == false && !github.event.pull_request.head.repo.fork }}
runs-on: ubuntu-latest
strategy:
matrix:
@ -108,7 +101,7 @@ jobs:
machine-learning:
name: Build and Push ML
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).machine-learning == true }}
strategy:
fail-fast: false
matrix:
@ -153,7 +146,7 @@ jobs:
server:
name: Build and Push Server
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }}
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@129aeda75a450666ce96e8bc8126652e717917a7 # multi-runner-build-workflow-0.1.1
permissions:
contents: read

View File

@ -18,32 +18,28 @@ jobs:
permissions:
contents: read
outputs:
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.found_paths.outputs.open-api == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
docs:
- 'docs/**'
workflow:
- '.github/workflows/docs-build.yml'
open-api:
- 'open-api/immich-openapi-specs.json'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' || github.ref_name == 'main' }}" >> "$GITHUB_OUTPUT"
force-filters: |
- '.github/workflows/docs-build.yml'
force-events: 'release'
force-branches: 'main'
build:
name: Docs Build
needs: pre-job
permissions:
contents: read
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).docs == true }}
runs-on: ubuntu-latest
defaults:
run:

View File

@ -17,28 +17,23 @@ jobs:
permissions:
contents: read
outputs:
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
mobile:
- 'mobile/**'
workflow:
- '.github/workflows/static_analysis.yml'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' }}" >> "$GITHUB_OUTPUT"
force-filters: |
- '.github/workflows/static_analysis.yml'
force-events: 'workflow_dispatch,release'
mobile-dart-analyze:
name: Run Dart Code Analysis
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).mobile == true }}
runs-on: ubuntu-latest
permissions:
contents: read

View File

@ -14,23 +14,11 @@ jobs:
permissions:
contents: read
outputs:
should_run_i18n: ${{ steps.found_paths.outputs.i18n == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_web: ${{ steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_server: ${{ steps.found_paths.outputs.server == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_cli: ${{ steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e: ${{ steps.found_paths.outputs.e2e == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_mobile: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e_web: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e_server_cli: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.server == 'true' || steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_.github: ${{ steps.found_paths.outputs['.github'] == 'true' || steps.should_force.outputs.should_force == 'true' }} # redundant to have should_force but if someone changes the trigger then this won't have to be changed
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
i18n:
@ -50,17 +38,16 @@ jobs:
- 'mobile/**'
machine-learning:
- 'machine-learning/**'
workflow:
- '.github/workflows/test.yml'
.github:
- '.github/**'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
force-filters: |
- '.github/workflows/test.yml'
force-events: 'workflow_dispatch'
server-unit-tests:
name: Test & Lint Server
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }}
runs-on: ubuntu-latest
permissions:
contents: read
@ -97,7 +84,7 @@ jobs:
cli-unit-tests:
name: Unit Test CLI
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).cli == true }}
runs-on: ubuntu-latest
permissions:
contents: read
@ -137,7 +124,7 @@ jobs:
cli-unit-tests-win:
name: Unit Test CLI (Windows)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).cli == true }}
runs-on: windows-latest
permissions:
contents: read
@ -172,7 +159,7 @@ jobs:
web-lint:
name: Lint Web
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_web == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).web == true }}
runs-on: mich
permissions:
contents: read
@ -209,7 +196,7 @@ jobs:
web-unit-tests:
name: Test Web
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_web == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).web == true }}
runs-on: ubuntu-latest
permissions:
contents: read
@ -243,7 +230,7 @@ jobs:
i18n-tests:
name: Test i18n
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_i18n == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).i18n == true }}
runs-on: ubuntu-latest
permissions:
contents: read
@ -281,7 +268,7 @@ jobs:
e2e-tests-lint:
name: End-to-End Lint
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true }}
runs-on: ubuntu-latest
permissions:
contents: read
@ -320,7 +307,7 @@ jobs:
server-medium-tests:
name: Medium Tests (Server)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }}
runs-on: ubuntu-latest
permissions:
contents: read
@ -348,7 +335,7 @@ jobs:
e2e-tests-server-cli:
name: End-to-End Tests (Server & CLI)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e_server_cli == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true || fromJSON(needs.pre-job.outputs.should_run).server == true || fromJSON(needs.pre-job.outputs.should_run).cli == true }}
runs-on: ${{ matrix.runner }}
permissions:
contents: read
@ -396,7 +383,7 @@ jobs:
e2e-tests-web:
name: End-to-End Tests (Web)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e_web == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true || fromJSON(needs.pre-job.outputs.should_run).web == true }}
runs-on: ${{ matrix.runner }}
permissions:
contents: read
@ -449,7 +436,7 @@ jobs:
mobile-unit-tests:
name: Unit Test Mobile
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_mobile == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).mobile == true }}
runs-on: ubuntu-latest
permissions:
contents: read
@ -471,7 +458,7 @@ jobs:
ml-unit-tests:
name: Unit Test ML
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).machine-learning == true }}
runs-on: ubuntu-latest
permissions:
contents: read
@ -507,7 +494,7 @@ jobs:
github-files-formatting:
name: .github Files Formatting
needs: pre-job
if: ${{ needs.pre-job.outputs['should_run_.github'] == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run)['.github'] == true }}
runs-on: ubuntu-latest
permissions:
contents: read

View File

@ -21,25 +21,24 @@ jobs:
permissions:
contents: read
outputs:
should_run: ${{ steps.found_paths.outputs.i18n == 'true' }}
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
i18n:
- 'i18n/!(en)**\.json'
exclude-branches: 'chore/translations'
skip-force-logic: 'true'
enforce-lock:
name: Check Weblate Lock
needs: [pre-job]
runs-on: ubuntu-latest
permissions: {}
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).i18n == true }}
steps:
- name: Bot review status
env:

1
.gitignore vendored
View File

@ -18,6 +18,7 @@ mobile/libisar.dylib
mobile/openapi/test
mobile/openapi/doc
mobile/openapi/.openapi-generator/FILES
mobile/ios/build
open-api/typescript-sdk/build
mobile/android/fastlane/report.xml

View File

@ -1,6 +1,6 @@
{
"name": "@immich/cli",
"version": "2.2.90",
"version": "2.2.91",
"description": "Command Line Interface (CLI) for Immich",
"type": "module",
"exports": "./dist/index.js",

View File

@ -169,8 +169,6 @@ Redis (Sentinel) URL example JSON before encoding:
| `MACHINE_LEARNING_ANN_TUNING_LEVEL` | ARM-NN GPU tuning level (1: rapid, 2: normal, 3: exhaustive) | `2` | machine learning |
| `MACHINE_LEARNING_DEVICE_IDS`<sup>\*4</sup> | Device IDs to use in multi-GPU environments | `0` | machine learning |
| `MACHINE_LEARNING_MAX_BATCH_SIZE__FACIAL_RECOGNITION` | Set the maximum number of faces that will be processed at once by the facial recognition model | None (`1` if using OpenVINO) | machine learning |
| `MACHINE_LEARNING_PING_TIMEOUT` | How long (ms) to wait for a PING response when checking if an ML server is available | `2000` | server |
| `MACHINE_LEARNING_AVAILABILITY_BACKOFF_TIME` | How long to ignore ML servers that are offline before trying again | `30000` | server |
| `MACHINE_LEARNING_RKNN` | Enable RKNN hardware acceleration if supported | `True` | machine learning |
| `MACHINE_LEARNING_RKNN_THREADS` | How many threads of RKNN runtime should be spinned up while inferencing. | `1` | machine learning |

View File

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

View File

@ -1,6 +1,6 @@
{
"name": "immich-e2e",
"version": "1.142.1",
"version": "1.143.0",
"description": "",
"main": "index.js",
"type": "module",

View File

@ -14,6 +14,7 @@
"add_a_location": "Voeg 'n ligging by",
"add_a_name": "Voeg 'n naam by",
"add_a_title": "Voeg 'n titel by",
"add_birthday": "Voeg 'n verjaarsdag by",
"add_endpoint": "Voeg Koppelvlakpunt by",
"add_exclusion_pattern": "Voeg uitsgluitingspatrone by",
"add_import_path": "Voeg invoerpad by",
@ -27,6 +28,8 @@
"add_to_album": "Voeg na album",
"add_to_album_bottom_sheet_added": "By {album} bygevoeg",
"add_to_album_bottom_sheet_already_exists": "Reeds in {album}",
"add_to_albums": "Voeg by albums",
"add_to_albums_count": "Voeg by ({count}) albums",
"add_to_shared_album": "Voeg toe aan gedeelde album",
"add_url": "Voeg URL by",
"added_to_archive": "By argief toegevoegd",
@ -44,6 +47,11 @@
"backup_database": "Skep Datastortlêer",
"backup_database_enable_description": "Aktiveer databasisrugsteun",
"backup_keep_last_amount": "Aantal vorige rugsteune om te hou",
"backup_onboarding_3_description": "totale kopieë van jou data, insluitende die oorspronklikke lêers. Dit sluit in 1 kopie op 'n ander perseel en 2 kopieë om die huidige rekenaar.",
"backup_onboarding_description": "'N <backblaze-link>3-2-1 rugsteun strategie</backblaze-link> word sterk aanbeveel om jou data veilig te hou. Hou kopieë van jou fotos/videos so wel as die Immich databasis vir 'n volledige rugsteun oplossing.",
"backup_onboarding_footer": "Vir meer inligting oor hoe om 'n rugsteun kopie van Immich te maak, gaan lees asseblief hierdie <link>dokument</link>.",
"backup_onboarding_parts_title": "'N 3-2-1 rugsteun sluit in:",
"backup_onboarding_title": "Rugsteun kopieë",
"backup_settings": "Rugsteun instellings",
"backup_settings_description": "Bestuur databasis rugsteun instellings.",
"cleared_jobs": "Poste gevee vir: {job}",
@ -62,8 +70,8 @@
"duplicate_detection_job_description": "Begin masjienleer op bates om soortgelyke beelde op te spoor. Maak staat op Smart Search",
"exclusion_pattern_description": "Met uitsluitingspatrone kan jy lêers en vouers ignoreer wanneer jy jou biblioteek skandeer. Dit is nuttig as jy vouers het wat lêers bevat wat jy nie wil invoer nie, soos RAW-lêers.",
"external_library_management": "Eksterne Biblioteekbestuur",
"face_detection": "Gesig deteksie",
"face_detection_description": "Detecteer die gesigte in media deur middel van masjienleer. Vir videos word slegs die duimnaelskets oorweeg. “Herlaai” (ver)werk al die media weer. “Stel terug” verwyder boonop alle huidige gesigdata. “Onverwerk” plaas bates in die tou wat nog nie verwerk is nie. Gedekte gesigte sal ná voltooiing van Gesigdetectie vir Gesigherkenning in die tou geplaas word, om hulle in bestaande of nuwe persone te groepeer.",
"face_detection": "Gesig herkenning",
"face_detection_description": "Identifiseer die gesigte in media deur middel van masjienleer. Vir videos word slegs die duimnaelskets oorweeg. “Herlaai” (ver)werk al die media weer. “Stel terug” verwyder alle huidige gesigdata. “Onverwerk” plaas bates in die tou wat nog nie verwerk is nie. Geidentifiseerde gesigte sal ná voltooiing van Gesigidentifikasie vir Gesigherkenning in die tou geplaas word, om hulle in bestaande of nuwe persone te groepeer.",
"facial_recognition_job_description": "Groepeer gesigte in mense in. Die stap is vinniger nadat Gesig Deteksie klaar is. \"Herstel\" (her-)groepeer alle gesigte. \"Vermiste\" plaas gesigte in ry wat nie 'n persoon gekoppel het nie.",
"failed_job_command": "Opdrag {command} het misluk vir werk: {job}",
"force_delete_user_warning": "WAARSKUWING: Dit sal onmiddellik die gebruiker en alle bates verwyder. Dit kan nie ontdoen word nie en die lêers kan nie herstel word nie.",
@ -93,15 +101,33 @@
"job_status": "Werkstatus",
"library_created": "Biblioteek geskep: {library}",
"library_deleted": "Biblioteek verwyder",
"library_import_path_description": "Spesifiseer 'n leer om in te neem. Hierdie leer, en al die sub leers, gaan geskandeer for vir prente en videos.",
"library_scanning": "Periodieke Skandering",
"library_scanning_description": "Stel periodieke skandering van biblioteek in",
"library_import_path_description": "Spesifiseer 'n leer om in te neem. Hierdie leer, en al die sub leers, gaan deursoek word vir prente en videos.",
"library_scanning": "Periodieke Soek",
"library_scanning_description": "Stel periodieke deursoek van biblioteek in",
"library_scanning_enable_description": "Aktiveer periodieke biblioteekskandering",
"library_settings": "Eksterne Biblioteek",
"library_settings_description": "Eksterne biblioteek verstellings",
"library_tasks_description": "Deursoek eksterne biblioteke vir nuwe of veranderde bates",
"library_watching_enable_description": "Hou eksterne biblioteke dop vir leer veranderinge",
"library_watching_settings": "Biblioteek dop hou (EKSPERIMENTEEL)",
"library_watching_settings_description": "Hou automaties dop vir veranderinge",
"logging_enable_description": "Aktifeer \"logging\"",
"logging_level_description": "Wanneer aktief, watter vlak van \"logs\" om te skep.",
"logging_settings": "\"Logs\"",
"machine_learning_clip_model": "CLIP model",
"machine_learning_duplicate_detection": "Duplikaat herkenning",
"machine_learning_duplicate_detection_enabled": "Aktifeer duplikaat herkenning",
"machine_learning_enabled": "Aktifeer masjienleer",
"machine_learning_facial_recognition": "Gesigsherkenning",
"machine_learning_facial_recognition_description": "Herken, identifiseer en groepeer gesigte in fotos",
"machine_learning_facial_recognition_model": "Gesigsherkennings model",
"machine_learning_facial_recognition_setting": "Aktifeer gesigsherkenning",
"machine_learning_max_detection_distance": "Maksimum herkennings afstand",
"map_settings": "Kaart",
"migration_job": "Migrasie",
"oauth_settings": "OAuth",
"transcoding_acceleration_vaapi": "VAAPI"
"transcoding_acceleration_vaapi": "VAAPI",
"transcoding_preferred_hardware_device": "Verkiesde hardeware"
},
"administration": "Administrasie",
"advanced": "Gevorderde",

View File

@ -387,8 +387,6 @@
"admin_password": "كلمة سر المشرف",
"administration": "الإدارة",
"advanced": "متقدم",
"advanced_settings_beta_timeline_subtitle": "جرب تجربة التطبيق الجديدة",
"advanced_settings_beta_timeline_title": "الجدول الزمني التجريبي",
"advanced_settings_enable_alternate_media_filter_subtitle": "استخدم هذا الخيار لتصفية الوسائط اثناء المزامنه بناء على معايير بديلة. جرب هذا الخيار فقط كان لديك مشاكل مع التطبيق بالكشف عن جميع الالبومات.",
"advanced_settings_enable_alternate_media_filter_title": "[تجريبي] استخدم جهاز تصفية مزامنه البومات بديل",
"advanced_settings_log_level_title": "مستوى السجل: {level}",

View File

@ -387,8 +387,6 @@
"admin_password": "Администраторска парола",
"administration": "Администрация",
"advanced": "Разширено",
"advanced_settings_beta_timeline_subtitle": "Опитайте новите функции на приложението",
"advanced_settings_beta_timeline_title": "Бета версия на времевата линия",
"advanced_settings_enable_alternate_media_filter_subtitle": "При синхронизация, използвайте тази опция като филтър, основан на промяна на даден критерии. Опитайте само в случай, че приложението има проблем с откриване на всички албуми.",
"advanced_settings_enable_alternate_media_filter_title": "[ЕКСПЕРИМЕНТАЛНО] Използвай филтъра на алтернативното устройство за синхронизация на албуми",
"advanced_settings_log_level_title": "Ниво на запис в дневника: {level}",
@ -404,7 +402,7 @@
"advanced_settings_sync_remote_deletions_title": "Синхронизация на дистанционни изтривания [ЕКСПЕРИМЕНТАЛНО]",
"advanced_settings_tile_subtitle": "Разширени потребителски настройки",
"advanced_settings_troubleshooting_subtitle": "Разреши допълнителни възможности за отстраняване на проблеми",
"advanced_settings_troubleshooting_title": "Отстраняване на проблеми",
"advanced_settings_troubleshooting_title": "Отстраняванe на проблеми",
"age_months": "Възраст {months, plural, one {# месец} other {# месеци}}",
"age_year_months": "Възраст 1 година, {months, plural, one {# месец} other {# месеци}}",
"age_years": "{years, plural, other {Година #}}",
@ -425,6 +423,7 @@
"album_remove_user_confirmation": "Сигурни ли сте, че искате да премахнете {user}?",
"album_search_not_found": "Няма намерени албуми, отговарящи на търсенето ви",
"album_share_no_users": "Изглежда, че сте споделили този албум с всички потребители или нямате друг потребител, с когото да го споделите.",
"album_summary": "Обобщение на албума",
"album_updated": "Албумът е актуализиран",
"album_updated_setting_description": "Получавайте известие по имейл, когато споделен албум има нови файлове",
"album_user_left": "Напусна {album}",
@ -496,6 +495,8 @@
"asset_restored_successfully": "Успешно възстановен обект",
"asset_skipped": "Пропуснато",
"asset_skipped_in_trash": "В кошчето",
"asset_trashed": "Обектът е изхвърлен",
"asset_troubleshoot": "Поправка на грешки с обекта",
"asset_uploaded": "Качено",
"asset_uploading": "Качване…",
"asset_viewer_settings_subtitle": "Управление на настройките за изглед",
@ -529,8 +530,10 @@
"autoplay_slideshow": "Автоматична смяна на слайдовете",
"back": "Назад",
"back_close_deselect": "Назад, затваряне или премахване на избора",
"background_backup_running_error": "Стартирано е фоново архивиране, не може да се пусне ръчно архивиране",
"background_location_permission": "Разрешение за достъп до местоположението във фонов режим",
"background_location_permission_content": "За да може да чете имената на Wi-Fi мрежите и да ги превключва при работа във фонов режим, Immich трябва *винаги* да има достъп до точното местоположение",
"background_options": "Опции за фоновите задачи",
"backup": "Архивиране",
"backup_album_selection_page_albums_device": "Албуми на устройството ({count})",
"backup_album_selection_page_albums_tap": "Натисни за да включиш, двойно за да изключиш",
@ -538,6 +541,7 @@
"backup_album_selection_page_select_albums": "Избор на албуми",
"backup_album_selection_page_selection_info": "Информация за избраното",
"backup_album_selection_page_total_assets": "Уникални обекти общо",
"backup_albums_sync": "Синхронизиране на архивите",
"backup_all": "Всичко",
"backup_background_service_backup_failed_message": "Неуспешно архивиране. Нов опит…",
"backup_background_service_connection_failed_message": "Неуспешно свързване към сървъра. Нов опит…",
@ -587,7 +591,7 @@
"backup_controller_page_turn_on": "Включи архивиране в активен режим",
"backup_controller_page_uploading_file_info": "Инфо за архивирания файл",
"backup_err_only_album": "Не може да се премахне единствения албум",
"backup_info_card_assets": "обекти",
"backup_info_card_assets": "обекта",
"backup_manual_cancelled": "Отменено",
"backup_manual_in_progress": "Върви архивиране. Опитай след малко",
"backup_manual_success": "Успешно",
@ -654,6 +658,8 @@
"change_pin_code": "Смени PIN кода",
"change_your_password": "Променете паролата си",
"changed_visibility_successfully": "Видимостта е променена успешно",
"charging": "При зареждане",
"charging_requirement_mobile_backup": "Фоново архивиране само при зареждане на устройството",
"check_corrupt_asset_backup": "Провери за повредени архивни копия",
"check_corrupt_asset_backup_button": "Провери",
"check_corrupt_asset_backup_description": "Изпълни тази проверка само при Wi-Fi и след архивиране на всички обекти. Процедурата може да продължи няколко минути.",
@ -740,6 +746,7 @@
"create_user": "Създай потребител",
"created": "Създадено",
"created_at": "Създаден",
"creating_linked_albums": "Създаване на свързани албуми...",
"crop": "Изрежи",
"curated_object_page_title": "Неща",
"current_device": "Текущо устройство",
@ -889,7 +896,9 @@
"error": "Грешка",
"error_change_sort_album": "Неуспешна промяна на реда на сортиране на албум",
"error_delete_face": "Грешка при изтриване на лице от актива",
"error_getting_places": "Грешка при събиране на местата",
"error_loading_image": "Грешка при зареждане на изображението",
"error_loading_partners": "Грешка при зареждане на партньори: {error}",
"error_saving_image": "Грешка: {error}",
"error_tag_face_bounding_box": "Грешка при отбелязване на лице - неуспешно получаване на координати на рамката",
"error_title": "Грешка - нещо се обърка",
@ -1054,6 +1063,7 @@
"favorites_page_no_favorites": "Не са намерени любими обекти",
"feature_photo_updated": "Представителната снимка е променена",
"features": "Функции",
"features_in_development": "Функции в процес на разработка",
"features_setting_description": "Управление на функциите на приложението",
"file_name": "Име на файла",
"file_name_or_extension": "Име на файл или разширение",
@ -1218,6 +1228,7 @@
"local": "Локално",
"local_asset_cast_failed": "Не може да се предава обект, който още не е качен на сървъра",
"local_assets": "Локални обекти",
"local_media_summary": "Обобщение на локалните медийни файлове",
"local_network": "Локална мрежа",
"local_network_sheet_info": "Приложението ще се свърже със сървъра на този URL, когато устройството е свързано към зададената Wi-Fi мрежа",
"location_permission": "Разрешение за местоположение",
@ -1229,6 +1240,7 @@
"location_picker_longitude_hint": "Въведете географска дължина тук",
"lock": "Заключи",
"locked_folder": "Заключена папка",
"log_detail_title": "Подробности от дневника",
"log_out": "Излизане",
"log_out_all_devices": "Излизане с всички устройства",
"logged_in_as": "Вписан като {user}",
@ -1259,6 +1271,7 @@
"login_password_changed_success": "Успешно обновена парола",
"logout_all_device_confirmation": "Сигурни ли сте, че искате да излезете от всички устройства?",
"logout_this_device_confirmation": "Сигурни ли сте, че искате да излезете от това устройство?",
"logs": "Дневник",
"longitude": "Дължина",
"look": "Изглед",
"loop_videos": "Повтаряне на видеата",
@ -1301,6 +1314,7 @@
"mark_as_read": "Маркирай като четено",
"marked_all_as_read": "Всички маркирани като прочетени",
"matches": "Съвпадения",
"matching_assets": "Съвпадащи обекти",
"media_type": "Вид медия",
"memories": "Спомени",
"memories_all_caught_up": "Това е всичко за днес",
@ -1341,6 +1355,7 @@
"name_or_nickname": "Име или прякор",
"network_requirement_photos_upload": "Използвай мобилни данни за архивиране на снимки",
"network_requirement_videos_upload": "Използвай мобилни данни за архивиране на видео",
"network_requirements": "Изисквания към мрежата",
"network_requirements_updated": "Мрежовите настройки са променени, нулиране на опашката за архивиране",
"networking_settings": "Мрежа",
"networking_subtitle": "Управление на настройките за връзка със сървъра",
@ -1351,6 +1366,7 @@
"new_person": "Нов човек",
"new_pin_code": "Нов PIN код",
"new_pin_code_subtitle": "Това е първи достъп до заключена папка. Създайте PIN код за защитен достъп до тази страница",
"new_timeline": "Нова времева линия",
"new_user_created": "Създаден нов потребител",
"new_version_available": "НАЛИЧНА НОВА ВЕРСИЯ",
"newest_first": "Най-новите първи",
@ -1364,20 +1380,25 @@
"no_assets_message": "КЛИКНЕТЕ, ЗА ДА КАЧИТЕ ПЪРВАТА СИ СНИМКА",
"no_assets_to_show": "Няма обекти за показване",
"no_cast_devices_found": "Няма намерени устройства за предаване",
"no_checksum_local": "Липсват контролни суми - не може да се получат локални обекти",
"no_checksum_remote": "Липсват контролни суми - не може да се получат обекти от сървъра",
"no_duplicates_found": "Не бяха открити дубликати.",
"no_exif_info_available": "Няма exif информация",
"no_explore_results_message": "Качете още снимки, за да разгледате колекцията си.",
"no_favorites_message": "Добавете в любими, за да намирате бързо най-добрите си снимки и видеоклипове",
"no_libraries_message": "Създайте външна библиотека за да разглеждате снимки и видеоклипове",
"no_local_assets_found": "Не е намерен локален обект с такава контролна сума",
"no_locked_photos_message": "Снимките и видеата в заключената папка са скрити и не се показват при разглеждане на библиотеката.",
"no_name": "Без име",
"no_notifications": "Няма известия",
"no_people_found": "Не са намерени съответстващи хора",
"no_places": "Няма места",
"no_remote_assets_found": "Не е намерен обект на сървъра с такава контролна сума",
"no_results": "Няма резултати",
"no_results_description": "Опитайте със синоним или по-обща ключова дума",
"no_shared_albums_message": "Създайте албум, за да споделяте снимки и видеоклипове с хората в мрежата си",
"no_uploads_in_progress": "Няма качване в момента",
"not_available": "Неналично",
"not_in_any_album": "Не е в никой албум",
"not_selected": "Не е избрано",
"note_apply_storage_label_to_previously_uploaded assets": "Забележка: За да приложите етикета за съхранение към предварително качени активи, стартирайте",
@ -1515,7 +1536,7 @@
"profile_drawer_client_out_of_date_minor": "Мобилното приложение е остаряло. Моля, актуализирай до най-новата версия.",
"profile_drawer_client_server_up_to_date": "Клиента и сървъра са обновени",
"profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Режима само за четене е активиран. С двоен клик върху картиката-аватар на потребителя ще деактивирате само за четене.",
"profile_drawer_readonly_mode": "Режима само за четене е активиран. С дълго натискане върху картиката-аватар на потребителя ще деактивирате само за четене.",
"profile_drawer_server_out_of_date_major": "Версията на сървъра е остаряла. Моля, актуализирай поне до последната главна версия.",
"profile_drawer_server_out_of_date_minor": "Версията на сървъра е остаряла. Моля, актуализирай до последната версия.",
"profile_image_of_user": "Профилна снимка на {user}",
@ -1588,6 +1609,7 @@
"regenerating_thumbnails": "Пресъздаване на миниатюрите",
"remote": "На сървъра",
"remote_assets": "Обекти на сървъра",
"remote_media_summary": "Обобщение на медийните файлове на сървъра",
"remove": "Премахни",
"remove_assets_album_confirmation": "Сигурни ли сте, че искате да премахнете {count, plural, one {# елемент} other {# елемента}} от албума?",
"remove_assets_shared_link_confirmation": "Сигурни ли сте, че искате да премахнете {count, plural, one {# елемент} other {# елемента}} от този споеделен линк?",
@ -1640,6 +1662,7 @@
"restore_user": "Възстанови потребител",
"restored_asset": "Възстановен елемент",
"resume": "Продължаване",
"resume_paused_jobs": "Продължи изпълнението на {count, plural, one {# задача} other {# задачи}}",
"retry_upload": "Опитай качването отново",
"review_duplicates": "Разгледай дубликатите",
"review_large_files": "Преглед на големи файлове",
@ -1862,6 +1885,7 @@
"show_slideshow_transition": "Покажи прехода на слайдшоуто",
"show_supporter_badge": "Значка поддръжник",
"show_supporter_badge_description": "Покажи значка поддръжник",
"show_text_search_menu": "Покажи менюто за търсене на текст",
"shuffle": "Разбъркване",
"sidebar": "Странична лента",
"sidebar_display_description": "Показване на връзка към изгледа в страничната лента",
@ -1916,6 +1940,8 @@
"sync_albums_manual_subtitle": "Синхронизирай всички заредени видеа и снимки в избраните архивни албуми",
"sync_local": "Локална синхронизация",
"sync_remote": "Синхронизация със сървъра",
"sync_status": "Състояние на синхронизацията",
"sync_status_subtitle": "Преглед и управление на системата за синхронизация",
"sync_upload_album_setting_subtitle": "Създавайте и зареждайте снимки и видеа в избрани албуми в Immich",
"tag": "Таг",
"tag_assets": "Тагни елементи",
@ -1975,6 +2001,7 @@
"trash_page_select_assets_btn": "Избери обекти",
"trash_page_title": "В коша ({count})",
"trashed_items_will_be_permanently_deleted_after": "Изхвърлените в кошчето елементи ще бъдат изтрити за постоянно след {days, plural, one {# ден} other {# дни}}.",
"troubleshoot": "Отстраняване на проблеми",
"type": "Тип",
"unable_to_change_pin_code": "Невъзможна промяна на PIN кода",
"unable_to_setup_pin_code": "Неуспешно задаване на PIN кода",
@ -2091,5 +2118,6 @@
"yes": "Да",
"you_dont_have_any_shared_links": "Нямате споделени връзки",
"your_wifi_name": "Вашата Wi-Fi мрежа",
"zoom_image": "Увеличаване на изображението"
"zoom_image": "Увеличаване на изображението",
"zoom_to_bounds": "Приближи до събиране в границите"
}

View File

@ -387,8 +387,6 @@
"admin_password": "Contrasenya de l'administrador",
"administration": "Administració",
"advanced": "Avançat",
"advanced_settings_beta_timeline_subtitle": "Prova la nova experiència de l'aplicació",
"advanced_settings_beta_timeline_title": "Cronologia beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Feu servir aquesta opció per filtrar els continguts multimèdia durant la sincronització segons criteris alternatius. Només proveu-ho si teniu problemes amb l'aplicació per detectar tots els àlbums.",
"advanced_settings_enable_alternate_media_filter_title": "Utilitza el filtre de sincronització d'àlbums de dispositius alternatius",
"advanced_settings_log_level_title": "Nivell de registre: {level}",
@ -425,6 +423,7 @@
"album_remove_user_confirmation": "Esteu segurs que voleu eliminar {user}?",
"album_search_not_found": "No s'ha trobat cap àlbum que coincideixi amb la teva cerca",
"album_share_no_users": "Sembla que has compartit aquest àlbum amb tots els usuaris o no tens cap usuari amb qui compartir-ho.",
"album_summary": "Resum de l'àlbum",
"album_updated": "Àlbum actualitzat",
"album_updated_setting_description": "Rep una notificació per correu electrònic quan un àlbum compartit tingui recursos nous",
"album_user_left": "Surt de {album}",
@ -496,6 +495,7 @@
"asset_restored_successfully": "Element recuperat correctament",
"asset_skipped": "Saltat",
"asset_skipped_in_trash": "A la paperera",
"asset_trashed": "Recurs a la paperera",
"asset_uploaded": "Carregat",
"asset_uploading": "S'està carregant…",
"asset_viewer_settings_subtitle": "Gestiona la configuració del visualitzador de la galeria",
@ -529,6 +529,7 @@
"autoplay_slideshow": "Reprodueix automàticament les diapositives",
"back": "Enrere",
"back_close_deselect": "Tornar, tancar o anul·lar la selecció",
"background_backup_running_error": "La còpia de seguretat en segon pla s'està executant actualment, no es pot iniciar la còpia de seguretat manual",
"background_location_permission": "Permís d'ubicació en segon pla",
"background_location_permission_content": "Per canviar de xarxa quan s'executa en segon pla, Immich ha de *sempre* tenir accés a la ubicació precisa perquè l'aplicació pugui llegir el nom de la xarxa Wi-Fi",
"backup": "Còpia",
@ -740,6 +741,7 @@
"create_user": "Crea un usuari",
"created": "Creat",
"created_at": "Creat",
"creating_linked_albums": "Creant àlbums enllaçats...",
"crop": "Retalla",
"curated_object_page_title": "Coses",
"current_device": "Dispositiu actual",
@ -889,6 +891,7 @@
"error": "Error",
"error_change_sort_album": "No s'ha pogut canviar l'ordre d'ordenació dels àlbums",
"error_delete_face": "Error esborrant cara de les cares reconegudes",
"error_getting_places": "S'ha produït un error en obtenir els llocs",
"error_loading_image": "Error carregant la imatge",
"error_saving_image": "Error: {error}",
"error_tag_face_bounding_box": "Error a l'etiquetar la cara - no s'han pogut obtenir les coordenades de l'àrea",
@ -1054,6 +1057,7 @@
"favorites_page_no_favorites": "No s'han trobat preferits",
"feature_photo_updated": "Foto destacada actualitzada",
"features": "Característiques",
"features_in_development": "Funcions en desenvolupament",
"features_setting_description": "Administrar les funcions de l'aplicació",
"file_name": "Nom de l'arxiu",
"file_name_or_extension": "Nom de l'arxiu o extensió",

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Povolit protokolování",
"logging_level_description": "Když je povoleno, jakou úroveň protokolu použít.",
"logging_settings": "Protokolování",
"machine_learning_availability_checks": "Kontroly dostupnosti",
"machine_learning_availability_checks_description": "Automaticky zvolit a preferovat dostupné servery strojového učení",
"machine_learning_availability_checks_enabled": "Povolit kontroly dostupnosti",
"machine_learning_availability_checks_interval": "Interval kontrol",
"machine_learning_availability_checks_interval_description": "Interval v milisekundách mezi kontrolami dostupnosti",
"machine_learning_availability_checks_timeout": "Vypršení požadavku",
"machine_learning_availability_checks_timeout_description": "Časové vypršení požadavku v milisekundách u kontrol dostupnosti",
"machine_learning_clip_model": "Model CLIP",
"machine_learning_clip_model_description": "Název CLIP modelu je uvedený <link>zde</link>. Pamatujte, že při změně modelu je nutné znovu spustit úlohu 'Chytré vyhledávání' pro všechny obrázky.",
"machine_learning_duplicate_detection": "Kontrola duplicit",
@ -387,8 +394,6 @@
"admin_password": "Heslo správce",
"administration": "Administrace",
"advanced": "Pokročilé",
"advanced_settings_beta_timeline_subtitle": "Vyzkoušejte nové prostředí aplikace",
"advanced_settings_beta_timeline_title": "Časová osa (beta)",
"advanced_settings_enable_alternate_media_filter_subtitle": "Tuto možnost použijte k filtrování médií během synchronizace na základě alternativních kritérií. Tuto možnost vyzkoušejte pouze v případě, že máte problémy s detekcí všech alb v aplikaci.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTÁLNÍ] Použít alternativní filtr pro synchronizaci alb zařízení",
"advanced_settings_log_level_title": "Úroveň protokolování: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "Opravdu chcete odebrat uživatele {user}?",
"album_search_not_found": "Nebyla nalezena žádná alba odpovídající vašemu hledání",
"album_share_no_users": "Zřejmě jste toto album sdíleli se všemi uživateli, nebo nemáte žádného uživatele, se kterým byste ho mohli sdílet.",
"album_summary": "Souhrn alba",
"album_updated": "Album aktualizováno",
"album_updated_setting_description": "Dostávat e-mailová oznámení o nových položkách sdíleného alba",
"album_user_left": "Opustil {album}",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Položka úspěšně obnovena",
"asset_skipped": "Přeskočeno",
"asset_skipped_in_trash": "V koši",
"asset_trashed": "Položka vyhozena",
"asset_troubleshoot": "Řešení problémů s položkami",
"asset_uploaded": "Nahráno",
"asset_uploading": "Nahrávání…",
"asset_viewer_settings_subtitle": "Správa nastavení prohlížeče galerie",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Automatické přehrávání prezentace",
"back": "Zpět",
"back_close_deselect": "Zpět, zavřít nebo zrušit výběr",
"background_backup_running_error": "Právě probíhá zálohování na pozadí, nelze spustit ruční zálohování",
"background_location_permission": "Povolení polohy na pozadí",
"background_location_permission_content": "Aby bylo možné přepínat sítě při běhu na pozadí, musí mít Immich *vždy* přístup k přesné poloze, aby mohl zjistit název Wi-Fi sítě",
"background_options": "Možnosti běhu na pozadí",
"backup": "Záloha",
"backup_album_selection_page_albums_device": "Alba v zařízení ({count})",
"backup_album_selection_page_albums_tap": "Klepnutím na položku ji zahrnete, opětovným klepnutím ji vyloučíte",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Vybraná alba",
"backup_album_selection_page_selection_info": "Informace o výběru",
"backup_album_selection_page_total_assets": "Celkový počet jedinečných položek",
"backup_albums_sync": "Synchronizace zálohovaných alb",
"backup_all": "Vše",
"backup_background_service_backup_failed_message": "Zálohování médií selhalo. Zkouším to znovu…",
"backup_background_service_connection_failed_message": "Nepodařilo se připojit k serveru. Zkouším to znovu…",
@ -654,6 +665,8 @@
"change_pin_code": "Změnit PIN kód",
"change_your_password": "Změna vašeho hesla",
"changed_visibility_successfully": "Změna viditelnosti proběhla úspěšně",
"charging": "Nabíjení",
"charging_requirement_mobile_backup": "Zálohování na pozadí vyžaduje, aby bylo zařízení nabíjeno",
"check_corrupt_asset_backup": "Kontrola poškozených záloh položek",
"check_corrupt_asset_backup_button": "Provést kontrolu",
"check_corrupt_asset_backup_description": "Tuto kontrolu provádějte pouze přes Wi-Fi a po zálohování všech prostředků. Takto operace může trvat několik minut.",
@ -740,6 +753,7 @@
"create_user": "Vytvořit uživatele",
"created": "Vytvořeno",
"created_at": "Vytvořeno",
"creating_linked_albums": "Vytváření propojených alb...",
"crop": "Oříznout",
"curated_object_page_title": "Věci",
"current_device": "Současné zařízení",
@ -889,7 +903,9 @@
"error": "Chyba",
"error_change_sort_album": "Nepodařilo se změnit pořadí alba",
"error_delete_face": "Chyba při odstraňování obličeje z položky",
"error_getting_places": "Chyba při zjišťování míst",
"error_loading_image": "Chyba při načítání obrázku",
"error_loading_partners": "Chyba při načítání partnerů: {error}",
"error_saving_image": "Chyba: {error}",
"error_tag_face_bounding_box": "Chyba při označování obličeje - nelze získat souřadnice ohraničujícího rámečku",
"error_title": "Chyba - Něco se pokazilo",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "Nebyla nalezena žádná oblíbená média",
"feature_photo_updated": "Hlavní fotka aktualizována",
"features": "Funkce",
"features_in_development": "Funkce ve vývoji",
"features_setting_description": "Správa funkcí aplikace",
"file_name": "Název souboru",
"file_name_or_extension": "Název nebo přípona souboru",
@ -1218,6 +1235,7 @@
"local": "Místní",
"local_asset_cast_failed": "Nelze odeslat položku, která není nahraná na serveru",
"local_assets": "Místní položky",
"local_media_summary": "Souhrn místních médií",
"local_network": "Místní síť",
"local_network_sheet_info": "Aplikace se při použití zadané sítě Wi-Fi připojí k serveru prostřednictvím tohoto URL",
"location_permission": "Oprávnění polohy",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Zadejte vlastní zeměpisnou délku",
"lock": "Zamknout",
"locked_folder": "Uzamčená složka",
"log_detail_title": "Podrobnosti protokolu",
"log_out": "Odhlásit",
"log_out_all_devices": "Odhlásit všechna zařízení",
"logged_in_as": "Přihlášen jako {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Heslo bylo úspěšně aktualizováno",
"logout_all_device_confirmation": "Opravdu chcete odhlásit všechna zařízení?",
"logout_this_device_confirmation": "Opravdu chcete odhlásit toto zařízení?",
"logs": "Protokoly",
"longitude": "Zeměpisná délka",
"look": "Zobrazení",
"loop_videos": "Videa ve smyčce",
@ -1301,6 +1321,7 @@
"mark_as_read": "Označit jako přečtené",
"marked_all_as_read": "Vše označeno jako přečtené",
"matches": "Shody",
"matching_assets": "Odpovídající položky",
"media_type": "Typ média",
"memories": "Vzpomínky",
"memories_all_caught_up": "To je všechno",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Jméno nebo přezdívka",
"network_requirement_photos_upload": "Pro zálohování fotografií používat mobilní data",
"network_requirement_videos_upload": "Pro zálohování videí používat mobilní data",
"network_requirements": "Požadavky na síť",
"network_requirements_updated": "Požadavky na síť se změnily, fronta zálohování se vytvoří znovu",
"networking_settings": "Síť",
"networking_subtitle": "Správa nastavení koncového bodu serveru",
@ -1351,6 +1373,7 @@
"new_person": "Nová osoba",
"new_pin_code": "Nový PIN kód",
"new_pin_code_subtitle": "Poprvé přistupujete k uzamčené složce. Vytvořte si kód PIN pro bezpečný přístup na tuto stránku",
"new_timeline": "Nová časová osa",
"new_user_created": "Vytvořen nový uživatel",
"new_version_available": "NOVÁ VERZE K DISPOZICI",
"newest_first": "Nejnovější první",
@ -1364,20 +1387,25 @@
"no_assets_message": "KLIKNĚTE PRO NAHRÁNÍ PRVNÍ FOTOGRAFIE",
"no_assets_to_show": "Žádné položky k zobrazení",
"no_cast_devices_found": "Nebyla nalezena žádná zařízení",
"no_checksum_local": "Není k dispozici kontrolní součet - nelze načíst místní položky",
"no_checksum_remote": "Není k dispozici kontrolní součet - nelze načíst vzdálenou položku",
"no_duplicates_found": "Nebyly nalezeny žádné duplicity.",
"no_exif_info_available": "Exif není k dispozici",
"no_explore_results_message": "Nahrajte další fotografie a prozkoumejte svou sbírku.",
"no_favorites_message": "Přidejte si oblíbené položky a rychle najděte své nejlepší obrázky a videa",
"no_libraries_message": "Vytvořte si externí knihovnu pro zobrazení fotografií a videí",
"no_local_assets_found": "Nebyly nalezeny žádné místní položky s tímto kontrolním součtem",
"no_locked_photos_message": "Fotky a videa v uzamčené složce jsou skryté a při procházení nebo vyhledávání v knihovně se nezobrazují.",
"no_name": "Bez jména",
"no_notifications": "Žádná oznámení",
"no_people_found": "Nebyli nalezeni žádní odpovídající lidé",
"no_places": "Žádná místa",
"no_remote_assets_found": "Nebyly nalezeny žádné vzdálené položky s tímto kontrolním součtem",
"no_results": "Žádné výsledky",
"no_results_description": "Zkuste použít synonymum nebo obecnější klíčové slovo",
"no_shared_albums_message": "Vytvořte si album a sdílejte fotografie a videa s lidmi ve své síti",
"no_uploads_in_progress": "Neprobíhá žádné nahrávání",
"not_available": "Není k dispozici",
"not_in_any_album": "Bez alba",
"not_selected": "Není vybráno",
"note_apply_storage_label_to_previously_uploaded assets": "Upozornění: Chcete-li použít štítek úložiště na dříve nahrané položky, spusťte příkaz",
@ -1499,6 +1527,7 @@
"port": "Port",
"preferences_settings_subtitle": "Správa předvoleb aplikace",
"preferences_settings_title": "Předvolby",
"preparing": "Příprava",
"preset": "Přednastavení",
"preview": "Náhled",
"previous": "Předchozí",
@ -1564,6 +1593,7 @@
"read_changelog": "Přečtěte si seznam změn",
"readonly_mode_disabled": "Režim pouze pro čtení je deaktivován",
"readonly_mode_enabled": "Režim pouze pro čtení povolen",
"ready_for_upload": "Připraveno k nahrání",
"reassign": "Přeřadit",
"reassigned_assets_to_existing_person": "Přeřadit {count, plural, one {# položku} few {# položky} other {# položek}} na {name, select, null {existující osobu} other {{name}}}",
"reassigned_assets_to_new_person": "{count, plural, one {Přeřazena # položka} few {Přeřazeny # položky} other {Přeřazeno # položek}} na novou osobu",
@ -1588,6 +1618,7 @@
"regenerating_thumbnails": "Regenerace miniatur",
"remote": "Vzdálený",
"remote_assets": "Vzdálené položky",
"remote_media_summary": "Souhrn vzdálených médií",
"remove": "Odstranit",
"remove_assets_album_confirmation": "Opravdu chcete z alba odstranit {count, plural, one {# položku} few {# položky} other {# položek}}?",
"remove_assets_shared_link_confirmation": "Opravdu chcete ze sdíleného odkazu odstranit {count, plural, one {# položku} few {# položky} other {# položek}}?",
@ -1653,7 +1684,7 @@
"saved_api_key": "API klíč uložen",
"saved_profile": "Profil uložen",
"saved_settings": "Nastavení uloženo",
"say_something": "Řekněte něco",
"say_something": "Napište něco",
"scaffold_body_error_occurred": "Došlo k chybě",
"scan_all_libraries": "Prohledat všechny knihovny",
"scan_library": "Prohledat",
@ -1863,6 +1894,7 @@
"show_slideshow_transition": "Zobrazit přechod prezentace",
"show_supporter_badge": "Odznak podporovatele",
"show_supporter_badge_description": "Zobrazit odznak podporovatele",
"show_text_search_menu": "Zobrazit nabídku pro vyhledávání textu",
"shuffle": "Náhodný výběr",
"sidebar": "Postranní panel",
"sidebar_display_description": "Zobrazení odkazu na zobrazení v postranním panelu",
@ -1893,6 +1925,7 @@
"stacktrace": "Výpis zásobníku",
"start": "Start",
"start_date": "Počáteční datum",
"start_date_before_end_date": "Počáteční datum se musí nacházet před konečným datem",
"state": "Stát",
"status": "Stav",
"stop_casting": "Zastavit odesílání",
@ -2095,5 +2128,6 @@
"yes": "Ano",
"you_dont_have_any_shared_links": "Nemáte žádné sdílené odkazy",
"your_wifi_name": "Název vaší Wi-Fi",
"zoom_image": "Zvětšit obrázek"
"zoom_image": "Zvětšit obrázek",
"zoom_to_bounds": "Přiblížit na okraje"
}

View File

@ -2,7 +2,7 @@
"about": "Om os",
"account": "Konto",
"account_settings": "Kontoindstillinger",
"acknowledge": "Anerkendelse",
"acknowledge": "Accepter",
"action": "Handling",
"action_common_update": "Opdater",
"actions": "Handlinger",
@ -387,8 +387,6 @@
"admin_password": "Administratoradgangskode",
"administration": "Administration",
"advanced": "Avanceret",
"advanced_settings_beta_timeline_subtitle": "Prøv den nye app-oplevelse",
"advanced_settings_beta_timeline_title": "Beta-tidslinje",
"advanced_settings_enable_alternate_media_filter_subtitle": "Brug denne valgmulighed for at filtrere media under synkronisering baseret på alternative kriterier. Prøv kun denne hvis du har problemer med at appen ikke opdager alle albums.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTEL] Brug alternativ enheds album synkroniserings filter",
"advanced_settings_log_level_title": "Logniveau: {level}",

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Aktiviere Logging",
"logging_level_description": "Wenn aktiviert, welches Log-Level genutzt wird.",
"logging_settings": "Protokollierung",
"machine_learning_availability_checks": "Verfügbarkeitschecks",
"machine_learning_availability_checks_description": "Erkenne und bevorzuge verfügbare Machine Learning Servers",
"machine_learning_availability_checks_enabled": "Verfügbarkeitschecks einschalten",
"machine_learning_availability_checks_interval": "Überprüfungsinterval",
"machine_learning_availability_checks_interval_description": "Interval in Millisekunden zwischen Verfügbarkeitschecks",
"machine_learning_availability_checks_timeout": "Anfragenzeitüberschreitung",
"machine_learning_availability_checks_timeout_description": "Zeitüberschreitung in Millisekunden für Verfügbarkeitschecks",
"machine_learning_clip_model": "CLIP-Modell",
"machine_learning_clip_model_description": "Der Name eines CLIP-Modells, welches <link>hier</link> aufgeführt ist. Beachte, dass du die Aufgabe \"Intelligente Suche\" für alle Bilder erneut ausführen musst, wenn du das Modell wechselst.",
"machine_learning_duplicate_detection": "Duplikaterkennung",
@ -387,8 +394,6 @@
"admin_password": "Administrator Passwort",
"administration": "Verwaltung",
"advanced": "Erweitert",
"advanced_settings_beta_timeline_subtitle": "Probier die neue App-Erfahrung aus",
"advanced_settings_beta_timeline_title": "Beta-Timeline",
"advanced_settings_enable_alternate_media_filter_subtitle": "Verwende diese Option, um Medien während der Synchronisierung nach anderen Kriterien zu filtern. Versuchen dies nur, wenn Probleme mit der Erkennung aller Alben durch die App auftreten.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTELL] Benutze alternativen Filter für Synchronisierung der Gerätealben",
"advanced_settings_log_level_title": "Log-Level: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "Bist du sicher, dass du {user} entfernen willst?",
"album_search_not_found": "Keine Alben gefunden, die zur Suche passen",
"album_share_no_users": "Es sieht so aus, als hättest du dieses Album mit allen Benutzern geteilt oder du hast keine Benutzer, mit denen du teilen kannst.",
"album_summary": "Album Zusammenfassung",
"album_updated": "Album aktualisiert",
"album_updated_setting_description": "Erhalte eine E-Mail-Benachrichtigung, wenn ein freigegebenes Album neue Dateien enthält",
"album_user_left": "{album} verlassen",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Datei erfolgreich wiederhergestellt",
"asset_skipped": "Übersprungen",
"asset_skipped_in_trash": "Im Papierkorb",
"asset_trashed": "Datei Gelöscht",
"asset_troubleshoot": "Datei Fehlerbehebung",
"asset_uploaded": "Hochgeladen",
"asset_uploading": "Hochladen…",
"asset_viewer_settings_subtitle": "Verwaltung der Einstellungen für die Fotoanzeige",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Automatische Diashow",
"back": "Zurück",
"back_close_deselect": "Zurück, Schließen oder Abwählen",
"background_backup_running_error": "Hintergrund Sicherung läuft, kann manuelle Sicherung nicht starten",
"background_location_permission": "Hintergrund Standortfreigabe",
"background_location_permission_content": "Um im Hintergrund zwischen den Netzwerken wechseln zu können, muss Immich *immer* Zugriff auf den genauen Standort haben, damit die App den Namen des WLAN-Netzwerks ermitteln kann",
"background_options": "Hintergrund Optionen",
"backup": "Sicherung",
"backup_album_selection_page_albums_device": "Alben auf dem Gerät ({count})",
"backup_album_selection_page_albums_tap": "Einmalig das Album antippen um es zu sichern, doppelt antippen um es nicht mehr zu sichern",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Alben auswählen",
"backup_album_selection_page_selection_info": "Information",
"backup_album_selection_page_total_assets": "Elemente",
"backup_albums_sync": "Synchronisation von Alben beim Backup",
"backup_all": "Alle",
"backup_background_service_backup_failed_message": "Es trat ein Fehler bei der Sicherung auf. Erneuter Versuch…",
"backup_background_service_connection_failed_message": "Es konnte keine Verbindung zum Server hergestellt werden. Erneuter Versuch…",
@ -654,6 +665,8 @@
"change_pin_code": "PIN Code ändern",
"change_your_password": "Ändere dein Passwort",
"changed_visibility_successfully": "Die Sichtbarkeit wurde erfolgreich geändert",
"charging": "Aufladen",
"charging_requirement_mobile_backup": "Backup im Hintergrund erfordert Aufladen des Geräts",
"check_corrupt_asset_backup": "Auf beschädigte Asset-Backups überprüfen",
"check_corrupt_asset_backup_button": "Überprüfung durchführen",
"check_corrupt_asset_backup_description": "Führe diese Prüfung nur mit aktivierten WLAN durch, nachdem alle Dateien gesichert worden sind. Dieser Vorgang kann ein paar Minuten dauern.",
@ -740,6 +753,7 @@
"create_user": "Nutzer erstellen",
"created": "Erstellt",
"created_at": "Erstellt",
"creating_linked_albums": "Erstelle verknüpfte Alben...",
"crop": "Zuschneiden",
"curated_object_page_title": "Dinge",
"current_device": "Aktuelles Gerät",
@ -889,7 +903,9 @@
"error": "Fehler",
"error_change_sort_album": "Ändern der Anzeigereihenfolge fehlgeschlagen",
"error_delete_face": "Fehler beim Löschen des Gesichts",
"error_getting_places": "Fehler beim Abrufen der Orte",
"error_loading_image": "Fehler beim Laden des Bildes",
"error_loading_partners": "Fehler beim Laden der Partner: {error}",
"error_saving_image": "Fehler: {error}",
"error_tag_face_bounding_box": "Fehler beim Markieren des Gesichts - Begrenzungen können nicht abgerufen werden",
"error_title": "Fehler - Etwas ist schief gelaufen",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "Keine favorisierten Inhalte gefunden",
"feature_photo_updated": "Profilbild aktualisiert",
"features": "Funktionen",
"features_in_development": "Feature in Entwicklung",
"features_setting_description": "Funktionen der App verwalten",
"file_name": "Dateiname",
"file_name_or_extension": "Dateiname oder -erweiterung",
@ -1190,7 +1207,7 @@
"large_files": "Große Dateien",
"last": "Letzte",
"last_seen": "Zuletzt gesehen",
"latest_version": "Aktuellste Version",
"latest_version": "Aktuelle Version",
"latitude": "Breitengrad",
"leave": "Verlassen",
"leave_album": "Album verlassen",
@ -1218,6 +1235,7 @@
"local": "Lokal",
"local_asset_cast_failed": "Eine Datei, die nicht auf den Server hochgeladen wurde, kann nicht gecastet werden",
"local_assets": "Lokale Dateien",
"local_media_summary": "Zusammenfassung der lokalen Medien",
"local_network": "Lokales Netzwerk",
"local_network_sheet_info": "Die App stellt über diese URL eine Verbindung zum Server her, wenn sie das angegebene WLAN-Netzwerk verwendet",
"location_permission": "Standort Genehmigung",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Längengrad eingeben",
"lock": "Sperren",
"locked_folder": "Gesperrter Ordner",
"log_detail_title": "Protokoll Details",
"log_out": "Abmelden",
"log_out_all_devices": "Alle Geräte abmelden",
"logged_in_as": "Angemeldet als {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Passwort erfolgreich geändert",
"logout_all_device_confirmation": "Bist du sicher, dass du alle Geräte abmelden willst?",
"logout_this_device_confirmation": "Bist du sicher, dass du dieses Gerät abmelden willst?",
"logs": "Protokolle",
"longitude": "Längengrad",
"look": "Erscheinungsbild",
"loop_videos": "Loop-Videos",
@ -1301,6 +1321,7 @@
"mark_as_read": "Als gelesen markieren",
"marked_all_as_read": "Alle als gelesen markiert",
"matches": "Treffer",
"matching_assets": "Passende Dateien",
"media_type": "Medientyp",
"memories": "Erinnerungen",
"memories_all_caught_up": "Alles aufgeholt",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Name oder Nickname",
"network_requirement_photos_upload": "Mobiles Datennetz verwenden, um Fotos zu sichern",
"network_requirement_videos_upload": "Mobiles Datennetz verwenden, um Videos zu sichern",
"network_requirements": "Anforderungen ans Netzwerk",
"network_requirements_updated": "Netzwerk-Abhängigkeiten haben sich geändert, Backup-Warteschlange wird zurückgesetzt",
"networking_settings": "Netzwerk",
"networking_subtitle": "Verwaltung von Server-Endpunkt-Einstellungen",
@ -1351,6 +1373,7 @@
"new_person": "Neue Person",
"new_pin_code": "Neuer PIN Code",
"new_pin_code_subtitle": "Dies ist dein erster Zugriff auf den gesperrten Ordner. Erstelle einen PIN Code für den sicheren Zugriff auf diese Seite",
"new_timeline": "Neue Zeitleiste",
"new_user_created": "Neuer Benutzer wurde erstellt",
"new_version_available": "NEUE VERSION VERFÜGBAR",
"newest_first": "Neueste zuerst",
@ -1364,20 +1387,25 @@
"no_assets_message": "KLICKE, UM DEIN ERSTES FOTO HOCHZULADEN",
"no_assets_to_show": "Keine Vorschau vorhanden",
"no_cast_devices_found": "Keine Geräte zum Übertragen gefunden",
"no_checksum_local": "Prüfsumme nicht verfügbar - kann lokale Datei/en nicht laden",
"no_checksum_remote": "Prüfsumme nicht verfügbar - kann entfernte Datei/en nicht laden",
"no_duplicates_found": "Es wurden keine Duplikate gefunden.",
"no_exif_info_available": "Keine EXIF-Informationen vorhanden",
"no_explore_results_message": "Lade weitere Fotos hoch, um deine Sammlung zu erkunden.",
"no_favorites_message": "Füge Favoriten hinzu, um deine besten Bilder und Videos schnell zu finden",
"no_libraries_message": "Eine externe Bibliothek erstellen, um deine Fotos und Videos anzusehen",
"no_local_assets_found": "Keine lokale Datei mit dieser Prüfsumme gefunden",
"no_locked_photos_message": "Fotos und Videos im gesperrten Ordner sind versteckt und werden nicht angezeigt, wenn du deine Bibliothek durchsuchst.",
"no_name": "Kein Name",
"no_notifications": "Keine Benachrichtigungen",
"no_people_found": "Keine passenden Personen gefunden",
"no_places": "Keine Orte",
"no_remote_assets_found": "Keine entfernten Dateien mit dieser Prüfsumme gefunden",
"no_results": "Keine Ergebnisse",
"no_results_description": "Versuche es mit einem Synonym oder einem allgemeineren Stichwort",
"no_shared_albums_message": "Erstelle ein Album, um Fotos und Videos mit Personen in deinem Netzwerk zu teilen",
"no_uploads_in_progress": "Kein Upload in Bearbeitung",
"not_available": "N/A",
"not_in_any_album": "In keinem Album",
"not_selected": "Nicht ausgewählt",
"note_apply_storage_label_to_previously_uploaded assets": "Hinweis: Um eine Speicherpfadbezeichnung anzuwenden, starte den",
@ -1588,6 +1616,7 @@
"regenerating_thumbnails": "Miniaturansichten werden neu erstellt",
"remote": "Server",
"remote_assets": "Server-Dateien",
"remote_media_summary": "Zusammenfassung der entfernten Medien",
"remove": "Entfernen",
"remove_assets_album_confirmation": "Bist du sicher, dass du {count, plural, one {# Datei} other {# Dateien}} aus dem Album entfernen willst?",
"remove_assets_shared_link_confirmation": "Bist du sicher, dass du {count, plural, one {# Datei} other {# Dateien}} von diesem geteilten Link entfernen willst?",
@ -1863,6 +1892,7 @@
"show_slideshow_transition": "Slideshow-Übergang anzeigen",
"show_supporter_badge": "Unterstützerabzeichen",
"show_supporter_badge_description": "Zeige Unterstützerabzeichen",
"show_text_search_menu": "Zeige Menü für Textsuche",
"shuffle": "Durchmischen",
"sidebar": "Seitenleiste",
"sidebar_display_description": "Zeige einen Link zu der Ansicht in der Seitenleiste an",
@ -1893,6 +1923,7 @@
"stacktrace": "Stapelaufgaben",
"start": "Starten",
"start_date": "Anfangsdatum",
"start_date_before_end_date": "Anfangsdatum muss vor dem Enddatum liegen",
"state": "Bundesland / Provinz",
"status": "Status",
"stop_casting": "Übertragung stoppen",
@ -2095,5 +2126,6 @@
"yes": "Ja",
"you_dont_have_any_shared_links": "Du hast keine geteilten Links",
"your_wifi_name": "Dein WLAN-Name",
"zoom_image": "Bild vergrößern"
"zoom_image": "Bild vergrößern",
"zoom_to_bounds": "In die Grenzen zoomen"
}

View File

@ -387,8 +387,6 @@
"admin_password": "Κωδικός πρόσβασης Διαχειριστή",
"administration": "Διαχείριση",
"advanced": "Για προχωρημένους",
"advanced_settings_beta_timeline_subtitle": "Δοκίμασε τη νέα εμπειρία της εφαρμογής",
"advanced_settings_beta_timeline_title": "Δοκιμαστικό χρονολόγιο",
"advanced_settings_enable_alternate_media_filter_subtitle": "Χρησιμοποιήστε αυτήν την επιλογή για να φιλτράρετε τα μέσα ενημέρωσης κατά τον συγχρονισμό με βάση εναλλακτικά κριτήρια. Δοκιμάστε αυτή τη δυνατότητα μόνο αν έχετε προβλήματα με την εφαρμογή που εντοπίζει όλα τα άλμπουμ.",
"advanced_settings_enable_alternate_media_filter_title": "[ΠΕΙΡΑΜΑΤΙΚΟ] Χρήση εναλλακτικού φίλτρου συγχρονισμού άλμπουμ συσκευής",
"advanced_settings_log_level_title": "Επίπεδο σύνδεσης: {level}",

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Enable logging",
"logging_level_description": "When enabled, what log level to use.",
"logging_settings": "Logging",
"machine_learning_availability_checks": "Availability checks",
"machine_learning_availability_checks_description": "Automatically detect and prefer available machine learning servers",
"machine_learning_availability_checks_enabled": "Enable availability checks",
"machine_learning_availability_checks_interval": "Check interval",
"machine_learning_availability_checks_interval_description": "Interval in milliseconds between availability checks",
"machine_learning_availability_checks_timeout": "Request timeout",
"machine_learning_availability_checks_timeout_description": "Timeout in milliseconds for availability checks",
"machine_learning_clip_model": "CLIP model",
"machine_learning_clip_model_description": "The name of a CLIP model listed <link>here</link>. Note that you must re-run the 'Smart Search' job for all images upon changing a model.",
"machine_learning_duplicate_detection": "Duplicate Detection",
@ -1520,6 +1527,7 @@
"port": "Port",
"preferences_settings_subtitle": "Manage the app's preferences",
"preferences_settings_title": "Preferences",
"preparing": "Preparing",
"preset": "Preset",
"preview": "Preview",
"previous": "Previous",
@ -1585,6 +1593,7 @@
"read_changelog": "Read Changelog",
"readonly_mode_disabled": "Read-only mode disabled",
"readonly_mode_enabled": "Read-only mode enabled",
"ready_for_upload": "Ready for upload",
"reassign": "Reassign",
"reassigned_assets_to_existing_person": "Re-assigned {count, plural, one {# asset} other {# assets}} to {name, select, null {an existing person} other {{name}}}",
"reassigned_assets_to_new_person": "Re-assigned {count, plural, one {# asset} other {# assets}} to a new person",
@ -1916,6 +1925,7 @@
"stacktrace": "Stacktrace",
"start": "Start",
"start_date": "Start date",
"start_date_before_end_date": "Start date must be before end date",
"state": "State",
"status": "Status",
"stop_casting": "Stop casting",

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Habilitar registro",
"logging_level_description": "Indica el nivel de registro a utilizar cuando está habilitado.",
"logging_settings": "Registro",
"machine_learning_availability_checks": "Verificaciones de disponibilidad",
"machine_learning_availability_checks_description": "Automáticamente detectar y preferir servidores de machine learning disponibles",
"machine_learning_availability_checks_enabled": "Habilitar verificaciones de disponibilidad",
"machine_learning_availability_checks_interval": "Intervalo de verificación",
"machine_learning_availability_checks_interval_description": "Intervalo en milisegundos entre las verificaciones de disponibilidad",
"machine_learning_availability_checks_timeout": "Tiempo de espera de solicitud",
"machine_learning_availability_checks_timeout_description": "Tiempo de espera en milisegundos para verificaciones de disponibilidad",
"machine_learning_clip_model": "Modelo CLIP (Contrastive Language-Image Pre-Training)",
"machine_learning_clip_model_description": "El nombre de un modelo CLIP listado <link>aquí</link>. Tendrás que relanzar el trabajo 'Búsqueda Inteligente' para todos los elementos al cambiar de modelo.",
"machine_learning_duplicate_detection": "Detección de duplicados",
@ -387,8 +394,6 @@
"admin_password": "Contraseña del administrador",
"administration": "Administración",
"advanced": "Avanzada",
"advanced_settings_beta_timeline_subtitle": "Prueba la nueva experiencia de la aplicación",
"advanced_settings_beta_timeline_title": "Cronología beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Usa esta opción para filtrar medios durante la sincronización según criterios alternativos. Intenta esto solo si tienes problemas con que la aplicación detecte todos los álbumes.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Usar filtro alternativo de sincronización de álbumes del dispositivo",
"advanced_settings_log_level_title": "Nivel de registro: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "¿Estás seguro de que quieres eliminar a {user}?",
"album_search_not_found": "No se encontraron álbumes que coincidan con tu búsqueda",
"album_share_no_users": "Parece que has compartido este álbum con todos los usuarios o no tienes ningún usuario con quien compartirlo.",
"album_summary": "Resumen del álbum",
"album_updated": "Album actualizado",
"album_updated_setting_description": "Reciba una notificación por correo electrónico cuando un álbum compartido tenga nuevos archivos",
"album_user_left": "Salida {album}",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Elementos restaurados exitosamente",
"asset_skipped": "Omitido",
"asset_skipped_in_trash": "En la papelera",
"asset_trashed": "Elemento eliminado",
"asset_troubleshoot": "Diagnóstico del elemento",
"asset_uploaded": "Subido",
"asset_uploading": "Subiendo…",
"asset_viewer_settings_subtitle": "Administra las configuracioens de tu visor de fotos",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Presentación con reproducción automática",
"back": "Atrás",
"back_close_deselect": "Atrás, cerrar o anular la selección",
"background_backup_running_error": "Ya se está ejecutando la copia de seguridad en segundo plano, no se puede iniciar la copia de seguridad manual",
"background_location_permission": "Permiso de ubicación en segundo plano",
"background_location_permission_content": "Para poder cambiar de red mientras se ejecuta en segundo plano, Immich debe tener *siempre* acceso a la ubicación precisa para que la aplicación pueda leer el nombre de la red Wi-Fi",
"background_options": "Opciones de segundo plano",
"backup": "Copia de Seguridad",
"backup_album_selection_page_albums_device": "Álbumes en el dispositivo ({count})",
"backup_album_selection_page_albums_tap": "Toque para incluir, doble toque para excluir",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Seleccionar álbumes",
"backup_album_selection_page_selection_info": "Información sobre la Selección",
"backup_album_selection_page_total_assets": "Total de elementos únicos",
"backup_albums_sync": "Sincronización de álbumes de respaldo",
"backup_all": "Todos",
"backup_background_service_backup_failed_message": "Error al copiar elementos. Reintentando…",
"backup_background_service_connection_failed_message": "Error al conectar con el servidor. Reintentando…",
@ -654,6 +665,8 @@
"change_pin_code": "Cambiar PIN",
"change_your_password": "Cambia tu contraseña",
"changed_visibility_successfully": "Visibilidad cambiada correctamente",
"charging": "Cargando",
"charging_requirement_mobile_backup": "La copia de seguridad en segundo plano requiere que el dispositivo se esté cargando",
"check_corrupt_asset_backup": "Comprobar copias de seguridad de archivos corruptos",
"check_corrupt_asset_backup_button": "Realizar comprobación",
"check_corrupt_asset_backup_description": "Ejecutar esta comprobación solo por Wi-Fi y una vez que todos los archivos hayan sido respaldados. El procedimiento puede tardar unos minutos.",
@ -740,6 +753,7 @@
"create_user": "Crear usuario",
"created": "Creado",
"created_at": "Creado",
"creating_linked_albums": "Creando álbumes vinculados...",
"crop": "Recortar",
"curated_object_page_title": "Objetos",
"current_device": "Dispositivo actual",
@ -889,7 +903,9 @@
"error": "Error",
"error_change_sort_album": "No se pudo cambiar el orden de visualización del álbum",
"error_delete_face": "Error al eliminar la cara del archivo",
"error_getting_places": "Error obteniendo lugares",
"error_loading_image": "Error al cargar la imagen",
"error_loading_partners": "Error al cargar compañeros: {error}",
"error_saving_image": "Error: {error}",
"error_tag_face_bounding_box": "Error al etiquetar la cara: no se pueden obtener las coordenadas del marco",
"error_title": "Error: algo salió mal",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "No se encontraron elementos marcados como favoritos",
"feature_photo_updated": "Foto destacada actualizada",
"features": "Características",
"features_in_development": "Funciones en Desarrollo",
"features_setting_description": "Administrar las funciones de la aplicación",
"file_name": "Nombre de archivo",
"file_name_or_extension": "Nombre del archivo o extensión",
@ -1218,6 +1235,7 @@
"local": "Local",
"local_asset_cast_failed": "No es posible transmitir un recurso que no está subido al servidor",
"local_assets": "Archivos Locales",
"local_media_summary": "Resumen de Medios Locales",
"local_network": "Red local",
"local_network_sheet_info": "La aplicación se conectará al servidor a través de esta URL cuando utilice la red Wi-Fi especificada",
"location_permission": "Permiso de ubicación",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Introduce tu longitud aquí",
"lock": "Bloquear",
"locked_folder": "Carpeta protegida",
"log_detail_title": "Detalle del registro",
"log_out": "Cerrar sesión",
"log_out_all_devices": "Cerrar sesión en todos los dispositivos",
"logged_in_as": "Sesión iniciada como {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Contraseña cambiado con éxito",
"logout_all_device_confirmation": "¿Estás seguro de que quieres cerrar sesión en todos los dispositivos?",
"logout_this_device_confirmation": "¿Estás seguro de que quieres cerrar sesión en este dispositivo?",
"logs": "Registros",
"longitude": "Longitud",
"look": "Mirar",
"loop_videos": "Vídeos en bucle",
@ -1301,6 +1321,7 @@
"mark_as_read": "Marcar como leído",
"marked_all_as_read": "Todos marcados como leídos",
"matches": "Coincidencias",
"matching_assets": "Elementos Coincidentes",
"media_type": "Tipo de medio",
"memories": "Recuerdos",
"memories_all_caught_up": "Puesto al día",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Nombre o apodo",
"network_requirement_photos_upload": "Usar datos móviles para crear una copia de seguridad de las fotos",
"network_requirement_videos_upload": "Usar datos móviles para crear una copia de seguridad de los videos",
"network_requirements": "Requisitos de red",
"network_requirements_updated": "Los requisitos de red han cambiado, reiniciando la cola de copias de seguridad",
"networking_settings": "Red",
"networking_subtitle": "Configuraciones de acceso por URL al servidor",
@ -1351,6 +1373,7 @@
"new_person": "Nueva persona",
"new_pin_code": "Nuevo PIN",
"new_pin_code_subtitle": "Esta es la primera vez que accedes a la carpeta protegida. Crea un código PIN seguro para acceder a esta página",
"new_timeline": "Nueva Línea de tiempo",
"new_user_created": "Nuevo usuario creado",
"new_version_available": "NUEVA VERSIÓN DISPONIBLE",
"newest_first": "El más reciente primero",
@ -1364,20 +1387,25 @@
"no_assets_message": "HAZ CLIC PARA SUBIR TU PRIMERA FOTO",
"no_assets_to_show": "No hay elementos a mostrar",
"no_cast_devices_found": "No se encontraron dispositivos de transmisión",
"no_checksum_local": "Suma de verificación no disponible. No se pueden obtener los elementos locales",
"no_checksum_remote": "Suma de verificación no disponible. No se puede obtener el elemento remoto",
"no_duplicates_found": "No se encontraron duplicados.",
"no_exif_info_available": "No hay información exif disponible",
"no_explore_results_message": "Sube más fotos para explorar tu colección.",
"no_favorites_message": "Agregue favoritos para encontrar rápidamente sus mejores fotos y videos",
"no_libraries_message": "Crea una biblioteca externa para ver tus fotos y vídeos",
"no_local_assets_found": "No se encontraron elementos locales con esta suma de comprobación",
"no_locked_photos_message": "Las fotos y los vídeos de la carpeta protegida se mantienen ocultos; no aparecerán cuando veas o busques elementos en tu biblioteca.",
"no_name": "Sin nombre",
"no_notifications": "Ninguna notificación",
"no_people_found": "No se encontraron personas coincidentes",
"no_places": "Sin lugares",
"no_remote_assets_found": "No se encontraron elementos remotos con esta suma de comprobación",
"no_results": "Sin resultados",
"no_results_description": "Pruebe con un sinónimo o una palabra clave más general",
"no_shared_albums_message": "Crea un álbum para compartir fotos y vídeos con personas de tu red",
"no_uploads_in_progress": "No hay cargas en progreso",
"not_available": "N/D",
"not_in_any_album": "Sin álbum",
"not_selected": "No seleccionado",
"note_apply_storage_label_to_previously_uploaded assets": "Nota: Para aplicar la etiqueta de almacenamiento a los archivos que ya se subieron, ejecute la",
@ -1499,6 +1527,7 @@
"port": "Puerto",
"preferences_settings_subtitle": "Configuraciones de la aplicación",
"preferences_settings_title": "Preferencias",
"preparing": "Preparando",
"preset": "Preestablecido",
"preview": "Posterior",
"previous": "Anterior",
@ -1564,6 +1593,7 @@
"read_changelog": "Leer registro de cambios",
"readonly_mode_disabled": "Modo Solo lectura deshabilitado",
"readonly_mode_enabled": "Modo Solo lectura habilitado",
"ready_for_upload": "Listo para subir",
"reassign": "Reasignar",
"reassigned_assets_to_existing_person": "Reasignado {count, plural, one {# elemento} other {# elementos}} a {name, select, null {una persona existente} other {{name}}}",
"reassigned_assets_to_new_person": "Reasignado {count, plural, one {# elemento} other {# elementos}} a un nuevo usuario",
@ -1588,6 +1618,7 @@
"regenerating_thumbnails": "Recargando miniaturas",
"remote": "Remoto",
"remote_assets": "Elementos remotos",
"remote_media_summary": "Resumen de Medios Remotos",
"remove": "Eliminar",
"remove_assets_album_confirmation": "¿Estás seguro que quieres eliminar {count, plural, one {# elemento} other {# elementos}} del álbum?",
"remove_assets_shared_link_confirmation": "¿Estás seguro que quieres eliminar {count, plural, one {# elemento} other {# elementos}} del enlace compartido?",
@ -1863,6 +1894,7 @@
"show_slideshow_transition": "Mostrar la transición de las diapositivas",
"show_supporter_badge": "Insignia de colaborador",
"show_supporter_badge_description": "Mostrar una insignia de colaborador",
"show_text_search_menu": "Mostrar el menú de búsqueda",
"shuffle": "Modo aleatorio",
"sidebar": "Barra lateral",
"sidebar_display_description": "Muestra un enlace a la vista en la barra lateral",
@ -1893,6 +1925,7 @@
"stacktrace": "Seguimiento de pila",
"start": "Inicio",
"start_date": "Fecha de inicio",
"start_date_before_end_date": "Fecha de inicio debe ser antes de fecha final",
"state": "Estado",
"status": "Estado",
"stop_casting": "Detener transmisión",
@ -2095,5 +2128,6 @@
"yes": "Sí",
"you_dont_have_any_shared_links": "No tienes ningún enlace compartido",
"your_wifi_name": "El nombre de tu Wi-Fi",
"zoom_image": "Acercar Imagen"
"zoom_image": "Acercar Imagen",
"zoom_to_bounds": "Ajustar a los límites"
}

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Luba logimine",
"logging_level_description": "Kui lubatud, millist logimistaset kasutada.",
"logging_settings": "Logimine",
"machine_learning_availability_checks": "Saadavuskontrollid",
"machine_learning_availability_checks_description": "Tuvasta ja eelista automaatselt saadavalolevaid masinõppeservereid",
"machine_learning_availability_checks_enabled": "Luba saadavuskontrollid",
"machine_learning_availability_checks_interval": "Kontrolli intervall",
"machine_learning_availability_checks_interval_description": "Saadavuskontrollide intervall millisekundites",
"machine_learning_availability_checks_timeout": "Päringu ajalõpp",
"machine_learning_availability_checks_timeout_description": "Saadavuskontrollide ajalõpp millisekundites",
"machine_learning_clip_model": "CLIP mudel",
"machine_learning_clip_model_description": "CLIP mudeli nimi, mis on loetletud <link>siin</link>. Pane tähele, et mudeli muutmisel pead kõigi piltide peal nutiotsingu tööte uuesti käivitama.",
"machine_learning_duplicate_detection": "Duplikaatide leidmine",
@ -387,8 +394,6 @@
"admin_password": "Administraatori parool",
"administration": "Administratsioon",
"advanced": "Täpsemad valikud",
"advanced_settings_beta_timeline_subtitle": "Koge uut rakendust",
"advanced_settings_beta_timeline_title": "Beeta ajajoon",
"advanced_settings_enable_alternate_media_filter_subtitle": "Kasuta seda valikut, et filtreerida sünkroonimise ajal üksuseid alternatiivsete kriteeriumite alusel. Proovi seda ainult siis, kui rakendusel on probleeme kõigi albumite tuvastamisega.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTAALNE] Kasuta alternatiivset seadme albumi sünkroonimise filtrit",
"advanced_settings_log_level_title": "Logimistase: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "Kas oled kindel, et soovid kasutaja {user} eemaldada?",
"album_search_not_found": "Otsingule vastavaid albumeid ei leitud",
"album_share_no_users": "Paistab, et oled seda albumit kõikide kasutajatega jaganud, või pole ühtegi kasutajat, kellega jagada.",
"album_summary": "Albumi kokkuvõte",
"album_updated": "Album muudetud",
"album_updated_setting_description": "Saa teavitus e-posti teel, kui jagatud albumis on uusi üksuseid",
"album_user_left": "Lahkutud albumist {album}",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Üksus edukalt taastatud",
"asset_skipped": "Vahele jäetud",
"asset_skipped_in_trash": "Prügikastis",
"asset_trashed": "Üksus liigutatud prügikasti",
"asset_troubleshoot": "Üksuse tõrkeotsing",
"asset_uploaded": "Üleslaaditud",
"asset_uploading": "Üleslaadimine…",
"asset_viewer_settings_subtitle": "Halda galeriivaaturi seadeid",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Esita slaidiesitlus automaatselt",
"back": "Tagasi",
"back_close_deselect": "Tagasi, sulge või tühista valik",
"background_backup_running_error": "Taustvarundus on käimas, ei saa käsitsi varundust alustada",
"background_location_permission": "Taustal asukoha luba",
"background_location_permission_content": "Et taustal töötades võrguühendust vahetada, peab Immich'il *alati* olema täpse asukoha luba, et rakendus saaks WiFi-võrgu nime lugeda",
"background_options": "Taustavalikud",
"backup": "Varundamine",
"backup_album_selection_page_albums_device": "Albumid seadmel ({count})",
"backup_album_selection_page_albums_tap": "Puuduta kaasamiseks, topeltpuuduta välistamiseks",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Vali albumid",
"backup_album_selection_page_selection_info": "Valiku info",
"backup_album_selection_page_total_assets": "Unikaalseid üksuseid kokku",
"backup_albums_sync": "Varundusalbumite sünkroniseerimine",
"backup_all": "Kõik",
"backup_background_service_backup_failed_message": "Üksuste varundamine ebaõnnestus. Uuesti proovimine…",
"backup_background_service_connection_failed_message": "Serveriga ühendumine ebaõnnestus. Uuesti proovimine…",
@ -654,6 +665,8 @@
"change_pin_code": "Muuda PIN-koodi",
"change_your_password": "Muuda oma parooli",
"changed_visibility_successfully": "Nähtavus muudetud",
"charging": "Laadimine",
"charging_requirement_mobile_backup": "Taustal varundus vajab, et seade oleks laadimas",
"check_corrupt_asset_backup": "Otsi riknenud üksuste varukoopiaid",
"check_corrupt_asset_backup_button": "Teosta kontroll",
"check_corrupt_asset_backup_description": "Käivita see kontroll ainult WiFi-võrgus ja siis, kui kõik üksused on varundatud. See protseduur võib kesta mõne minuti.",
@ -740,6 +753,7 @@
"create_user": "Lisa kasutaja",
"created": "Lisatud",
"created_at": "Lisatud",
"creating_linked_albums": "Lingitud albumite loomine...",
"crop": "Kärpimine",
"curated_object_page_title": "Asjad",
"current_device": "Praegune seade",
@ -832,11 +846,11 @@
"download_settings_description": "Halda üksuste allalaadimise seadeid",
"download_started": "Allalaadimine alustatud",
"download_sucess": "Allalaadimine õnnestus",
"download_sucess_android": "Meediumid laaditi alla kataloogi DCIM/Immich",
"download_sucess_android": "Üksused laaditi alla kataloogi DCIM/Immich",
"download_waiting_to_retry": "Uuesti proovimise ootel",
"downloading": "Allalaadimine",
"downloading_asset_filename": "Üksuse {filename} allalaadimine",
"downloading_media": "Meediumi allalaadimine",
"downloading_media": "Üksuste allalaadimine",
"drop_files_to_upload": "Failide üleslaadimiseks sikuta need ükskõik kuhu",
"duplicates": "Duplikaadid",
"duplicates_description": "Lahenda iga grupp, valides duplikaadid, kui neid on",
@ -889,7 +903,9 @@
"error": "Viga",
"error_change_sort_album": "Albumi sorteerimisjärjestuse muutmine ebaõnnestus",
"error_delete_face": "Viga näo kustutamisel",
"error_getting_places": "Viga kohtade pärimisel",
"error_loading_image": "Viga pildi laadimisel",
"error_loading_partners": "Viga partnerite laadimisel: {error}",
"error_saving_image": "Viga: {error}",
"error_tag_face_bounding_box": "Viga näo sildistamisel - ümbritseva kasti koordinaate ei õnnestunud leida",
"error_title": "Viga - midagi läks valesti",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "Lemmikuid üksuseid ei leitud",
"feature_photo_updated": "Esiletõstetud foto muudetud",
"features": "Funktsioonid",
"features_in_development": "Arendusjärgus olevad funktsioonid",
"features_setting_description": "Halda rakenduse funktsioone",
"file_name": "Failinimi",
"file_name_or_extension": "Failinimi või -laiend",
@ -1218,6 +1235,7 @@
"local": "Lokaalsed",
"local_asset_cast_failed": "Ei saa edastada üksust, mis pole serverisse üles laaditud",
"local_assets": "Lokaalsed üksused",
"local_media_summary": "Lokaalsete üksuste kokkuvõte",
"local_network": "Kohalik võrk",
"local_network_sheet_info": "Rakendus ühendub valitud Wi-Fi võrgus olles serveriga selle URL-i kaudu",
"location_permission": "Asukoha luba",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Sisesta pikkuskraad siia",
"lock": "Lukusta",
"locked_folder": "Lukustatud kaust",
"log_detail_title": "Logi detailid",
"log_out": "Logi välja",
"log_out_all_devices": "Logi kõigist seadmetest välja",
"logged_in_as": "Logitud sisse kasutajana {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Parool edukalt uuendatud",
"logout_all_device_confirmation": "Kas oled kindel, et soovid kõigist seadmetest välja logida?",
"logout_this_device_confirmation": "Kas oled kindel, et soovid sellest seadmest välja logida?",
"logs": "Logid",
"longitude": "Pikkuskraad",
"look": "Välimus",
"loop_videos": "Taasesita videod",
@ -1301,6 +1321,7 @@
"mark_as_read": "Märgi loetuks",
"marked_all_as_read": "Kõik märgiti loetuks",
"matches": "Ühtivad failid",
"matching_assets": "Ühtivad üksused",
"media_type": "Meediumi tüüp",
"memories": "Mälestused",
"memories_all_caught_up": "Ongi kõik",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Nimi või hüüdnimi",
"network_requirement_photos_upload": "Kasuta fotode varundamiseks mobiilset andmesidet",
"network_requirement_videos_upload": "Kasuta videote varundamiseks mobiilset andmesidet",
"network_requirements": "Võrgu nõuded",
"network_requirements_updated": "Võrgu nõuded muutusid, varundamise järjekord lähtestatakse",
"networking_settings": "Võrguühendus",
"networking_subtitle": "Halda serveri lõpp-punkti seadeid",
@ -1351,6 +1373,7 @@
"new_person": "Uus isik",
"new_pin_code": "Uus PIN-kood",
"new_pin_code_subtitle": "See on sul esimene kord lukustatud kausta kasutada. Turvaliseks ligipääsuks loo PIN-kood",
"new_timeline": "Uus ajajoon",
"new_user_created": "Uus kasutaja lisatud",
"new_version_available": "UUS VERSIOON SAADAVAL",
"newest_first": "Uuemad eespool",
@ -1364,16 +1387,20 @@
"no_assets_message": "KLIKI ESIMESE FOTO ÜLESLAADIMISEKS",
"no_assets_to_show": "Pole üksuseid, mida kuvada",
"no_cast_devices_found": "Edastamise seadmeid ei leitud",
"no_checksum_local": "Kontrollsumma pole saadaval - lokaalse üksuse pärimine ebaõnnestus",
"no_checksum_remote": "Kontrollsumma pole saadaval - kaugüksuse pärimine ebaõnnestus",
"no_duplicates_found": "Ühtegi duplikaati ei leitud.",
"no_exif_info_available": "Exif info pole saadaval",
"no_explore_results_message": "Oma kogu avastamiseks laadi üles rohkem fotosid.",
"no_favorites_message": "Lisa lemmikud, et oma parimaid fotosid ja videosid kiiresti leida",
"no_libraries_message": "Lisa väline kogu oma fotode ja videote vaatamiseks",
"no_local_assets_found": "Selle kontrollsummaga lokaalseid üksuseid ei leitud",
"no_locked_photos_message": "Lukustatud kaustas olevad fotod ja videod on peidetud ning need pole kogu sirvimisel ja otsimisel nähtavad.",
"no_name": "Nimetu",
"no_notifications": "Teavitusi pole",
"no_people_found": "Kattuvaid isikuid ei leitud",
"no_places": "Kohti ei ole",
"no_remote_assets_found": "Selle kontrollsummaga kaugüksuseid ei leitud",
"no_results": "Vasteid pole",
"no_results_description": "Proovi sünonüümi või üldisemat märksõna",
"no_shared_albums_message": "Lisa album, et fotosid ja videosid teistega jagada",
@ -1587,6 +1614,7 @@
"regenerating_thumbnails": "Pisipiltide uuesti genereerimine",
"remote": "Serveris",
"remote_assets": "Kaugüksused",
"remote_media_summary": "Kaugüksuste kokkuvõte",
"remove": "Eemalda",
"remove_assets_album_confirmation": "Kas oled kindel, et soovid {count, plural, one {# üksuse} other {# üksust}} albumist eemaldada?",
"remove_assets_shared_link_confirmation": "Kas oled kindel, et soovid eemaldada {count, plural, one {# üksuse} other {# üksust}} sellelt jagatud lingilt?",
@ -1862,6 +1890,7 @@
"show_slideshow_transition": "Kuva slaidiesitluse üleminekud",
"show_supporter_badge": "Toetaja märk",
"show_supporter_badge_description": "Kuva toetaja märki",
"show_text_search_menu": "Kuva tekstiotsingu menüüd",
"shuffle": "Juhuslik",
"sidebar": "Külgmenüü",
"sidebar_display_description": "Kuva külgmenüüs linki vaatele",
@ -1892,6 +1921,7 @@
"stacktrace": "Pinujälg",
"start": "Alusta",
"start_date": "Alguskuupäev",
"start_date_before_end_date": "Alguskuupäev peab olema varasem kui lõppkuupäev",
"state": "Osariik",
"status": "Staatus",
"stop_casting": "Lõpeta edastamine",
@ -2027,7 +2057,7 @@
"upload_success": "Üleslaadimine õnnestus, uute üksuste nägemiseks värskenda lehte.",
"upload_to_immich": "Laadi Immich'isse ({count})",
"uploading": "Üleslaadimine",
"uploading_media": "Meediumi üleslaadimine",
"uploading_media": "Üksuste üleslaadimine",
"url": "URL",
"usage": "Kasutus",
"use_biometric": "Kasuta biomeetriat",
@ -2094,5 +2124,6 @@
"yes": "Jah",
"you_dont_have_any_shared_links": "Sul pole ühtegi jagatud linki",
"your_wifi_name": "Sinu WiFi-võrgu nimi",
"zoom_image": "Suumi pilti"
"zoom_image": "Suumi pilti",
"zoom_to_bounds": "Suumi piiridesse"
}

View File

@ -387,8 +387,6 @@
"admin_password": "Ylläpitäjän salasana",
"administration": "Ylläpito",
"advanced": "Edistyneet",
"advanced_settings_beta_timeline_subtitle": "Kokeile uutta sovelluskokemusta",
"advanced_settings_beta_timeline_title": "Beta-aikajana",
"advanced_settings_enable_alternate_media_filter_subtitle": "Käytä tätä vaihtoehtoa suodattaaksesi mediaa synkronoinnin aikana vaihtoehtoisten kriteerien perusteella. Kokeile tätä vain, jos sovelluksessa on ongelmia kaikkien albumien tunnistamisessa.",
"advanced_settings_enable_alternate_media_filter_title": "[KOKEELLINEN] Käytä vaihtoehtoisen laitteen albumin synkronointisuodatinta",
"advanced_settings_log_level_title": "Kirjaustaso: {level}",

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Activer la journalisation",
"logging_level_description": "Niveau de journalisation lorsque cette option est activée.",
"logging_settings": "Journalisation",
"machine_learning_availability_checks": "Vérifications de disponibilité",
"machine_learning_availability_checks_description": "Détecte automatiquement et choisit les serveurs d'apprentissage machine disponibles",
"machine_learning_availability_checks_enabled": "Activer les vérifications de disponibilité",
"machine_learning_availability_checks_interval": "Intervalle de vérification",
"machine_learning_availability_checks_interval_description": "Intervalle en millisecondes entre les vérifications de disponibilité",
"machine_learning_availability_checks_timeout": "Délai d'expiration de la requête",
"machine_learning_availability_checks_timeout_description": "Délai d'expiration en millisecondes pour les vérifications de disponibilité",
"machine_learning_clip_model": "Modèle de langage CLIP",
"machine_learning_clip_model_description": "Le nom d'un modèle CLIP listé <link>ici</link>. Notez que vous devez réexécuter la tâche 'Recherche intelligente' pour toutes les images après avoir changé de modèle.",
"machine_learning_duplicate_detection": "Détection des doublons",
@ -387,8 +394,6 @@
"admin_password": "Mot de passe Admin",
"administration": "Administration",
"advanced": "Avancé",
"advanced_settings_beta_timeline_subtitle": "Essayer la nouvelle application",
"advanced_settings_beta_timeline_title": "Timeline de la béta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Utilisez cette option pour filtrer les média durant la synchronisation avec des critères alternatifs. N'utilisez cela que lorsque l'application n'arrive pas à détecter tous les albums.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPÉRIMENTAL] Utiliser le filtre de synchronisation d'album alternatif",
"advanced_settings_log_level_title": "Niveau de journalisation : {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "Êtes-vous sûr de vouloir supprimer {user}?",
"album_search_not_found": "Aucun album trouvé ne correspond à votre recherche",
"album_share_no_users": "Il semble que vous ayez partagé cet album avec tous les utilisateurs ou que vous n'ayez aucun utilisateur avec lequel le partager.",
"album_summary": "Résumé de l'album",
"album_updated": "Album mis à jour",
"album_updated_setting_description": "Recevoir une notification par courriel lorsqu'un album partagé a de nouveaux médias",
"album_user_left": "{album} quitté",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Élément restauré avec succès",
"asset_skipped": "Sauté",
"asset_skipped_in_trash": "À la corbeille",
"asset_trashed": "Média mis à la corbeille",
"asset_troubleshoot": "Dépannage de média",
"asset_uploaded": "Envoyé",
"asset_uploading": "Envoi…",
"asset_viewer_settings_subtitle": "Modifier les paramètres du visualiseur photos",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Lecture automatique d'un diaporama",
"back": "Retour",
"back_close_deselect": "Retournez en arrière, fermez ou désélectionnez",
"background_backup_running_error": "La sauvegarde en tâche de fond est actuellement en cours, impossible de démarrer une sauvegarde manuelle",
"background_location_permission": "Permission de localisation en arrière plan",
"background_location_permission_content": "Afin de pouvoir changer d'adresse en arrière plan, Immich doit avoir *en permanence* accès à la localisation précise, afin d'accéder au le nom du réseau Wi-Fi utilisé",
"background_options": "Options d'arrière-plan",
"backup": "Sauvegarde",
"backup_album_selection_page_albums_device": "Albums sur l'appareil ({count})",
"backup_album_selection_page_albums_tap": "Tapez pour inclure, tapez deux fois pour exclure",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Sélectionner les albums",
"backup_album_selection_page_selection_info": "Informations sur la sélection",
"backup_album_selection_page_total_assets": "Total des éléments uniques",
"backup_albums_sync": "Sauvegarde de la synchronisation des albums",
"backup_all": "Tout",
"backup_background_service_backup_failed_message": "Échec de la sauvegarde des médias. Nouvelle tentative…",
"backup_background_service_connection_failed_message": "Impossible de se connecter au serveur. Nouvelle tentative…",
@ -654,6 +665,8 @@
"change_pin_code": "Changer le code PIN",
"change_your_password": "Changer votre mot de passe",
"changed_visibility_successfully": "Visibilité modifiée avec succès",
"charging": "En charge",
"charging_requirement_mobile_backup": "La sauvegarde en tâche de fond nécessite que l'appareil soit en charge",
"check_corrupt_asset_backup": "Vérifier la corruption des éléments enregistrés",
"check_corrupt_asset_backup_button": "Vérifier",
"check_corrupt_asset_backup_description": "Lancer cette vérification uniquement lorsque connecté à un réseau Wi-Fi et que tout le contenu a été enregistré. Cette procédure peut durer plusieurs minutes.",
@ -740,6 +753,7 @@
"create_user": "Créer un utilisateur",
"created": "Créé",
"created_at": "Créé à",
"creating_linked_albums": "Création des albums liés...",
"crop": "Recadrer",
"curated_object_page_title": "Objets",
"current_device": "Appareil actuel",
@ -889,7 +903,9 @@
"error": "Erreur",
"error_change_sort_album": "Impossible de modifier l'ordre de tri des albums",
"error_delete_face": "Erreur lors de la suppression du visage pour le média",
"error_getting_places": "Erreur à la récupération des lieux",
"error_loading_image": "Erreur de chargement de l'image",
"error_loading_partners": "Erreur de récupération des partenaires : {error}",
"error_saving_image": "Erreur : {error}",
"error_tag_face_bounding_box": "Erreur lors de l'identification de visage - impossible de récupérer les coordonnées du cadre entourant le visage",
"error_title": "Erreur - Quelque chose s'est mal passé",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "Aucun élément favori n'a été trouvé",
"feature_photo_updated": "Photo de la personne mise à jour",
"features": "Fonctionnalités",
"features_in_development": "Fonctionnalités en développement",
"features_setting_description": "Gérer les fonctionnalités de l'application",
"file_name": "Nom du fichier",
"file_name_or_extension": "Nom du fichier ou extension",
@ -1218,6 +1235,7 @@
"local": "Local",
"local_asset_cast_failed": "Impossible de caster un média qui n'a pas envoyé vers le serveur",
"local_assets": "Média locaux",
"local_media_summary": "Résumé du média local",
"local_network": "Réseau local",
"local_network_sheet_info": "L'application va se connecter au serveur via cette URL quand l'appareil est connecté à ce réseau Wi-Fi",
"location_permission": "Autorisation de localisation",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Saisir la longitude ici",
"lock": "Verrouiller",
"locked_folder": "Dossier verrouillé",
"log_detail_title": "Niveau de journalisation",
"log_out": "Se déconnecter",
"log_out_all_devices": "Déconnecter tous les appareils",
"logged_in_as": "Connecté en tant que {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Mot de passe mis à jour avec succès",
"logout_all_device_confirmation": "Êtes-vous sûr de vouloir déconnecter tous les appareils?",
"logout_this_device_confirmation": "Êtes-vous sûr de vouloir déconnecter cet appareil?",
"logs": "Journaux",
"longitude": "Longitude",
"look": "Regarder",
"loop_videos": "Vidéos en boucle",
@ -1301,6 +1321,7 @@
"mark_as_read": "Marquer comme lu",
"marked_all_as_read": "Tout a été marqué comme lu",
"matches": "Correspondances",
"matching_assets": "Médias correspondants",
"media_type": "Type de média",
"memories": "Souvenirs",
"memories_all_caught_up": "Vous avez tout vu",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Nom ou surnom",
"network_requirement_photos_upload": "Utiliser les données mobile pour sauvegarder les photos",
"network_requirement_videos_upload": "Utiliser les données mobile pour sauvegarder les vidéos",
"network_requirements": "Prérequis réseau",
"network_requirements_updated": "Contraintes réseau modifiées, file d'attente de sauvegarde réinitialisée",
"networking_settings": "Réseau",
"networking_subtitle": "Gérer les adresses du serveur",
@ -1351,6 +1373,7 @@
"new_person": "Nouvelle personne",
"new_pin_code": "Nouveau code PIN",
"new_pin_code_subtitle": "C'est votre premier accès au dossier verrouillé. Créez un code PIN pour sécuriser l'accès à cette page",
"new_timeline": "Nouvelle vue chronologique",
"new_user_created": "Nouvel utilisateur créé",
"new_version_available": "NOUVELLE VERSION DISPONIBLE",
"newest_first": "Récents en premier",
@ -1364,20 +1387,25 @@
"no_assets_message": "CLIQUEZ POUR ENVOYER VOTRE PREMIÈRE PHOTO",
"no_assets_to_show": "Aucun élément à afficher",
"no_cast_devices_found": "Aucun appareil de diffusion trouvé",
"no_checksum_local": "Aucune empreinte numerique disponible - impossible de récupérer les médias locaux",
"no_checksum_remote": "Aucune empreinte numérique disponible - impossible de récupérer les médias distants",
"no_duplicates_found": "Aucun doublon n'a été trouvé.",
"no_exif_info_available": "Aucune information exif disponible",
"no_explore_results_message": "Envoyez plus de photos pour explorer votre bibliothèque.",
"no_favorites_message": "Ajouter des photos et vidéos à vos favoris pour les retrouver plus rapidement",
"no_libraries_message": "Créer une bibliothèque externe pour voir vos photos et vidéos dans un autre espace de stockage",
"no_local_assets_found": "Aucun média local trouvé avec cette empreinte numerique",
"no_locked_photos_message": "Les photos et vidéos du dossier verrouillé sont masqués et ne s'afficheront pas dans votre galerie ou la recherche.",
"no_name": "Pas de nom",
"no_notifications": "Pas de notification",
"no_people_found": "Aucune personne correspondante trouvée",
"no_places": "Pas de lieu",
"no_remote_assets_found": "Aucun média distant trouvé avec cette empreinte numerique",
"no_results": "Aucun résultat",
"no_results_description": "Essayez un synonyme ou un mot-clé plus général",
"no_shared_albums_message": "Créer un album pour partager vos photos et vidéos avec les personnes de votre réseau",
"no_uploads_in_progress": "Pas d'envoi en cours",
"not_available": "N/A",
"not_in_any_album": "Dans aucun album",
"not_selected": "Non sélectionné",
"note_apply_storage_label_to_previously_uploaded assets": "Note : Pour appliquer l'étiquette de stockage aux médias précédemment envoyés, exécutez",
@ -1499,6 +1527,7 @@
"port": "Port",
"preferences_settings_subtitle": "Gérer les préférences de l'application",
"preferences_settings_title": "Préférences",
"preparing": "Préparation",
"preset": "Préréglage",
"preview": "Aperçu",
"previous": "Précédent",
@ -1564,6 +1593,7 @@
"read_changelog": "Lire les changements",
"readonly_mode_disabled": "Mode lecture seule désactivé",
"readonly_mode_enabled": "Mode lecture seule activé",
"ready_for_upload": "Téléchargement prêt",
"reassign": "Réattribuer",
"reassigned_assets_to_existing_person": "{count, plural, one {# média réattribué} other {# médias réattribués}} à {name, select, null {une personne existante} other {{name}}}",
"reassigned_assets_to_new_person": "{count, plural, one {# média réattribué} other {# médias réattribués}} à une nouvelle personne",
@ -1588,6 +1618,7 @@
"regenerating_thumbnails": "Regénération des miniatures",
"remote": "À distance",
"remote_assets": "Média à distance",
"remote_media_summary": "Résumé du média distant",
"remove": "Supprimer",
"remove_assets_album_confirmation": "Êtes-vous sûr de vouloir supprimer {count, plural, one {# média} other {# médias}} de l'album?",
"remove_assets_shared_link_confirmation": "Êtes-vous sûr de vouloir supprimer {count, plural, one {# média} other {# médias}} de ce lien partagé?",
@ -1863,6 +1894,7 @@
"show_slideshow_transition": "Afficher la transition du diaporama",
"show_supporter_badge": "Badge de contributeur",
"show_supporter_badge_description": "Afficher le badge de contributeur",
"show_text_search_menu": "Afficher le menu de recherche de texte",
"shuffle": "Mélanger",
"sidebar": "Barre latérale",
"sidebar_display_description": "Afficher un lien vers la vue dans la barre latérale",
@ -1893,6 +1925,7 @@
"stacktrace": "Trace de la pile",
"start": "Commencer",
"start_date": "Date de début",
"start_date_before_end_date": "La date de début doit être avant la date de fin",
"state": "Région",
"status": "Statut",
"stop_casting": "Arrêter la diffusion",
@ -2095,5 +2128,6 @@
"yes": "Oui",
"you_dont_have_any_shared_links": "Vous n'avez aucun lien partagé",
"your_wifi_name": "Nom du réseau wifi",
"zoom_image": "Zoomer"
"zoom_image": "Zoomer",
"zoom_to_bounds": "Zoom sur la zone"
}

View File

@ -45,11 +45,18 @@
"authentication_settings_disable_all": "Estás seguro de que queres desactivar todos os métodos de inicio de sesión? O inicio de sesión desactivarase completamente.",
"authentication_settings_reenable": "Para reactivalo, use un <link>Comando de servidor</link>.",
"background_task_job": "Tarefas en segundo plano",
"backup_database": "Copia de seguridade da base de datos",
"backup_database_enable_description": "Activar copias de seguridade da base de datos",
"backup_database": "Crear un vertedoiro de base de datos",
"backup_database_enable_description": "Activar o vertedoiro de copias de seguridade da base de datos",
"backup_keep_last_amount": "Cantidade de copias de seguridade anteriores a conservar",
"backup_onboarding_1_description": "Copia no exterior na nube ou noutra localización física.",
"backup_onboarding_2_description": "Copias locais en diferentes dispositivos. Isto inclue os arquivos principais e as copias de esos arquivos localmente.",
"backup_onboarding_3_description": "copias totais da tua información, incluindo os arquivos orixinais. Isto inclue 1 copia externa e 2 copias locais.",
"backup_onboarding_description": "Unha <backblaze-link>estratexia de copia 3-2-1</backblaze-link> é recomendada para protexer os teus datos. Deberías gardar copias das túas fotos/videos subidas así como da base de datos de Immich como unha solución de seguridade.",
"backup_onboarding_footer": "Pra máis información sobre copias de seguridade de Immich, por favor use a seguinte ligazón <link> de documentación</link>.",
"backup_onboarding_parts_title": "Unha copia de seguridade 3-2-1 inclue:",
"backup_onboarding_title": "Copia de seguridade",
"backup_settings": "Configuración da copia de seguridade",
"backup_settings_description": "Xestionar a configuración da copia de seguridade da base de datos",
"backup_settings_description": "Xestionar a configuración do volcado da base de datos",
"cleared_jobs": "Traballos borrados para: {job}",
"config_set_by_file": "A configuración establécese actualmente mediante un ficheiro de configuración",
"confirm_delete_library": "Estás seguro de que queres eliminar a biblioteca {library}?",
@ -116,6 +123,13 @@
"logging_enable_description": "Activar rexistro",
"logging_level_description": "Cando estea activado, que nivel de rexistro usar.",
"logging_settings": "Rexistro",
"machine_learning_availability_checks": "Comprobacións de dispoñibilidade",
"machine_learning_availability_checks_description": "Detectar automáticamente e preferir servidores de aprendizaxe profunda dispoñibles",
"machine_learning_availability_checks_enabled": "Activar comprobacións de dispoñibilidade",
"machine_learning_availability_checks_interval": "Intervalo de comprobación",
"machine_learning_availability_checks_interval_description": "Intervalo en milisegundos entre comprobacións de dispoñibilidade",
"machine_learning_availability_checks_timeout": "Tempo de espera da solicitude",
"machine_learning_availability_checks_timeout_description": "Tempo de espera en milisegundos para as comprobación de dispoñibilidade",
"machine_learning_clip_model": "Modelo CLIP",
"machine_learning_clip_model_description": "O nome dun modelo CLIP listado <link>aquí</link>. Ten en conta que debe volver executar o traballo 'Busca Intelixente' para todas as imaxes ao cambiar un modelo.",
"machine_learning_duplicate_detection": "Detección de duplicados",
@ -170,6 +184,19 @@
"metadata_settings_description": "Xestionar a configuración de metadatos",
"migration_job": "Migración",
"migration_job_description": "Migrar miniaturas de activos e caras á última estrutura de cartafoles",
"nightly_tasks_cluster_faces_setting_description": "Executar recoñecemento facial nas novas caras detectadas",
"nightly_tasks_cluster_new_faces_setting": "Agrupar novas caras",
"nightly_tasks_database_cleanup_setting": "Tarefas de limpeza da base de datos",
"nightly_tasks_database_cleanup_setting_description": "Limpar información vella e obsoleta da base de datos",
"nightly_tasks_generate_memories_setting": "Xerar memorias",
"nightly_tasks_generate_memories_setting_description": "Crear novas memorias dende os recursos",
"nightly_tasks_missing_thumbnails_setting": "Xerar as miniaturas que faltan",
"nightly_tasks_missing_thumbnails_setting_description": "Encolar arquivos sin miniaturas para a xeración das miniaturas",
"nightly_tasks_settings": "Configuración das tarefas nocturnas",
"nightly_tasks_settings_description": "Administrar as tarefas nocturnas",
"nightly_tasks_start_time_setting": "Tempo de inicio",
"nightly_tasks_start_time_setting_description": "O tempo no que o servidor comeza a executar as tarefas nocturnas",
"nightly_tasks_sync_quota_usage_setting": "Sincronizar uso de cuota",
"no_paths_added": "Non se engadiron rutas",
"no_pattern_added": "Non se engadiu ningún padrón",
"note_apply_storage_label_previous_assets": "Nota: Para aplicar a Etiqueta de Almacenamento a activos cargados previamente, execute o",

View File

@ -123,6 +123,9 @@
"logging_enable_description": "אפשר רישום ביומן",
"logging_level_description": "כאשר פועל, באיזה רמת יומן לתעד.",
"logging_settings": "רישום ביומן",
"machine_learning_availability_checks": "בדיקת זמינות",
"machine_learning_availability_checks_enabled": "הפעלת בדיקות זמינות",
"machine_learning_availability_checks_interval": "תזמון בדיקה",
"machine_learning_clip_model": "מודל CLIP",
"machine_learning_clip_model_description": "שמו של מודל CLIP רשום <link>כאן</link>. שים לב שעליך להפעיל מחדש את המשימה 'חיפוש חכם' עבור כל התמונות בעת שינוי מודל.",
"machine_learning_duplicate_detection": "איתור כפילויות",
@ -387,8 +390,6 @@
"admin_password": "סיסמת מנהל",
"administration": "ניהול",
"advanced": "מתקדם",
"advanced_settings_beta_timeline_subtitle": "נסה את חווית האפליקציה החדשה",
"advanced_settings_beta_timeline_title": "ציר זמן (בטא)",
"advanced_settings_enable_alternate_media_filter_subtitle": "השתמש באפשרות זו כדי לסנן מדיה במהלך הסנכרון לפי קריטריונים חלופיים. מומלץ להשתמש בזה רק אם יש בעיה בזיהוי כל האלבומים באפליקציה.",
"advanced_settings_enable_alternate_media_filter_title": "[ניסיוני] השתמש במסנן סנכרון אלבום חלופי שמבכשיר",
"advanced_settings_log_level_title": "רמת רישום ביומן: {level}",
@ -425,6 +426,7 @@
"album_remove_user_confirmation": "האם באמת ברצונך להסיר את {user}?",
"album_search_not_found": "לא נמצאו אלבומים התואמים לחיפוש שלך",
"album_share_no_users": "נראה ששיתפת את האלבום הזה עם כל המשתמשים או שאין לך אף משתמש לשתף איתו.",
"album_summary": "תקציר אלבום",
"album_updated": "אלבום עודכן",
"album_updated_setting_description": "קבל הודעת דוא\"ל כאשר לאלבום משותף יש תמונות חדשות",
"album_user_left": "עזב את {album}",
@ -1564,10 +1566,11 @@
"read_changelog": "קרא את יומן השינויים",
"readonly_mode_disabled": "מצב לקריאה בלבד מושבת",
"readonly_mode_enabled": "מצב לקריאה בלבד מופעל",
"reassign": "הקצה מחדש",
"ready_for_upload": "מוכן להעלאה",
"reassign": "הקצאה מחדש",
"reassigned_assets_to_existing_person": "{count, plural, one {תמונה # הוקצתה} other {# תמונות הוקצו}} מחדש אל {name, select, null {אדם קיים} other {{name}}}",
"reassigned_assets_to_new_person": "{count, plural, one {תמונה # הוקצתה} other {# תמונות הוקצו}} מחדש לאדם חדש",
"reassing_hint": "הקצה תמונות שנבחרו לאדם קיים",
"reassing_hint": "הקצאת תמונות שנבחרו לאדם קיים",
"recent": "חדש",
"recent-albums": "אלבומים אחרונים",
"recent_searches": "חיפושים אחרונים",
@ -1575,11 +1578,11 @@
"recently_added_page_title": "נוסף לאחרונה",
"recently_taken": "צולם לאחרונה",
"recently_taken_page_title": "צולם לאחרונה",
"refresh": "רענן",
"refresh_encoded_videos": "רענן סרטונים מקודדים",
"refresh_faces": "רענן פנים",
"refresh_metadata": "רענן מטא-נתונים",
"refresh_thumbnails": "רענן תמונות ממוזערות",
"refresh": "רענון",
"refresh_encoded_videos": "רענון סרטונים מקודדים",
"refresh_faces": "רענון פנים",
"refresh_metadata": "רענון מטא-נתונים",
"refresh_thumbnails": "רענון תמונות ממוזערות",
"refreshed": "רוענן",
"refreshes_every_file": "קורא מחדש את כל הקבצים הקיימים והחדשים",
"refreshing_encoded_video": "מרענן סרטון מקודד",
@ -1588,15 +1591,16 @@
"regenerating_thumbnails": "מחדש תמונות ממוזערות",
"remote": "מרוחק",
"remote_assets": "תמונות מרוחקות",
"remove": "הסר",
"remote_media_summary": "תקציר תמונות מרוחקות",
"remove": "הסרה",
"remove_assets_album_confirmation": "האם באמת ברצונך להסיר {count, plural, one {תמונה #} other {# תמונות}} מהאלבום?",
"remove_assets_shared_link_confirmation": "האם אתה בטוח שברצונך להסיר {count, plural, one {תמונה #} other {# תמונות}} מהקישור המשותף הזה?",
"remove_assets_shared_link_confirmation": "האם ברצונך להסיר {count, plural, one {תמונה #} other {# תמונות}} מהקישור המשותף הזה?",
"remove_assets_title": "להסיר תמונות?",
"remove_custom_date_range": "הסר טווח תאריכים מותאם",
"remove_deleted_assets": "הסר קבצים לא מקוונים",
"remove_from_album": "הסר מאלבום",
"remove_custom_date_range": "הסרת טווח תאריכים מותאם",
"remove_deleted_assets": "הסרת קבצים לא מקוונים",
"remove_from_album": "הסרה מאלבום",
"remove_from_album_action_prompt": "{count} הוסרו מהאלבום",
"remove_from_favorites": "הסר מהמועדפים",
"remove_from_favorites": "הסרה מהמועדפים",
"remove_from_lock_folder_action_prompt": "{count} הוסרו מהתיקייה הנעולה",
"remove_from_locked_folder": "הסר מהתיקייה הנעולה",
"remove_from_locked_folder_confirmation": "האם אתה בטוח שברצונך להעביר את התמונות והסרטונים האלה מחוץ לתיקייה הנעולה? הם יהיו מוצגים בספרייה שלך.",

View File

@ -381,8 +381,6 @@
"admin_password": "व्यवस्थापक पासवर्ड",
"administration": "प्रशासन",
"advanced": "विकसित",
"advanced_settings_beta_timeline_subtitle": "नए ऐप अनुभव को आज़माएँ",
"advanced_settings_beta_timeline_title": "बीटा टाइमलाइन",
"advanced_settings_enable_alternate_media_filter_subtitle": "सिंक के दौरान वैकल्पिक मानदंडों के आधार पर मीडिया को फ़िल्टर करने के लिए इस विकल्प का उपयोग करें। इसे केवल तभी आज़माएँ जब आपको ऐप द्वारा सभी एल्बमों का पता लगाने में समस्या हो।",
"advanced_settings_enable_alternate_media_filter_title": "[प्रयोगात्मक] वैकल्पिक डिवाइस एल्बम सिंक फ़िल्टर का उपयोग करें",
"advanced_settings_log_level_title": "लॉग स्तर:{level}",

View File

@ -387,8 +387,6 @@
"admin_password": "Admin lozinka",
"administration": "Administracija",
"advanced": "Napredno",
"advanced_settings_beta_timeline_subtitle": "Isprobaj novo iskustvo aplikacije",
"advanced_settings_beta_timeline_title": "Beta vremenska crta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Koristite ovu opciju za filtriranje medija tijekom sinkronizacije na temelju alternativnih kriterija. Pokušajte ovo samo ako imate problema s aplikacijom koja ne prepoznaje sve albume.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTALNO] Koristite alternativni filter za sinkronizaciju albuma na uređaju",
"advanced_settings_log_level_title": "Razina zapisivanja: {level}",

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Naplózás engedélyezése",
"logging_level_description": "Ha be van kapcsolva, milyen részletességű legyen a naplózás.",
"logging_settings": "Naplózás",
"machine_learning_availability_checks": "Elérhetőség ellenőrzése",
"machine_learning_availability_checks_description": "Automatikusan keressen és válasszon elérhető gépi tanulás szervereket",
"machine_learning_availability_checks_enabled": "Elérhetőség ellenőrzésének bekapcsolása",
"machine_learning_availability_checks_interval": "Ellenőrzési intervallum",
"machine_learning_availability_checks_interval_description": "Elérhetőség-ellenőrzések közötti késleltetés milliszekundumban",
"machine_learning_availability_checks_timeout": "Kérések időkorlátja",
"machine_learning_availability_checks_timeout_description": "Elérhetőség-ellenőrzések időkorlátja milliszekundumban",
"machine_learning_clip_model": "CLIP modell",
"machine_learning_clip_model_description": "Egy CLIP modell neve az <link>itt</link> felsoroltak közül. A modell megváltoztatása után újra kell futtatni az 'Okos Keresés' feladatot minden képre.",
"machine_learning_duplicate_detection": "Duplikációk Keresése",
@ -387,8 +394,6 @@
"admin_password": "Admin Jelszó",
"administration": "Adminisztráció",
"advanced": "Haladó",
"advanced_settings_beta_timeline_subtitle": "Próbáld ki az új alkalmazást",
"advanced_settings_beta_timeline_title": "Béta Idővonal",
"advanced_settings_enable_alternate_media_filter_subtitle": "Ezzel a beállítással a szinkronizálás során alternatív kritériumok alapján szűrheted a fájlokat. Csak akkor próbáld ki, ha problémáid vannak azzal, hogy az alkalmazás nem ismeri fel az összes albumot.",
"advanced_settings_enable_alternate_media_filter_title": "[KÍSÉRLETI] Alternatív eszköz album szinkronizálási szűrő használata",
"advanced_settings_log_level_title": "Naplózás szintje: {level}",
@ -396,6 +401,8 @@
"advanced_settings_prefer_remote_title": "Távoli képek előnyben részesítése",
"advanced_settings_proxy_headers_subtitle": "Add meg azokat a proxy fejléceket, amiket az app elküldjön minden hálózati kérésnél",
"advanced_settings_proxy_headers_title": "Proxy Fejlécek",
"advanced_settings_readonly_mode_subtitle": "Bekapcsol egy írásvédett módot ahol csak fotókat nézni lehetséges, egyebek, mint több kép kiválasztása, megosztás, kivetítés és törlés ki vannak kapcsolva. Ki/bekapcsolható a felhasználó ikonjáról a fő képernyőn",
"advanced_settings_readonly_mode_title": "Írásvédett Mód",
"advanced_settings_self_signed_ssl_subtitle": "Nem ellenőrzi a szerver SSL tanúsítványát. Önaláírt tanúsítvány esetén szükséges beállítás.",
"advanced_settings_self_signed_ssl_title": "Önaláírt SSL tanúsítványok engedélyezése",
"advanced_settings_sync_remote_deletions_subtitle": "Automatikusan törölni vagy visszaállítani egy elemet ezen az eszközön, ha az adott műveletet a weben hajtották végre",
@ -423,6 +430,7 @@
"album_remove_user_confirmation": "Biztos, hogy el szeretnéd távolítani {user} felhasználót?",
"album_search_not_found": "Nem található a keresésnek megfelelő album",
"album_share_no_users": "Úgy tűnik, hogy már minden felhasználóval megosztottad ezt az albumot, vagy nincs senki, akivel meg tudnád osztani.",
"album_summary": "Album összefogalaló",
"album_updated": "Album frissült",
"album_updated_setting_description": "Küldjön email értesítőt, amikor egy megosztott albumhoz új elemeket adnak hozzá",
"album_user_left": "Kiléptél a(z) {album} albumból",
@ -461,6 +469,7 @@
"app_bar_signout_dialog_title": "Kijelentkezés",
"app_settings": "Alkalmazás Beállítások",
"appears_in": "Itt szerepel",
"apply_count": "Alkalmaz ({count, number})",
"archive": "Archívum",
"archive_action_prompt": "{count} elem hozzáadva az Archívumhoz",
"archive_or_unarchive_photo": "Fotó archiválása vagy archiválásának visszavonása",
@ -493,6 +502,8 @@
"asset_restored_successfully": "Elem sikeresen helyreállítva",
"asset_skipped": "Kihagyva",
"asset_skipped_in_trash": "Lomtárban",
"asset_trashed": "Elem lomtárba helyezve",
"asset_troubleshoot": "Hibajavítás",
"asset_uploaded": "Feltöltve",
"asset_uploading": "Feltöltés…",
"asset_viewer_settings_subtitle": "A képnézegető beállításainak kezelése",
@ -500,7 +511,7 @@
"assets": "Elemek",
"assets_added_count": "{count, plural, other {# elem}} hozzáadva",
"assets_added_to_album_count": "{count, plural, other {# elem}} hozzáadva az albumhoz",
"assets_added_to_albums_count": "Az {assetTotal, plural, one {elem} other {elemek}} hozzáadva {albumTotal} albumhoz",
"assets_added_to_albums_count": "{assetTotal, plural, one {# elem} other {# elemek}} hozzáadva {albumTotal, plural, one {# albumhoz} other {# albumokhoz}}",
"assets_cannot_be_added_to_album_count": "{count, plural, one {Az elem} other {Az elemek}} nem adhatóak hozzá az albumhoz",
"assets_cannot_be_added_to_albums": "Az {count, plural, one {elemet} other {elemeket}} nem lehet hozzáadni egy albumhoz sem",
"assets_count": "{count, plural, other {# elem}}",
@ -526,8 +537,10 @@
"autoplay_slideshow": "Automatikus diavetítés",
"back": "Vissza",
"back_close_deselect": "Vissza, bezárás, vagy kijelölés törlése",
"background_backup_running_error": "Háttérben futó mentés folyamatban, kézi mentés nem indítható",
"background_location_permission": "Háttérben történő helymeghatározási engedély",
"background_location_permission_content": "Hálózatok automatikus váltásához az Immich-nek *mindenképpen* hozzá kell férnie a pontos helyzethez, hogy az alkalmazás le tudja kérni a Wi-Fi hálózat nevét",
"background_options": "Háttérbeli futás beállításai",
"backup": "Mentés",
"backup_album_selection_page_albums_device": "Ezen az eszközön lévő albumok ({count})",
"backup_album_selection_page_albums_tap": "Koppints a hozzáadáshoz, duplán koppints az eltávolításhoz",
@ -651,6 +664,8 @@
"change_pin_code": "PIN kód megváltoztatása",
"change_your_password": "Jelszavad megváltoztatása",
"changed_visibility_successfully": "Láthatóság sikeresen megváltoztatva",
"charging": "Töltés",
"charging_requirement_mobile_backup": "Háttérben mentéshez szükséges, hogy az eszköz töltőn legyen",
"check_corrupt_asset_backup": "Sérült elemek keresése a mentésben",
"check_corrupt_asset_backup_button": "Ellenőrzés",
"check_corrupt_asset_backup_description": "Ezt az ellenőtzést csak Wi-Fi hálózaton futtasd és csak akkot, ha már az összes elem feltöltésre került. A folyamat néhány percig is eltarthat.",
@ -737,6 +752,7 @@
"create_user": "Felhasználó létrehozása",
"created": "Készült",
"created_at": "Létrehozva",
"creating_linked_albums": "Kapcsolt albumok létrehozása...",
"crop": "Kivágás",
"curated_object_page_title": "Dolgok",
"current_device": "Ez az eszköz",
@ -886,7 +902,9 @@
"error": "Hiba",
"error_change_sort_album": "Album sorbarendezésének megváltoztatása sikertelen",
"error_delete_face": "Hiba az arc törlése során",
"error_getting_places": "Hiba a helyek betöltésekor",
"error_loading_image": "Hiba a kép betöltése közben",
"error_loading_partners": "Hiba a partnerek betöltésénél: {error}",
"error_saving_image": "Hiba: {error}",
"error_tag_face_bounding_box": "Hiba az arc megjelölése közben - nem elérhetőek a határoló koordináták",
"error_title": "Hiba - valami félresikerült",
@ -1051,6 +1069,7 @@
"favorites_page_no_favorites": "Nem található kedvencnek jelölt elem",
"feature_photo_updated": "Címlapkép frissítve",
"features": "Jellemzők",
"features_in_development": "Folyamatban lévő fejlesztések",
"features_setting_description": "Az alkalmazás jellemzőinek kezelése",
"file_name": "Fájlnév",
"file_name_or_extension": "Fájlnév vagy kiterjesztés",
@ -1071,12 +1090,15 @@
"gcast_enabled": "Google Cast",
"gcast_enabled_description": "Ez a funkció a Google-től tölti be a működéséhez szükséges külső adatokat.",
"general": "Általános",
"geolocation_instruction_location": "Kattints egy elemre, amelynek ismert a helyszíne a pozíció kiválasztásához, vagy válassz a térképen",
"get_help": "Segítségkérés",
"get_wifiname_error": "Nem sikerült lekérni a Wi-Fi nevét. Győződj meg róla, hogy megadtad a szükséges engedélyeket és csatlakoztál egy Wi-Fi hálózathoz",
"getting_started": "Kezdő Lépések",
"go_back": "Visszalépés",
"go_to_folder": "Ugrás a mappához",
"go_to_search": "Ugrás a kereséshez",
"gps": "GPS",
"gps_missing": "Nincs GPS",
"grant_permission": "Engedély megadása",
"group_albums_by": "Albumok csoportosítása...",
"group_country": "Csoportosítás ország szerint",
@ -1212,6 +1234,7 @@
"local": "Helyi",
"local_asset_cast_failed": "Nem lehet olyan elemet vetíteni, ami nincs a szerverre feltöltve",
"local_assets": "Helyi Elemek",
"local_media_summary": "Helyi média összegzés",
"local_network": "Helyi hálózat",
"local_network_sheet_info": "Az alkalmazés ezen az URL címen fogja elérni a szervert, ha a megadott WiFi hálózathoz van csatlankozva",
"location_permission": "Helymeghatározási engedély",
@ -1223,6 +1246,7 @@
"location_picker_longitude_hint": "Ide írd a hosszúsági kört",
"lock": "Zárolás",
"locked_folder": "Zárolt mappa",
"log_detail_title": "Naplók részletei",
"log_out": "Kijelentkezés",
"log_out_all_devices": "Kijelentkezés Minden Eszközön",
"logged_in_as": "Belépve: {user} néven",
@ -1253,6 +1277,7 @@
"login_password_changed_success": "Jelszó sikeresen módosítva",
"logout_all_device_confirmation": "Biztos, hogy minden eszközön ki szeretnél jelentkezni?",
"logout_this_device_confirmation": "Biztos, hogy ki szeretnél jelentkezni ezen az eszközön?",
"logs": "Naplók",
"longitude": "Hosszúság",
"look": "Megjelenítés",
"loop_videos": "Videók ismétlése",
@ -1260,6 +1285,7 @@
"main_branch_warning": "Fejlesztői verziót használsz. Javasoljuk a stabil verzió használatát!",
"main_menu": "Főmenü",
"make": "Gyártó",
"manage_geolocation": "Helyadatok kezelése",
"manage_shared_links": "Megosztási linkek kezelése",
"manage_sharing_with_partners": "Partnerekkel való megosztás kezelése",
"manage_the_app_settings": "Alkalmazás beállításainak kezelése",
@ -1294,6 +1320,7 @@
"mark_as_read": "Megjelölés olvasottként",
"marked_all_as_read": "Összes megjelölve olvasottként",
"matches": "Azonosak",
"matching_assets": "Kapcsolódó elemek",
"media_type": "Médiatípus",
"memories": "Emlékek",
"memories_all_caught_up": "Naprakész vagy",
@ -1334,6 +1361,7 @@
"name_or_nickname": "Név vagy becenév",
"network_requirement_photos_upload": "Mobil adatforgalmat használjon a fényképek biztonsági mentéséhez",
"network_requirement_videos_upload": "Mobil adatforgalmat használjon a videók biztonsági mentéséhez",
"network_requirements": "Hálózati követelmények",
"network_requirements_updated": "A hálózat megváltozott, a biztonsági mentési sor visszaállítása",
"networking_settings": "Hálózat",
"networking_subtitle": "Szerver végpont beállítások kezelése",
@ -1344,6 +1372,7 @@
"new_person": "Új személy",
"new_pin_code": "Új PIN kód",
"new_pin_code_subtitle": "Ez az első alkalom hogy megnyitod a zárolt mappát. Hozz létre egy jelszót a mappa biztonságos eléréséhez",
"new_timeline": "Új idővonal",
"new_user_created": "Új felhasználó létrehozva",
"new_version_available": "ÚJ VERZIÓ ÉRHETŐ EL",
"newest_first": "Legújabb először",
@ -1902,6 +1931,8 @@
"sync_albums_manual_subtitle": "Összes fotó és videó létrehozása és szinkronizálása a kiválasztott Immich albumokba",
"sync_local": "Helyi Szinkronizálása",
"sync_remote": "Távoli Szinkronizálása",
"sync_status": "Szinkronizálás állapota",
"sync_status_subtitle": "Szinkronizálás megtekintése és kezelése",
"sync_upload_album_setting_subtitle": "Fotók és videók létrehozása és szinkronizálása a kiválasztott Immich albumba",
"tag": "Címke",
"tag_assets": "Elemek címkézése",
@ -1989,6 +2020,7 @@
"unstacked_assets_count": "{count, plural, other {# elemből}} álló csoport szétszedve",
"untagged": "Címke eltávolítva",
"up_next": "Következik",
"update_location_action_prompt": "{count} elem pozíciójának frissítése a következővel:",
"updated_at": "Frissített",
"updated_password": "Jelszó megváltoztatva",
"upload": "Feltöltés",
@ -2055,6 +2087,7 @@
"view_next_asset": "Következő elem megtekintése",
"view_previous_asset": "Előző elem megtekintése",
"view_qr_code": "QR kód megtekintése",
"view_similar_photos": "Hasonló képek keresése",
"view_stack": "Csoport Megtekintése",
"view_user": "Felhasználó Megtekintése",
"viewer_remove_from_stack": "Eltávolít a Csoportból",

View File

@ -387,8 +387,6 @@
"admin_password": "Kata Sandi Admin",
"administration": "Administrasi",
"advanced": "Tingkat lanjut",
"advanced_settings_beta_timeline_subtitle": "Coba pengalaman aplikasi baru",
"advanced_settings_beta_timeline_title": "Garis waktu Beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Gunakan opsi ini untuk menyaring media saat sinkronisasi berdasarkan kriteria alternatif. Hanya coba ini dengan aplikasi mendeteksi semua album.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTAL] Gunakan saringan sinkronisasi album perangkat alternatif",
"advanced_settings_log_level_title": "Tingkat log: {level}",

View File

@ -387,8 +387,6 @@
"admin_password": "Password Amministratore",
"administration": "Amministrazione",
"advanced": "Avanzate",
"advanced_settings_beta_timeline_subtitle": "Prova la nuova esperienza dell'app",
"advanced_settings_beta_timeline_title": "Timeline beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Usa questa opzione per filtrare i contenuti multimediali durante la sincronizzazione in base a criteri alternativi. Prova questa opzione solo se riscontri problemi con il rilevamento di tutti gli album da parte dell'app.",
"advanced_settings_enable_alternate_media_filter_title": "[SPERIMENTALE] Usa un filtro alternativo per la sincronizzazione degli album del dispositivo",
"advanced_settings_log_level_title": "Livello log: {level}",
@ -425,6 +423,7 @@
"album_remove_user_confirmation": "Sicuro di voler rimuovere l'utente {user}?",
"album_search_not_found": "Nessun album trovato corrispondente alla tua ricerca",
"album_share_no_users": "Sembra che tu abbia condiviso questo album con tutti gli utenti oppure non hai nessun utente con cui condividere.",
"album_summary": "Sommario Album",
"album_updated": "Album aggiornato",
"album_updated_setting_description": "Ricevi una notifica email quando un album condiviso ha nuovi media",
"album_user_left": "{album} abbandonato",
@ -496,6 +495,8 @@
"asset_restored_successfully": "Elemento ripristinato con successo",
"asset_skipped": "Saltato",
"asset_skipped_in_trash": "Nel cestino",
"asset_trashed": "Asset cestinato",
"asset_troubleshoot": "Risoluzione dei problemi dell'asset",
"asset_uploaded": "Caricato",
"asset_uploading": "Caricamento…",
"asset_viewer_settings_subtitle": "Gestisci le impostazioni del visualizzatore della galleria",
@ -529,6 +530,7 @@
"autoplay_slideshow": "Avvio automatico presentazione",
"back": "Indietro",
"back_close_deselect": "Indietro, chiudi o deseleziona",
"background_backup_running_error": "Il backup in background è attualmente in esecuzione, impossibile avviare il backup manuale",
"background_location_permission": "Permesso di localizzazione in background",
"background_location_permission_content": "Per fare in modo che sia possibile cambiare rete quando è in esecuzione in background, Immich deve *sempre* avere accesso alla tua posizione precisa in modo da poter leggere il nome della rete Wi-Fi",
"backup": "Backup",
@ -740,6 +742,7 @@
"create_user": "Crea utente",
"created": "Creato",
"created_at": "Creato il",
"creating_linked_albums": "Creazione di album collegati...",
"crop": "Ritaglia",
"curated_object_page_title": "Oggetti",
"current_device": "Dispositivo attuale",
@ -889,7 +892,9 @@
"error": "Errore",
"error_change_sort_album": "Errore nel cambiare l'ordine di degli album",
"error_delete_face": "Errore nel cancellare la faccia dalla foto",
"error_getting_places": "Errore durante il recupero dei luoghi",
"error_loading_image": "Errore nel caricamento dell'immagine",
"error_loading_partners": "Errore durante il caricamento dei partner: {error}",
"error_saving_image": "Errore: {error}",
"error_tag_face_bounding_box": "Errore durante il tag del volto - impossibile ricavare le coordinate del riquadro",
"error_title": "Errore - Qualcosa è andato storto",
@ -1054,6 +1059,7 @@
"favorites_page_no_favorites": "Nessun preferito",
"feature_photo_updated": "Foto in evidenza aggiornata",
"features": "Funzionalità",
"features_in_development": "Funzionalità in fase di sviluppo",
"features_setting_description": "Gestisci le funzionalità dell'app",
"file_name": "Nome file",
"file_name_or_extension": "Nome file o estensione",
@ -1218,6 +1224,7 @@
"local": "Locale",
"local_asset_cast_failed": "Impossibile trasmettere una risorsa che non è caricata sul server",
"local_assets": "Risorsa locale",
"local_media_summary": "Riepilogo dei Media Locali",
"local_network": "Rete locale",
"local_network_sheet_info": "L'app si collegherà al server tramite questo URL quando è in uso la rete Wi-Fi specificata",
"location_permission": "Permesso di localizzazione",
@ -1229,6 +1236,7 @@
"location_picker_longitude_hint": "Inserisci la longitudine qui",
"lock": "Rendi privato",
"locked_folder": "Cartella Privata",
"log_detail_title": "Dettaglio dei Log",
"log_out": "Esci",
"log_out_all_devices": "Disconnetti tutti i dispositivi",
"logged_in_as": "Effettuato l'accesso come {user}",
@ -1259,6 +1267,7 @@
"login_password_changed_success": "Password aggiornata con successo",
"logout_all_device_confirmation": "Sei sicuro di volerti disconnettere da tutti i dispositivi?",
"logout_this_device_confirmation": "Sei sicuro di volerti disconnettere da questo dispositivo?",
"logs": "Logs",
"longitude": "Longitudine",
"look": "Guarda",
"loop_videos": "Riproduci video in loop",
@ -1301,6 +1310,7 @@
"mark_as_read": "Segna come letto",
"marked_all_as_read": "Segnato tutto come letto",
"matches": "Corrispondenze",
"matching_assets": "Assets Corrispondenti",
"media_type": "Tipo Media",
"memories": "Ricordi",
"memories_all_caught_up": "Tutto a posto",
@ -1351,6 +1361,7 @@
"new_person": "Nuova persona",
"new_pin_code": "Nuovo codice PIN",
"new_pin_code_subtitle": "Questa è la prima volta che accedi alla cartella privata. Crea un codice PIN per accedere in modo sicuro a questa pagina",
"new_timeline": "Nuova Timeline",
"new_user_created": "Nuovo utente creato",
"new_version_available": "NUOVA VERSIONE DISPONIBILE",
"newest_first": "Prima recenti",
@ -1364,20 +1375,25 @@
"no_assets_message": "CLICCA PER CARICARE LA TUA PRIMA FOTO",
"no_assets_to_show": "Nessuna risorsa da mostrare",
"no_cast_devices_found": "Nessun dispositivo di trasmissione trovato",
"no_checksum_local": "Nessun checksum disponibile: impossibile recuperare gli assets locali",
"no_checksum_remote": "Nessun checksum disponibile: impossibile recuperare l'asset remoto",
"no_duplicates_found": "Nessun duplicato trovato.",
"no_exif_info_available": "Nessuna informazione exif disponibile",
"no_explore_results_message": "Carica più foto per esplorare la tua collezione.",
"no_favorites_message": "Aggiungi preferiti per trovare facilmente le tue migliori foto e video",
"no_libraries_message": "Crea una libreria esterna per vedere le tue foto e i tuoi video",
"no_local_assets_found": "Nessun asset locale trovato con questo checksum",
"no_locked_photos_message": "Le foto e i video nella cartella privata sono nascosti e non vengono visualizzati mentre navighi o cerchi nella tua libreria.",
"no_name": "Nessun nome",
"no_notifications": "Nessuna notifica",
"no_people_found": "Nessuna persona trovata",
"no_places": "Nessun posto",
"no_remote_assets_found": "Nessun asset remoto trovato con questo checksum",
"no_results": "Nessun risultato",
"no_results_description": "Prova ad usare un sinonimo oppure una parola chiave più generica",
"no_shared_albums_message": "Crea un album per condividere foto e video con le persone nella tua rete",
"no_uploads_in_progress": "Nessun upload in corso",
"not_available": "N/A",
"not_in_any_album": "In nessun album",
"not_selected": "Non selezionato",
"note_apply_storage_label_to_previously_uploaded assets": "Nota: Per aggiungere l'etichetta dell'archiviazione agli asset caricati in precedenza, esegui",
@ -1588,6 +1604,7 @@
"regenerating_thumbnails": "Rigenerando le anteprime",
"remote": "Remoto",
"remote_assets": "Risorse remote",
"remote_media_summary": "Riepilogo dei Media Remoti",
"remove": "Rimuovi",
"remove_assets_album_confirmation": "Sei sicuro di voler rimuovere {count, plural, one {# asset} other {# asset}} dall'album?",
"remove_assets_shared_link_confirmation": "Sei sicuro di voler rimuovere {count, plural, one {# asset} other {# asset}} da questo link condiviso?",
@ -1863,6 +1880,7 @@
"show_slideshow_transition": "Mostra la transizione della presentazione",
"show_supporter_badge": "Medaglia di Contributore",
"show_supporter_badge_description": "Mostra la medaglia di contributore",
"show_text_search_menu": "Mostra il menu di ricerca del testo",
"shuffle": "Casuale",
"sidebar": "Barra laterale",
"sidebar_display_description": "Visualizzare un link alla vista nella barra laterale",
@ -1917,6 +1935,8 @@
"sync_albums_manual_subtitle": "Sincronizza tutti i video e le foto caricati con gli album di backup selezionati",
"sync_local": "Sincronizza gli elementi locali",
"sync_remote": "Sincronizza gli elementi remoti",
"sync_status": "Stato di Sincronizzazione",
"sync_status_subtitle": "Visualizza e gestisci il sistema di sincronizzazione",
"sync_upload_album_setting_subtitle": "Crea e carica le tue foto e video sull'album selezionato in Immich",
"tag": "Tag",
"tag_assets": "Tagga risorse",
@ -1976,6 +1996,7 @@
"trash_page_select_assets_btn": "Seleziona elemento",
"trash_page_title": "Cestino ({count})",
"trashed_items_will_be_permanently_deleted_after": "Gli elementi cestinati saranno eliminati definitivamente dopo {days, plural, one {# giorno} other {# giorni}}.",
"troubleshoot": "Risoluzione dei problemi",
"type": "Tipo",
"unable_to_change_pin_code": "Impossibile cambiare il codice PIN",
"unable_to_setup_pin_code": "Impossibile configurare il codice PIN",
@ -2092,5 +2113,6 @@
"yes": "Si",
"you_dont_have_any_shared_links": "Non è presente alcun link condiviso",
"your_wifi_name": "Nome della tua rete Wi-Fi",
"zoom_image": "Ingrandisci immagine"
"zoom_image": "Ingrandisci immagine",
"zoom_to_bounds": "Ingrandisci fino ai bordi"
}

View File

@ -123,6 +123,11 @@
"logging_enable_description": "ログの有効化",
"logging_level_description": "有効な場合に使用されるログ レベル。",
"logging_settings": "ログ",
"machine_learning_availability_checks_enabled": "可用性チェックを有効にする",
"machine_learning_availability_checks_interval": "チェックの間隔",
"machine_learning_availability_checks_interval_description": "可用性チェックの間隔(ミリ秒単位)",
"machine_learning_availability_checks_timeout": "リクエストタイムアウト",
"machine_learning_availability_checks_timeout_description": "可用性チェックのタイムアウト時間(ミリ秒単位)",
"machine_learning_clip_model": "Clipモデル",
"machine_learning_clip_model_description": "CLIP モデルの名前は<link>ここ</link>にリストされています。モデルを変更した場合は、すべてのイメージに対して「スマート検索」ジョブを再実行する必要があります。",
"machine_learning_duplicate_detection": "重複検出",
@ -387,8 +392,6 @@
"admin_password": "管理者パスワード",
"administration": "管理",
"advanced": "詳細設定",
"advanced_settings_beta_timeline_subtitle": "新しいアプリを体験してみましょう",
"advanced_settings_beta_timeline_title": "試験運用のタイムライン",
"advanced_settings_enable_alternate_media_filter_subtitle": "別の基準に従ってメディアファイルにフィルターをかけて、同期を行います。アプリがすべてのアルバムを読み込んでくれない場合にのみ、この機能を試してください。",
"advanced_settings_enable_alternate_media_filter_title": "[試験運用] 別のデバイスのアルバム同期フィルターを使用する",
"advanced_settings_log_level_title": "ログレベル: {level}",
@ -1499,6 +1502,7 @@
"port": "ポートレート",
"preferences_settings_subtitle": "アプリに関する設定",
"preferences_settings_title": "設定",
"preparing": "準備中",
"preset": "プリセット",
"preview": "プレビュー",
"previous": "前",
@ -1564,6 +1568,7 @@
"read_changelog": "変更履歴を読む",
"readonly_mode_disabled": "読み取り専用モード無効",
"readonly_mode_enabled": "読み取り専用モード有効",
"ready_for_upload": "アップロード準備完了",
"reassign": "再割り当て",
"reassigned_assets_to_existing_person": "{count, plural, one {#個} other {#個}}のアセットを{name, select, null {既存の人物} other {{name}}}に再割り当てしました",
"reassigned_assets_to_new_person": "{count, plural, one {#個} other {#個}}のアセットを新しい人物に割り当てました",
@ -1893,6 +1898,7 @@
"stacktrace": "スタックトレース",
"start": "開始",
"start_date": "開始日",
"start_date_before_end_date": "開始日は終了日より前でなければなりません",
"state": "都道府県",
"status": "ステータス",
"stop_casting": "キャストを停止",

View File

@ -387,8 +387,6 @@
"admin_password": "관리자 비밀번호",
"administration": "관리",
"advanced": "고급",
"advanced_settings_beta_timeline_subtitle": "새로운 앱 경험 사용해보기",
"advanced_settings_beta_timeline_title": "베타 타임라인",
"advanced_settings_enable_alternate_media_filter_subtitle": "이 옵션을 사용하면 동기화 중 미디어를 대체 기준으로 필터링할 수 있습니다. 앱이 모든 앨범을 제대로 감지하지 못할 때만 사용하세요.",
"advanced_settings_enable_alternate_media_filter_title": "대체 기기 앨범 동기화 필터 사용 (실험적)",
"advanced_settings_log_level_title": "로그 레벨: {level}",

View File

@ -387,8 +387,6 @@
"admin_password": "Administratoriaus slaptažodis",
"administration": "Administravimas",
"advanced": "Sudėtingesnis",
"advanced_settings_beta_timeline_subtitle": "Išbandykite naujos programos patirtį",
"advanced_settings_beta_timeline_title": "Beta laiko juosta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Naudokite šį nustatymą medijos filtravimui sinchronizuojant remiantis alternatyviais kriterijais. Naudokite tik jei programa turi problemų su visų albumų aptikimu.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTINIS] Naudokite alternatyvų įrenginio albumų sinchronizavimo filtrą",
"advanced_settings_log_level_title": "Žurnalo įrašų lygis: {level}",
@ -425,6 +423,7 @@
"album_remove_user_confirmation": "Ar tikrai norite pašalinti naudotoją {user}?",
"album_search_not_found": "Pagal jūsų paiešką albumų nerasta",
"album_share_no_users": "Atrodo, kad bendrinate šį albumą su visais naudotojais, arba neturite naudotojų, su kuriais galėtumėte bendrinti.",
"album_summary": "Albumo santrauka",
"album_updated": "Albumas atnaujintas",
"album_updated_setting_description": "Gauti pranešimą el. paštu, kai bendrinamas albumas turi naujų elementų",
"album_user_left": "Paliko {album}",
@ -496,6 +495,8 @@
"asset_restored_successfully": "Elementas atkurtas sėkmingai",
"asset_skipped": "Praleista",
"asset_skipped_in_trash": "Šiukšliadėžėje",
"asset_trashed": "Elementai ištrinti",
"asset_troubleshoot": "Elementų trikčių šalinimas",
"asset_uploaded": "Įkelta",
"asset_uploading": "Įkeliama…",
"asset_viewer_settings_subtitle": "Tvarkykite savo galerijos peržiūros nustatymus",
@ -529,8 +530,10 @@
"autoplay_slideshow": "Automatiškai rodyti skaidrių demonstraciją",
"back": "Atgal",
"back_close_deselect": "Atgal, uždaryti arba atžymėti",
"background_backup_running_error": "Vyksta foninis atsarginis kopijavimas, negalima pradėti rankinio kopijavimo",
"background_location_permission": "Foninis vietovės leidimas",
"background_location_permission_content": "Veikiant fone tinklo perjungimui Immich privalo *visada* turėti prieigą prie tikslios vietovės, kad programa galėtų perskaityti Wi-Fi tinklo pavadinimą",
"background_options": "Fono nuostatos",
"backup": "Atsarginė kopija",
"backup_album_selection_page_albums_device": "Albumų įrenginyje ({count})",
"backup_album_selection_page_albums_tap": "Palieskite įtraukti, du kart palieskite neįtraukti",
@ -538,6 +541,7 @@
"backup_album_selection_page_select_albums": "Pažymėti albumai",
"backup_album_selection_page_selection_info": "Pažymėjimo informacija",
"backup_album_selection_page_total_assets": "Viso unikalių elementų",
"backup_albums_sync": "Atsarginio kopijavimo albumų sinchronizacija",
"backup_all": "Visi",
"backup_background_service_backup_failed_message": "Nepavyko sukurti atsarginių kopijų. Bandoma dar kartą…",
"backup_background_service_connection_failed_message": "Nepavyko prisijungti prie serverio. Bandoma dar kartą…",
@ -651,6 +655,8 @@
"change_pin_code": "Pakeisti PIN kodą",
"change_your_password": "Pakeisti slaptažodį",
"changed_visibility_successfully": "Matomumas pakeistas sėkmingai",
"charging": "Kraunasi",
"charging_requirement_mobile_backup": "Foninis kopijavimas reikalauja, kad įrenginys būtų prijungtas pakrovimui",
"check_corrupt_asset_backup": "Patikrinti sugadintų elementų atsarginę kopiją",
"check_corrupt_asset_backup_button": "Atlikti patikrinimą",
"check_corrupt_asset_backup_description": "Paleiskite šį patikrinimą tik per Wi-Fi ir tik kai visi elementai buvo perkopijuoti. Ši procedūra užtruks kelias minutes.",
@ -737,6 +743,7 @@
"create_user": "Sukurti naudotoją",
"created": "Sukurta",
"created_at": "Sukurta",
"creating_linked_albums": "Kuriami susieti albumai...",
"crop": "Apkirpti",
"curated_object_page_title": "Daiktai",
"current_device": "Dabartinis įrenginys",
@ -886,7 +893,9 @@
"error": "Klaida",
"error_change_sort_album": "Nepavyko pakeisti albumo rūšiavimo tvarkos",
"error_delete_face": "Klaida trinant veidą iš elementų",
"error_getting_places": "Klaida gaunant vietoves",
"error_loading_image": "Klaida įkeliant vaizdą",
"error_loading_partners": "Klaida užkraunant partnerius: {error}",
"error_saving_image": "Klaida: {error}",
"error_tag_face_bounding_box": "Klaida aprašant veidą - nepavyko gauti veido vietos koordinačių",
"error_title": "Klaida - Kažkas nutiko ne taip",
@ -1051,6 +1060,7 @@
"favorites_page_no_favorites": "Nerasta mėgstamiausių elementų",
"feature_photo_updated": "Pageidaujama nuotrauka atnaujinta",
"features": "Funkcijos",
"features_in_development": "Kūrimo funkcijos",
"features_setting_description": "Valdyti aplikacijos funkcijas",
"file_name": "Failo pavadinimas",
"file_name_or_extension": "Failo pavadinimas arba plėtinys",
@ -1115,64 +1125,158 @@
"home_page_building_timeline": "Kuriama laiko juosta",
"home_page_delete_err_partner": "Negalima ištrinti partnerio elementų, praleidžiama",
"home_page_delete_remote_err_local": "Vietiniai elementai ištrinant nuotolinį pasirinkimą, praleidžiami",
"home_page_favorite_err_local": "Kol kad negalima priskirti mėgstamiausių vietinių elementų, praleidžiama",
"home_page_favorite_err_local": "Kol kas negalima priskirti mėgstamiausių vietinių elementų, praleidžiama",
"home_page_favorite_err_partner": "Kol kas negalima priskirti mėgstamiausių partnerio elementų, praleidžiama",
"home_page_first_time_notice": "Jei jūs naudojate programą pirmą kartą, tai prašome pasirinkti atsarginės kopijos albumą, kad laiko juosta galėtų tvarkyti albumo nuotraukas ir vaizdo įrašus",
"home_page_locked_error_local": "Nepavyko perkelti lokalių failų į užrakintą aplanką, praleidžiama",
"home_page_locked_error_partner": "Nepavyko perkelti partnerio failų į užrakintą aplanką, praleidžiama",
"home_page_share_err_local": "Negalima dalinti vietinių elementų per nuorodą, praleidžiama",
"home_page_upload_err_limit": "Galima įkelti tik iki 30 elementų vienu metu, praleidžiama",
"host": "Šeimininkas",
"hour": "Valanda",
"hours": "Valandos",
"id": "ID",
"idle": "Laisva",
"ignore_icloud_photos": "Ignoruoti iCloud nuotraukas",
"ignore_icloud_photos_description": "Nuotraukos laikomos iCloud nebus įkeltos į Immich serverį",
"image": "Nuotrauka",
"image_alt_text_date": "{isVideo, select, true {Filmuota} other {Fotografuota}} {date}",
"image_alt_text_date_1_person": "{isVideo, select, true {Filmuota} other {Fotografuota}} su {person1} {date}",
"image_alt_text_date_2_people": "{isVideo, select, true {Filmuota} other {Fotografuota}} su {person1} ir {person2} {date}",
"image_alt_text_date_3_people": "{isVideo, select, true {Filmuota} other {Fotografuota}} {date} su {person1}, {person2} ir{person3}",
"image_alt_text_date_4_or_more_people": "{isVideo, select, true {Filmuota} other {Fotografuota}} {date} su {person1}, {person2} ir {additionalCount, number} kitais",
"image_alt_text_date_place": "{isVideo, select, true {Filmuota} other {Fotografuota}} {city}, {country} {date}",
"image_alt_text_date_place_1_person": "{isVideo, select, true {Filmuota} other {Fotografuota}} su {person1} - {city}, {country} {date}",
"image_alt_text_date_place_2_people": "{isVideo, select, true {Filmuota} other {Fotografuota}} su {person1} ir {person2} - {city}, {country} {date}",
"image_alt_text_date_place_3_people": "{isVideo, select, true {Filmuota} other {Fotografuota}} su {person1}, {person2}, ir {person3} - {city}, {country} {date}",
"image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {Filmuota} other {Fotografuota}} su {person1}, {person2}, ir {additionalCount, number} kitais - {city}, {country} {date}",
"image_saved_successfully": "Nuotrauka išsaugota",
"image_viewer_page_state_provider_download_started": "Atsisiuntimas pradėtas",
"image_viewer_page_state_provider_download_success": "Atsisiuntimas pavyko",
"image_viewer_page_state_provider_share_error": "Dalinimosi klaida",
"immich_logo": "Immich logotipas",
"immich_web_interface": "Immich Web sąsaja",
"import_from_json": "Importuoti iš JSON",
"import_path": "Importavimo kelias",
"in_albums": "{count, plural, one {# Albume} few {#Albumuose} other {# Albumų}}",
"in_archive": "Archyve",
"include_archived": "Įtraukti archyvuotus",
"include_shared_albums": "Įtraukti bendrinamus albumus",
"include_shared_partner_assets": "Įtraukti partnerio pasidalintus elementus",
"individual_share": "Pavienis pasidalinimas",
"individual_shares": "Pavieniai pasidalinimai",
"info": "Informacija",
"interval": {
"day_at_onepm": "Kiekvieną dieną 13:00",
"hours": "Kas{hours, plural, one {valandą} few {#valandas} other {{hours, number} valandų}}",
"night_at_midnight": "Kiekvieną vidurnaktį",
"night_at_twoam": "Kiekvieną naktį 02:00"
},
"invalid_date": "Netinkama data",
"invalid_date_format": "Netinkamas datos formatas",
"invite_people": "Kviesti žmones",
"invite_to_album": "Pakviesti į albumą",
"ios_debug_info_fetch_ran_at": "Užkrovimas vyko {dateTime}",
"ios_debug_info_last_sync_at": "Paskutinė sinchronizacija {dateTime}",
"ios_debug_info_no_processes_queued": "Eilėje nėra foninių procesų",
"ios_debug_info_no_sync_yet": "Jokia background sync užduotis dar nebuvo paleista",
"ios_debug_info_processes_queued": "{count, plural, one {Eilėje {count} foninis procesas} few {Eilėje {count} foniniai procesai} other {Eilėje {count} foninių procesų}}",
"ios_debug_info_processing_ran_at": "Apdorojimas vyko {dateTime}",
"items_count": "{count, plural, one {# elementas} few {# elementai} other {# elementų}}",
"jobs": "Užduotys",
"keep": "Palikti",
"keep_all": "Palikti visus",
"keep_this_delete_others": "Išsaugoti šį, kitus ištrinti",
"kept_this_deleted_others": "Išsaugotas šis elementas ir {count, plural, one {ištrintas # elementas} few {ištrinti # elementai} other {ištrinta # elementų}}",
"keyboard_shortcuts": "Spartieji klaviatūros klavišai",
"language": "Kalba",
"language_no_results_subtitle": "Bandykite pakoreguoti paieškos terminą",
"language_no_results_title": "Kalbos nerastos",
"language_search_hint": "Ieškoti kalbų...",
"language_setting_description": "Pasirinkti pageidaujamą kalbą",
"large_files": "Dideli failai",
"last": "Paskutinis",
"last_seen": "Paskutinį kartą matytas",
"latest_version": "Naujausia versija",
"latitude": "Platuma",
"leave": "Išeiti",
"leave_album": "Palikti albumą",
"lens_model": "Lęšių modelis",
"let_others_respond": "Leisti kitiems reaguoti",
"level": "Lygis",
"library": "Biblioteka",
"library_options": "Bibliotekos pasirinktys",
"library_page_device_albums": "Albumai įrenginyje",
"library_page_new_album": "Naujas albumas",
"library_page_sort_asset_count": "Elementų skaičius",
"library_page_sort_created": "Kūrimo data",
"library_page_sort_last_modified": "Paskutinį kartą modifikuota",
"library_page_sort_title": "Albumo pavadinimas",
"licenses": "Licencijos",
"light": "Šviesi",
"like": "Kaip",
"like_deleted": "Kaip ištrintas",
"link_motion_video": "Susieti judesio vaizdo įrašą",
"link_to_oauth": "Susieti su OAuth",
"linked_oauth_account": "Susieta OAuth paskyra",
"list": "Sąrašas",
"loading": "Kraunama",
"loading_search_results_failed": "Nepavyko užkrauti paieškos rezultatų",
"local": "Vietinis",
"local_asset_cast_failed": "Negalima transliuoti elemento kuris neįkeltas į serverį",
"local_assets": "Vietiniai elementai",
"local_media_summary": "Vietinės medijos santrauka",
"local_network": "Vietinis tinklas",
"local_network_sheet_info": "Programa jungsis prie serverio per šį URL kai naudos pasirinktą Wi-Fi tinklą",
"location_permission": "Vietovės leidimai",
"location_permission_content": "Norint naudoti automatinio persijungimo opciją, Immich reikia tikslios vietovės leidimo, kad galėtų nuskaityti Wi-Fi tinklo pavadinimą",
"location_picker_choose_on_map": "Pasirinkite žemėlapyje",
"location_picker_latitude_error": "Įveskite tinkamą platumą",
"location_picker_latitude_hint": "Įveskite platumą čia",
"location_picker_longitude_error": "Įveskite tinkamą ilgumą",
"location_picker_longitude_hint": "Įveskite ilgumą čia",
"lock": "Užrakinti",
"locked_folder": "Užrakintas aplankas",
"log_detail_title": "Žurnalo detalės",
"log_out": "Atsijungti",
"log_out_all_devices": "Atsijungti iš visų įrenginių",
"logged_in_as": "Prisijungta kaip {user}",
"logged_out_all_devices": "Atsijungta iš visų įrenginių",
"logged_out_device": "Atsijungta nuo įrenginio",
"login": "Prisijungti",
"login_disabled": "Prisijungimas neįgalintas",
"login_form_api_exception": "API išimtis. Patikrinkite serverio URL ir bandykite dar kartą.",
"login_form_back_button_text": "Atgal",
"login_form_email_hint": "jusupastas@email.com",
"login_form_endpoint_hint": "http://jusu-serverio-ip:port",
"login_form_endpoint_url": "Serverio galutinio taško URL",
"login_form_err_http": "Prašome nurodyti http:// arba https://",
"login_form_err_invalid_email": "Neteisingas el. paštas",
"login_form_err_invalid_url": "Neteisingas URL",
"login_form_err_leading_whitespace": "Pradinis tarpas",
"login_form_err_trailing_whitespace": "Galinis tarpas",
"login_form_failed_get_oauth_server_config": "Klaida prisijungiant su OAuth, patikrinkite serverio URL",
"login_form_failed_get_oauth_server_disable": "Serveryje OAuth funkcija negalima",
"login_form_failed_login": "Klaida prisijungiant, patikrinkite serverio URL, el. paštą ir slaptažodį",
"login_form_handshake_exception": "Įvyko serverio patvirtinimo išimtis. Jei naudojate savarankiškai pasirašytą sertifikatą, nustatymuose įjunkite savarankiškai pasirašyto sertifikato palaikymą.",
"login_form_password_hint": "slaptažodis",
"login_form_save_login": "Likti prisijungus",
"login_form_server_empty": "Įveskite serverio URL.",
"login_form_server_error": "Nepavyko prisijungti prie serverio.",
"login_has_been_disabled": "Prisijungimas išjungtas.",
"login_password_changed_error": "Įvyko klaida atnaujinant jūsų slaptažodį",
"login_password_changed_success": "Slaptažodis sėkmingai atnaujintas",
"logout_all_device_confirmation": "Ar tikrai norite atsijungti iš visų įrenginių?",
"logout_this_device_confirmation": "Ar tikrai norite atsijungti iš šio prietaiso?",
"logs": "Žurnalas",
"longitude": "Ilguma",
"look": "Išvaizda",
"loop_videos": "Kartoti vaizdo įrašus",
"loop_videos_description": "Įgalinti automatinį vaizdo įrašo rodymą iš naujo detalių peržiūroje.",
"main_branch_warning": "Jūs naudojate kūrėjo versiją, mes stipriai rekomenduojame naudoti galutinę versiją!",
"main_menu": "Pagrindinis meniu",
"make": "Gamintojas",
"manage_geolocation": "Tvarkyti vietovę",
"manage_shared_links": "Bendrinimo nuorodų tvarkymas",
"manage_sharing_with_partners": "Valdyti dalijimąsi su partneriais",
"manage_the_app_settings": "Valdyti programos nustatymus",
@ -1182,15 +1286,41 @@
"manage_your_oauth_connection": "Tvarkyti OAuth prisijungimą",
"map": "Žemėlapis",
"map_assets_in_bounds": "{count, plural, =0 {Nuotraukų nėra} one {# nuotrauka} other {# nuotraukos}}",
"map_cannot_get_user_location": "Negalime gauti naudotojo vietovės",
"map_location_dialog_yes": "Taip",
"map_location_picker_page_use_location": "Naudoti šią vietovę",
"map_location_service_disabled_content": "Vietovės servisas turi būti įjungtas, kad rodytų elementus iš dabartinės vietovės. Įjungti vietovės servisą?",
"map_location_service_disabled_title": "Vietovės servisas išjungtas",
"map_marker_for_images": "Žemėlapio žymeklis nuotraukoms yra {city}, {country}",
"map_marker_with_image": "Žemėlapio žymeklis su nuotrauka",
"map_no_location_permission_content": "Reikalingas vietovės leidimas, kad rodytų elementus iš dabartinės vietovės. Ar norite suteikti leidimą?",
"map_no_location_permission_title": "Vietovės leidimas atmestas",
"map_settings": "Žemėlapio nustatymai",
"map_settings_dark_mode": "Tamsi tema",
"map_settings_date_range_option_day": "Pastarosios 24 valandos",
"map_settings_date_range_option_days": "Pastarąsias {days} dienas",
"map_settings_date_range_option_year": "Pastarieji metai",
"map_settings_date_range_option_years": "Pastaruosius {years} metus",
"map_settings_dialog_title": "Žemėlapio nustatymai",
"map_settings_include_show_archived": "Įtraukti archyvuotus",
"map_settings_include_show_partners": "Pridėti partneriai",
"map_settings_only_show_favorites": "Rodyti tik mėgstamiausius",
"map_settings_theme_settings": "Žemėlapio tema",
"map_zoom_to_see_photos": "Atitolinkite, kad matytumėte nuotraukas",
"mark_all_as_read": "Pažymėti viską kaip perskaitytą",
"mark_as_read": "Pažymėti kaip perskaitytą",
"marked_all_as_read": "Viskas pažymėta kaip perskaityta",
"matches": "Atitikmenys",
"matching_assets": "Atitinkantys elementai",
"media_type": "Laikmenos tipas",
"memories": "Atsiminimai",
"memories_all_caught_up": "Jau viskas peržiūrėta",
"memories_check_back_tomorrow": "Užsukite rytoj, kad pamatytumėte daugiau prisiminimų",
"memories_setting_description": "Valdyti tai, ką matote savo prisiminimuose",
"memory": "Atmintis",
"memories_start_over": "Pradėti iš naujo",
"memories_swipe_to_close": "Perbraukite į viršų norėdami uždaryti",
"memory": "Prisiminimai",
"memory_lane_title": "Prisiminimų juosta {title}",
"menu": "Meniu",
"merge": "Sujungti",
"merge_people": "Sujungti asmenis",
@ -1200,24 +1330,40 @@
"merged_people_count": "{count, plural, one {Sujungtas # asmuo} few {Sujungti # asmenys} other {Sujungta # asmenų}}",
"minimize": "Sumažinti",
"minute": "Minutė",
"minutes": "Minutės",
"missing": "Trūkstami",
"model": "Modelis",
"month": "Mėnesis",
"monthly_title_text_date_format": "MMMM y",
"more": "Daugiau",
"move": "Perkelti",
"move_off_locked_folder": "Ištraukti iš užrakinto aplanko",
"move_to_lock_folder_action_prompt": "{count} įkelta į užrakintą aplanką",
"move_to_locked_folder": "Įtraukti į užrakintą aplanką",
"move_to_locked_folder_confirmation": "Šios nuotraukos ir vaizdo įrašai bus pašalinti iš visų albumų ir bus matomi tik užrakintame aplanke",
"moved_to_archive": "{count, plural, one {# Elementas perkeltas} few {# Elementai perkelti} other {# Elementų perkelta}} į archyvą",
"moved_to_library": "{count, plural, one {# Elementas perkeltas} few {# Elementai perkelti} other {# Elementų perkelta}} į biblioteką",
"moved_to_trash": "Perkelta į šiukšliadėžę",
"multiselect_grid_edit_date_time_err_read_only": "Negalima redaguoti tik skaitomo elemento datos, praleidžiama",
"multiselect_grid_edit_gps_err_read_only": "Negalima redaguoti tik skaitomo elemento vietovės, praleidžiama",
"mute_memories": "Užtildyti prisiminimus",
"my_albums": "Mano albumai",
"name": "Vardas",
"name_or_nickname": "Vardas arba slapyvardis",
"network_requirement_photos_upload": "Naudoti mobilų internetą atsarginėms nuotraukų kopijoms",
"network_requirement_videos_upload": "Naudoti mobilų internetą atsarginėms vaizdo įrašų kopijoms",
"network_requirements": "Tinklo reikalavimai",
"network_requirements_updated": "Tinklo reikalavimai pakeisti, atstatoma atsarginio kopijavimo eilė",
"networking_settings": "Tinklai",
"networking_subtitle": "Tvarkyti serverio galutinio taško nustatymus",
"never": "Niekada",
"new_album": "Naujas albumas",
"new_api_key": "Naujas API raktas",
"new_password": "Naujas slaptažodis",
"new_person": "Naujas asmuo",
"new_pin_code": "Naujas PIN kodas",
"new_pin_code_subtitle": "Tai pirmas kartas, kai naudojate užrakinto aplanko funkciją. Nustatykite PIN kodą savo užrakintam aplankui",
"new_timeline": "Nauja laiko juosta",
"new_user_created": "Naujas naudotojas sukurtas",
"new_version_available": "PRIEINAMA NAUJA VERSIJA",
"newest_first": "Pirmiausia naujausi",
@ -1229,33 +1375,68 @@
"no_albums_yet": "Atrodo, kad dar neturite albumų.",
"no_archived_assets_message": "Suarchyvuokite nuotraukas ir vaizdo įrašus, kad jie nebūtų rodomi nuotraukų rodinyje",
"no_assets_message": "SPUSTELĖKITE NORĖDAMI ĮKELTI PIRMĄJĄ NUOTRAUKĄ",
"no_assets_to_show": "Nėra rodomų elementų",
"no_cast_devices_found": "Nerasta transliavimo įrenginių",
"no_checksum_local": "Kontrolinė suma nepasiekiama negalima gauti vietinių elementų",
"no_checksum_remote": "Kontrolinė suma nepasiekiama negalima gauti nuotolinių elementų",
"no_duplicates_found": "Dublikatų nerasta.",
"no_exif_info_available": "Nėra Exif informacijos",
"no_explore_results_message": "Įkelkite daugiau nuotraukų ir tyrinėkite savo kolekciją.",
"no_favorites_message": "Pridėti į mėgstamiausius, kad greitai rastum geriausias nuotraukas ir vaizdo įrašus",
"no_libraries_message": "Sukurkite išorinę biblioteką nuotraukoms ir vaizdo įrašams peržiūrėti",
"no_local_assets_found": "Nerasta jokių vietinių elementų su šia kontroline suma",
"no_locked_photos_message": "Užrakintame aplanke esančios nuotraukos ir vaizdo įrašai yra paslėpti ir nematomi naršant ir ieškant.",
"no_name": "Be vardo",
"no_results": "Nerasta",
"no_notifications": "Pranešimų nėra",
"no_people_found": "Ieškomų žmonių nerasta",
"no_places": "Vietovių nėra",
"no_remote_assets_found": "Nerasta jokių nuotolinių elementų su šia kontroline suma",
"no_results": "Rezultatų nerasta",
"no_results_description": "Pabandykite sinonimą arba bendresnį raktažodį",
"no_shared_albums_message": "Sukurkite nuotraukų ar vaizdo įrašų albumą dalinimuisi su žmonėmis jūsų tinkle",
"no_uploads_in_progress": "Nėra vykstančių įkėlimų",
"not_available": "Nepasiekiamas",
"not_in_any_album": "Nė viename albume",
"note_apply_storage_label_to_previously_uploaded assets": "Pastaba: Priskirti Saugyklos Žymą prie ankčiau įkeltų ištekliu, paleiskite šį",
"not_selected": "Nepasirinkta",
"note_apply_storage_label_to_previously_uploaded assets": "Pastaba: Priskirti Saugyklos Žymą prie anksčiau įkeltų ištekliu, paleiskite šį",
"notes": "Pastabos",
"nothing_here_yet": "Kol kas tuščia",
"notification_permission_dialog_content": "Pranešimų įgalinimui eikite į Nustatymus ir pasirinkite Leisti.",
"notification_permission_list_tile_content": "Suteikti leidimą pranešimų įgalinimui.",
"notification_permission_list_tile_enable_button": "Įgalinti pranešimus",
"notification_permission_list_tile_title": "Pranešimų leidimai",
"notification_toggle_setting_description": "Įjungti el. pašto pranešimus",
"notifications": "Pranešimai",
"notifications_setting_description": "Tvarkyti pranešimus",
"oauth": "OAuth",
"official_immich_resources": "Oficialūs Immich ištekliai",
"offline": "Neprisijungęs",
"offset": "Ofsetas",
"ok": "Ok",
"oldest_first": "Seniausias pirmas",
"on_this_device": "Šiame įrenginyje",
"onboarding": "Įdarbinimas",
"onboarding_locale_description": "Pasirinkite pageidaujamą kalbą. Vėliau ją galėsite pakeisti nustatymuose.",
"onboarding_privacy_description": "Sekančios (neprivalomos) funkcijos remiasi išorinėmis paslaugomis ir gali būti bet kada išjungtos nustatymuose.",
"onboarding_server_welcome_description": "Nustatykime jūsų programą su dažniausiai naudojamais nustatymais.",
"onboarding_theme_description": "Pasirinkite temos spalvą. Vėliau galite pasikeisti ją nustatymuose.",
"onboarding_user_welcome_description": "Pradėkime!",
"onboarding_welcome_user": "Sveiki atvykę, {user}",
"online": "Prisijungęs",
"only_favorites": "Tik mėgstamiausi",
"open": "Atverti",
"open_in_map_view": "Atverti žemėlapio peržiūroje",
"open_in_openstreetmap": "Atverti per OpenStreetMap",
"open_the_search_filters": "Atidaryti paieškos filtrus",
"options": "Pasirinktys",
"or": "arba",
"organize_into_albums": "Sutvarkyti į albumus",
"organize_into_albums_description": "Sukelti egzistuojančias nuotraukas į albumus naudojant dabartinius sinchronizavimo nustatymus",
"organize_your_library": "Tvarkykite savo biblioteką",
"original": "Originalas",
"other": "Kiti",
"other_devices": "Kiti įrenginiai",
"other_entities": "Kiti subjektai",
"other_variables": "Kiti kintamieji",
"owned": "Nuosavi",
"owner": "Savininkas",
@ -1263,13 +1444,27 @@
"partner_can_access": "{partner} gali naudotis",
"partner_can_access_assets": "Visos jūsų nuotraukos ir vaizdo įrašai, išskyrus archyvuotus ir ištrintus",
"partner_can_access_location": "Vieta, kurioje darytos nuotraukos",
"partner_list_user_photos": "{user} nuotraukos",
"partner_list_view_all": "Žiūrėti viską",
"partner_page_empty_message": "Jūsų nuotraukomis dar nesidalinama su jokiu partneriu.",
"partner_page_no_more_users": "Nėra daugiau naudotojų pridėjimui",
"partner_page_partner_add_failed": "Nepavyko pridėti partnerio",
"partner_page_select_partner": "Pasirinkite partnerį",
"partner_page_shared_to_title": "Dalinamasi su",
"partner_page_stop_sharing_content": "{partner} daugiau nebegalės pasiekti jūsų nuotraukų.",
"partner_sharing": "Dalinimasis su partneriu",
"partners": "Partneriai",
"password": "Slaptažodis",
"password_does_not_match": "Slaptažodis nesutampa",
"password_required": "Reikalingas slaptažodis",
"password_reset_success": "Slaptažodis sėkmingai atkurtas",
"past_durations": {
"days": "Per {days, plural, one {pastarąją dieną} few {# pastarąsias dienas} other {# pastarųjų dienų}}",
"hours": "Per {hours, plural, one {pastarąją valandą} few{# pastarąsias valandas} other {# pastarųjų valandų}}",
"years": "Per {years, plural, one {pastaruosius metus} few{# pastaruosius metus} other {# pastarųjų metų}}"
},
"path": "Kelias",
"pattern": "Raštas",
"pause": "Sustabdyti",
"pause_memories": "Pristabdyti atsiminimus",
"paused": "Sustabdyta",
@ -1278,27 +1473,73 @@
"people_edits_count": "{count, plural, one {Redaguotas # asmuo} few {Redaguoti # asmenys} other {Redaguota # asmenų}}",
"people_feature_description": "Peržiūrėkite nuotraukas ir vaizdo įrašus sugrupuotus pagal asmenis",
"people_sidebar_description": "Rodyti asmenų rodinio nuorodą šoninėje juostoje",
"permanent_deletion_warning": "Ištrynimo visam laikui perspėjimas",
"permanent_deletion_warning_setting_description": "Rodyti perspėjimą kai elementas ištrinamas visam laikui",
"permanently_delete": "Ištrinti visam laikui",
"permanently_delete_assets_count": "Visam laikui ištrinti {count, plural, one {# elementą} few {# elementus} other {# elementų}}",
"permanently_delete_assets_prompt": "Ar tikrai norite visam laikui ištrinti {count, plural, one {šitą elementą?} few {šituos <b>#</b> elementus?} other {šitų <b>#</b> elementų?}} Tuo pačiu {count, plural, one {jis bus pašalintas} other {jie bus pašalinti}} iš albumo.",
"permanently_deleted_asset": "Visiškai ištrinti elementai",
"permanently_deleted_assets_count": "Visam laikui {count, plural, one {ištrintas # elementas} few {ištrinti # elementai} other {ištrinta # elementų}}",
"permission": "Leidimas",
"permission_empty": "Jūsų leidimas neturėtų būti tuščias",
"permission_onboarding_back": "Atgal",
"permission_onboarding_continue_anyway": "Vis tiek tęsti",
"permission_onboarding_get_started": "Pradėkite",
"permission_onboarding_go_to_settings": "Eiti į nustatymus",
"permission_onboarding_permission_denied": "Leidimas nesuteiktas. Norėdami naudoti Immich, suteikite nuotraukų ir vaizdo įrašų leidimus nustatymuose.",
"permission_onboarding_permission_granted": "Leidimas suteiktas! jūs pasiruošę.",
"permission_onboarding_permission_limited": "Leidimai apriboti. Norėdami leisti Immich kurti atsargines kopijas ir tvarkyti visą jūsų galerijos kolekciją, suteikite nuotraukų ir vaizdo įrašų leidimus nustatymuose.",
"permission_onboarding_request": "Immich reikalingas leidimas peržiūrėti jūsų nuotraukas ir vaizdo įrašus.",
"person": "Asmuo",
"person_age_months": "{months, plural, one {# mėnesio} other {# mėnesių}} amžiaus",
"person_age_year_months": "1 metų ir {months, plural, one {# mėnesio} other {# mėnesių}} amžiaus",
"person_age_years": "{years, plural, other {# metų}} amžiaus",
"person_birthdate": "Gimė {date}",
"person_hidden": "{name}{hidden, select, true { (paslėptas)} other {}}",
"photo_shared_all_users": "Panašu, kad savo nuotraukomis pasidalijote su visais naudotojais arba neturite naudotojų, su kuriais galėtumėte jomis pasidalyti.",
"photos": "Nuotraukos",
"photos_and_videos": "Nuotraukos ir vaizdo įrašai",
"photos_count": "{count, plural, one {{count, number} nuotrauka} few {{count, number} nuotraukos} other {{count, number} nuotraukų}}",
"photos_from_previous_years": "Ankstesnių metų nuotraukos",
"pick_a_location": "Išsirinkite vietovę",
"pin_code_changed_successfully": "PIN kodas pakeistas sėkmingai",
"pin_code_reset_successfully": "PIN kodas sėkmingai atstatytas",
"pin_code_setup_successfully": "PIN kodas sėkmingai nustatytas",
"pin_verification": "PIN kodo patvirtinimas",
"place": "Vieta",
"places": "Vietos",
"places_count": "{count, plural, one {{count, number} Vieta} few{{count, number} Vietos} other {{count, number} Vietų}}",
"play": "Paleisti",
"play_memories": "Leisti atsiminimus",
"play_motion_photo": "Rodyti judančias nuotraukas",
"play_or_pause_video": "Rodyti arba sustabdyti vaizdo įrašą",
"please_auth_to_access": "Prašome patvirtinti prisijungimą",
"port": "Portas",
"preferences_settings_subtitle": "Tvarkyti programos nuostatas",
"preferences_settings_title": "Nuostatos",
"preset": "Šablonas",
"preview": "Peržiūra",
"previous": "Buvęs",
"previous_memory": "Buvęs prisiminimas",
"previous_or_next_day": "Dieną pirmyn/atgal",
"previous_or_next_month": "Mėnesį pirmyn/atgal",
"previous_or_next_photo": "Nuotrauką pirmyn/atgal",
"previous_or_next_year": "Metus pirmyn/atgal",
"primary": "Pirminis",
"privacy": "Privatumas",
"profile": "Profilis",
"profile_drawer_app_logs": "Logai",
"profile_drawer_client_out_of_date_major": "Mobili aplikacija jau pasenusios versijos. Prašome atsinaujinti į paskutinę didžiąją versiją.",
"profile_drawer_client_out_of_date_minor": "Mobili aplikacija jau pasenusios versijos. Prašome atsinaujinti į paskutinę mažąją versiją.",
"profile_drawer_client_server_up_to_date": "Klientas ir Serveris yra atnaujinti",
"profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Tik skaitymo rėžimas įgalintas. Ilgai paspauskite vartotojo ikoną išėjimui.",
"profile_drawer_server_out_of_date_major": "Serveris jau yra pasenusios versijos. Prašome atsinaujinti į paskutinę didžiąją versiją.",
"profile_drawer_server_out_of_date_minor": "Serveris jau yra pasenusios versijos. Prašome atsinaujinti į paskutinę mažąją versiją.",
"profile_image_of_user": "{user} profilio nuotrauka",
"profile_picture_set": "Profilio nuotrauka nustatyta.",
"public_album": "Viešas albumas",
"public_share": "Viešas dilinimasis",
"purchase_account_info": "Rėmėjas",
"purchase_activated_subtitle": "Dėkojame, kad remiate Immich ir atviro kodo programinę įrangą",
"purchase_activated_time": "Suaktyvinta {date}",
@ -1313,6 +1554,7 @@
"purchase_failed_activation": "Nepavyko suaktyvinti! Patikrinkite el. paštą, ar turite teisingo produkto koda!",
"purchase_individual_description_1": "Asmeniui",
"purchase_individual_description_2": "Rėmėjo statusas",
"purchase_individual_title": "Asmeninis",
"purchase_input_suggestion": "Turite produkto raktą? Įveskite jį žemiau",
"purchase_license_subtitle": "Įsigykite „Immich“, kad palaikytumėte tolesnį paslaugos vystymą",
"purchase_lifetime_description": "Pirkimas visam gyvenimui",

View File

@ -231,8 +231,6 @@
"admin_password": "Administratora parole",
"administration": "Administrēšana",
"advanced": "Papildu",
"advanced_settings_beta_timeline_subtitle": "Izmēģini jauno lietotnes pieredzi",
"advanced_settings_beta_timeline_title": "Bēta laika skala",
"advanced_settings_log_level_title": "Žurnalēšanas līmenis: {level}",
"advanced_settings_prefer_remote_subtitle": "Dažās ierīcēs sīktēli no ierīcē esošajiem resursiem tiek ielādēti ļoti lēni. Aktivizējiet šo iestatījumu, lai tā vietā ielādētu attālus attēlus.",
"advanced_settings_prefer_remote_title": "Dot priekšroku attāliem attēliem",
@ -328,6 +326,7 @@
"automatic_endpoint_switching_title": "Automātiska URL pārslēgšana",
"autoplay_slideshow": "Automātiska slaidrādes atskaņošana",
"back": "Atpakaļ",
"background_options": "Fona opcijas",
"backup": "Dublēšana",
"backup_album_selection_page_albums_device": "Albumi ierīcē ({count})",
"backup_album_selection_page_albums_tap": "Pieskarieties, lai iekļautu, veiciet dubultskārienu, lai izslēgtu",
@ -335,6 +334,7 @@
"backup_album_selection_page_select_albums": "Atlasīt albumus",
"backup_album_selection_page_selection_info": "Atlases informācija",
"backup_album_selection_page_total_assets": "Unikālo failu kopsumma",
"backup_albums_sync": "Dublēšanas albumu sinhronizācija",
"backup_all": "Viss",
"backup_background_service_backup_failed_message": "Neizdevās dublēt līdzekļus. Notiek atkārtota mēģināšana…",
"backup_background_service_connection_failed_message": "Neizdevās izveidot savienojumu ar serveri. Notiek atkārtota mēģināšana…",
@ -436,6 +436,8 @@
"change_password_form_password_mismatch": "Paroles nesakrīt",
"change_password_form_reenter_new_password": "Atkārtoti ievadīt jaunu paroli",
"change_pin_code": "Nomainīt PIN kodu",
"charging": "Lādē",
"charging_requirement_mobile_backup": "Fona dublēšanai nepieciešams, lai ierīce tiktu lādēta",
"check_corrupt_asset_backup_button": "Veikt pārbaudi",
"choose_matching_people_to_merge": "Izvēlies atbilstošas personas apvienošanai",
"city": "Pilsēta",
@ -601,6 +603,7 @@
"enter_your_pin_code_subtitle": "Ievadi savu PIN kodu, lai piekļūtu slēgtajai mapei",
"error": "Kļūda",
"error_change_sort_album": "Neizdevās nomainīt albuma kārtošanas secību",
"error_loading_partners": "Kļūda, ielādējot partnerus: {error}",
"error_saving_image": "Kļūda: {error}",
"errors": {
"cant_get_faces": "Nevar iegūt sejas",
@ -664,6 +667,7 @@
"favorite": "Izlase",
"favorites": "Izlase",
"favorites_page_no_favorites": "Nav atrasti iecienītākie faili",
"features_in_development": "Izstrādes stadijā esošas funkcijas",
"features_setting_description": "Lietotnes funkciju pārvaldība",
"file_name": "Faila nosaukums",
"file_name_or_extension": "Faila nosaukums vai paplašinājums",
@ -894,6 +898,7 @@
"name_or_nickname": "Vārds vai iesauka",
"network_requirement_photos_upload": "Izmantot mobilo datu pārraidi, lai dublētu fotoattēlus",
"network_requirement_videos_upload": "Izmantot mobilo datu pārraidi, lai dublētu video",
"network_requirements": "Tīkla prasības",
"networking_subtitle": "Pārvaldīt servera galapunktu iestatījumus",
"never": "nekad",
"new_album": "Jauns albums",
@ -1268,6 +1273,7 @@
"show_slideshow_transition": "Rādīt slīdrādes pāreju",
"show_supporter_badge": "Atbalstītāja nozīmīte",
"show_supporter_badge_description": "Rādīt atbalstītāja nozīmīti",
"show_text_search_menu": "Rādīt teksta meklēšanas izvēlni",
"shuffle": "Jaukta",
"sidebar": "Sānu josla",
"sidebar_display_description": "Parādīt saiti uz skatu sānu joslā",

View File

@ -14,6 +14,7 @@
"add_a_location": "Додади локација",
"add_a_name": "Додади име",
"add_a_title": "Додади наслов",
"add_birthday": "Додади роденден",
"add_exclusion_pattern": "Додади шаблон за исклучување",
"add_import_path": "Додади патека за импортирање",
"add_location": "Додади локација",
@ -23,6 +24,9 @@
"add_photos": "Додади слики",
"add_to": "Додади во…",
"add_to_album": "Додади во албум",
"add_to_album_bottom_sheet_added": "Додадено во {album}",
"add_to_albums": "Додади во албуми",
"add_to_albums_count": "Додади во албуми ({count})",
"add_to_shared_album": "Додади во споделен албум",
"add_url": "Додади URL",
"added_to_archive": "Додадено во архива",
@ -30,13 +34,14 @@
"added_to_favorites_count": "Додадени {count, number} во омилени",
"admin": {
"add_exclusion_pattern_description": "Додади шаблони за исклучување. Поддржано е користење на glob со *, **, и ?. За да се игнорираат сите датотеки во кој било директориум именуван \"Raw\", користи \"**/Raw/**\". За да се игнорираат сите датотеки што завршуваат со \".tif\", користи \"**/*.tif\". За да се игнорира апсолутна патека, користи \"/path/to/ignore/**\".",
"admin_user": "Административен Корисник",
"asset_offline_description": "Ова средство од екстерна библиотека веќе не е пронајдено на дискот и е преместено во ѓубре. Ако датотеката била преместена во рамките на библиотеката, проверете ја вашата временска линија за новото соодветно средство. За да го вратите ова средство, осигурајте се дека долунаведената патека може да биде пристапена од Immich и скенирајте ја библиотеката.",
"authentication_settings": "Поставки за автентикација",
"authentication_settings_description": "Управувај со лозинки, OAuth, и други поставки за автентикација",
"authentication_settings_disable_all": "Дали сте сигурни дека сакате да ги исклучите сите методи за најава? Целосно ќе биде оневозможено најавување.",
"authentication_settings_reenable": "За повторно да овозможите, искористете <link>Сервер команда</link>.",
"background_task_job": "Позадински задачи",
"backup_database": "Резервна копија од базата на податоци",
"backup_database": "Креирај резервна копија од базата на податоци",
"backup_database_enable_description": "Овозможи резервни копии од базата на податоци",
"backup_keep_last_amount": "Количина на претходни резервни копии за чување",
"backup_settings": "Поставки за резервни копии",

View File

@ -383,8 +383,6 @@
"admin_password": "प्रशासक पासवर्ड",
"administration": "प्रशासन",
"advanced": "प्रगत",
"advanced_settings_beta_timeline_subtitle": "नवीन ॲप अनुभव वापरून पहा",
"advanced_settings_beta_timeline_title": "बीटा टाईमलाईन",
"advanced_settings_enable_alternate_media_filter_subtitle": "सिंक दरम्यान वैकल्पिक निकषांवर आधारित मीडिया फिल्टर करण्यासाठी हा पर्याय वापरा. ॲप सर्व अल्बम ओळखण्यात समस्या येत असल्यासच वापरा.",
"advanced_settings_enable_alternate_media_filter_title": "[प्रयोगात्मक] उपकरण-आधारित अल्बम सिंक फिल्टर वापरा",
"advanced_settings_log_level_title": "लॉग पातळी: {level}",

View File

@ -373,8 +373,6 @@
"admin_password": "Kata laluan Pentadbir",
"administration": "Pentadbiran",
"advanced": "Lanjutan",
"advanced_settings_beta_timeline_subtitle": "Cuba pengalaman aplikasi baharu",
"advanced_settings_beta_timeline_title": "Garis masa beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Gunakan pilihan ini untuk menapis media semasa penyegerakan berdasarkan kriteria alternatif. Hanya cuba jika anda menghadapi masalah dengan aplikasi mengesan semua album.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTAL] Gunakan penapis penyelarasan album peranti alternatif",
"advanced_settings_log_level_title": "Tahap log: {level}",

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Aktiver logging",
"logging_level_description": "Hvis aktivert, hvilket loggnivå som skal brukes.",
"logging_settings": "Logger",
"machine_learning_availability_checks": "Tilgjengelighetssjekk",
"machine_learning_availability_checks_description": "Automatisk oppdag og velg tilgjengelige maskinlæring-servere",
"machine_learning_availability_checks_enabled": "Aktiver tilgjengelighetssjekk",
"machine_learning_availability_checks_interval": "Sjekkintervall",
"machine_learning_availability_checks_interval_description": "Interval i millisekunder mellom tilgjengelighetssjekk",
"machine_learning_availability_checks_timeout": "Forespørselstimeout",
"machine_learning_availability_checks_timeout_description": "Tidsavbrudd i millisekunder for tilgjengelighetssjekk",
"machine_learning_clip_model": "Clip-modell",
"machine_learning_clip_model_description": "Navnet på en CLIP-modell finnes <link>her</link>. Merk at du må kjøre 'Smart Søk'-jobben på nytt for alle bilder etter at du har endret modell.",
"machine_learning_duplicate_detection": "Duplikatsøk",
@ -387,8 +394,6 @@
"admin_password": "Administrator Passord",
"administration": "Administrasjon",
"advanced": "Avansert",
"advanced_settings_beta_timeline_subtitle": "Prøv den nye app opplevelsen",
"advanced_settings_beta_timeline_title": "Beta tidslinje",
"advanced_settings_enable_alternate_media_filter_subtitle": "Bruk denne innstillingen for å filtrere mediefiler under synkronisering basert på alternative kriterier. Bruk kun denne innstillingen dersom man opplever problemer med at applikasjonen ikke oppdager alle album.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTELT] Bruk alternativ enhet album synk filter",
"advanced_settings_log_level_title": "Loggnivå: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "Er du sikker på at du vil fjerne {user}?",
"album_search_not_found": "Ingen album ble funnet som traff ditt søk",
"album_share_no_users": "Ser ut til at du har delt dette albumet med alle brukere, eller du ikke har noen brukere å dele det med.",
"album_summary": "Oppsummering av album",
"album_updated": "Album oppdatert",
"album_updated_setting_description": "Motta e-postvarsling når et delt album får nye filer",
"album_user_left": "Forlot {album}",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Objekt(er) gjenopprettet",
"asset_skipped": "Hoppet over",
"asset_skipped_in_trash": "I søppelbøtten",
"asset_trashed": "Objekt slettet",
"asset_troubleshoot": "Feilsøk objekt",
"asset_uploaded": "Lastet opp",
"asset_uploading": "Laster opp…",
"asset_viewer_settings_subtitle": "Endre dine visningsinnstillinger for galleriet",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Autoavspilling av lysbildefremvisning",
"back": "Tilbake",
"back_close_deselect": "Tilbake, lukk eller fjern merking",
"background_backup_running_error": "Bakgrunnsbackup kjører, kan ikke starte manuell backup",
"background_location_permission": "Bakgrunnstillatelse for plassering",
"background_location_permission_content": "For å bytte nettverk når du kjører i bakgrunnen, må Immich *alltid* ha presis posisjonstilgang slik at appen kan lese Wi-Fi-nettverkets navn",
"background_options": "Bakgrunnsinnstillinger",
"backup": "Sikkerhetskopiering",
"backup_album_selection_page_albums_device": "Album på enhet ({count})",
"backup_album_selection_page_albums_tap": "Trykk for å inkludere, dobbelttrykk for å ekskludere",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Velg album",
"backup_album_selection_page_selection_info": "Valginformasjon",
"backup_album_selection_page_total_assets": "Totalt antall unike objekter",
"backup_albums_sync": "Synkronisering av sikkerhetskopialbum",
"backup_all": "Alle",
"backup_background_service_backup_failed_message": "Sikkerhetskopiering av objekter feilet. Prøver på nytt…",
"backup_background_service_connection_failed_message": "Tilkobling til server feilet. Prøver på nytt…",
@ -654,6 +665,8 @@
"change_pin_code": "Endre PIN kode",
"change_your_password": "Endre passordet ditt",
"changed_visibility_successfully": "Endret synlighet vellykket",
"charging": "Lading",
"charging_requirement_mobile_backup": "Bakgrunnsbackup krever at enheten lader",
"check_corrupt_asset_backup": "Sjekk etter korrupte backupobjekter",
"check_corrupt_asset_backup_button": "Utfør sjekk",
"check_corrupt_asset_backup_description": "Kjør denne sjekken kun over Wi-Fi og når alle objekter har blitt lastet opp. Denne sjekken kan ta noen minutter.",
@ -740,6 +753,7 @@
"create_user": "Opprett Bruker",
"created": "Opprettet",
"created_at": "Laget",
"creating_linked_albums": "Oppretter sammenkoblede albumer...",
"crop": "Beskjær",
"curated_object_page_title": "Ting",
"current_device": "Nåværende enhet",
@ -889,7 +903,9 @@
"error": "Feil",
"error_change_sort_album": "Feilet ved endring av sorteringsrekkefølge på albumer",
"error_delete_face": "Feil ved sletting av ansikt fra aktivia",
"error_getting_places": "Feil ved henting av steder",
"error_loading_image": "Feil ved lasting av bilde",
"error_loading_partners": "Feil ved lasting av partnere: {error}",
"error_saving_image": "Feil: {error}",
"error_tag_face_bounding_box": "Feil ved merking av ansikt - klarte ikke å få koordinatene på omrisset",
"error_title": "Feil - Noe gikk galt",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "Ingen favorittobjekter funnet",
"feature_photo_updated": "Fremhevet bilde oppdatert",
"features": "Funksjoner",
"features_in_development": "Funksjoner under utvikling",
"features_setting_description": "Administrerer funksjoner for appen",
"file_name": "Filnavn",
"file_name_or_extension": "Filnavn eller filtype",
@ -1218,6 +1235,7 @@
"local": "Lokal",
"local_asset_cast_failed": "Kan ikke caste et bilde som ikke er lastet opp til serveren",
"local_assets": "Lokale objekter",
"local_media_summary": "Oppsummering av lokale media",
"local_network": "Lokalt nettverk",
"local_network_sheet_info": "Appen vil koble til serveren via denne URL-en når du bruker det angitte Wi-Fi-nettverket",
"location_permission": "Stedstillatelse",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Skriv inn lengdegrad her",
"lock": "Lås",
"locked_folder": "Låst mappe",
"log_detail_title": "Loggdetaljer",
"log_out": "Logg ut",
"log_out_all_devices": "Logg ut fra alle enheter",
"logged_in_as": "Logget inn som {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Passord oppdatert",
"logout_all_device_confirmation": "Er du sikker på at du vil logge ut av alle enheter?",
"logout_this_device_confirmation": "Er du sikker på at du vil logge ut av denne enheten?",
"logs": "Logger",
"longitude": "Lengdegrad",
"look": "Se",
"loop_videos": "Gjenta Videoer",
@ -1301,6 +1321,7 @@
"mark_as_read": "Merk som lest",
"marked_all_as_read": "Merket alle som lest",
"matches": "Samsvarende",
"matching_assets": "Matchende objekter",
"media_type": "Mediatype",
"memories": "Minner",
"memories_all_caught_up": "Alt utført",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Navn eller kallenavn",
"network_requirement_photos_upload": "Bruk mobildata for backup av bilder",
"network_requirement_videos_upload": "Bruk mobildata for backup av videoer",
"network_requirements": "Nettverkskrav",
"network_requirements_updated": "Nettverkskrav endret, resetter backupkø",
"networking_settings": "Nettverk",
"networking_subtitle": "Administrer serverendepunkt-innstillinger",
@ -1351,6 +1373,7 @@
"new_person": "Ny person",
"new_pin_code": "Ny PIN-kode",
"new_pin_code_subtitle": "Dette er første gang du åpner den låste mappen. Lag en PIN-kode for å sikre tilgangen til denne siden",
"new_timeline": "Ny tidslinje",
"new_user_created": "Ny bruker opprettet",
"new_version_available": "NY VERSJON TILGJENGELIG",
"newest_first": "Nyeste først",
@ -1364,20 +1387,25 @@
"no_assets_message": "KLIKK FOR Å LASTE OPP DITT FØRSTE BILDE",
"no_assets_to_show": "Ingen objekter å vise",
"no_cast_devices_found": "Ingen caste-enheter oppdaget",
"no_checksum_local": "Ingen sjekksum tilgjengelig - Kan ikke hente lokale objekter",
"no_checksum_remote": "Ingen sjekksum tilgjengelig - Kan ikke hente eksterne objekter",
"no_duplicates_found": "Ingen duplikater ble funnet.",
"no_exif_info_available": "Ingen EXIF-informasjon tilgjengelig",
"no_explore_results_message": "Last opp flere bilder for å utforske samlingen din.",
"no_favorites_message": "Legg til favoritter for å finne dine beste bilder og videoer raskt",
"no_libraries_message": "Opprett et eksternt bibliotek for å se bildene og videoene dine",
"no_local_assets_found": "Ingen lokale objekter funnet med denne sjekksummen",
"no_locked_photos_message": "Bilder og videoer i den låste mappen er skjult og vil ikke vises når du blar i biblioteket.",
"no_name": "Ingen navn",
"no_notifications": "Ingen varsler",
"no_people_found": "Ingen samsvarende personer funnet",
"no_places": "Ingen steder",
"no_remote_assets_found": "Ingen eksterne objekter funnet med denne sjekksummen",
"no_results": "Ingen resultater",
"no_results_description": "Prøv et synonym eller mer generelt søkeord",
"no_shared_albums_message": "Opprett et album for å dele bilder og videoer med personer i nettverket ditt",
"no_uploads_in_progress": "Ingen opplasting pågår",
"not_available": "Ikke tilgjengelig",
"not_in_any_album": "Ikke i noe album",
"not_selected": "Ikke valgt",
"note_apply_storage_label_to_previously_uploaded assets": "Merk: For å bruke lagringsetiketten på tidligere opplastede filer, kjør",
@ -1588,6 +1616,7 @@
"regenerating_thumbnails": "Regenererer miniatyrbilder",
"remote": "Eksternt",
"remote_assets": "Eksterne objekter",
"remote_media_summary": "Oppsummering av eksterne media",
"remove": "Fjern",
"remove_assets_album_confirmation": "Er du sikker på at du fil slette {count, plural, one {# objekt} other {# objekter}} fra albumet?",
"remove_assets_shared_link_confirmation": "Er du sikker på at du vil slette {count, plural, one {# objekt} other {# objekter}} fra den delte lenken?",
@ -1863,6 +1892,7 @@
"show_slideshow_transition": "Vis overgang til lysbildefremvisning",
"show_supporter_badge": "Supportermerke",
"show_supporter_badge_description": "Vis et supportermerke",
"show_text_search_menu": "Vis tekstsøk meny",
"shuffle": "Bland",
"sidebar": "Sidefelt",
"sidebar_display_description": "Vis en lenke for visningen i sidefeltet",
@ -1893,6 +1923,7 @@
"stacktrace": "Stakkspor",
"start": "Start",
"start_date": "Startdato",
"start_date_before_end_date": "Startdato må være før sluttdato",
"state": "Fylke",
"status": "Status",
"stop_casting": "Stopp casting",
@ -2095,5 +2126,6 @@
"yes": "Ja",
"you_dont_have_any_shared_links": "Du har ingen delte lenker",
"your_wifi_name": "Ditt Wi-Fi-navn",
"zoom_image": "Zoom Bilde"
"zoom_image": "Zoom Bilde",
"zoom_to_bounds": "Zoom til grensene"
}

View File

@ -123,6 +123,10 @@
"logging_enable_description": "Logboek inschakelen",
"logging_level_description": "Indien ingeschakeld, welk logniveau er wordt gebruikt.",
"logging_settings": "Logging",
"machine_learning_availability_checks_description": "Automatisch detecteren en selecteren van beschikbare machine learning servers",
"machine_learning_availability_checks_enabled": "Activeer beschikbaarheid controles",
"machine_learning_availability_checks_interval": "Controleinterval",
"machine_learning_availability_checks_interval_description": "Interval in milliseconden tussen beschikbaarheid checks",
"machine_learning_clip_model": "CLIP model",
"machine_learning_clip_model_description": "De naam van een CLIP-model dat <link>hier</link> is vermeld. Let op: je moet de 'Slim Zoeken -taak opnieuw uitvoeren voor alle afbeeldingen wanneer je een model wijzigt.",
"machine_learning_duplicate_detection": "Duplicaat detectie",
@ -387,8 +391,6 @@
"admin_password": "Beheerder wachtwoord",
"administration": "Beheer",
"advanced": "Geavanceerd",
"advanced_settings_beta_timeline_subtitle": "Probeer de nieuwe app-ervaring",
"advanced_settings_beta_timeline_title": "Beta tijdlijn",
"advanced_settings_enable_alternate_media_filter_subtitle": "Gebruik deze optie om media te filteren tijdens de synchronisatie op basis van alternatieve criteria. Gebruik dit enkel als de app problemen heeft met het detecteren van albums.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTEEL] Gebruik een alternatieve album synchronisatie filter",
"advanced_settings_log_level_title": "Logniveau: {level}",
@ -425,6 +427,7 @@
"album_remove_user_confirmation": "Weet je zeker dat je {user} wilt verwijderen?",
"album_search_not_found": "Geen albums gevonden die aan je zoekopdracht voldoen",
"album_share_no_users": "Het lijkt erop dat je dit album met alle gebruikers hebt gedeeld, of dat je geen gebruikers hebt om mee te delen.",
"album_summary": "Album samenvatting",
"album_updated": "Album bijgewerkt",
"album_updated_setting_description": "Ontvang een e-mailmelding wanneer een gedeeld album nieuwe items heeft",
"album_user_left": "{album} verlaten",
@ -496,6 +499,8 @@
"asset_restored_successfully": "Item succesvol hersteld",
"asset_skipped": "Overgeslagen",
"asset_skipped_in_trash": "In prullenbak",
"asset_trashed": "Asset verwijderd",
"asset_troubleshoot": "Asset probleemoplossing",
"asset_uploaded": "Geüpload",
"asset_uploading": "Uploaden…",
"asset_viewer_settings_subtitle": "Beheer je instellingen voor galerijweergave",
@ -529,8 +534,10 @@
"autoplay_slideshow": "Diavoorstelling automatisch afspelen",
"back": "Terug",
"back_close_deselect": "Terug, sluiten of deselecteren",
"background_backup_running_error": "Achtergrond backup draait, handmatige backup kan niet worden gestart",
"background_location_permission": "Achtergrond locatie toestemming",
"background_location_permission_content": "Om van netwerk te wisselen terwijl de app op de achtergrond draait, heeft Immich *altijd* toegang tot de exacte locatie nodig om de naam van het WiFi-netwerk te kunnen lezen",
"background_options": "Achtergrond opties",
"backup": "Back-up",
"backup_album_selection_page_albums_device": "Albums op apparaat ({count})",
"backup_album_selection_page_albums_tap": "Tik om op te nemen, dubbel tik om uit te sluiten",
@ -538,6 +545,7 @@
"backup_album_selection_page_select_albums": "Selecteer albums",
"backup_album_selection_page_selection_info": "Selectie info",
"backup_album_selection_page_total_assets": "Totaal unieke items",
"backup_albums_sync": "Backup albums synchronisatie",
"backup_all": "Alle",
"backup_background_service_backup_failed_message": "Fout bij het back-uppen van de items. Opnieuw proberen…",
"backup_background_service_connection_failed_message": "Fout bij het verbinden met de server. Opnieuw proberen…",
@ -654,6 +662,8 @@
"change_pin_code": "Wijzig PIN code",
"change_your_password": "Wijzig je wachtwoord",
"changed_visibility_successfully": "Zichtbaarheid succesvol gewijzigd",
"charging": "Opladen",
"charging_requirement_mobile_backup": "Achtergrond backup vereist dat het apparaat wordt opgeladen",
"check_corrupt_asset_backup": "Controleer op corrupte back-ups van items",
"check_corrupt_asset_backup_button": "Controle uitvoeren",
"check_corrupt_asset_backup_description": "Voer deze controle alleen uit via WiFi en nadat alle items zijn geback-upt. De procedure kan een paar minuten duren.",
@ -740,6 +750,7 @@
"create_user": "Gebruiker aanmaken",
"created": "Aangemaakt",
"created_at": "Aangemaakt",
"creating_linked_albums": "Gekoppelde albums worden aangemaakt",
"crop": "Bijsnijden",
"curated_object_page_title": "Dingen",
"current_device": "Huidig apparaat",
@ -1054,6 +1065,7 @@
"favorites_page_no_favorites": "Geen favoriete items gevonden",
"feature_photo_updated": "Uitgelichte afbeelding bijgewerkt",
"features": "Functies",
"features_in_development": "Functies in ontwikkeling",
"features_setting_description": "Beheer de app functies",
"file_name": "Bestandsnaam",
"file_name_or_extension": "Bestandsnaam of extensie",
@ -1218,6 +1230,7 @@
"local": "Lokaal",
"local_asset_cast_failed": "Kan geen item casten die nog niet geüpload is naar de server",
"local_assets": "Lokale Items",
"local_media_summary": "Lokale media samenvatting",
"local_network": "Lokaal netwerk",
"local_network_sheet_info": "De app maakt verbinding met de server via deze URL wanneer het opgegeven WiFi-netwerk wordt gebruikt",
"location_permission": "Locatietoestemming",
@ -1229,6 +1242,7 @@
"location_picker_longitude_hint": "Voer hier je lengtegraad in",
"lock": "Vergrendel",
"locked_folder": "Vergrendelde map",
"log_detail_title": "Log details",
"log_out": "Uitloggen",
"log_out_all_devices": "Uitloggen op alle apparaten",
"logged_in_as": "Ingelogd als {user}",
@ -1259,6 +1273,7 @@
"login_password_changed_success": "Wachtwoord succesvol bijgewerkt",
"logout_all_device_confirmation": "Weet je zeker dat je wilt uitloggen op alle apparaten?",
"logout_this_device_confirmation": "Weet je zeker dat je wilt uitloggen op dit apparaat?",
"logs": "Logs",
"longitude": "Lengtegraad",
"look": "Uiterlijk",
"loop_videos": "Video's herhalen",
@ -1301,6 +1316,7 @@
"mark_as_read": "Markeren als gelezen",
"marked_all_as_read": "Allen gemarkeerd als gelezen",
"matches": "Overeenkomsten",
"matching_assets": "Overeenkomende assets",
"media_type": "Mediatype",
"memories": "Herinneringen",
"memories_all_caught_up": "Je bent helemaal bij",
@ -1341,6 +1357,7 @@
"name_or_nickname": "Naam of gebruikersnaam",
"network_requirement_photos_upload": "Gebruik mobiele data voor de backup van foto's",
"network_requirement_videos_upload": "Gebruik mobiele data voor de backups van video's",
"network_requirements": "Netwerk vereisten",
"network_requirements_updated": "Netwerkeisen zijn gewijzigd, back-upwachtrij wordt opnieuw ingesteld",
"networking_settings": "Netwerk",
"networking_subtitle": "Beheer de instellingen voor de server-URL",
@ -1351,6 +1368,7 @@
"new_person": "Nieuw persoon",
"new_pin_code": "Nieuwe PIN code",
"new_pin_code_subtitle": "Dit is de eerste keer dat u de vergrendelde map opent. Stel een pincode in om deze pagina veilig te openen",
"new_timeline": "Nieuwe tijdlijn",
"new_user_created": "Nieuwe gebruiker aangemaakt",
"new_version_available": "NIEUWE VERSIE BESCHIKBAAR",
"newest_first": "Nieuwste eerst",

View File

@ -28,6 +28,8 @@
"add_to_album": "Legg til i album",
"add_to_album_bottom_sheet_added": "Lagt til i {album}",
"add_to_album_bottom_sheet_already_exists": "Allereie i {album}",
"add_to_albums": "Legg til i album",
"add_to_albums_count": "Legg til i album ({count})",
"add_to_shared_album": "Legg til i delt album",
"add_url": "Legg til URL",
"added_to_archive": "Lagt til i arkiv",
@ -45,6 +47,7 @@
"backup_database": "Lag tryggingskopi av database",
"backup_database_enable_description": "Aktiver tryggingskopiering av database",
"backup_keep_last_amount": "Antal tryggingskopiar å behalde",
"backup_onboarding_1_description": "sikkerheitskopi i skya eller på eit anna fysisk sted.",
"backup_onboarding_2_description": "lokale kopiar på andre einingar. Dette inkluderer hovudfilene og backup av desse filene lokalt.",
"backup_onboarding_3_description": "fullstendige kopiar av dine data, inkludert originalfilene. Dette inkluderer 1 utomhus kopi og 2 lokale kopiar.",
"backup_onboarding_description": "Ein <backblaze-link>3-2-1 backup-strategi</backblaze-link> tilrådast for å verne dataa dine. Du bør ha kopiar av dei opplasta bileta/videoane dine samt Immich-databasen, slik at du har ei fleirdelt backup-løysing.",
@ -78,6 +81,7 @@
"image_format_description": "WebP gjev mindre filstorleik enn JPEG, men er treigare å lage.",
"image_fullsize_description": "Bilete i full storleik utan metadata, i bruk når zooma inn",
"image_fullsize_enabled": "Skru på generering av bilete i full storleik",
"image_fullsize_enabled_description": "Generer bilete i full storleik for ikkje web-tilpassa formatar. Når \"Foretrekk",
"image_fullsize_quality_description": "Kvalitet på bilete i full storleik frå 1-100. Høgare er betre, men gjev større filer.",
"image_fullsize_title": "Innstillingar for bilete i full storleik",
"image_prefer_embedded_preview": "Bruk helst innebygd førehandsvisning",
@ -118,6 +122,9 @@
"logging_enable_description": "Aktiver loggføring",
"logging_level_description": "Når aktivert, kva loggnivå å bruke.",
"logging_settings": "Logging",
"machine_learning_availability_checks_description": "Automatiser oppdaging og prioritet av tilgjengelege maskinlærings-serverar",
"machine_learning_availability_checks_interval": "Sjekk intervall",
"machine_learning_availability_checks_timeout_description": "Utløpstid i millisekund for tilgjengelegheitssjekk",
"machine_learning_clip_model": "CLIP modell",
"machine_learning_clip_model_description": "Namnet på ein CLIP modell finst <link>her</link>. Merk at du må køyre 'Smart Søk'-jobben på nytt for alle bilete etter du har forandra modell.",
"machine_learning_duplicate_detection": "Duplikatdeteksjon",
@ -139,6 +146,7 @@
"machine_learning_min_detection_score": "Minimum deteksjonsresultat",
"machine_learning_min_detection_score_description": "Minimum tillitspoeng for at eit ansikt skal bli oppdaga, på ein skala frå 0 til 1. Lågare verdiar vil oppdage fleire ansikt, men kan føre til feilaktige treff.",
"machine_learning_min_recognized_faces": "Minimum gjenkjende ansikt",
"machine_learning_min_recognized_faces_description": "Minste tal på gjenkjende fjes for å opprette ein person. Aukar ein dette, vert ansiktsgjenkjenninga meir presis, på bekostning av auka sjanse for at ansikt ikkje vert tileigna ein person.",
"machine_learning_settings": "Innstillingar for maskinlæring",
"machine_learning_settings_description": "Administrer maskinlæringsfunksjonar og innstillingar",
"machine_learning_smart_search": "Smart Søk",
@ -154,6 +162,7 @@
"map_settings": "Kart",
"map_settings_description": "Endre kartinnstillingar",
"map_style_description": "URL til eit style.json-karttema",
"memory_generate_job": "Minne-generering",
"metadata_extraction_job": "Hent ut metadata",
"metadata_extraction_job_description": "Hent ut metadata frå kvart bilete, slik som GPS, ansikt og oppløysing",
"metadata_faces_import_setting": "Skru på import av ansikt",
@ -161,6 +170,17 @@
"metadata_settings": "Metadata Innstillinger",
"metadata_settings_description": "Endre metadata-innstillingar",
"migration_job": "Migrasjon",
"migration_job_description": "Overfør miniatyrbilete for bilete og ansikt til den nyaste mappestrukturen",
"nightly_tasks_cluster_faces_setting_description": "Køyr ansiktsgjenkjenning på nyleg identifiserte ansikt",
"nightly_tasks_database_cleanup_setting_description": "Fjern gamal, utgått data frå databasen",
"nightly_tasks_generate_memories_setting": "Generer minner",
"nightly_tasks_generate_memories_setting_description": "Lag nye minner frå bilete",
"nightly_tasks_missing_thumbnails_setting": "Generer manglande miniatyrbilete",
"nightly_tasks_missing_thumbnails_setting_description": "Set bilete utan miniatyrbilete i kø for generering av miniatyrbilete",
"nightly_tasks_settings": "Innstillingar for nattlege jobbar",
"nightly_tasks_settings_description": "Handsam nattlege jobbar",
"nightly_tasks_start_time_setting": "Starttid",
"nightly_tasks_start_time_setting_description": "Tidspunktet serveren køyrer nattlege jobbar",
"notification_email_from_address": "Frå adresse",
"notification_email_test_email_failed": "Mislukka sending av test-e-post, sjekk konfigurasjonen din",
"notification_email_test_email_sent": "Det vart sendt ei test-melding til {email}. Sjekk e-posten din.",

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Uruchom zapisywanie logów",
"logging_level_description": "Kiedy włączone, jakiego poziomu użyć.",
"logging_settings": "Rejestrowanie logów",
"machine_learning_availability_checks": "Sprawdzanie dostępności",
"machine_learning_availability_checks_description": "Automatyczne wykrywaj i preferuj dostępne serwery uczenia maszynowego",
"machine_learning_availability_checks_enabled": "Włącz sprawdzanie dostępności",
"machine_learning_availability_checks_interval": "Częstotliwość sprawdzania",
"machine_learning_availability_checks_interval_description": "Odstęp czasu w milisekundach między sprawdzeniami dostępności",
"machine_learning_availability_checks_timeout": "Upłynął czas żądania",
"machine_learning_availability_checks_timeout_description": "Limit czasu żądania w milisekundach dla sprawdzania dostępności",
"machine_learning_clip_model": "Model CLIP",
"machine_learning_clip_model_description": "Nazwa modelu CLIP jest wymieniona <link>tutaj</link>. Zwróć uwagę, że po zmianie modelu musisz ponownie uruchomić zadanie 'Smart Search' dla wszystkich obrazów.",
"machine_learning_duplicate_detection": "Wykrywanie Duplikatów",
@ -233,7 +240,7 @@
"oauth_storage_quota_default": "Domyślna ilość miejsca w magazynie (GiB)",
"oauth_storage_quota_default_description": "Limit w GiB do wykorzystania, gdy nie podano żadnej wartości.",
"oauth_timeout": "Upłynął czas żądania",
"oauth_timeout_description": "Limit czasu żądania (w milisekundach)",
"oauth_timeout_description": "Limit czasu żądania w milisekundach",
"password_enable_description": "Zaloguj używając e-mail i hasła",
"password_settings": "Logowanie Hasłem",
"password_settings_description": "Zarządzaj ustawieniami logowania hasłem",
@ -387,8 +394,6 @@
"admin_password": "Hasło Administratora",
"administration": "Administracja",
"advanced": "Zaawansowane",
"advanced_settings_beta_timeline_subtitle": "Wypróbuj nową funkcjonalność aplikacji",
"advanced_settings_beta_timeline_title": "Beta-Timeline",
"advanced_settings_enable_alternate_media_filter_subtitle": "Użyj tej opcji do filtrowania mediów podczas synchronizacji alternatywnych kryteriów. Używaj tylko wtedy gdy aplikacja ma problemy z wykrywaniem wszystkich albumów.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERYMENTALNE] Użyj alternatywnego filtra synchronizacji albumu",
"advanced_settings_log_level_title": "Poziom szczegółowości dziennika: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "Na pewno chcesz usunąć {user}?",
"album_search_not_found": "Nie znaleziono albumów pasujących do Twojego wyszukiwania",
"album_share_no_users": "Wygląda na to, że ten album albo udostępniono wszystkim użytkownikom, albo nie ma komu go udostępnić.",
"album_summary": "Podsumowanie albumu",
"album_updated": "Album zaktualizowany",
"album_updated_setting_description": "Otrzymaj powiadomienie e-mail, gdy do udostępnionego Ci albumu zostaną dodane nowe zasoby",
"album_user_left": "Opuszczono {album}",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Zasób został pomyślnie przywrócony",
"asset_skipped": "Pominięto",
"asset_skipped_in_trash": "W koszu",
"asset_trashed": "Zasób wrzucono do kosza",
"asset_troubleshoot": "Rozwiązywanie problemów z zasobami",
"asset_uploaded": "Przesłano",
"asset_uploading": "Przesyłanie…",
"asset_viewer_settings_subtitle": "Zarządzaj ustawieniami przeglądarki galerii",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Automatyczne odtwarzanie pokazu slajdów",
"back": "Wstecz",
"back_close_deselect": "Wróć, zamknij lub odznacz",
"background_backup_running_error": "Tworzenie kopii zapasowej w tle jest obecnie w toku, nie można rozpocząć ręcznego tworzenia kopii zapasowej",
"background_location_permission": "Uprawnienia do lokalizacji w tle",
"background_location_permission_content": "Aby móc przełączać sieć podczas pracy w tle, Immich musi *zawsze* mieć dostęp do dokładnej lokalizacji, aby aplikacja mogła odczytać nazwę sieci Wi-Fi",
"background_options": "Opcje w tle",
"backup": "Kopia zapasowa",
"backup_album_selection_page_albums_device": "Albumy na urządzeniu ({count})",
"backup_album_selection_page_albums_tap": "Stuknij, aby włączyć, stuknij dwukrotnie, aby wykluczyć",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Wybierz albumy",
"backup_album_selection_page_selection_info": "Info o wyborze",
"backup_album_selection_page_total_assets": "Łącznie unikalnych plików",
"backup_albums_sync": "Synchronizacja kopii zapasowych albumów",
"backup_all": "Wszystkie",
"backup_background_service_backup_failed_message": "Nie udało się wykonać kopii zapasowej zasobów. Ponowna próba…",
"backup_background_service_connection_failed_message": "Nie udało się połączyć z serwerem. Ponowna próba…",
@ -654,6 +665,8 @@
"change_pin_code": "Zmień kod PIN",
"change_your_password": "Zmień swoje hasło",
"changed_visibility_successfully": "Pomyślnie zmieniono widoczność",
"charging": "Ładowanie",
"charging_requirement_mobile_backup": "Tworzenie kopii zapasowej w tle wymaga by urządzenie było podłączone do ładowania",
"check_corrupt_asset_backup": "Sprawdź, czy kopie zapasowe zasobów nie są uszkodzone",
"check_corrupt_asset_backup_button": "Wykonaj sprawdzenie",
"check_corrupt_asset_backup_description": "Uruchom sprawdzenie tylko przez Wi-Fi i po utworzeniu kopii zapasowej wszystkich zasobów. Procedura może potrwać kilka minut.",
@ -740,6 +753,7 @@
"create_user": "Stwórz użytkownika",
"created": "Utworzono",
"created_at": "Utworzony",
"creating_linked_albums": "Tworzenie połączonych albumów...",
"crop": "Przytnij",
"curated_object_page_title": "Rzeczy",
"current_device": "Obecne urządzenie",
@ -888,8 +902,10 @@
"enter_your_pin_code_subtitle": "Wprowadź twój kod PIN, aby uzyskać dostęp do folderu zablokowanego",
"error": "Błąd",
"error_change_sort_album": "Nie udało się zmienić kolejności sortowania albumów",
"error_delete_face": "Wystąpił błąd podczas usuwania twarzy z zasobów",
"error_delete_face": "Błąd podczas usuwania twarzy z zasobów",
"error_getting_places": "Błąd podczas pozyskiwania lokalizacji",
"error_loading_image": "Błąd podczas ładowania zdjęcia",
"error_loading_partners": "Błąd podczas ładowania partnerów: {error}",
"error_saving_image": "Błąd: {error}",
"error_tag_face_bounding_box": "Błąd przy dodawaniu etykiety dla tej twarzy - nie może uzyskać współrzędnych granicznych",
"error_title": "Błąd - Coś poszło nie tak",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "Nie znaleziono ulubionych zasobów",
"feature_photo_updated": "Zdjęcie główne zaktualizowane pomyślnie",
"features": "Funkcje",
"features_in_development": "Funkcje w fazie rozwoju",
"features_setting_description": "Zarządzaj funkcjami aplikacji",
"file_name": "Nazwa pliku",
"file_name_or_extension": "Nazwie lub rozszerzeniu pliku",
@ -1218,6 +1235,7 @@
"local": "Lokalny",
"local_asset_cast_failed": "Nie można strumieniować zasobu, który nie został przesłany na serwer",
"local_assets": "Zasoby lokalne",
"local_media_summary": "Podsumowanie lokalnych mediów",
"local_network": "Sieć lokalna",
"local_network_sheet_info": "Aplikacja połączy się z serwerem za pośrednictwem tego adresu URL podczas korzystania z określonej sieci Wi-Fi",
"location_permission": "Zezwolenie na lokalizację",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Wpisz tutaj swoją długość geograficzną",
"lock": "Zablokuj",
"locked_folder": "Folder zablokowany",
"log_detail_title": "Szczegóły dziennika",
"log_out": "Wyloguj",
"log_out_all_devices": "Wyloguj ze Wszystkich Urządzeń",
"logged_in_as": "Zalogowano jako {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Hasło zostało zmienione",
"logout_all_device_confirmation": "Czy na pewno chcesz wylogować się ze wszystkich urządzeń?",
"logout_this_device_confirmation": "Czy na pewno chcesz wylogować to urządzenie?",
"logs": "Logi",
"longitude": "Długość geograficzna",
"look": "Wygląd",
"loop_videos": "Powtarzaj filmy",
@ -1301,6 +1321,7 @@
"mark_as_read": "Zaznacz jako odczytane",
"marked_all_as_read": "Zaznaczono wszystkie jako przeczytane",
"matches": "Powiązania",
"matching_assets": "Pasujące zasoby",
"media_type": "Typ zasobu",
"memories": "Wspomnienia",
"memories_all_caught_up": "Wszystko złapane",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Nazwa lub pseudonim",
"network_requirement_photos_upload": "Używaj danych komórkowych do tworzenia kopii zapasowych zdjęć",
"network_requirement_videos_upload": "Używaj danych komórkowych do tworzenia kopii zapasowych filmów",
"network_requirements": "Wymagania sieciowe",
"network_requirements_updated": "Zmieniono wymagania sieciowe, resetowanie kolejki kopii zapasowych",
"networking_settings": "Sieć",
"networking_subtitle": "Zarządzaj ustawieniami punktu końcowego serwera",
@ -1351,6 +1373,7 @@
"new_person": "Nowa osoba",
"new_pin_code": "Nowy kod PIN",
"new_pin_code_subtitle": "Jest to pierwszy raz, kiedy wchodzisz do folderu zablokowanego. Utwórz kod PIN, aby bezpiecznie korzystać z tej strony",
"new_timeline": "Nowa oś czasu",
"new_user_created": "Pomyślnie stworzono nowego użytkownika",
"new_version_available": "NOWA WERSJA DOSTĘPNA",
"newest_first": "Od najnowszych",
@ -1364,20 +1387,25 @@
"no_assets_message": "KLIKNIJ, ABY WYSŁAĆ PIERWSZE ZDJĘCIE",
"no_assets_to_show": "Brak zasobów do pokazania",
"no_cast_devices_found": "Nie znaleziono urządzeń do przesyłania strumieniowego",
"no_checksum_local": "Brak sumy kontrolnej - nie można pobrać lokalnych zasobów",
"no_checksum_remote": "Brak sumy kontrolnej - nie można pobrać zdalnego zasobu",
"no_duplicates_found": "Nie znaleziono duplikatów.",
"no_exif_info_available": "Nie znaleziono informacji exif",
"no_explore_results_message": "Prześlij więcej zdjęć, aby przeglądać swój zbiór.",
"no_favorites_message": "Dodaj ulubione aby szybko znaleźć swoje najlepsze zdjęcia i filmy",
"no_libraries_message": "Stwórz bibliotekę zewnętrzną, aby przeglądać swoje zdjęcia i filmy",
"no_local_assets_found": "Nie znaleziono żadnych lokalnych zasobów o tej sumie kontrolnej",
"no_locked_photos_message": "Zdjęcia i filmy w folderze zablokowanym są ukryte i nie będą wyświetlane podczas przeglądania biblioteki.",
"no_name": "Brak Nazwy",
"no_notifications": "Brak powiadomień",
"no_people_found": "Brak pasujących osób",
"no_places": "Brak miejsc",
"no_remote_assets_found": "Nie znaleziono żadnych zdalnych zasobów o tej sumie kontrolnej",
"no_results": "Brak wyników",
"no_results_description": "Spróbuj użyć synonimu lub bardziej ogólnego słowa kluczowego",
"no_shared_albums_message": "Stwórz album aby udostępnić zdjęcia i filmy osobom w Twojej sieci",
"no_uploads_in_progress": "Brak przesyłań w toku",
"not_available": "Nie dotyczy",
"not_in_any_album": "Bez albumu",
"not_selected": "Nie wybrano",
"note_apply_storage_label_to_previously_uploaded assets": "Uwaga: Aby przypisać etykietę magazynowania do wcześniej przesłanych zasobów, uruchom",
@ -1588,6 +1616,7 @@
"regenerating_thumbnails": "Regenerowanie miniatur",
"remote": "Zdalny",
"remote_assets": "Zasoby zdalne",
"remote_media_summary": "Podsumowanie mediów zdalnych",
"remove": "Usuń",
"remove_assets_album_confirmation": "Czy na pewno chcesz usunąć {count, plural, one {# zasób} few {# zasoby} other {# zasobów}} z albumu?",
"remove_assets_shared_link_confirmation": "Czy na pewno chcesz usunąć {count, plural, one {# zasób} other {# zasoby}} z tego udostępnionego linku?",
@ -1863,6 +1892,7 @@
"show_slideshow_transition": "Pokaż przejście pokazu slajdów",
"show_supporter_badge": "Odznaka wspierającego",
"show_supporter_badge_description": "Pokaż odznakę wspierającego",
"show_text_search_menu": "Pokaż menu wyszukiwania tekstowego",
"shuffle": "Losuj",
"sidebar": "Panel boczny",
"sidebar_display_description": "Wyświetl link do widoku w pasku bocznym",
@ -1893,6 +1923,7 @@
"stacktrace": "Ślad stosu",
"start": "Start",
"start_date": "Od dnia",
"start_date_before_end_date": "Data początkowa musi być wcześniejsza niż data końcowa",
"state": "Województwo",
"status": "Status",
"stop_casting": "Zatrzymaj strumieniowanie",
@ -2095,5 +2126,6 @@
"yes": "Tak",
"you_dont_have_any_shared_links": "Nie masz żadnych udostępnionych linków",
"your_wifi_name": "Twoja nazwa Wi-Fi",
"zoom_image": "Powiększ obraz"
"zoom_image": "Powiększ obraz",
"zoom_to_bounds": "Powiększ do krawędzi"
}

View File

@ -387,8 +387,6 @@
"admin_password": "Palavra-passe do administrador",
"administration": "Administração",
"advanced": "Avançado",
"advanced_settings_beta_timeline_subtitle": "Experimente as novas funcionalidades da aplicação",
"advanced_settings_beta_timeline_title": "Linha temporal da versão Beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Utilize esta definição para filtrar ficheiros durante a sincronização baseada em critérios alternativos. Utilize apenas se a aplicação estiver com problemas a detetar todos os álbuns.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Utilizar um filtro alternativo de sincronização de álbuns em dispositivos",
"advanced_settings_log_level_title": "Nível de registo: {level}",

View File

@ -387,8 +387,6 @@
"admin_password": "Senha do administrador",
"administration": "Administração",
"advanced": "Avançado",
"advanced_settings_beta_timeline_subtitle": "Teste a nova interface do aplicativo",
"advanced_settings_beta_timeline_title": "Linha do tempo Beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Use esta opção para filtrar mídias durante a sincronização com base em critérios alternativos. Tente esta opção somente se o aplicativo estiver com problemas para detectar todos os álbuns.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Utilizar filtro alternativo de sincronização de álbum de dispositivo",
"advanced_settings_log_level_title": "Nível de log: {level}",
@ -425,6 +423,7 @@
"album_remove_user_confirmation": "Tem certeza de que deseja remover {user}?",
"album_search_not_found": "Não há álbum que corresponda à sua pesquisa",
"album_share_no_users": "Parece que você já compartilhou este álbum com todos os usuários ou não há nenhum usuário para compartilhar.",
"album_summary": "Resumo do álbum",
"album_updated": "Álbum atualizado",
"album_updated_setting_description": "Receba uma notificação por e-mail quando um álbum compartilhado tiver novos recursos",
"album_user_left": "Saiu do álbum {album}",
@ -496,6 +495,8 @@
"asset_restored_successfully": "Arquivo restaurado",
"asset_skipped": "Ignorado",
"asset_skipped_in_trash": "Na lixeira",
"asset_trashed": "Arquivo enviado para a lixeira",
"asset_troubleshoot": "Diagnóstico do arquivo",
"asset_uploaded": "Enviado",
"asset_uploading": "Enviando…",
"asset_viewer_settings_subtitle": "Gerenciar as configurações do visualizador da galeria",
@ -529,8 +530,10 @@
"autoplay_slideshow": "Apresentação de slides automática",
"back": "Voltar",
"back_close_deselect": "Voltar, fechar ou desmarcar",
"background_backup_running_error": "Não é possível iniciar o backup manual agora pois o backup em segundo plano já está sendo executado",
"background_location_permission": "Permissão de localização em segundo plano",
"background_location_permission_content": "Para que seja possível trocar o endereço quando estiver executando em segundo plano, o Immich deve *sempre* ter a permissão de localização precisa para que o aplicativo consiga ler o nome da rede Wi-Fi",
"background_options": "Opções de Plano de Fundo",
"backup": "Backup",
"backup_album_selection_page_albums_device": "Álbuns no dispositivo ({count})",
"backup_album_selection_page_albums_tap": "Toque para incluir, toque duas vezes para excluir",
@ -538,6 +541,7 @@
"backup_album_selection_page_select_albums": "Selecionar álbuns",
"backup_album_selection_page_selection_info": "Informações da Seleção",
"backup_album_selection_page_total_assets": "Total de recursos exclusivos",
"backup_albums_sync": "Backup de sincronização de álbuns",
"backup_all": "Todos",
"backup_background_service_backup_failed_message": "Falha ao fazer backup. Tentando novamente…",
"backup_background_service_connection_failed_message": "Falha na conexão com o servidor. Tentando novamente…",
@ -654,6 +658,8 @@
"change_pin_code": "Alterar código PIN",
"change_your_password": "Alterar sua senha",
"changed_visibility_successfully": "Visibilidade alterada com sucesso",
"charging": "Carregando",
"charging_requirement_mobile_backup": "Backups em plano de fundo requerem que o dispositivo esteja sendo carregado",
"check_corrupt_asset_backup": "Verifique se há backups corrompidos",
"check_corrupt_asset_backup_button": "Verificar",
"check_corrupt_asset_backup_description": "Execute esta verificação somente em uma rede Wi-Fi e quando o backup de todos os arquivos já estiver concluído. O processo demora alguns minutos.",
@ -740,6 +746,7 @@
"create_user": "Criar usuário",
"created": "Criado",
"created_at": "Criado em",
"creating_linked_albums": "Criando álbuns relacionados...",
"crop": "Cortar",
"curated_object_page_title": "Objetos",
"current_device": "Dispositivo atual",
@ -889,7 +896,9 @@
"error": "Erro",
"error_change_sort_album": "Falha ao alterar a ordem de exibição",
"error_delete_face": "Erro ao remover face do arquivo",
"error_getting_places": "Erro ao buscar os locais",
"error_loading_image": "Erro ao carregar a página",
"error_loading_partners": "Erro ao carregar parceiros: {error}",
"error_saving_image": "Erro: {error}",
"error_tag_face_bounding_box": "Erro ao marcar o rosto - não foi possível localizar o rosto",
"error_title": "Erro - Algo deu errado",
@ -1054,6 +1063,7 @@
"favorites_page_no_favorites": "Nenhuma mídia favorita encontrada",
"feature_photo_updated": "Foto principal atualizada",
"features": "Funcionalidades",
"features_in_development": "Funções em desenvolvimento",
"features_setting_description": "Gerenciar as funcionalidades da aplicação",
"file_name": "Nome do arquivo",
"file_name_or_extension": "Nome do arquivo ou extensão",
@ -1218,6 +1228,7 @@
"local": "Local",
"local_asset_cast_failed": "Não é possível transmitir um arquivo que não foi enviado ao servidor",
"local_assets": "Arquivos no dispositivo",
"local_media_summary": "Resumo das mídias locais",
"local_network": "Rede local",
"local_network_sheet_info": "O aplicativo irá se conectar ao servidor através deste endereço quando estiver na rede Wi-Fi especificada",
"location_permission": "Permissão de localização",
@ -1229,6 +1240,7 @@
"location_picker_longitude_hint": "Digite a longitude",
"lock": "Trancar",
"locked_folder": "Pasta com senha",
"log_detail_title": "Detalhes do Log",
"log_out": "Sair",
"log_out_all_devices": "Sair de todos dispositivos",
"logged_in_as": "Usuário atual: {user}",
@ -1259,6 +1271,7 @@
"login_password_changed_success": "Senha atualizada com sucesso",
"logout_all_device_confirmation": "Tem certeza de que deseja sair de todos os dispositivos?",
"logout_this_device_confirmation": "Tem certeza de que deseja sair deste dispositivo?",
"logs": "Logs",
"longitude": "Longitude",
"look": "Estilo",
"loop_videos": "Repetir vídeos",
@ -1301,6 +1314,7 @@
"mark_as_read": "Marcar como lido",
"marked_all_as_read": "Tudo marcado como lido",
"matches": "Correspondências",
"matching_assets": "Arquivos encontrados",
"media_type": "Tipo de mídia",
"memories": "Memórias",
"memories_all_caught_up": "Finalizamos por hoje",
@ -1341,6 +1355,7 @@
"name_or_nickname": "Nome ou apelido",
"network_requirement_photos_upload": "Use a rede móvel para enviar fotos",
"network_requirement_videos_upload": "Use a rede móvel para enviar vídeos",
"network_requirements": "Requerimentos de Rede",
"network_requirements_updated": "Requerimentos de rede alterados, reiniciando a fila de envio",
"networking_settings": "Conexões",
"networking_subtitle": "Gerencie as conexões ao servidor",
@ -1351,6 +1366,7 @@
"new_person": "Nova Pessoa",
"new_pin_code": "Novo código PIN",
"new_pin_code_subtitle": "Esta é a primeira vez que está acessando a pasta com senha. Crie um código PIN para acessar esta página de forma segura",
"new_timeline": "Nova Linha do Tempo",
"new_user_created": "Novo usuário criado",
"new_version_available": "NOVA VERSÃO DISPONÍVEL",
"newest_first": "Mais recente primeiro",
@ -1364,20 +1380,25 @@
"no_assets_message": "CLIQUE PARA ENVIAR SUA PRIMEIRA FOTO",
"no_assets_to_show": "Não há arquivos para exibir",
"no_cast_devices_found": "Nenhum dispositivo encontrado",
"no_checksum_local": "Nenhum checksum disponível - não foi possível carregar os arquivos locais",
"no_checksum_remote": "Nenhum checksum disponível - não foi possível carregar os arquivos remotos",
"no_duplicates_found": "Nenhuma duplicidade foi encontrada.",
"no_exif_info_available": "Sem informações exif disponíveis",
"no_explore_results_message": "Envie mais fotos para explorar sua coleção.",
"no_favorites_message": "Adicione aos favoritos para encontrar suas melhores fotos e vídeos rapidamente",
"no_libraries_message": "Crie uma biblioteca externa para ver suas fotos e vídeos",
"no_local_assets_found": "Nenhum arquivo local foi encontrado com este checksum",
"no_locked_photos_message": "Fotos e vídeos na pasta com senha são ocultos e não serão exibidos enquanto explora ou pesquisa na biblioteca.",
"no_name": "Sem Nome",
"no_notifications": "Nenhuma notificação",
"no_people_found": "Nenhuma pessoa encontrada",
"no_places": "Sem lugares",
"no_remote_assets_found": "Nenhum arquivo remoto foi encontrado com este checksum",
"no_results": "Sem resultados",
"no_results_description": "Tente um sinônimo ou uma palavra-chave mais geral",
"no_shared_albums_message": "Crie um álbum para compartilhar fotos e vídeos com pessoas em sua rede",
"no_uploads_in_progress": "Nenhum envio em progresso",
"not_available": "N/A",
"not_in_any_album": "Fora de álbum",
"not_selected": "Não selecionado",
"note_apply_storage_label_to_previously_uploaded assets": "Nota: Para aplicar o rótulo de armazenamento a arquivos enviados anteriormente, execute o",
@ -1588,6 +1609,7 @@
"regenerating_thumbnails": "Regenerando miniaturas",
"remote": "Remoto",
"remote_assets": "Arquivos Remotos",
"remote_media_summary": "Resumo das mídias remotas",
"remove": "Remover",
"remove_assets_album_confirmation": "Tem certeza de que deseja remover {count, plural, one {# arquivo} other {# arquivos}} do álbum?",
"remove_assets_shared_link_confirmation": "Tem certeza de que deseja remover {count, plural, one {# arquivo} other {# arquivos}} desse link compartilhado?",
@ -1863,6 +1885,7 @@
"show_slideshow_transition": "Usar transições no modo de apresentação",
"show_supporter_badge": "Insígnia de apoiador",
"show_supporter_badge_description": "Mostrar uma insígnia de apoiador",
"show_text_search_menu": "Mostrar menu de pesquisa por texto",
"shuffle": "Aleatório",
"sidebar": "Barra lateral",
"sidebar_display_description": "Exibir um link para a visualização na barra lateral",
@ -2095,5 +2118,6 @@
"yes": "Sim",
"you_dont_have_any_shared_links": "Não há links compartilhados",
"your_wifi_name": "Nome do seu Wi-Fi",
"zoom_image": "Ampliar imagem"
"zoom_image": "Ampliar imagem",
"zoom_to_bounds": "Ampliar para preencher"
}

View File

@ -123,6 +123,11 @@
"logging_enable_description": "Activează înregistrarea log-urilor",
"logging_level_description": "Dacă setarea este activată, înregistrează evenimentele cu nivelul de utilizat.",
"logging_settings": "Înregistrare",
"machine_learning_availability_checks": "Verificări disponibilitate",
"machine_learning_availability_checks_description": "Detectează automat si preferă serverele cu învațare automată",
"machine_learning_availability_checks_enabled": "Activează verificare disponibilitate",
"machine_learning_availability_checks_interval": "Interval verificare",
"machine_learning_availability_checks_interval_description": "Interval in milisecunde între verificările de disponibilitate",
"machine_learning_clip_model": "Model CLIP",
"machine_learning_clip_model_description": "Numele unui model CLIP listat <link>aici</link>. Rețineți că trebuie să rulați din nou funcția „Smart Search” pentru toate imaginile la schimbarea unui model.",
"machine_learning_duplicate_detection": "Detectare Duplicate",
@ -387,8 +392,6 @@
"admin_password": "Parolă Administrator",
"administration": "Administrare",
"advanced": "Avansat",
"advanced_settings_beta_timeline_subtitle": "Încearcă noua experiență în aplicație",
"advanced_settings_beta_timeline_title": "Cronologie beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Utilizați această opțiune pentru a filtra conținutul media în timpul sincronizării pe baza unor criterii alternative. Încercați numai dacă întâmpinați probleme cu aplicația la detectarea tuturor albumelor.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Utilizați filtrul alternativ de sincronizare a albumelor de pe dispozitiv",
"advanced_settings_log_level_title": "Nivel log: {level}",
@ -425,6 +428,7 @@
"album_remove_user_confirmation": "Ești sigur că dorești eliminarea {user}?",
"album_search_not_found": "Nu s-au găsit albume care să corespundă căutării dumneavoastră",
"album_share_no_users": "Se pare că ai partajat acest album cu toți utilizatorii sau nu ai niciun utilizator cu care să-l partajezi.",
"album_summary": "Rezumat album",
"album_updated": "Album actualizat",
"album_updated_setting_description": "Primiți o notificare prin e-mail când un album partajat are elemente noi",
"album_user_left": "A părăsit {album}",
@ -482,7 +486,7 @@
"asset_description_updated": "Descrierea resursei a fost actualizată",
"asset_filename_is_offline": "Resursa {filename} este offline",
"asset_has_unassigned_faces": "Resursa are fețe neatribuite",
"asset_hashing": "Calculare amprentă digitală",
"asset_hashing": "Calculare amprentă digitală",
"asset_list_group_by_sub_title": "Grupare după",
"asset_list_layout_settings_dynamic_layout_title": "Aspect dinamic",
"asset_list_layout_settings_group_automatically": "Automat",
@ -496,6 +500,8 @@
"asset_restored_successfully": "Date restaurate cu succes",
"asset_skipped": "Sărit",
"asset_skipped_in_trash": "În coșul de gunoi",
"asset_trashed": "Resursă ștearsă",
"asset_troubleshoot": "Depanare resursă",
"asset_uploaded": "Încărcat",
"asset_uploading": "Se incarcă…",
"asset_viewer_settings_subtitle": "Gestionați setările de vizualizare a galeriei",
@ -528,6 +534,7 @@
"autoplay_slideshow": "Derulare slideshow automat",
"back": "Înapoi",
"back_close_deselect": "Înapoi, închidere sau deselectare",
"background_backup_running_error": "Procesul de backup în fundal este activ, nu se poate porni backup manual",
"background_location_permission": "Permisiune locație în fundal",
"background_location_permission_content": "Pentru a putea schimba rețeaua activă în fundal, Immich are nevoie de acces *permanent* la locația precisă pentru a citi numele rețelei Wi-Fi",
"backup": "Backup",

View File

@ -7,7 +7,7 @@
"action_common_update": "Обновить",
"actions": "Действия",
"active": "Выполняется",
"activity": "Активность",
"activity": "Действия",
"activity_changed": "Активность {enabled, select, true {включена} other {отключена}}",
"add": "Добавить",
"add_a_description": "Добавить описание",
@ -26,8 +26,8 @@
"add_tag": "Добавить тег",
"add_to": "Добавить в…",
"add_to_album": "Добавить в альбом",
"add_to_album_bottom_sheet_added": "Добавлено в {album}",
"add_to_album_bottom_sheet_already_exists": "Уже в {album}",
"add_to_album_bottom_sheet_added": "Добавлено в альбом {album}",
"add_to_album_bottom_sheet_already_exists": "Уже в альбоме {album}",
"add_to_album_toggle": "Переключить выделение для альбома {album}",
"add_to_albums": "Добавить в альбомы",
"add_to_albums_count": "Добавить в альбомы ({count})",
@ -65,9 +65,9 @@
"confirm_reprocess_all_faces": "Вы уверены, что хотите повторно определить все лица? Будут также удалены имена со всех лиц.",
"confirm_user_password_reset": "Вы действительно хотите сбросить пароль пользователя {user}?",
"confirm_user_pin_code_reset": "Вы действительно хотите сбросить PIN-код пользователя {user}?",
"create_job": "Создать задание",
"create_job": "Создать задачу",
"cron_expression": "Расписание (выражение планировщика cron)",
"cron_expression_description": "Частота и время выполнения задания в формате планировщика cron. Воспользуйтесь при необходимости визуальным редактором <link>Crontab Guru</link>",
"cron_expression_description": "Частота и время выполнения задачи в формате планировщика cron. Воспользуйтесь при необходимости визуальным редактором <link>Crontab Guru</link>",
"cron_expression_presets": "Расписание (предустановленные варианты)",
"disable_login": "Отключить вход",
"duplicate_detection_job_description": "Запускает определение похожих изображений при помощи машинного зрения (зависит от умного поиска)",
@ -100,11 +100,11 @@
"image_thumbnail_description": "Маленькая миниатюра с удаленными метаданными, используемая при просмотре групп фотографий, таких как основная временная шкала",
"image_thumbnail_quality_description": "Качество миниатюр от 1 до 100. Чем выше качество, тем лучше, но при этом создаются файлы большего размера и может снизиться скорость отклика приложения.",
"image_thumbnail_title": "Настройки миниатюр",
"job_concurrency": "Параллельная обработка задания - {job}",
"job_created": "Задание создано",
"job_concurrency": "Число параллельных потоков задачи {job}",
"job_created": "Задача создана",
"job_not_concurrency_safe": "Эта задача не обеспечивает безопасность параллельности выполнения.",
"job_settings": "Настройки заданий",
"job_settings_description": "Управление параллельной обработкой заданий",
"job_settings": "Настройки задач",
"job_settings_description": "Управление параллельностью выполнения задач",
"job_status": "Состояние выполнения задач",
"jobs_delayed": "{jobCount, plural, one {# отложена} other {# отложено}}",
"jobs_failed": "{jobCount, plural, other {# не удалось выполнить}}",
@ -123,20 +123,27 @@
"logging_enable_description": "Включить ведение журнала",
"logging_level_description": "Если включено, выберите желаемый уровень журналирования.",
"logging_settings": "Ведение журнала",
"machine_learning_availability_checks": "Проверка доступности",
"machine_learning_availability_checks_description": "Автоматически определять и использовать доступные серверы машинного обучения",
"machine_learning_availability_checks_enabled": "Включить проверку доступности",
"machine_learning_availability_checks_interval": "Интервал проверки",
"machine_learning_availability_checks_interval_description": "Интервал в миллисекундах между проверками",
"machine_learning_availability_checks_timeout": "Тайм-аут запроса",
"machine_learning_availability_checks_timeout_description": "Время ожидания ответа сервера в миллисекундах для определения доступности",
"machine_learning_clip_model": "CLIP модель",
"machine_learning_clip_model_description": "Названия моделей CLIP размещены <link>здесь</link>. Обратите внимание, что при изменении модели необходимо заново запустить задачу «Интеллектуальный поиск» для всех изображений.",
"machine_learning_clip_model_description": "Названия доступных CLIP моделей размещены <link>здесь</link>.\nПри изменении модели необходимо заново запустить задачу «Интеллектуальный поиск» для всех объектов.",
"machine_learning_duplicate_detection": "Поиск дубликатов",
"machine_learning_duplicate_detection_enabled": "Включить обнаружение дубликатов",
"machine_learning_duplicate_detection_enabled_description": "Если этот параметр отключен, абсолютно идентичные файлы всё равно будут удалены из дубликатов.",
"machine_learning_duplicate_detection_setting_description": "Используйте встраивания CLIP для поиска вероятных дубликатов",
"machine_learning_enabled": "Включите машинное обучение",
"machine_learning_enabled_description": "При отключении, все функции ML будут отключены независимо от следующих параметров.",
"machine_learning_duplicate_detection_enabled_description": "Если этот параметр отключён, абсолютно идентичные файлы всё равно не будут загружаться.",
"machine_learning_duplicate_detection_setting_description": "Использование CLIP моделей для выявления возможных дубликатов",
"machine_learning_enabled": "Включить машинное обучение",
"machine_learning_enabled_description": "При выключении будут отключены все функции ML независимо от следующих параметров.",
"machine_learning_facial_recognition": "Распознавание лиц",
"machine_learning_facial_recognition_description": "Обнаруживать, распознавать и группировать лица на изображениях",
"machine_learning_facial_recognition_model": "Модель для распознавания лиц",
"machine_learning_facial_recognition_model_description": "Модели перечислены в порядке убывания размера. Большие модели работают медленнее и используют больше памяти, но дают лучшие результаты. Обратите внимание, что при смене модели необходимо повторно запустить задание распознавания лиц для всех изображений.",
"machine_learning_facial_recognition_model_description": "Модели перечислены в порядке убывания их размера. Большие модели работают медленнее и используют больше памяти, но дают лучшие результаты. При смене модели необходимо повторно запустить задачу распознавания лиц для всех изображений.",
"machine_learning_facial_recognition_setting": "Включить функцию распознавания лиц",
"machine_learning_facial_recognition_setting_description": "Если отключить эту функцию, изображения не будут кодироваться для распознавания лиц и не будут заполнять раздел Люди на обзорной странице.",
"machine_learning_facial_recognition_setting_description": "При отключении этой функции изображения не будут кодироваться для распознавания лиц, и не будет заполняться раздел Люди.",
"machine_learning_max_detection_distance": "Максимальное различие изображений",
"machine_learning_max_detection_distance_description": "Максимальное различие между двумя изображениями, чтобы считать их дубликатами, в диапазоне 0,001-0,1. Более высокие значения позволяют обнаружить больше дубликатов, но могут привести к ложным срабатываниям.",
"machine_learning_max_recognition_distance": "Порог распознавания",
@ -146,13 +153,13 @@
"machine_learning_min_recognized_faces": "Минимум распознанных лиц",
"machine_learning_min_recognized_faces_description": "Минимальное количество распознанных лиц для создания человека. Увеличение этого параметра делает распознавание лиц более точным, но при этом увеличивается вероятность того, что лицо не будет присвоено человеку.",
"machine_learning_settings": "Настройки машинного обучения",
"machine_learning_settings_description": "Управление функциями и настройками машинного обучения",
"machine_learning_settings_description": "Управление функциями и настройками машинного обучения (ML)",
"machine_learning_smart_search": "Интеллектуальный поиск",
"machine_learning_smart_search_description": "Семантический поиск изображений с использованием вложений CLIP",
"machine_learning_smart_search_description": "Семантический (контекстный) поиск объектов с использованием CLIP моделей",
"machine_learning_smart_search_enabled": "Включить интеллектуальный поиск",
"machine_learning_smart_search_enabled_description": "Если этот параметр отключен, изображения не будут кодироваться для интеллектуального поиска.",
"machine_learning_smart_search_enabled_description": "При отключении этой функции изображения не будут кодироваться для интеллектуального поиска.",
"machine_learning_url_description": "URL-адрес сервера машинного обучения. Если указано несколько, запросы будут отправляться по очереди на каждый, пока от одного из них не будет получен успешный ответ. Серверы, которые не отвечают, будут временно игнорироваться до тех пор, пока не станут снова доступны.",
"manage_concurrency": "Управление параллельностью заданий",
"manage_concurrency": "Управление параллельностью",
"manage_log_settings": "Управление настройками журнала",
"map_dark_style": "Тёмный стиль",
"map_enable_description": "Включить функции карты",
@ -170,9 +177,9 @@
"memory_cleanup_job": "Очистка воспоминаний",
"memory_generate_job": "Создание воспоминаний",
"metadata_extraction_job": "Извлечение метаданных",
"metadata_extraction_job_description": "Извлекает метаданные из каждого файла, такие как местоположение, лица и разрешение",
"metadata_extraction_job_description": "Извлечение метаданных из файлов, таких как местоположение, лица и разрешение",
"metadata_faces_import_setting": "Включить импорт лиц",
"metadata_faces_import_setting_description": "Импорт лиц из изображений EXIF-данных и файлов sidecar",
"metadata_faces_import_setting_description": "Импорт лиц из EXIF-данных и файлов sidecar",
"metadata_settings": "Настройки метаданных",
"metadata_settings_description": "Управление настройками метаданных",
"migration_job": "Миграция",
@ -247,7 +254,7 @@
"reset_settings_to_default": "Сброс настроек до значений по умолчанию",
"reset_settings_to_recent_saved": "Не сохранённые изменения сброшены к последним сохраненным значениям",
"scanning_library": "Сканирование библиотеки",
"search_jobs": "Поиск заданий…",
"search_jobs": "Поиск задач…",
"send_welcome_email": "Отправить приветственное письмо",
"server_external_domain_settings": "Внешний домен",
"server_external_domain_settings_description": "Домен для публичных ссылок, включая http(s)://",
@ -269,7 +276,7 @@
"storage_template_migration": "Применение шаблона хранилища",
"storage_template_migration_description": "Применяет текущий <link>{template}</link> к ранее загруженным объектам",
"storage_template_migration_info": "Расширения файлов всегда будут сохраняться в нижнем регистре. Изменения в шаблоне будут применяться только к новым ресурсам. Чтобы применить шаблон к ранее загруженным ресурсам, запустите <link>{job}</link>.",
"storage_template_migration_job": "Задание по применению шаблона хранилища",
"storage_template_migration_job": "Задача по применению шаблона хранилища",
"storage_template_more_details": "Для получения дополнительной информации об этой функции обратитесь к разделам документации <template-link>Шаблон хранилища</template-link> и <implications-link>Структура хранения файлов</implications-link>",
"storage_template_onboarding_description_v2": "Если эта функция включена, она автоматически организует файлы на основе заданного пользователем шаблона. Для получения дополнительной информации обратитесь к <link>документации</link>.",
"storage_template_path_length": "Примерный предел длины пути: <b>{length, number}</b>/{limit, number}",
@ -387,8 +394,6 @@
"admin_password": "Пароль администратора",
"administration": "Управление сервером",
"advanced": "Расширенные",
"advanced_settings_beta_timeline_subtitle": "Попробуйте новый функционал приложения",
"advanced_settings_beta_timeline_title": "Бета-версия временной шкалы",
"advanced_settings_enable_alternate_media_filter_subtitle": "Подбор объектов для синхронизации на основе альтернативных критериев. Пробуйте включать только в том случае, если в приложении есть проблемы с обнаружением всех альбомов.",
"advanced_settings_enable_alternate_media_filter_title": "[ЭКСПЕРИМЕНТАЛЬНО] Использование альтернативного способа синхронизации альбомов на устройстве",
"advanced_settings_log_level_title": "Уровень логирования: {level}",
@ -403,8 +408,8 @@
"advanced_settings_sync_remote_deletions_subtitle": "Автоматически удалять или восстанавливать объекты на этом устройстве, когда это действие выполняется через веб-интерфейс",
"advanced_settings_sync_remote_deletions_title": "[ЭКСПЕРИМЕНТАЛЬНО] Синхронизация удаления объектов",
"advanced_settings_tile_subtitle": "Расширенные настройки",
"advanced_settings_troubleshooting_subtitle": "Включить расширенные возможности для решения проблем",
"advanced_settings_troubleshooting_title": "Решение проблем",
"advanced_settings_troubleshooting_subtitle": "Включить расширенные возможности для диагностики и решения проблем",
"advanced_settings_troubleshooting_title": "Режим диагностики",
"age_months": "{months, plural, one {# месяц} many {# месяцев} other {# месяца}}",
"age_year_months": "1 год {months, plural, one {# месяц} many {# месяцев} other {# месяца}}",
"age_years": "{years, plural, one {# год} many {# лет} other {# года}}",
@ -420,11 +425,12 @@
"album_leave": "Покинуть альбом?",
"album_leave_confirmation": "Вы уверены, что хотите покинуть {album}?",
"album_name": "Название альбома",
"album_options": "Параметры альбома",
"album_options": "Действия с альбомом",
"album_remove_user": "Удалить пользователя?",
"album_remove_user_confirmation": "Вы уверены, что хотите удалить пользователя {user}?",
"album_search_not_found": "Не найдено альбомов по вашему запросу",
"album_share_no_users": "Нет доступных пользователей, с которыми можно поделиться альбомом.",
"album_summary": "Информация об альбоме",
"album_updated": "Альбом обновлён",
"album_updated_setting_description": "Получать уведомление по электронной почте при добавлении новых объектов в общий альбом",
"album_user_left": "Вы покинули {album}",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Объект успешно восстановлен",
"asset_skipped": "Пропущено",
"asset_skipped_in_trash": "В корзине",
"asset_trashed": "Объект удалён",
"asset_troubleshoot": "Данные для диагностики",
"asset_uploaded": "Загружено",
"asset_uploading": "Загрузка…",
"asset_viewer_settings_subtitle": "Настройка параметров отображения",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Автовоспроизведение слайдшоу",
"back": "Назад",
"back_close_deselect": "Назад, закрыть или отменить выбор",
"background_backup_running_error": "Выполняется фоновое резервное копирование, запуск вручную пока невозможен",
"background_location_permission": "Доступ к местоположению в фоне",
"background_location_permission_content": "Чтобы считывать имя Wi-Fi сети в фоне, приложению *всегда* необходим доступ к точному местоположению устройства",
"background_options": "Параметры фоновых задач",
"backup": "Резервное копирование",
"backup_album_selection_page_albums_device": "Альбомы на устройстве ({count})",
"backup_album_selection_page_albums_tap": "Нажмите, чтобы включить, дважды, чтобы исключить",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Выбор альбомов",
"backup_album_selection_page_selection_info": "Выбранные альбомы",
"backup_album_selection_page_total_assets": "Всего уникальных объектов",
"backup_albums_sync": "Синхронизация альбомов",
"backup_all": "Все",
"backup_background_service_backup_failed_message": "Не удалось выполнить резервное копирование. Повторная попытка…",
"backup_background_service_connection_failed_message": "Не удалось подключиться к серверу. Повторная попытка…",
@ -654,6 +665,8 @@
"change_pin_code": "Изменить PIN-код",
"change_your_password": "Изменить свой пароль",
"changed_visibility_successfully": "Видимость успешно изменена",
"charging": "На зарядке",
"charging_requirement_mobile_backup": "Запускать резервное копирование только во время зарядки",
"check_corrupt_asset_backup": "Проверка поврежденных резервных копий",
"check_corrupt_asset_backup_button": "Проверить",
"check_corrupt_asset_backup_description": "Запускайте проверку только через Wi-Fi и после создания резервной копии всех объектов. Операция может занять несколько минут.",
@ -681,8 +694,8 @@
"color": "Цвет",
"color_theme": "Цветовая тема",
"comment_deleted": "Комментарий удалён",
"comment_options": "Параметры комментариев",
"comments_and_likes": "Комментарии и лайки",
"comment_options": "Действия с комментарием",
"comments_and_likes": "Комментарии и отметки \"нравится\"",
"comments_are_disabled": "Комментарии отключены",
"common_create_new_album": "Создать новый альбом",
"common_server_error": "Пожалуйста, проверьте подключение к сети и убедитесь, что ваш сервер доступен, а версии приложения и сервера — совместимы.",
@ -705,7 +718,7 @@
"control_bottom_app_bar_delete_from_immich": "Удалить из Immich",
"control_bottom_app_bar_delete_from_local": "Удалить с устройства",
"control_bottom_app_bar_edit_location": "Изменить место",
"control_bottom_app_bar_edit_time": "Изменить дату",
"control_bottom_app_bar_edit_time": "Изменить дату и время",
"control_bottom_app_bar_share_link": "Поделиться ссылкой",
"control_bottom_app_bar_share_to": "Поделиться с",
"control_bottom_app_bar_trash_from_immich": "В корзину",
@ -740,6 +753,7 @@
"create_user": "Создать пользователя",
"created": "Создан",
"created_at": "Создан",
"creating_linked_albums": "Создание связанных альбомов...",
"crop": "Обрезать",
"curated_object_page_title": "Предметы",
"current_device": "Текущее устройство",
@ -809,7 +823,7 @@
"discovered_devices": "Обнаруженные устройства",
"dismiss_all_errors": "Сбросить все ошибки",
"dismiss_error": "Сбросить ошибку",
"display_options": "Настройки отображения",
"display_options": "Дополнительно",
"display_order": "Порядок отображения",
"display_original_photos": "Отображение оригинальных фотографий",
"display_original_photos_setting_description": "Открывать при просмотре оригинал фотографии вместо миниатюры, если исходный формат поддерживается браузером. Возможно снижение скорости отображения фотографий.",
@ -841,11 +855,11 @@
"duplicates": "Дубликаты",
"duplicates_description": "Просмотрите найденные дубликаты и в каждой группе укажите, какие объекты оставить, а какие удалить",
"duration": "Продолжительность",
"edit": "Редактировать",
"edit_album": "Редактировать альбом",
"edit": "Изменить",
"edit_album": "Изменить альбом",
"edit_avatar": "Изменить аватар",
"edit_birthday": "Изменить дату рождения",
"edit_date": "редактировать дату",
"edit_date": "Изменить дату",
"edit_date_and_time": "Изменить дату и время",
"edit_date_and_time_action_prompt": "Дата и время изменены у {count} объектов",
"edit_date_and_time_by_offset": "Изменить дату по смещению",
@ -857,14 +871,14 @@
"edit_import_path": "Изменить путь импорта",
"edit_import_paths": "Изменить путь импорта",
"edit_key": "Изменить ключ",
"edit_link": "Редактировать ссылку",
"edit_location": "Редактировать местоположение",
"edit_link": "Изменить ссылку",
"edit_location": "Изменить местоположение",
"edit_location_action_prompt": "Места изменены ({count} шт.)",
"edit_location_dialog_title": "Местоположение",
"edit_name": "Редактировать имя",
"edit_people": "Редактировать людей",
"edit_name": "Изменить имя",
"edit_people": "Изменить людей",
"edit_tag": "Изменить тег",
"edit_title": "Редактировать Заголовок",
"edit_title": "Изменить заголовок",
"edit_user": "Изменить пользователя",
"edited": "Отредактировано",
"editor": "Редактор",
@ -878,7 +892,7 @@
"empty_trash": "Очистить корзину",
"empty_trash_confirmation": "Вы действительно хотите очистить корзину? Все объекты в ней будут навсегда удалены из Immich.\nВы не сможете отменить это действие!",
"enable": "Включить",
"enable_backup": "Включить резервное копирование",
"enable_backup": "Активировать",
"enable_biometric_auth_description": "Введите свой PIN-код для включения биометрической аутентификации",
"enabled": "Включено",
"end_date": "Дата окончания",
@ -889,7 +903,9 @@
"error": "Ошибка",
"error_change_sort_album": "Не удалось изменить порядок сортировки альбома",
"error_delete_face": "Ошибка при удалении лица из объекта",
"error_getting_places": "Ошибка получения мест",
"error_loading_image": "Ошибка при загрузке изображения",
"error_loading_partners": "Ошибка загрузки партнёров: {error}",
"error_saving_image": "Ошибка: {error}",
"error_tag_face_bounding_box": "Ошибка при добавлении отметки - не удалось получить координаты рамки лица",
"error_title": "Ошибка - Что-то пошло не так",
@ -1002,7 +1018,7 @@
"unable_to_scan_library": "Не удалось просканировать библиотеку",
"unable_to_set_feature_photo": "Не удалось установить фотографию на обложку",
"unable_to_set_profile_picture": "Не удалось установить фото профиля",
"unable_to_submit_job": "Не удалось отправить задание",
"unable_to_submit_job": "Не удалось отправить задачу на выполнение",
"unable_to_trash_asset": "Не удалось переместить объект в корзину",
"unable_to_unlink_account": "Не удалось отсоединить учётную запись",
"unable_to_unlink_motion_video": "Не удалось отсоединить движущееся видео",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "В избранном сейчас пусто",
"feature_photo_updated": "Избранное фото обновлено",
"features": "Дополнительные возможности",
"features_in_development": "Функции в разработке",
"features_setting_description": "Управление дополнительными возможностями приложения",
"file_name": "Имя файла",
"file_name_or_extension": "Имя файла или расширение",
@ -1167,7 +1184,7 @@
},
"invalid_date": "Неверная дата",
"invalid_date_format": "Неверный формат даты",
"invite_people": "Пригласить",
"invite_people": "Пригласить участника",
"invite_to_album": "Пригласить в альбом",
"ios_debug_info_fetch_ran_at": "Выборка запущена {dateTime}",
"ios_debug_info_last_sync_at": "Последняя синхронизация {dateTime}",
@ -1185,7 +1202,7 @@
"language": "Язык",
"language_no_results_subtitle": "Попробуйте скорректировать поисковый запрос",
"language_no_results_title": "Языков не найдено",
"language_search_hint": "Поиск языков...",
"language_search_hint": "Поиск языка...",
"language_setting_description": "Выберите предпочитаемый вами язык",
"large_files": "Файлы наибольшего размера",
"last": "Последний",
@ -1195,10 +1212,10 @@
"leave": "Покинуть",
"leave_album": "Покинуть альбом",
"lens_model": "Модель объектива",
"let_others_respond": "Позволять другим откликаться",
"let_others_respond": "Разрешить другим пользователям добавлять комментарии и отметки \"нравится\"",
"level": "Уровень",
"library": "Библиотека",
"library_options": "Опции библиотеки",
"library_options": "Действия с библиотекой",
"library_page_device_albums": "Альбомы на устройстве",
"library_page_new_album": "Новый альбом",
"library_page_sort_asset_count": "Количество объектов",
@ -1218,6 +1235,7 @@
"local": "На устройстве",
"local_asset_cast_failed": "Невозможна трансляция объектов, которые ещё не загружены на сервер",
"local_assets": "Объекты на устройстве",
"local_media_summary": "Информация об объекте на устройстве",
"local_network": "Локальная сеть",
"local_network_sheet_info": "Приложение будет подключаться к серверу по этому адресу, когда устройство подключено к указанной Wi-Fi сети",
"location_permission": "Доступ к местоположению",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Введите долготу",
"lock": "Заблокировать",
"locked_folder": "Личная папка",
"log_detail_title": "Детали события",
"log_out": "Выйти",
"log_out_all_devices": "Завершить сеансы на всех устройствах",
"logged_in_as": "Авторизован как {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Пароль успешно обновлен",
"logout_all_device_confirmation": "Вы действительно хотите завершить все сеансы, кроме текущего?",
"logout_this_device_confirmation": "Вы действительно хотите завершить сеанс на этом устройстве?",
"logs": "Журнал событий",
"longitude": "Долгота",
"look": "Просмотр",
"loop_videos": "Циклическое воспроизведение видео",
@ -1268,7 +1288,7 @@
"make": "Производитель",
"manage_geolocation": "Управление местами съёмки",
"manage_shared_links": "Управление публичными ссылками",
"manage_sharing_with_partners": "Функция совместного доступа к фото и видео, позволяющая видеть все объекты партнёров, а также предоставлять доступ к своим",
"manage_sharing_with_partners": "Функция совместного доступа к фото и видео, позволяющая видеть объекты партнёров, а также предоставлять доступ к своим",
"manage_the_app_settings": "Управление настройками приложения",
"manage_your_account": "Управление учётной записью",
"manage_your_api_keys": "Управление API ключами для взаимодействия с другими программами",
@ -1301,6 +1321,7 @@
"mark_as_read": "Отметить как прочитанное",
"marked_all_as_read": "Отмечены как прочитанные",
"matches": "Совпадения",
"matching_assets": "Соответствующие объекты",
"media_type": "Тип медиа",
"memories": "Воспоминания",
"memories_all_caught_up": "Это всё на сегодня",
@ -1312,7 +1333,7 @@
"memory_lane_title": "Воспоминание {title}",
"menu": "Меню",
"merge": "Объединить",
"merge_people": "Объединить людей",
"merge_people": "Объединить с другим",
"merge_people_limit": "Вы можете объединять до 5 лиц за один раз",
"merge_people_prompt": "Вы хотите объединить этих людей? Это действие необратимо.",
"merge_people_successfully": "Лица людей успешно объединены",
@ -1324,7 +1345,7 @@
"model": "Модель",
"month": "Месяц",
"monthly_title_text_date_format": "MMMM y",
"more": "Больше",
"more": "Дополнительные действия",
"move": "Переместить",
"move_off_locked_folder": "Переместить из личной папки",
"move_to_lock_folder_action_prompt": "Объекты добавлены в личную папку ({count} шт.)",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Имя или ник",
"network_requirement_photos_upload": "Использовать мобильный интернет для загрузки фото",
"network_requirement_videos_upload": "Использовать мобильный интернет для загрузки видео",
"network_requirements": "Требования к сети",
"network_requirements_updated": "Требования к сети изменились, сброс очереди загрузки",
"networking_settings": "Сеть",
"networking_subtitle": "Настройка подключения к серверу",
@ -1351,6 +1373,7 @@
"new_person": "Новый человек",
"new_pin_code": "Новый PIN-код",
"new_pin_code_subtitle": "Это ваш первый доступ к личной папке. Создайте PIN-код для защищенного доступа к этой странице.",
"new_timeline": "Новая лента",
"new_user_created": "Новый пользователь создан",
"new_version_available": "ДОСТУПНА НОВАЯ ВЕРСИЯ",
"newest_first": "Сначала новые",
@ -1364,20 +1387,25 @@
"no_assets_message": "НАЖМИТЕ ДЛЯ ЗАГРУЗКИ ВАШЕГО ПЕРВОГО ФОТО",
"no_assets_to_show": "Медиа отсутствуют",
"no_cast_devices_found": "Не найдено устройств для трансляции",
"no_checksum_local": "Контрольные суммы отсутствуют - невозможно получить объекты на устройстве",
"no_checksum_remote": "Контрольные суммы отсутствуют - невозможно получить объекты с сервера",
"no_duplicates_found": "Дубликатов не обнаружено.",
"no_exif_info_available": "Нет доступной информации exif",
"no_explore_results_message": "Загружайте больше фотографий, чтобы наслаждаться вашей коллекцией.",
"no_favorites_message": "Добавляйте объекты в избранное, чтобы быстрее находить свои лучшие фото и видео",
"no_libraries_message": "Создайте внешнюю библиотеку для просмотра в Immich сторонних фотографий и видео",
"no_local_assets_found": "На устройстве не найдено объектов с такой контрольной суммой",
"no_locked_photos_message": "Фото и видео, перемещенные в личную папку, скрыты и не отображаются при просмотре библиотеки.",
"no_name": "Нет имени",
"no_notifications": "Нет уведомлений",
"no_people_found": "Никого не найдено",
"no_places": "Нет мест",
"no_remote_assets_found": "На сервере не найдено объектов с такой контрольной суммой",
"no_results": "Нет результатов",
"no_results_description": "Попробуйте использовать синоним или более общее ключевое слово",
"no_shared_albums_message": "Создайте альбом для обмена фотографиями и видеозаписями с людьми в вашей сети",
"no_uploads_in_progress": "Нет активных загрузок",
"not_available": "Нет данных",
"not_in_any_album": "Ни в одном альбоме",
"not_selected": "Не выбрано",
"note_apply_storage_label_to_previously_uploaded assets": "Примечание: Чтобы применить метку хранилища к ранее загруженным ресурсам, запустите",
@ -1410,7 +1438,7 @@
"open_in_map_view": "Открыть в режиме просмотра карты",
"open_in_openstreetmap": "Открыть в OpenStreetMap",
"open_the_search_filters": "Открыть фильтры поиска",
"options": "Опции",
"options": "Параметры",
"or": "или",
"organize_into_albums": "Распределить по альбомам",
"organize_into_albums_description": "Добавить уже существующие объекты в альбомы, используя текущие настройки синхронизации",
@ -1499,6 +1527,7 @@
"port": "Порт",
"preferences_settings_subtitle": "Настройка внешнего вида",
"preferences_settings_title": "Параметры",
"preparing": "Подготовка",
"preset": "Предустановленные варианты",
"preview": "Предварительный просмотр",
"previous": "Предыдущее",
@ -1560,10 +1589,11 @@
"rating_clear": "Очистить рейтинг",
"rating_count": "{count, plural, one {# звезда} many {# звезд} other {# звезды}}",
"rating_description": "Система оценки объектов в панели информации",
"reaction_options": "Опции реакций",
"reaction_options": "Действия с отметкой",
"read_changelog": "Прочитать список изменений",
"readonly_mode_disabled": "Режим «только просмотр» отключён",
"readonly_mode_enabled": "Режим «только просмотр» включён",
"ready_for_upload": "Готово к загрузке",
"reassign": "Переназначить",
"reassigned_assets_to_existing_person": "Лица на {count, plural, one {# объекте} other {# объектах}} переназначены на {name, select, null {другого человека} other {человека с именем {name}}}",
"reassigned_assets_to_new_person": "Лица на {count, plural, one {# объекте} other {# объектах}} переназначены на нового человека",
@ -1588,6 +1618,7 @@
"regenerating_thumbnails": "Восстановление миниатюр",
"remote": "На сервере",
"remote_assets": "Объекты на сервере",
"remote_media_summary": "Информация об объекте на сервере",
"remove": "Удалить",
"remove_assets_album_confirmation": "Вы действительно хотите удалить {count, plural, one {# объект} many {# объектов} other {# объекта}} из альбома?",
"remove_assets_shared_link_confirmation": "Вы действительно хотите удалить {count, plural, one {# объект} many {# объектов} other {# объекта}} из публичного доступа по этой ссылке?",
@ -1653,7 +1684,7 @@
"saved_api_key": "API ключ изменён",
"saved_profile": "Профиль сохранён",
"saved_settings": "Настройки сохранены",
"say_something": "Скажите что-нибудь",
"say_something": "Напишите что-нибудь",
"scaffold_body_error_occurred": "Возникла ошибка",
"scan_all_libraries": "Сканировать все библиотеки",
"scan_library": "Сканировать",
@ -1674,7 +1705,7 @@
"search_filter_camera_title": "Выберите тип камеры",
"search_filter_date": "Дата",
"search_filter_date_interval": "{start} — {end}",
"search_filter_date_title": "Выберите промежуток",
"search_filter_date_title": "Выберите период",
"search_filter_display_option_not_in_album": "Не в альбоме",
"search_filter_display_options": "Настройки отображения",
"search_filter_filename": "Поиск по имени файла",
@ -1727,7 +1758,7 @@
"select_from_computer": "Выбрать с компьютера",
"select_keep_all": "Выбрать все для сохранения",
"select_library_owner": "Выберите владельца библиотеки",
"select_new_face": "Выбрать другое лицо",
"select_new_face": "Выбрать другого человека",
"select_person_to_tag": "Выделите лицо человека, которого хотите отметить",
"select_photos": "Выберите фотографии",
"select_trash_all": "Выбрать все для удаления",
@ -1740,7 +1771,7 @@
"server_endpoint": "Адрес сервера",
"server_info_box_app_version": "Версия приложения",
"server_info_box_server_url": "URL сервера",
"server_offline": "Сервер не в сети",
"server_offline": "Оффлайн",
"server_online": "Сервер в сети",
"server_privacy": "Конфиденциальность сервера",
"server_stats": "Статистика сервера",
@ -1827,7 +1858,7 @@
"shared_link_individual_shared": "Индивидуальный общий доступ",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_manage_links": "Управление публичными ссылками",
"shared_link_options": "Параметры публичных ссылок",
"shared_link_options": "Действия со ссылкой",
"shared_link_password_description": "Требовать пароль для доступа к этой общей ссылке",
"shared_links": "Публичные ссылки",
"shared_links_description": "Делитесь фотографиями и видео по ссылке",
@ -1856,13 +1887,14 @@
"show_metadata": "Показывать метаданные",
"show_or_hide_info": "Показать или скрыть информацию",
"show_password": "Показать пароль",
"show_person_options": "Показать опции персоны",
"show_person_options": "Действия с человеком",
"show_progress_bar": "Показать Индикатор Выполнения",
"show_search_options": "Показать параметры поиска",
"show_shared_links": "Показать публичные ссылки",
"show_slideshow_transition": "Показать слайд-шоу переход",
"show_supporter_badge": "Значок поддержки",
"show_supporter_badge_description": "Показать значок поддержки",
"show_text_search_menu": "Показать меню текстового поиска",
"shuffle": "Перемешать",
"sidebar": "Боковая панель",
"sidebar_display_description": "Отображать раздел на боковой панели",
@ -1893,6 +1925,7 @@
"stacktrace": "Трассировка стека",
"start": "Старт",
"start_date": "Дата начала",
"start_date_before_end_date": "Дата начала должна быть меньше даты окончания",
"state": "Регион",
"status": "Состояние",
"stop_casting": "Остановить трансляцию",
@ -1978,7 +2011,7 @@
"trash_page_select_assets_btn": "Выбранные объекты",
"trash_page_title": "Корзина ({count})",
"trashed_items_will_be_permanently_deleted_after": "Объекты, хранящиеся в корзине более {days, plural, one {# дня} other {# дней}}, удаляются автоматически.",
"troubleshoot": "Решение проблем",
"troubleshoot": "Диагностика",
"type": "Тип",
"unable_to_change_pin_code": "Ошибка при изменении PIN-кода",
"unable_to_setup_pin_code": "Ошибка при создании PIN-кода",
@ -2037,7 +2070,7 @@
"user": "Пользователь",
"user_has_been_deleted": "Этот пользователь был удалён.",
"user_id": "ID пользователя",
"user_liked": "{user} отметил(а) {type, select, photo {это фото} video {это видео} asset {этот ресурс} other {этот альбом}}",
"user_liked": "Пользователю {user} нравится {type, select, photo {это фото} video {это видео} asset {этот объект} other {этот альбом}}",
"user_pin_code_settings": "PIN-код",
"user_pin_code_settings_description": "Настройка PIN-кода для доступа к личной папке",
"user_privacy": "Конфиденциальность пользователя",
@ -2095,5 +2128,6 @@
"yes": "Да",
"you_dont_have_any_shared_links": "У вас нет публичных ссылок",
"your_wifi_name": "Имя вашей Wi-Fi сети",
"zoom_image": "Приблизить"
"zoom_image": "Изменить масштаб",
"zoom_to_bounds": "Увеличить до границ"
}

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Povoliť ukladanie záznamov",
"logging_level_description": "Ak je povolené, akú úroveň záznamov použiť.",
"logging_settings": "Ukladanie záznamov",
"machine_learning_availability_checks": "Kontroly dostupnosti",
"machine_learning_availability_checks_description": "Automaticky zistiť a uprednostniť dostupné servery strojového učenia",
"machine_learning_availability_checks_enabled": "Povoliť kontroly dostupnosti",
"machine_learning_availability_checks_interval": "Interval kontroly",
"machine_learning_availability_checks_interval_description": "Interval v milisekundách medzi kontrolami dostupnosti",
"machine_learning_availability_checks_timeout": "Časový limit požiadavky",
"machine_learning_availability_checks_timeout_description": "Časový limit v milisekundách pre kontroly dostupnosti",
"machine_learning_clip_model": "Model CLIP",
"machine_learning_clip_model_description": "Názov modelu CLIP je uvedený <link>tu</link>. Pamätajte, že pri zmene modelu je nutné znovu spustiť úlohu 'Inteligentné vyhľadávanie' pre všetky obrázky.",
"machine_learning_duplicate_detection": "Detekcia duplikátov",
@ -387,8 +394,6 @@
"admin_password": "Administrátorské heslo",
"administration": "Administrácia",
"advanced": "Pokročilé",
"advanced_settings_beta_timeline_subtitle": "Vyskúšajte prostredie novej aplikácie",
"advanced_settings_beta_timeline_title": "Beta verzia časovej osi",
"advanced_settings_enable_alternate_media_filter_subtitle": "Túto možnosť použite na filtrovanie médií počas synchronizácie na základe alternatívnych kritérií. Túto možnosť vyskúšajte len vtedy, ak máte problémy s detekciou všetkých albumov v aplikácii.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTÁLNE] Použiť alternatívny filter synchronizácie albumu zariadenia",
"advanced_settings_log_level_title": "Úroveň ukladania záznamov: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "Ste si istý, že chcete odstrániť používateľa {user}?",
"album_search_not_found": "Neboli nájdené žiadne albumy zodpovedajúce vášmu hľadaniu",
"album_share_no_users": "Vyzerá to, že ste tento album zdieľali so všetkými používateľmi alebo nemáte žiadneho používateľa, s ktorým by ste ho mohli zdieľať.",
"album_summary": "Súhrn albumu",
"album_updated": "Album bol aktualizovaný",
"album_updated_setting_description": "Obdržať e-mailové upozornenie, keď v zdieľanom albume pribudnú nové položky",
"album_user_left": "Opustil {album}",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Položky boli úspešne obnovené",
"asset_skipped": "Preskočené",
"asset_skipped_in_trash": "V koši",
"asset_trashed": "Položka bola vyhodená",
"asset_troubleshoot": "Riešenie problémov s položkami",
"asset_uploaded": "Nahrané",
"asset_uploading": "Nahráva sa…",
"asset_viewer_settings_subtitle": "Spravujte nastavenia prehliadača galérie",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Automatické prehrávanie prezentácie",
"back": "Späť",
"back_close_deselect": "Späť, zavrieť alebo zrušiť výber",
"background_backup_running_error": "V súčasnosti prebieha zálohovanie na pozadí, nie je možné spustiť ručné zálohovanie",
"background_location_permission": "Povolenie na určenie polohy na pozadí",
"background_location_permission_content": "Aby bolo možné prepínať siete pri spustení na pozadí, musí mať aplikácia Immich *vždy* presný prístup k polohe, aby mohla prečítať názov siete Wi-Fi",
"background_options": "Možnosti pozadia",
"backup": "Zálohovanie",
"backup_album_selection_page_albums_device": "Albumy v zariadení ({count})",
"backup_album_selection_page_albums_tap": "Ťuknutím na položku ju zahrniete, dvojitým ťuknutím ju vylúčite",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Vybrať albumy",
"backup_album_selection_page_selection_info": "Informácie o výbere",
"backup_album_selection_page_total_assets": "Celkový počet jedinečných súborov",
"backup_albums_sync": "Synchronizácia zálohovaných albumov",
"backup_all": "Všetko",
"backup_background_service_backup_failed_message": "Zálohovanie médií zlyhalo. Skúšam to znova…",
"backup_background_service_connection_failed_message": "Nepodarilo sa pripojiť k serveru. Skúšam to znova…",
@ -654,6 +665,8 @@
"change_pin_code": "Zmeniť PIN kód",
"change_your_password": "Zmeniť heslo",
"changed_visibility_successfully": "Viditeľnosť bola úspešne zmenená",
"charging": "Nabíja sa",
"charging_requirement_mobile_backup": "Zálohovanie na pozadí vyžaduje, aby bolo zariadenie nabíjané",
"check_corrupt_asset_backup": "Skontrolovať, či nie sú poškodené zálohy položiek",
"check_corrupt_asset_backup_button": "Vykonať kontrolu",
"check_corrupt_asset_backup_description": "Spustiť túto kontrolu len cez Wi-Fi a po zálohovaní všetkých položiek. Tento postup môže trvať niekoľko minút.",
@ -740,6 +753,7 @@
"create_user": "Vytvoriť používateľa",
"created": "Vytvorené",
"created_at": "Vytvorené",
"creating_linked_albums": "Vytváranie prepojených albumov...",
"crop": "Orezať",
"curated_object_page_title": "Veci",
"current_device": "Súčasné zariadenie",
@ -889,7 +903,9 @@
"error": "Chyba",
"error_change_sort_album": "Nepodarilo sa zmeniť poradie albumu",
"error_delete_face": "Chyba pri odstraňovaní tváre z položky",
"error_getting_places": "Chyba pri získavaní polôh",
"error_loading_image": "Nepodarilo sa načítať obrázok",
"error_loading_partners": "Chyba pri načítaní partnerov: {error}",
"error_saving_image": "Chyba: {error}",
"error_tag_face_bounding_box": "Chyba pri označovaní tváre - nemožno získať súradnice ohraničujúceho poľa",
"error_title": "Chyba - niečo sa pokazilo",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "Žiadne obľúbené médiá",
"feature_photo_updated": "Hlavný obrázok bol aktualizovaný",
"features": "Funkcie",
"features_in_development": "Funkcie vo vývoji",
"features_setting_description": "Spravovať funkcie aplikácie",
"file_name": "Názov súboru",
"file_name_or_extension": "Názov alebo prípona súboru",
@ -1218,6 +1235,7 @@
"local": "Lokálne",
"local_asset_cast_failed": "Nie je možné preniesť médium, ktoré nie je nahrané na serveri",
"local_assets": "Lokálne položky",
"local_media_summary": "Súhrn lokálnych médií",
"local_network": "Miestna sieť",
"local_network_sheet_info": "Pri použití zadanej siete Wi-Fi sa aplikácia pripojí k serveru prostredníctvom tejto URL adresy",
"location_permission": "Povolenie na určenie polohy",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Zadajte platnú zemepisnú dĺžku",
"lock": "Zamknúť",
"locked_folder": "Zamknutý priečinok",
"log_detail_title": "Podrobnosti o zázname",
"log_out": "Odhlásiť sa",
"log_out_all_devices": "Odhlásiť všetky zariadenia",
"logged_in_as": "Prihlásený ako {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Aktualizácia hesla prebehla úspešne",
"logout_all_device_confirmation": "Ste si istý, že sa chcete odhlásiť zo všetkých zariadení?",
"logout_this_device_confirmation": "Ste si istý, že sa chcete odhlásiť z tohoto zariadenia?",
"logs": "Záznamy",
"longitude": "Zemepisná dĺžka",
"look": "Vzhľad",
"loop_videos": "Opakovať videá",
@ -1301,6 +1321,7 @@
"mark_as_read": "Označiť ako prečítané",
"marked_all_as_read": "Označené všetko ako prečítané",
"matches": "Zhody",
"matching_assets": "Vyhovujúce položky",
"media_type": "Typ média",
"memories": "Spomienky",
"memories_all_caught_up": "Na dnes to je všetko",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Meno alebo prezývka",
"network_requirement_photos_upload": "Použiť mobilné dáta na zálohovanie fotografií",
"network_requirement_videos_upload": "Použiť mobilné dáta na zálohovanie videí",
"network_requirements": "Požiadavky na sieť",
"network_requirements_updated": "Požiadavky na sieť sa zmenili, obnovuje sa poradie zálohovania",
"networking_settings": "Sieť",
"networking_subtitle": "Spravovať nastavenia koncového bodu servera",
@ -1351,6 +1373,7 @@
"new_person": "Nová osoba",
"new_pin_code": "Nový PIN kód",
"new_pin_code_subtitle": "Toto je váš prvý prístup k zamknutému priečinku. Vytvorte si PIN kód na bezpečný prístup k tejto stránke",
"new_timeline": "Nová časová os",
"new_user_created": "Nový používateľ vytvorený",
"new_version_available": "JE DOSTUPNÁ NOVÁ VERZIA",
"newest_first": "Najprv najnovšie",
@ -1364,20 +1387,25 @@
"no_assets_message": "KLIKNITE A NAHRAJTE SVOJU PRVÚ FOTKU",
"no_assets_to_show": "Žiadne položky",
"no_cast_devices_found": "Nenašli sa žiadne zariadenia na prenos",
"no_checksum_local": "Kontrola súčtu nie je k dispozícii nie je možné načítať lokálne položky",
"no_checksum_remote": "Kontrola súčtu nie je k dispozícii nie je možné načítať vzdialené položky",
"no_duplicates_found": "Nenašli sa žiadne duplicity.",
"no_exif_info_available": "Nie sú dostupné exif údaje",
"no_explore_results_message": "Nahrajte viac fotiek na objavovanie vašej zbierky.",
"no_favorites_message": "Pridajte si obľúbené, aby ste rýchlo našli svoje najlepšie obrázky a videá",
"no_libraries_message": "Vytvorí externú knižnicu na prezeranie fotiek a videí",
"no_local_assets_found": "Neboli nájdené žiadne lokálne položky s touto kontrolnou sumou",
"no_locked_photos_message": "Fotografie a videá v zamknutom priečinku sú skryté a nezobrazujú sa pri prehľadávaní alebo vyhľadávaní v knižnici.",
"no_name": "Bez mena",
"no_notifications": "Žiadne oznámenia",
"no_people_found": "Nenašli sa žiadni vyhovujúci ľudia",
"no_places": "Bez miesta",
"no_remote_assets_found": "Neboli nájdené žiadne vzdialené položky s touto kontrolnou sumou",
"no_results": "Žiadne výsledky",
"no_results_description": "Skúste synonymum alebo všeobecnejší výraz",
"no_shared_albums_message": "Vytvorí album na zdieľanie fotiek a videí s ľuďmi vo vašej sieti",
"no_uploads_in_progress": "Žiadne prebiehajúce nahrávanie",
"not_available": "Nedostupné",
"not_in_any_album": "Nie je v žiadnom albume",
"not_selected": "Nevybrané",
"note_apply_storage_label_to_previously_uploaded assets": "Poznámka: Ak chcete použiť Štítok úložiska na predtým nahrané médiá, spustite príkaz",
@ -1588,6 +1616,7 @@
"regenerating_thumbnails": "Pregenerovanie náhľadov",
"remote": "Vzdialené",
"remote_assets": "Vzdialené položky",
"remote_media_summary": "Súhrn vzdialených médií",
"remove": "Odstrániť",
"remove_assets_album_confirmation": "Naozaj chcete odstrániť {count, plural, one {# položku} few {# položky} other {# položiek}} z albumu?",
"remove_assets_shared_link_confirmation": "Naozaj chcete odstrániť {count, plural, one {# položku} few {# položky} other {# položiek}} z tohoto zdieľaného odkazu?",
@ -1863,6 +1892,7 @@
"show_slideshow_transition": "Zobraziť prechody v prezentácii",
"show_supporter_badge": "Odznak podporovateľa",
"show_supporter_badge_description": "Zobraziť odznak podporovateľa",
"show_text_search_menu": "Zobraziť ponuku vyhľadávania textu",
"shuffle": "Náhodné poradie",
"sidebar": "Bočný panel",
"sidebar_display_description": "Zobraziť odkaz na zobrazenie v bočnom paneli",
@ -1893,6 +1923,7 @@
"stacktrace": "Výpis zásobníku",
"start": "Spustiť",
"start_date": "Počiatočný dátum",
"start_date_before_end_date": "Dátum začiatku musí byť pred dátumom ukončenia",
"state": "Štát",
"status": "Stav",
"stop_casting": "Zastaviť prenos",
@ -2095,5 +2126,6 @@
"yes": "Áno",
"you_dont_have_any_shared_links": "Nemáte žiadne zdielané odkazy",
"your_wifi_name": "Váš názov siete Wi-Fi",
"zoom_image": "Priblížiť obrázok"
"zoom_image": "Priblížiť obrázok",
"zoom_to_bounds": "Zväčšiť na okraje"
}

View File

@ -8,7 +8,7 @@
"actions": "Dejanja",
"active": "Aktivno",
"activity": "Aktivnost",
"activity_changed": "Aktivnost {enabled, select, true {omogočena} other {onemogočena}}",
"activity_changed": "Aktivnost je {enabled, select, true {omogočena} other {onemogočena}}",
"add": "Dodaj",
"add_a_description": "Dodaj opis",
"add_a_location": "Dodaj lokacijo",
@ -39,15 +39,15 @@
"admin": {
"add_exclusion_pattern_description": "Dodajte vzorec izključitev. Globiranje z uporabo *, ** in ? je podprto. Če želite prezreti vse datoteke v katerem koli imeniku z imenom \"Raw\", uporabite \"**/Raw/**\". Če želite prezreti vse datoteke, ki se končajo na \".tif\", uporabite \"**/*.tif\". Če želite prezreti absolutno pot, uporabite \"/pot/za/ignoriranje/**\".",
"admin_user": "Skrbniški uporabnik",
"asset_offline_description": "Sredstva zunanje knjižnice ni več mogoče najti na disku in je bilo premaknjeno v koš. Če je bila datoteka premaknjena znotraj knjižnice, preverite svojo časovnico za novo ustrezno sredstvo. Če želite obnoviti to sredstvo, zagotovite, da ima Immich dostop do spodnje poti datoteke, in skenirajte knjižnico.",
"asset_offline_description": "Tega sredstva zunanje knjižnice ni več mogoče najti na disku in je bilo premaknjeno v koš. Če je bila datoteka premaknjena znotraj knjižnice, preverite svojo časovnico za novo ustrezno sredstvo. Če želite obnoviti to sredstvo, zagotovite, da ima Immich dostop do spodnje poti datoteke, in skenirajte knjižnico.",
"authentication_settings": "Nastavitve preverjanja pristnosti",
"authentication_settings_description": "Upravljanje gesel, OAuth in drugih nastavitev preverjanja pristnosti",
"authentication_settings_disable_all": "Ali zares želite onemogočiti vse prijavne metode? Prijava bo popolnoma onemogočena.",
"authentication_settings_reenable": "Ponovno omogoči z uporabo <link>strežniškega ukaza</link>.",
"authentication_settings_reenable": "Za ponovno omogočanje uporabite <link>strežniški ukaz</link>.",
"background_task_job": "Opravila v ozadju",
"backup_database": "Ustvari izpis baze podatkov",
"backup_database_enable_description": "Omogoči izpise baze podatkov",
"backup_keep_last_amount": "Število prejšnjih odlagališč, ki jih je treba obdržati",
"backup_keep_last_amount": "Število prejšnjih izpisov baze podatkov, ki jih je treba obdržati",
"backup_onboarding_1_description": "kopijo zunaj lokacije v oblaku ali na drugi fizični lokaciji.",
"backup_onboarding_2_description": "lokalne kopije na različnih napravah. To vključuje glavne datoteke in lokalno varnostno kopijo teh datotek.",
"backup_onboarding_3_description": "skupno število kopij vaših podatkov, vključno z izvirnimi datotekami. To vključuje 1 kopijo zunaj lokacije in 2 lokalni kopiji.",
@ -57,7 +57,7 @@
"backup_onboarding_title": "Varnostne kopije",
"backup_settings": "Nastavitve izpisa baze podatkov",
"backup_settings_description": "Upravljanje nastavitev izpisa podatkovne baze.",
"cleared_jobs": "Razčiščeno opravilo za: {job}",
"cleared_jobs": "Razčiščena opravila za: {job}",
"config_set_by_file": "Konfiguracija je trenutno nastavljena s konfiguracijsko datoteko",
"confirm_delete_library": "Ali ste prepričani, da želite izbrisati knjižnico {library}?",
"confirm_delete_library_assets": "Ali ste prepričani, da želite izbrisati to knjižnico? To bo iz Immicha izbrisalo {count, plural, one {# vsebovani vir} two {# vsebovana vira} few {# vsebovane vire} other {vseh # vsebovanih virov}} in tega ni možno razveljaviti. Datoteke bodo ostale na disku.",
@ -72,10 +72,10 @@
"disable_login": "Onemogoči prijavo",
"duplicate_detection_job_description": "Zaženite strojno učenje na sredstvih, da zaznate podobne slike. Zanaša se na Pametno Iskanje",
"exclusion_pattern_description": "Vzorci izključitev vam omogočajo, da prezrete datoteke in mape pri skeniranju knjižnice. To je uporabno, če imate mape z datotekami, ki jih ne želite uvoziti, na primer datoteke RAW.",
"external_library_management": "Upravljanje zunanje knjižnice",
"external_library_management": "Upravljanje zunanjih knjižnic",
"face_detection": "Zaznavanje obrazov",
"face_detection_description": "Zaznajte obraze v sredstvih s pomočjo strojnega učenja. Pri videoposnetkih se upošteva samo sličica. \"Vse\" (ponovno) obdela vsa sredstva. \"Manjkajoče\" postavi v čakalno vrsto sredstva, ki še niso bila obdelana. Zaznani obrazi bodo postavljeni v čakalno vrsto za prepoznavanje obrazov, ko bo zaznavanje obrazov končano, in jih bodo združili v obstoječe ali nove osebe.",
"facial_recognition_job_description": "Združi zaznane obraze v osebe. Ta korak se izvede po končanem zaznavanju obrazov. \"Vse\" (ponovno) združuje vse obraze. \"Manjkajoče\", doda v čakalno vrsto obraze, ki nimajo dodeljene osebe.",
"face_detection_description": "Zaznavanje obrazov v sredstvih z uporabo strojnega učenja. Pri videoposnetkih se upošteva samo sličica. »Osveži« (ponovno) obdela vsa sredstva. »Ponastavi« dodatno izbriše vse trenutne podatke o obrazih. »Manjkajoča« uvrsti sredstva, ki še niso bila obdelana, v čakalno vrsto. Zaznani obrazi bodo po končanem zaznavanju obrazov uvrščeni v čakalno vrsto za prepoznavanje obrazov, pri čemer bodo združeni v obstoječe ali nove osebe.",
"facial_recognition_job_description": "Združi zaznane obraze v osebe. Ta korak se izvede po končanem zaznavanju obrazov. »Ponastavi« (ponovno) združi vse obraze. »Manjkajoča« uvrsti obraze, ki jim ni dodeljena oseba, v čakalno vrsto.",
"failed_job_command": "Za opravilo {job} ukaz {command} ni uspel",
"force_delete_user_warning": "OPOZORILO: S tem boste takoj odstranili uporabnika in vsa sredstva. Tega ni mogoče razveljaviti in datotek ni mogoče obnoviti.",
"image_format": "Format",
@ -102,12 +102,12 @@
"image_thumbnail_title": "Nastavitve sličic",
"job_concurrency": "{job} sočasnost",
"job_created": "Opravilo ustvarjeno",
"job_not_concurrency_safe": "To opravilo ni sočasno-varno.",
"job_not_concurrency_safe": "To delo ni varno za sočasnost.",
"job_settings": "Nastavitve opravil",
"job_settings_description": "Upravljaj sočasnost opravil",
"job_status": "Status opravila",
"jobs_delayed": "{jobCount, plural, other {# zadržan}}",
"jobs_failed": "{jobCount, plural, other {# neuspešen}}",
"jobs_delayed": "{jobCount, plural, other {# zadržani}}",
"jobs_failed": "{jobCount, plural, other {# neuspešni}}",
"library_created": "Ustvarjena knjižnica: {library}",
"library_deleted": "Knjižnica izbrisana",
"library_import_path_description": "Določi mapo za uvoz. Ta mapa in njene podmape bodo pregledane za slike in video posnetke.",
@ -123,6 +123,13 @@
"logging_enable_description": "Omogoči dnevnik",
"logging_level_description": "Nivo dnevnika, ko je le-ta omogočen.",
"logging_settings": "Dnevnik",
"machine_learning_availability_checks": "Preverjanja razpoložljivosti",
"machine_learning_availability_checks_description": "Samodejno zaznavanje in dajanje prednosti razpoložljivim strežnikom strojnega učenja",
"machine_learning_availability_checks_enabled": "Omogoči preverjanja razpoložljivosti",
"machine_learning_availability_checks_interval": "Interval preverjanja",
"machine_learning_availability_checks_interval_description": "Interval v milisekundah med preverjanji razpoložljivosti",
"machine_learning_availability_checks_timeout": "Zahteva za časovno omejitev",
"machine_learning_availability_checks_timeout_description": "Časovna omejitev v milisekundah za preverjanje razpoložljivosti",
"machine_learning_clip_model": "model CLIP",
"machine_learning_clip_model_description": "Ime CLIP modela iz seznama <link>tukaj</link>. Vedite, da boste morali po menjavi modela ponovno zagnati opravilo za 'Pametno iskanje' za vse slike.",
"machine_learning_duplicate_detection": "Zaznavanje dvojnikov",
@ -131,7 +138,7 @@
"machine_learning_duplicate_detection_setting_description": "Za iskanje verjetnih dvojnikov uporabite vdelave CLIP",
"machine_learning_enabled": "Omogoči strojno učenje",
"machine_learning_enabled_description": "Če je onemogočeno, bodo vse funkcije strojnega učenja onemogočene ne glede na spodnje nastavitve.",
"machine_learning_facial_recognition": "Zaznavanje obrazov",
"machine_learning_facial_recognition": "Prepoznavanje obrazov",
"machine_learning_facial_recognition_description": "Zaznavanje, prepoznavanje in združevanje obrazov na slikah",
"machine_learning_facial_recognition_model": "Model za prepoznavanje obraza",
"machine_learning_facial_recognition_model_description": "Modeli so navedeni v padajočem vrstnem redu glede na velikost. Večji modeli so počasnejši in uporabljajo več pomnilnika, vendar dajejo boljše rezultate. Upoštevajte, da morate po spremembi modela znova zagnati opravilo zaznavanja obrazov za vse slike.",
@ -144,7 +151,7 @@
"machine_learning_min_detection_score": "Najmanjši rezultat zaznavanja",
"machine_learning_min_detection_score_description": "Najmanjši rezultat zaupanja za zaznavanje obraza od 0-1. Nižje vrednosti bodo zaznale več obrazov, vendar lahko povzročijo lažne pozitivne rezultate.",
"machine_learning_min_recognized_faces": "Najmanjše število prepoznanih obrazov",
"machine_learning_min_recognized_faces_description": "Najmanjše število prepoznanih obrazov za osebo, ki se ustvari. Če to povečate, postane prepoznavanje obraza natančnejše na račun večje možnosti, da obraz ni dodeljen osebi.",
"machine_learning_min_recognized_faces_description": "Najmanjše število prepoznanih obrazov za osebo, da se ustvari. Če to povečate, postane prepoznavanje obraza natančnejše na račun večje možnosti, da obraz ni dodeljen osebi.",
"machine_learning_settings": "Nastavitve strojnega učenja",
"machine_learning_settings_description": "Upravljajte funkcije in nastavitve strojnega učenja",
"machine_learning_smart_search": "Pametno iskanje",
@ -176,41 +183,41 @@
"metadata_settings": "Nastavitve metapodatkov",
"metadata_settings_description": "Upravljanje nastavitev metapodatkov",
"migration_job": "Migracija",
"migration_job_description": "Preselite sličice za sredstva in obraze v najnovejšo strukturo map",
"migration_job_description": "Prenesite sličice za sredstva in obraze v najnovejšo strukturo map",
"nightly_tasks_cluster_faces_setting_description": "Zaženi prepoznavanje obrazov na novo zaznanih obrazih",
"nightly_tasks_cluster_new_faces_setting": "Združite nove obraze",
"nightly_tasks_database_cleanup_setting": "Naloge čiščenja baze podatkov",
"nightly_tasks_database_cleanup_setting_description": "Očistite stare, potekle podatke iz baze podatkov",
"nightly_tasks_generate_memories_setting": "Ustvarjajte spomine",
"nightly_tasks_generate_memories_setting_description": "Ustvarite nove spomine iz sredstev",
"nightly_tasks_generate_memories_setting": "Ustvari spomine",
"nightly_tasks_generate_memories_setting_description": "Ustvari nove spomine iz sredstev",
"nightly_tasks_missing_thumbnails_setting": "Ustvari manjkajoče sličice",
"nightly_tasks_missing_thumbnails_setting_description": "Sredstva brez sličic postavite v čakalno vrsto za ustvarjanje sličic",
"nightly_tasks_settings": "Nastavitve nočnih opravil",
"nightly_tasks_settings_description": "Upravljajte nočne naloge",
"nightly_tasks_start_time_setting": "Začetni čas",
"nightly_tasks_start_time_setting_description": "Čas, ko strežnik začne izvajati nočne naloge",
"nightly_tasks_sync_quota_usage_setting": "Poraba kvote za sinhronizacijo",
"nightly_tasks_sync_quota_usage_setting": "Posodobi kvoto porabljenega prostora",
"nightly_tasks_sync_quota_usage_setting_description": "Posodobi kvoto shrambe uporabnikov glede na trenutno uporabo",
"no_paths_added": "Ni dodanih poti",
"no_pattern_added": "Brez dodanega vzorca",
"no_pattern_added": "Nobenega dodanega vzorca",
"note_apply_storage_label_previous_assets": "Opomba: Če želite oznako za shranjevanje uporabiti za predhodno naložena sredstva, zaženite",
"note_cannot_be_changed_later": "OPOMBA: Tega pozneje ni mogoče spremeniti!",
"notification_email_from_address": "Iz naslova",
"notification_email_from_address_description": "E-poštni naslov pošiljatelja, na primer: \"Immich Photo Server <noreply@example.com>\". Uporabite naslov, s katerega lahko pošiljate e-pošto.",
"notification_email_from_address": "Od naslova",
"notification_email_from_address_description": "Pošiljateljev e-poštni naslov, na primer: \"Immich Photo Server <noreply@example.com>\". Uporabite naslov, s katerega lahko pošiljate e-pošto.",
"notification_email_host_description": "Gostitelj e-poštnega strežnika (npr. smtp.immich.app)",
"notification_email_ignore_certificate_errors": "Prezri napake potrdil",
"notification_email_ignore_certificate_errors_description": "Prezri napake pri preverjanju potrdila TLS (ni priporočljivo)",
"notification_email_password_description": "Geslo za uporabo pri preverjanju pristnosti z e-poštnim strežnikom",
"notification_email_port_description": "Vrata e-poštnega strežnika (npr. 25, 465 ali 587)",
"notification_email_sent_test_email_button": "Pošljite testno e-pošto in shranite",
"notification_email_sent_test_email_button": "Pošljite testno e-pošto in shrani",
"notification_email_setting_description": "Nastavitve za pošiljanje e-poštnih obvestil",
"notification_email_test_email": "Pošlji testno e-pošto",
"notification_email_test_email_failed": "Pošiljanje testnega e-poštnega sporočila ni uspelo, preverite svoje vrednosti",
"notification_email_test_email_failed": "Pošiljanje testnega e-poštnega sporočila ni uspelo, preverite svoje podatke",
"notification_email_test_email_sent": "Testno e-poštno sporočilo je bilo poslano na {email}. Prosimo, preverite svoj nabiralnik.",
"notification_email_username_description": "Uporabniško ime za uporabo pri preverjanju pristnosti z e-poštnim strežnikom",
"notification_enable_email_notifications": "Omogoči e-poštna obvestila",
"notification_settings": "Nastavitve obvestil",
"notification_settings_description": "Upravljajte nastavitve obvestil, vključno z e-pošto",
"notification_settings_description": "Upravljaj z nastavitvami obvestil, vključno z e-pošto",
"oauth_auto_launch": "Samodejni zagon",
"oauth_auto_launch_description": "Samodejno zaženite tok prijave OAuth, ko obiščete stran za prijavo",
"oauth_auto_register": "Samodejna registracija",
@ -221,7 +228,7 @@
"oauth_mobile_redirect_uri": "Mobilni preusmeritveni URI",
"oauth_mobile_redirect_uri_override": "Preglasitev URI preusmeritve za mobilne naprave",
"oauth_mobile_redirect_uri_override_description": "Omogoči, ko ponudnik OAuth ne dovoli mobilnega URI-ja, kot je ''{callback}''",
"oauth_role_claim": "Zahteva vloge",
"oauth_role_claim": "Zahteva za vlogo",
"oauth_role_claim_description": "Samodejno dodeli skrbniški dostop na podlagi prisotnosti tega zahtevka. Zahtevek ima lahko »uporabnik« ali »skrbnik«.",
"oauth_settings": "OAuth",
"oauth_settings_description": "Upravljanje nastavitev prijave OAuth",
@ -241,13 +248,13 @@
"person_cleanup_job": "Čiščenje osebe",
"quota_size_gib": "Velikost kvote (GiB)",
"refreshing_all_libraries": "Osveževanje vseh knjižnic",
"registration": "Administratorska registracija",
"registration": "Registracija administratorja",
"registration_description": "Ker ste prvi uporabnik v sistemu, boste dodeljeni kot skrbnik in ste odgovorni za skrbniška opravila, dodatne uporabnike pa boste ustvarili sami.",
"require_password_change_on_login": "Od uporabnika zahtevajte spremembo gesla ob prvi prijavi",
"reset_settings_to_default": "Ponastavi nastavitve na privzete",
"reset_settings_to_recent_saved": "Ponastavite nastavitve na nedavno shranjene nastavitve",
"scanning_library": "Pregledovanje knjižnice",
"search_jobs": "Iskanje opravil…",
"search_jobs": "Išči opravila…",
"send_welcome_email": "Pošlji pozdravno e-pošto",
"server_external_domain_settings": "Zunanja domena",
"server_external_domain_settings_description": "Domena za javne skupne povezave, vključno s http(s)://",
@ -256,7 +263,7 @@
"server_settings": "Nastavitve strežnika",
"server_settings_description": "Upravljanje nastavitev strežnika",
"server_welcome_message": "Pozdravno sporočilo",
"server_welcome_message_description": "Sporočilo, ki se prikaže na strani za prijavo.",
"server_welcome_message_description": "Sporočilo prikazano na prijavni strani.",
"sidecar_job": "Stranski metapodatki",
"sidecar_job_description": "Odkrijte ali sinhronizirajte stranske metapodatke iz datotečnega sistema",
"slideshow_duration_description": "Število sekund za prikaz posamezne slike",
@ -264,7 +271,7 @@
"storage_template_date_time_description": "Časovni žig ustvarjanja sredstva se uporablja za informacije o datumu in času",
"storage_template_date_time_sample": "Vzorec časa {date}",
"storage_template_enable_description": "Omogoči mehanizem predloge za shranjevanje",
"storage_template_hash_verification_enabled": "Preverjanje zgoščevanja je omogočeno",
"storage_template_hash_verification_enabled": "Omogočeno preverjanje zgoščene vrednosti",
"storage_template_hash_verification_enabled_description": "Omogoči preverjanje zgoščene vrednosti, tega ne onemogočite, razen če niste prepričani o posledicah",
"storage_template_migration": "Selitev predloge za shranjevanje",
"storage_template_migration_description": "Uporabi trenutno <link>{template}</link> za predhodno naložena sredstva",
@ -283,7 +290,7 @@
"template_email_invite_album": "Predloga povabila v album",
"template_email_preview": "Predogled",
"template_email_settings": "E-poštne predloge",
"template_email_update_album": "Predloga posodobitve albuma",
"template_email_update_album": "Posodobi predlogo albuma",
"template_email_welcome": "Predloga pozdravnega e-poštnega sporočila",
"template_settings": "Predloge obvestil",
"template_settings_description": "Upravljanje predlog po meri za obvestila",
@ -299,14 +306,14 @@
"transcoding_acceleration_qsv": "Hitra sinhronizacija (zahteva procesor Intel 7. generacije ali novejši)",
"transcoding_acceleration_rkmpp": "RKMPP (samo na Rockchip SOC)",
"transcoding_acceleration_vaapi": "VAAPI",
"transcoding_accepted_audio_codecs": "Sprejeti zvočni kodeki",
"transcoding_accepted_audio_codecs_description": "Izberite, katerih zvočnih kodekov ni treba prekodirati. Uporablja se samo za določene politike prekodiranja.",
"transcoding_accepted_audio_codecs": "Dovoljeni zvočni kodeksi",
"transcoding_accepted_audio_codecs_description": "Izberite, katerih zvočnih kodeksov ni treba prekodirati. Uporablja se samo za določene politike prekodiranja.",
"transcoding_accepted_containers": "Sprejeti zabojniki",
"transcoding_accepted_containers_description": "Izberite, katerih formatov zabojnika ni treba ponovno muksirati v MP4. Uporablja se samo za določene politike prekodiranja.",
"transcoding_accepted_video_codecs": "Podprti video kodeki",
"transcoding_accepted_video_codecs_description": "Izberite, katerih video kodekov ni treba prekodirati. Uporablja se samo za določene politike prekodiranja.",
"transcoding_advanced_options_description": "Možnosti večini uporabnikov ne bi bilo treba spreminjati",
"transcoding_audio_codec": "Avdio kodek",
"transcoding_accepted_video_codecs": "Podprti video kodeksi",
"transcoding_accepted_video_codecs_description": "Izberite, katerih video kodeksov ni treba prekodirati. Uporablja se samo za določene politike prekodiranja.",
"transcoding_advanced_options_description": "Možnosti, ki jih večini uporabnikov ne treba spreminjati",
"transcoding_audio_codec": "Zvočni kodeks",
"transcoding_audio_codec_description": "Opus je najbolj kakovostna možnost, vendar ima slabšo združljivost s starimi napravami ali programsko opremo.",
"transcoding_bitrate_description": "Videoposnetki, ki presegajo največjo bitno hitrost ali niso v sprejemljivem formatu",
"transcoding_codecs_learn_more": "Če želite izvedeti več o tukaj uporabljeni terminologiji, glejte dokumentacijo FFmpeg za <h264-link>kodek H.264</h264-link>, <hevc-link>kodek HEVC</hevc-link> in <vp9-link>VP9 kodek</vp9-link>.",
@ -316,7 +323,7 @@
"transcoding_constant_rate_factor_description": "Raven kakovosti videa. Tipične vrednosti so 23 za H.264, 28 za HEVC, 31 za VP9 in 35 za AV1. Nižje je boljše, vendar ustvarja večje datoteke.",
"transcoding_disabled_description": "Ne prekodirajte nobenih videoposnetkov, lahko prekine predvajanje na nekaterih odjemalcih",
"transcoding_encoding_options": "Možnosti kodiranja",
"transcoding_encoding_options_description": "Nastavite kodeke, ločljivost, kakovost in druge možnosti za kodirane videoposnetke",
"transcoding_encoding_options_description": "Nastavite kodekse, ločljivost, kakovost in druge možnosti za kodirane videoposnetke",
"transcoding_hardware_acceleration": "Strojno pospeševanje",
"transcoding_hardware_acceleration_description": "Eksperimentalno: hitrejše prekodiranje, vendar se lahko kakovost pri enaki bitni hitrosti zmanjša",
"transcoding_hardware_decoding": "Strojno dekodiranje",
@ -387,8 +394,6 @@
"admin_password": "Skrbniško geslo",
"administration": "Administracija",
"advanced": "Napredno",
"advanced_settings_beta_timeline_subtitle": "Preizkusite novo izkušnjo aplikacije",
"advanced_settings_beta_timeline_title": "Časovnica beta različice",
"advanced_settings_enable_alternate_media_filter_subtitle": "Uporabite to možnost za filtriranje medijev med sinhronizacijo na podlagi alternativnih meril. To poskusite le, če imate težave z aplikacijo, ki zaznava vse albume.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTALNO] Uporabite alternativni filter za sinhronizacijo albuma v napravi",
"advanced_settings_log_level_title": "Nivo dnevnika: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "Ali ste prepričani, da želite odstraniti {user}?",
"album_search_not_found": "Ni najdenih albumov, ki bi ustrezali vašemu iskanju",
"album_share_no_users": "Videti je, da ste ta album dali v skupno rabo z vsemi uporabniki ali pa nimate nobenega uporabnika, s katerim bi ga lahko delili.",
"album_summary": "Povzetek albuma",
"album_updated": "Album posodobljen",
"album_updated_setting_description": "Prejmite e-poštno obvestilo, ko ima album v skupni rabi nova sredstva",
"album_user_left": "Zapustil {album}",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Sredstvo uspešno obnovljeno",
"asset_skipped": "Preskočeno",
"asset_skipped_in_trash": "V smetnjak",
"asset_trashed": "Sredstvo je bilo premaknjeno v koš",
"asset_troubleshoot": "Odpravljanje težav s sredstvi",
"asset_uploaded": "Naloženo",
"asset_uploading": "Nalaganje…",
"asset_viewer_settings_subtitle": "Upravljaj nastavitve pregledovalnika galerije",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Samodejno predvajanje diaprojekcije",
"back": "Nazaj",
"back_close_deselect": "Nazaj, zaprite ali prekličite izbiro",
"background_backup_running_error": "Varnostno kopiranje v ozadju se trenutno izvaja, ročnega varnostnega kopiranja ni mogoče zagnati",
"background_location_permission": "Dovoljenje za iskanje lokacije v ozadju",
"background_location_permission_content": "Ko deluje v ozadju mora imeti Immich za zamenjavo omrežij, *vedno* dostop do natančne lokacije, da lahko aplikacija prebere ime omrežja Wi-Fi",
"background_options": "Možnosti ozadja",
"backup": "Varnostna kopija",
"backup_album_selection_page_albums_device": "Albumi v napravi ({count})",
"backup_album_selection_page_albums_tap": "Tapnite za vključitev, dvakrat tapnite za izključitev",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Izberi albume",
"backup_album_selection_page_selection_info": "Informacije o izbiri",
"backup_album_selection_page_total_assets": "Skupaj unikatnih sredstev",
"backup_albums_sync": "Sinhronizacija varnostnih kopij albumov",
"backup_all": "Vse",
"backup_background_service_backup_failed_message": "Varnostno kopiranje sredstev ni uspelo. Ponovno poskušam…",
"backup_background_service_connection_failed_message": "Povezava s strežnikom ni uspela. Ponovno poskušam…",
@ -654,6 +665,8 @@
"change_pin_code": "Spremeni PIN kodo",
"change_your_password": "Spremenite geslo",
"changed_visibility_successfully": "Uspešno spremenjena vidnost",
"charging": "Polnjenje",
"charging_requirement_mobile_backup": "Za varnostno kopiranje v ozadju je potrebno polnjenje naprave",
"check_corrupt_asset_backup": "Preverite poškodovane varnostne kopije sredstev",
"check_corrupt_asset_backup_button": "Izvedi preverjanje",
"check_corrupt_asset_backup_description": "To preverjanje zaženite samo prek omrežja Wi-Fi in potem, ko so vsa sredstva varnostno kopirana. Postopek lahko traja nekaj minut.",
@ -740,6 +753,7 @@
"create_user": "Ustvari uporabnika",
"created": "Ustvarjeno",
"created_at": "Ustvarjeno",
"creating_linked_albums": "Ustvarjanje povezanih albumov ...",
"crop": "Obrezovanje",
"curated_object_page_title": "Stvari",
"current_device": "Trenutna naprava",
@ -889,7 +903,9 @@
"error": "Napaka",
"error_change_sort_album": "Vrstnega reda albuma ni bilo mogoče spremeniti",
"error_delete_face": "Napaka pri brisanju obraza iz sredstva",
"error_getting_places": "Napaka pri pridobivanju mest",
"error_loading_image": "Napaka pri nalaganju slike",
"error_loading_partners": "Napaka pri nalaganju partnerjev: {error}",
"error_saving_image": "Napaka: {error}",
"error_tag_face_bounding_box": "Napaka pri označevanju obraza - ni mogoče pridobiti koordinat omejevalnega okvirja",
"error_title": "Napaka - nekaj je šlo narobe",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "Ni priljubljenih sredstev",
"feature_photo_updated": "Funkcijska fotografija je posodobljena",
"features": "Funkcije",
"features_in_development": "Funkcije v razvoju",
"features_setting_description": "Upravljaj funkcije aplikacije",
"file_name": "Ime datoteke",
"file_name_or_extension": "Ime ali končnica datoteke",
@ -1218,6 +1235,7 @@
"local": "Lokalno",
"local_asset_cast_failed": "Sredstva, ki niso naložena na strežnik, ni mogoče predvajati",
"local_assets": "Lokalna sredstva",
"local_media_summary": "Povzetek lokalnih medijev",
"local_network": "Lokalno omrežje",
"local_network_sheet_info": "Aplikacija se bo povezala s strežnikom prek tega URL-ja, ko bo uporabljala navedeno omrežje Wi-Fi",
"location_permission": "Dovoljenje za lokacijo",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Tukaj vnesi svojo zemljepisno dolžino",
"lock": "Zaklepanje",
"locked_folder": "Zaklenjena mapa",
"log_detail_title": "Podrobnosti dnevnika",
"log_out": "Odjava",
"log_out_all_devices": "Odjava vseh naprav",
"logged_in_as": "Prijavljen kot {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Geslo je bilo uspešno posodobljeno",
"logout_all_device_confirmation": "Ali ste prepričani, da želite odjaviti vse naprave?",
"logout_this_device_confirmation": "Ali ste prepričani, da se želite odjaviti iz te naprave?",
"logs": "Dnevniki",
"longitude": "Zemljepisna dolžina",
"look": "Izgled",
"loop_videos": "Zanka videoposnetkov",
@ -1301,6 +1321,7 @@
"mark_as_read": "Označi kot prebrano",
"marked_all_as_read": "Označeno vse kot prebrano",
"matches": "Ujemanja",
"matching_assets": "Ujemajoča se sredstva",
"media_type": "Vrsta medija",
"memories": "Spomini",
"memories_all_caught_up": "Vse dohiteno",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Ime ali vzdevek",
"network_requirement_photos_upload": "Uporaba mobilnih podatkov za varnostno kopiranje fotografij",
"network_requirement_videos_upload": "Uporaba mobilnih podatkov za varnostno kopiranje videoposnetkov",
"network_requirements": "Omrežne zahteve",
"network_requirements_updated": "Omrežne zahteve so se spremenile, ponastavitev čakalne vrste za varnostno kopiranje",
"networking_settings": "Omrežje",
"networking_subtitle": "Upravljaj nastavitve končne točke strežnika",
@ -1351,6 +1373,7 @@
"new_person": "Nova oseba",
"new_pin_code": "Nova PIN koda",
"new_pin_code_subtitle": "To je vaš prvi dostop do zaklenjene mape. Ustvarite PIN kodo za varen dostop do te strani",
"new_timeline": "Nova časovnica",
"new_user_created": "Nov uporabnik ustvarjen",
"new_version_available": "NA VOLJO JE NOVA RAZLIČICA",
"newest_first": "Najprej najnovejše",
@ -1364,20 +1387,25 @@
"no_assets_message": "KLIKNITE ZA NALOŽITEV SVOJE PRVE FOTOGRAFIJE",
"no_assets_to_show": "Ni sredstev za prikaz",
"no_cast_devices_found": "Naprav za predvajanje ni bilo mogoče najti",
"no_checksum_local": "Kontrolna vsota ni na voljo lokalnih sredstev ni mogoče pridobiti",
"no_checksum_remote": "Kontrolna vsota ni na voljo oddaljenega sredstva ni mogoče pridobiti",
"no_duplicates_found": "Najden ni bil noben dvojnik.",
"no_exif_info_available": "Podatki o exif niso na voljo",
"no_explore_results_message": "Naložite več fotografij, da raziščete svojo zbirko.",
"no_favorites_message": "Dodajte priljubljene, da hitreje najdete svoje najboljše slike in videoposnetke",
"no_libraries_message": "Ustvarite zunanjo knjižnico za ogled svojih fotografij in videoposnetkov",
"no_local_assets_found": "S to kontrolno vsoto ni bilo najdenih lokalnih sredstev",
"no_locked_photos_message": "Fotografije in videoposnetki v zaklenjeni mapi so skriti in se ne bodo prikazali med brskanjem ali iskanjem po knjižnici.",
"no_name": "Brez imena",
"no_notifications": "Ni obvestil",
"no_people_found": "Ni najdenih ustreznih oseb",
"no_places": "Ni krajev",
"no_remote_assets_found": "S to kontrolno vsoto ni bilo najdenih oddaljenih sredstev",
"no_results": "Brez rezultatov",
"no_results_description": "Poskusite s sinonimom ali bolj splošno ključno besedo",
"no_shared_albums_message": "Ustvarite album za skupno rabo fotografij in videoposnetkov z osebami v vašem omrežju",
"no_uploads_in_progress": "Ni nalaganj v teku",
"not_available": "Ni na voljo",
"not_in_any_album": "Ni v nobenem albumu",
"not_selected": "Ni izbrano",
"note_apply_storage_label_to_previously_uploaded assets": "Opomba: Če želite oznako za shranjevanje uporabiti za predhodno naložena sredstva, zaženite",
@ -1588,6 +1616,7 @@
"regenerating_thumbnails": "Obnavljanje sličic",
"remote": "Oddaljeno",
"remote_assets": "Oddaljena sredstva",
"remote_media_summary": "Povzetek oddaljenih medijev",
"remove": "Odstrani",
"remove_assets_album_confirmation": "Ali ste prepričani, da želite odstraniti {count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}} iz albuma?",
"remove_assets_shared_link_confirmation": "Ali ste prepričani, da želite odstraniti {count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}} iz te skupne povezave?",
@ -1863,6 +1892,7 @@
"show_slideshow_transition": "Prikaži prehod diaprojekcije",
"show_supporter_badge": "Značka podpornika",
"show_supporter_badge_description": "Prikaži značko podpornika",
"show_text_search_menu": "Prikaži meni za iskanje po besedilu",
"shuffle": "Naključno",
"sidebar": "Stranska vrstica",
"sidebar_display_description": "Prikaži povezavo do pogleda v stranski vrstici",
@ -1893,6 +1923,7 @@
"stacktrace": "Sled nabora",
"start": "Začetek",
"start_date": "Datum začetka",
"start_date_before_end_date": "Začetni datum mora biti pred končnim datumom",
"state": "Dežela",
"status": "Status",
"stop_casting": "Ustavi predvajanje",
@ -2095,5 +2126,6 @@
"yes": "Da",
"you_dont_have_any_shared_links": "Nimate nobenih skupnih povezav",
"your_wifi_name": "Vaše ime Wi-Fi",
"zoom_image": "Povečava slike"
"zoom_image": "Povečava slike",
"zoom_to_bounds": "Povečaj do meja"
}

View File

@ -387,8 +387,6 @@
"admin_password": "Admin Lösenord",
"administration": "Administration",
"advanced": "Avancerat",
"advanced_settings_beta_timeline_subtitle": "Testa den nya appupplevelsen",
"advanced_settings_beta_timeline_title": "Tidslinje(BETA)",
"advanced_settings_enable_alternate_media_filter_subtitle": "Använd det här alternativet för att filtrera media under synkronisering baserat på alternativa kriterier. Prova detta endast om du har problem med att appen inte hittar alla album.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTELLT] Använd alternativ enhetsalbum-synkroniseringsfilter",
"advanced_settings_log_level_title": "Loggnivå: {level}",
@ -1515,7 +1513,7 @@
"profile_drawer_client_out_of_date_minor": "Mobilappen är föråldrad. Uppdatera till senaste versionen.",
"profile_drawer_client_server_up_to_date": "Klient och server är uppdaterade",
"profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Skrivskyddat läge aktiverat. Håll in användaravatarikonen för att avsluta",
"profile_drawer_readonly_mode": "Skrivskyddat läge aktiverat. Långtryck användaravatarikonen för att avsluta.",
"profile_drawer_server_out_of_date_major": "Servern har en föråldrad mjukvara. Uppdatera till senaste versionen.",
"profile_drawer_server_out_of_date_minor": "Servern har en föråldrad mjukvara. Uppdatera till senaste versionen.",
"profile_image_of_user": "{user} profilbild",

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@
"added_to_favorites_count": "{count, number} fotoğraf favorilere eklendi",
"admin": {
"add_exclusion_pattern_description": "Hariç tutma desenleri ekleyin. *, ** ve ? kullanılarak Globbing (temsili yer doldurucu karakter) desteklenir. Farzedelim \"Raw\" adlı bir dizininiz var, içinde ki tüm dosyaları yoksaymak için \"**/Raw/**\" şeklinde yazabilirsiniz. \".tif\" ile biten tüm dosyaları yoksaymak için \"**/*.tif\" yazabilirsiniz. Mutlak yolu yoksaymak için \"/yoksayılacak/olan/yol/**\" şeklinde yazabilirsiniz.",
"admin_user": "Yönetici kullanıcısı",
"admin_user": "Yönetici Kullanıcı",
"asset_offline_description": "Bu harici kütüphane öğesi artık diskte bulunmuyor ve çöp kutusuna taşındı. Dosya kütüphane içinde taşındıysa, yeni karşılık gelen öğe için zaman çizelgenizi kontrol edin. Bu öğeyi geri yüklemek için lütfen aşağıdaki dosya yolunun Immich tarafından erişilebilir olduğundan emin olun ve kütüphaneyi tarayın.",
"authentication_settings": "Yetkilendirme Ayarları",
"authentication_settings_description": "Şifre, OAuth, ve diğer yetkilendirme ayarlarını yönet",
@ -66,9 +66,9 @@
"confirm_user_password_reset": "{user} adlı kullanıcının şifresini sıfırlamak istediğinize emin misiniz?",
"confirm_user_pin_code_reset": "{user} adlı kullanıcının PIN kodunu sıfırlamak istediğinize emin misiniz?",
"create_job": "Görev oluştur",
"cron_expression": "Cron İfadesi",
"cron_expression": "Cron ifadesi",
"cron_expression_description": "Cron formatını kullanarak tarama aralığını belirle. Daha fazla bilgi için örneğin <link>Crontab Guru</link>ya bakın",
"cron_expression_presets": "Cron İfadesi Önayarları",
"cron_expression_presets": "Cron ifadesi ön ayarları",
"disable_login": "Girişi devre dışı bırak",
"duplicate_detection_job_description": "Benzer fotoğrafları bulmak için makine öğrenmesini çalıştır. Bu işlem Akıllı Arama'ya bağlıdır",
"exclusion_pattern_description": "Kütüphaneyi tararken dosya ve klasörleri görmezden gelmek için dışlama desenlerini kullanabilirsiniz. RAW dosyaları gibi bazı dosya ve klasörleri içe aktarmak istemediğinizde bu seçeneği kullanabilirsiniz.",
@ -84,9 +84,9 @@
"image_fullsize_enabled": "Tam boyutlu görüntü üretimini etkinleştir",
"image_fullsize_enabled_description": "Yerleşik önizlemeyi tercih et” seçeneği etkinleştirildiğinde, yerleşik önizlemeler dönüştürme yapılmadan doğrudan kullanılır. JPEG gibi web dostu formatlar bu ayardan etkilenmez.",
"image_fullsize_quality_description": "1-100 arasında tam boyutlu görüntü kalitesi. Daha yüksek kalitelidir, ancak daha büyük dosyalar üretir.",
"image_fullsize_title": "Tam boyutlu görüntü ayarları",
"image_prefer_embedded_preview": "Gömülü önizlemeyi tercih et",
"image_prefer_embedded_preview_setting_description": "RAtoğrafları için mümkün olduğunda gömülü önizlemeyi kullan. Bu, bazı fotoğraflarda daha gerçekçi renkler n kameraya bağlıdır ve fotoğrafta normalden daha fazla görüntü bozukluklarına sebep olabilir.",
"image_fullsize_title": "Tam Boyutlu Görüntü Ayarları",
"image_prefer_embedded_preview": "Gömülü ön izlemeyi tercih et",
"image_prefer_embedded_preview_setting_description": "RAW fotoğrafları için mümkün olduğunda gömülü ön izlemeyi kullan. Bu, bazı fotoğraflarda daha gerçekçi renkler n kameraya bağlıdır ve fotoğrafta normalden daha fazla görüntü bozukluklarına sebep olabilir.",
"image_prefer_wide_gamut": "Geniş renk aralığını tercih et",
"image_prefer_wide_gamut_setting_description": "Önizleme görseli için P3 renk paletini tercih et. Bu, geniş renk paletli fotoğraflarda renk canlılığını daha iyi korur, fakat fotoğraflar eski tarayıcılarda ve eski cihazlarda daha farklı görünebilir. sRGB fotoğraflar renk paletini korumak için sRGB olarak tutulur.",
"image_preview_description": "Orta boyutlu görüntü, meta verisi çıkarılmış, tekil bir öğe görüntülenirken ve makine öğrenimi için kullanılır",
@ -95,7 +95,7 @@
"image_quality": "Kalite",
"image_resolution": "Çözünürlük",
"image_resolution_description": "Daha yüksek çözünürlükle, daha fazla detayı koruyabilir ancak kodlanması daha uzun sürer, daha büyük dosya boyutlarına sahip olur ve uygulamanın yanıt verme hızını azaltabilir.",
"image_settings": "Fotoğraf ayarları",
"image_settings": "Fotoğraf Ayarları",
"image_settings_description": "Oluşturulan fotoğrafların kalite ve çözünürlüklerini yönet",
"image_thumbnail_description": "Meta verisi çıkarılmış küçük boyutlu küçük resim, ana zaman çizelgesi gibi fotoğraf gruplarını görüntülerken kullanılır",
"image_thumbnail_quality_description": "Küçük resim kalitesi 1-100 arasında. Daha yüksek değerler daha iyidir, ancak daha büyük dosyalar üretir ve uygulamanın yanıt hızını azaltabilir.",
@ -114,7 +114,7 @@
"library_scanning": "Periyodik Tarama",
"library_scanning_description": "Periyodik kütüphane taramasını yönet",
"library_scanning_enable_description": "Periyodik kütüphane taramasını etkinleştir",
"library_settings": "Harici kütüphane",
"library_settings": "Harici Kütüphane",
"library_settings_description": "Harici kütüphane ayarlarını yönet",
"library_tasks_description": "Yeni yada değiştirilmiş öğeler için dış kütüphaneleri tara",
"library_watching_enable_description": "Harici kütüphanelerdeki dosya değişikliklerini izle",
@ -122,10 +122,17 @@
"library_watching_settings_description": "Değişen dosyalar için otomatik olarak izle",
"logging_enable_description": "Günlüğü aktifleştir",
"logging_level_description": "Etkinleştirildiğinde hangi günlük seviyesi kullanılır.",
"logging_settings": "Günlük tutma",
"logging_settings": "Günlük Tutma",
"machine_learning_availability_checks": "Kullanılabilirlik kontrolleri",
"machine_learning_availability_checks_description": "Kullanılabilir makine öğrenimi sunucularını otomatik olarak algılayın ve tercih edin",
"machine_learning_availability_checks_enabled": "Kullanılabilirlik kontrollerini etkinleştir",
"machine_learning_availability_checks_interval": "Kontrol aralığı",
"machine_learning_availability_checks_interval_description": "Kullanılabilirlik kontrolleri arasındaki milisaniye cinsinden aralık",
"machine_learning_availability_checks_timeout": "İstek zaman aşımı",
"machine_learning_availability_checks_timeout_description": "Kullanılabilirlik kontrolleri için milisaniye cinsinden zaman aşımı",
"machine_learning_clip_model": "CLIP modeli",
"machine_learning_clip_model_description": "<link>Link</link> burada listelenen CLIP modelinin adı. Bu özelliği değiştirdikten sonra \"Akıllı Arama\" işini tüm fotoğraflar için tekrardan çalıştırmalısınız.",
"machine_learning_duplicate_detection": "Kopya fotoğraf tespiti",
"machine_learning_duplicate_detection": "Kopya Fotoğraf Tespiti",
"machine_learning_duplicate_detection_enabled": "Kopya fotoğraf tespitini etkinleştir",
"machine_learning_duplicate_detection_enabled_description": "Devre dışı bırakılırsa aynı öğeler yine de temizlenecek.",
"machine_learning_duplicate_detection_setting_description": "Birbirinin kopyası olan varlıkları bulmak için CLIP kullan",
@ -133,9 +140,9 @@
"machine_learning_enabled_description": "Eğer devre dışı bırakılırsa bütün Makine Öğrenmesi özellikleri devre dışı bırakılacak.",
"machine_learning_facial_recognition": "Yüz Tanıma",
"machine_learning_facial_recognition_description": "Fotoğraflardaki yüzleri tara, tanı ve gruplandır",
"machine_learning_facial_recognition_model": "Yüz Tanıma Modeli",
"machine_learning_facial_recognition_model": "Yüz tanıma modeli",
"machine_learning_facial_recognition_model_description": "Modeller, azalan boyut sırasına göre listelenmiştir. Daha büyük modeller daha yavaştır ve daha fazla bellek kullanır, ancak daha iyi sonuçlar üretir. Bir modeli değiştirdikten sonra tüm görüntüler için yüz algılama işini yeniden çalıştırmanız gerektiğini unutmayın.",
"machine_learning_facial_recognition_setting": "Yüz Tanımayı etkinleştir",
"machine_learning_facial_recognition_setting": "Yüz tanımayı etkinleştir",
"machine_learning_facial_recognition_setting_description": "Devre dışı bırakıldığında fotoğraflar yüz tanıma için işlenmeyecek ve Keşfet sayfasındaki Kişiler sekmesini doldurmayacak.",
"machine_learning_max_detection_distance": "Maksimum tespit uzaklığı",
"machine_learning_max_detection_distance_description": "Resimleri birbirinin çifti saymak için hesap edilecek azami benzerlik ölçüsü, 0.001-0.1 aralığında. Daha yüksek değer daha hassas olup daha fazla çift tespit eder ancak çift olmayan resimleri birbirinin çifti sayabilir.",
@ -209,7 +216,7 @@
"notification_email_test_email_sent": "Test emaili {email} adresine yollandı. Lütfen gelen kutunuzu kontrol edin.",
"notification_email_username_description": "Email sunucu doğrulamasında kullanılacak olan kullanıcı adı",
"notification_enable_email_notifications": "Email bildirimlerini etkinleştir",
"notification_settings": "Bildirim ayarları",
"notification_settings": "Bildirim Ayarları",
"notification_settings_description": "Email ve bildirim ayarlarını yönet",
"oauth_auto_launch": "Otomatik başlat",
"oauth_auto_launch_description": "Giriş sayfasına girildiğinde OAuth akışını otomatik olarak başlat",
@ -232,16 +239,16 @@
"oauth_storage_quota_claim_description": "Kullanıcıya depolama kotası koymak için kullanılacak değer (en: OAuth claim).",
"oauth_storage_quota_default": "Varsayılan depolama kotası (GiB)",
"oauth_storage_quota_default_description": "Değer (en: OAuth claim) mevcut değilse GiB cinsinden konulacak kota.",
"oauth_timeout": "İstek zaman aşımı",
"oauth_timeout": "İstek Zaman Aşımı",
"oauth_timeout_description": "Milisaniye cinsinden istek zaman aşımı",
"password_enable_description": "E-posta ve şifre ile giriş yapın",
"password_settings": "Şifre ile Giriş",
"password_settings_description": "Şifre giriş ayarlarını yönet",
"paths_validated_successfully": "Tüm yollar başarıyla doğrulandı",
"person_cleanup_job": "Kişi temizleme",
"quota_size_gib": "Kota boyutu (GiB)",
"quota_size_gib": "Kota Boyutu (GiB)",
"refreshing_all_libraries": "Tüm kütüphaneler yenileniyor",
"registration": "Yönetici kaydı",
"registration": "Yönetici Kaydı",
"registration_description": "Sistemdeki ilk kullanıcı olduğunuz için hesabınız Yönetici olarak ayarlandı. Yeni oluşturulan üyeliklerin, ve yönetici görevlerinin sorumlusu olarak atandınız.",
"require_password_change_on_login": "Kullanıcının ilk girişinde şifre değiştirmesini zorunlu kıl",
"reset_settings_to_default": "Ayarları varsayılana sıfırla",
@ -253,7 +260,7 @@
"server_external_domain_settings_description": "Paylaşılan fotoğraflar için domain, http(s):// dahil",
"server_public_users": "Harici Kullanıcılar",
"server_public_users_description": "Paylaşılan albümlere bir kullanıcı eklenirken tüm kullanıcılar (ad ve e-posta) listelenir. Devre dışı bırakıldığında, kullanıcı listesi yalnızca yönetici kullanıcılar tarafından kullanılabilir.",
"server_settings": "Sunucu ayarları",
"server_settings": "Sunucu Ayarları",
"server_settings_description": "Sunucu ayarlarını yönet",
"server_welcome_message": "Hoş geldin mesajı",
"server_welcome_message_description": "Giriş sayfasında gösterilen mesaj.",
@ -289,7 +296,7 @@
"template_settings_description": "Bildirim şablonlarını yönet",
"theme_custom_css_settings": "Özel CSS",
"theme_custom_css_settings_description": "CSS (Cascading Style Sheets) kullanılarak Immich'in tasarımı değiştirilebilir.",
"theme_settings": "Tema ayarları",
"theme_settings": "Tema Ayarları",
"theme_settings_description": "Immich web arayüzünün özelleştirilmesi ayarlarını yönet",
"thumbnail_generation_job": "Önizlemeleri oluştur",
"thumbnail_generation_job_description": "Her bir öğe için büyük, küçük ve bulanık küçük resimler ile her kişi için küçük resimler oluşturun",
@ -356,8 +363,8 @@
"trash_enabled_description": "Çöp özelliklerini etkinleştir",
"trash_number_of_days": "Gün sayısı",
"trash_number_of_days_description": "Öğeleri kalıcı olarak silmeden önce çöp kutusunda tutma süresi (gün)",
"trash_settings": "Çöp ayarları",
"trash_settings_description": "Çöp ayarlarını yönet",
"trash_settings": "Çöp Kutusu Ayarları",
"trash_settings_description": "Çöp kutusu ayarlarını yönet",
"unlink_all_oauth_accounts": "Tüm OAuth hesaplarının bağlantısını kaldır",
"unlink_all_oauth_accounts_description": "Yeni bir sağlayıcıya geçmeden önce tüm OAuth hesaplarını kaldırılmayı unutmayın.",
"unlink_all_oauth_accounts_prompt": "Tüm OAuth hesaplarını kaldırmak istediğinizden emin misiniz? Bu, her kullanıcı için OAuth kimliğini sıfırlar ve geri alınamaz.",
@ -374,7 +381,7 @@
"user_restore_description": "<b>{user}</b> kullanıcısı geri yüklenecek.",
"user_restore_scheduled_removal": "Kullanıcıyı geri yükle - {date, date, long} tarihinde planlanan kaldırma",
"user_settings": "Kullanıcı Ayarları",
"user_settings_description": "Kullanıcı Ayarlarını Yönet",
"user_settings_description": "Kullanıcı ayarlarını yönet",
"user_successfully_removed": "Kullanıcı {email} başarıyla kaldırıldı.",
"version_check_enabled_description": "Sürüm kontrolü etkin",
"version_check_implications": "Sürüm kontrol özelliği, github.com ile periyodik iletişime dayanır",
@ -387,8 +394,6 @@
"admin_password": "Yönetici Şifresi",
"administration": "Yönetim",
"advanced": "Gelişmiş",
"advanced_settings_beta_timeline_subtitle": "Yeni uygulama deneyimini deneyin",
"advanced_settings_beta_timeline_title": "Beta Zaman Çizelgesi",
"advanced_settings_enable_alternate_media_filter_subtitle": "Eşzamanlama sırasında medyayı alternatif ölçütlere göre süzgeçten geçirmek için bu seçeneği kullanın. Uygulamanın tüm albümleri algılamasında sorun yaşıyorsanız yalnızca bu durumda deneyin.",
"advanced_settings_enable_alternate_media_filter_title": "[DENEYSEL] Alternatif cihaz albüm eşzamanlama süzgeci kullanın",
"advanced_settings_log_level_title": "Günlük düzeyi: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "{user} kullanıcısını kaldırmak istediğinize emin misiniz?",
"album_search_not_found": "Aramanızla eşleşen albüm bulunamadı",
"album_share_no_users": "Görünüşe göre bu albümü tüm kullanıcılarla paylaştınız veya paylaşacak herhangi bir başka kullanıcınız yok.",
"album_summary": "Albüm özeti",
"album_updated": "Albüm güncellendi",
"album_updated_setting_description": "Paylaşılan bir albüme yeni bir öğe eklendiğinde e-posta bildirimi alın",
"album_user_left": "{album}den ayrıldınız",
@ -491,11 +497,13 @@
"asset_list_layout_sub_title": "Düzen",
"asset_list_settings_subtitle": "Fotoğraf ızgara düzeni ayarları",
"asset_list_settings_title": "Fotoğraf Izgarası",
"asset_offline": "Varlık Çevrim Dışı",
"asset_offline": "Öğe Çevrim Dışı",
"asset_offline_description": "Bu harici öğe artık diskte bulunmuyor. Yardım için lütfen Immich yöneticinizle iletişime geçin.",
"asset_restored_successfully": "Öğe başarıyla geri yüklendi",
"asset_skipped": "Atlandı",
"asset_skipped_in_trash": "Çöpte",
"asset_trashed": "Öğe çöpe atıldı",
"asset_troubleshoot": "Öğe Sorun Giderme",
"asset_uploaded": "Yüklendi",
"asset_uploading": "Yükleniyor…",
"asset_viewer_settings_subtitle": "Galeri görüntüleyici ayarlarını düzenle",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Otomatik slayt gösterisi",
"back": "Geri",
"back_close_deselect": "Geri, kapat veya seçimi kaldır",
"background_backup_running_error": "Arka plan yedekleme şu anda çalışıyor, manuel yedekleme başlatılamıyor",
"background_location_permission": "Arka plan konum izni",
"background_location_permission_content": "Arka planda çalışırken ağ değiştirmek için Immich'in *her zaman* tam konum erişimine sahip olması gerekir, böylece uygulama Wi-Fi ağının adını okuyabilir",
"background_options": "Arka Plan Seçenekleri",
"backup": "Yedekle",
"backup_album_selection_page_albums_device": "Cihazdaki albümler ({count})",
"backup_album_selection_page_albums_tap": "Seçmek için dokunun, hariç tutmak için çift dokunun",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Albüm seç",
"backup_album_selection_page_selection_info": "Seçim Bilgileri",
"backup_album_selection_page_total_assets": "Toplam eşsiz öğeler",
"backup_albums_sync": "Yedekleme albümlerinin senkronizasyonu",
"backup_all": "Tümü",
"backup_background_service_backup_failed_message": "Yedekleme başarısız. Tekrar deneniyor…",
"backup_background_service_connection_failed_message": "Sunucuya bağlanılamadı. Tekrar deneniyor…",
@ -654,6 +665,8 @@
"change_pin_code": "PIN kodunu değiştirin",
"change_your_password": "Şifreni değiştir",
"changed_visibility_successfully": "Görünürlük başarıyla değiştirildi",
"charging": "Şarj oluyor",
"charging_requirement_mobile_backup": "Arka plan yedekleme için cihazın şarjda olması gerekir",
"check_corrupt_asset_backup": "Bozuk öğe yedeklemelerini kontrol et",
"check_corrupt_asset_backup_button": "Kontrol et",
"check_corrupt_asset_backup_description": "Bu kontrolü yalnızca Wi-Fi üzerinden ve tüm öğeler yedeklendikten sonra çalıştırın. İşlem birkaç dakika sürebilir.",
@ -740,6 +753,7 @@
"create_user": "Kullanıcı oluştur",
"created": "Oluşturuldu",
"created_at": "Oluşturuldu",
"creating_linked_albums": "Bağlantılı albümler oluşturuluyor...",
"crop": "Kes",
"curated_object_page_title": "Nesneler",
"current_device": "Mevcut cihaz",
@ -889,7 +903,9 @@
"error": "Hata",
"error_change_sort_album": "Albüm sıralama düzeni değiştirilemedi",
"error_delete_face": "Öğeden yüz silme hatası",
"error_getting_places": "Konum bilgisi alınırken hata oluştu",
"error_loading_image": "Resim yüklenirken hata oluştu",
"error_loading_partners": "Ortakları yükleme hatası: {error}",
"error_saving_image": "Hata: {error}",
"error_tag_face_bounding_box": "Yüz etiketleme hatası sınırlayıcı kutu koordinatları alınamadı",
"error_title": "Bir Hata Oluştu - Bir şeyler ters gitti",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "Favori öğe bulunamadı",
"feature_photo_updated": "Öne çıkan fotoğraf güncellendi",
"features": "Özellikler",
"features_in_development": "Geliştirme Aşamasındaki Özellikler",
"features_setting_description": "Uygulamanın özelliklerini yönet",
"file_name": "Dosya adı",
"file_name_or_extension": "Dosya adı veya uzantı",
@ -1093,8 +1110,8 @@
"haptic_feedback_switch": "Dokunsal geri bildirimi aç",
"haptic_feedback_title": "Dokunsal Geri Bildirim (Haptic Feedback)",
"has_quota": "Kota var",
"hash_asset": "Hash varlığı",
"hashed_assets": "Hashlenmiş varlıklar",
"hash_asset": "Karma öğe",
"hashed_assets": "Karma öğeler",
"hashing": "Hashleme",
"header_settings_add_header_tip": "Header Ekle",
"header_settings_field_validator_msg": "Değer boş olamaz",
@ -1218,6 +1235,7 @@
"local": "Yerel",
"local_asset_cast_failed": "Sunucuya yüklenmemiş bir öğe yansıtılamaz",
"local_assets": "Yerel Öğeler",
"local_media_summary": "Yerel Medya Özeti",
"local_network": "Yerel Wi-Fi",
"local_network_sheet_info": "Uygulama belirlenmiş Wi-Fi ağını kullanırken bu URL üzerinden sunucuya bağlanacaktır",
"location_permission": "Konum izni",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Buraya boylam yazın",
"lock": "Kilitle",
"locked_folder": "Kilitli Klasör",
"log_detail_title": "Günlük Ayrıntıları",
"log_out": "Oturumu kapat",
"log_out_all_devices": "Tüm Cihazlarda Oturumu Kapat",
"logged_in_as": "{user} olarak oturum açıldı",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Şifre başarıyla güncellendi",
"logout_all_device_confirmation": "Tüm cihazlarda oturum kapatmak istediğinizden emin misiniz?",
"logout_this_device_confirmation": "Bu cihazda oturum kapatmak istediğinizden emin misiniz?",
"logs": "Kayıtlar",
"longitude": "Boylam",
"look": "Görünüm",
"loop_videos": "Videoları döngüye al",
@ -1301,6 +1321,7 @@
"mark_as_read": "Okundu olarak işaretle",
"marked_all_as_read": "Tümü okundu olarak işaretlendi",
"matches": "Eşleşenler",
"matching_assets": "Eşleşen Öğeler",
"media_type": "Medya türü",
"memories": "Anılar",
"memories_all_caught_up": "Tümü görüldü",
@ -1341,6 +1362,7 @@
"name_or_nickname": "İsim veya takma isim",
"network_requirement_photos_upload": "Fotoğrafları yedeklemek için mobil veriyi kullan",
"network_requirement_videos_upload": "Videoları yedeklemek için mobil veriyi kullan",
"network_requirements": "Ağ Gereksinimleri",
"network_requirements_updated": "Ağ durumu değişti, yedekleme kuyruğu sıfırlandı",
"networking_settings": "Ağ Ayarları",
"networking_subtitle": "Sunucu uç nokta ayarlarını düzenle",
@ -1351,6 +1373,7 @@
"new_person": "Yeni kişi",
"new_pin_code": "Yeni PIN kodu",
"new_pin_code_subtitle": "Kilitli klasöre ilk kez erişiyorsunuz. Bu sayfaya güvenli erişim için bir PIN kodu oluşturun",
"new_timeline": "Yeni Zaman Çizelgesi",
"new_user_created": "Yeni kullanıcı oluşturuldu",
"new_version_available": "YENİ SÜRÜM MEVCUT",
"newest_first": "Önce en yeniler",
@ -1364,20 +1387,25 @@
"no_assets_message": "İLK FOTOĞRAFINIZI YÜKLEMEK İÇİN TIKLAYIN",
"no_assets_to_show": "Gösterilecek öğe yok",
"no_cast_devices_found": "Yansıtılacak cihaz bulunamadı",
"no_checksum_local": "Sağlama toplamı mevcut değil - yerel varlıkları alamıyor",
"no_checksum_remote": "Sağlama toplamı mevcut değil - uzak varlık alınamıyor",
"no_duplicates_found": "Çift bulunamadı.",
"no_exif_info_available": "EXIF bilgisi mevcut değil",
"no_explore_results_message": "Koleksiyonunuzu keşfetmek için daha fazla fotoğraf yükleyin.",
"no_favorites_message": "En sevdiğiniz fotoğraf ve videoları hızlıca bulmak için favorilere ekleyin",
"no_libraries_message": "Fotoğraf ve videolarınızı görmek için bir harici kütüphane oluşturun",
"no_local_assets_found": "Bu sağlama toplamı ile yerel varlık bulunamadı",
"no_locked_photos_message": "Kilitli klasördeki fotoğraf ve videolar gizlidir; kitaplığınızda gezinirken veya arama yaparken görünmezler.",
"no_name": "İsim yok",
"no_notifications": "Bildirim yok",
"no_people_found": "Eşleşen kişi bulunamadı",
"no_places": "Yer yok",
"no_remote_assets_found": "Bu sağlama toplamı ile uzaktaki varlık bulunamadı",
"no_results": "Sonuç bulunamadı",
"no_results_description": "Eş anlamlı ya da daha genel anlamlı bir kelime deneyin",
"no_shared_albums_message": "Fotoğrafları ve videolarıınızdaki kişilerle paylaşmak için bir albüm oluşturun",
"no_uploads_in_progress": "Yükleme işlemi yok",
"not_available": "YOK",
"not_in_any_album": "Hiçbir albümde değil",
"not_selected": "Seçilmedi",
"note_apply_storage_label_to_previously_uploaded assets": "Not: Daha önce yüklenen öğeler için bir depolama yolu etiketi uygulamak üzere şunu başlatın",
@ -1588,6 +1616,7 @@
"regenerating_thumbnails": "Küçük resimler yeniden oluşturuluyor",
"remote": "Uzaktan",
"remote_assets": "Uzak Öğeler",
"remote_media_summary": "Uzaktan Medya Özeti",
"remove": "Kaldır",
"remove_assets_album_confirmation": "{count, plural, one {# öğeyi} other {# öğeleri}} albümden çıkarmak istediğinizden emin misiniz?",
"remove_assets_shared_link_confirmation": "{count, plural, one {# öğeyi} other {# öğeleri}} bu paylaşılan bağlantıdan çıkarmak istediğinizden emin misiniz?",
@ -1863,6 +1892,7 @@
"show_slideshow_transition": "Slayt geçişini göster",
"show_supporter_badge": "Destekçi rozeti",
"show_supporter_badge_description": "Destekçi rozetini göster",
"show_text_search_menu": "Metin arama menüsünü göster",
"shuffle": "Karıştır",
"sidebar": "Yan panel",
"sidebar_display_description": "Yan panelde görünüme kısa yol göster",
@ -1893,6 +1923,7 @@
"stacktrace": "Yığın izi",
"start": "Başlat",
"start_date": "Başlangıç tarihi",
"start_date_before_end_date": "Başlangıç tarihi bitiş tarihinden önce olmalıdır",
"state": "Eyalet/İl",
"status": "Durum",
"stop_casting": "Yansıtmayı durdur",
@ -1974,7 +2005,7 @@
"trash_page_empty_trash_dialog_content": "Çöp kutusuna atılmış öğeleri silmek istediğinize emin misiniz? Bu öğeler Immich'ten kalıcı olarak silinecek",
"trash_page_info": "Çöp kutusuna atılan öğeler {days} gün sonra kalıcı olarak silinecektir",
"trash_page_no_assets": "Çöp kutusuna atılmış öğe yok",
"trash_page_restore_all": "Tümünü geri yükle",
"trash_page_restore_all": "Tümünü Geri Yükle",
"trash_page_select_assets_btn": "Öğeleri seç",
"trash_page_title": "Çöp Kutusu ({count})",
"trashed_items_will_be_permanently_deleted_after": "Silinen öğeler {days, plural, one {# gün} other {# gün}} sonra kalıcı olarak silinecek.",
@ -1990,16 +2021,16 @@
"unfavorite_action_prompt": "{count} Favorilerden kaldırıldı",
"unhide_person": "Kişiyi göster",
"unknown": "Bilinmeyen",
"unknown_country": "Bilinmeyen ülke",
"unknown_year": "Bilinmeyen YIl",
"unknown_country": "Bilinmeyen Ülke",
"unknown_year": "Bilinmeyen Yıl",
"unlimited": "Sınırsız",
"unlink_motion_video": "Hareketli video bağlantısını kaldır",
"unlink_oauth": "OAuth bağlantısını kaldır",
"unlinked_oauth_account": "Bağlantısı kaldırılmış OAuth hesabı",
"unmute_memories": "Anıların sesini aç",
"unmute_memories": "Anıların Sesini Aç",
"unnamed_album": "İsimsiz Albüm",
"unnamed_album_delete_confirmation": "Bu albümü silmek istediğinizden emin misiniz?",
"unnamed_share": "İsimsiz paylaşım",
"unnamed_share": "İsimsiz Paylaşım",
"unsaved_change": "Kaydedilmemiş değişiklik",
"unselect_all": "Tümünü seçimini kaldır",
"unselect_all_duplicates": "Tüm çiftlerin seçimini kaldır",
@ -2095,5 +2126,6 @@
"yes": "Evet",
"you_dont_have_any_shared_links": "Herhangi bir paylaşılan bağlantınız yok",
"your_wifi_name": "Wi-Fi Adınız",
"zoom_image": "Görüntüyü yakınlaştır"
"zoom_image": "Görüntüyü yakınlaştır",
"zoom_to_bounds": "Sınırlara yakınlaştır"
}

View File

@ -123,6 +123,13 @@
"logging_enable_description": "Увімкнути ведення журналу",
"logging_level_description": "Коли увімкнено, який рівень журналювання використовувати.",
"logging_settings": "Журналювання",
"machine_learning_availability_checks": "Перевірки доступності",
"machine_learning_availability_checks_description": "Автоматично виявляти та надавати перевагу доступним серверам машинного навчання",
"machine_learning_availability_checks_enabled": "Увімкнути перевірки доступності",
"machine_learning_availability_checks_interval": "Інтервал перевірки",
"machine_learning_availability_checks_interval_description": "Інтервал у мілісекундах між перевірками доступності",
"machine_learning_availability_checks_timeout": "Тайм-аут запиту",
"machine_learning_availability_checks_timeout_description": "Тайм-аут у мілісекундах для перевірки доступності",
"machine_learning_clip_model": "Модель CLIP",
"machine_learning_clip_model_description": "Ім'я однієї з моделей CLIP, яка перерахована <link>тут</link>. Зауважте, що потрібно знову запустити завдання «Розумний пошук» для всіх зображень після зміни моделі.",
"machine_learning_duplicate_detection": "Виявлення дублікатів",
@ -387,8 +394,6 @@
"admin_password": "Пароль адміністратора",
"administration": "Адміністрування",
"advanced": "Розширені",
"advanced_settings_beta_timeline_subtitle": "Випробуйте новий інтерфейс застосунку",
"advanced_settings_beta_timeline_title": "Бета-версія стрічки",
"advanced_settings_enable_alternate_media_filter_subtitle": "Використовуйте цей варіант для фільтрації медіафайлів під час синхронізації за альтернативними критеріями. Спробуйте це, якщо у вас виникають проблеми з тим, що застосунок не виявляє всі альбоми.",
"advanced_settings_enable_alternate_media_filter_title": "[ЕКСПЕРИМЕНТАЛЬНИЙ] Використовуйте альтернативний фільтр синхронізації альбомів пристрою",
"advanced_settings_log_level_title": "Рівень логування: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "Ви впевнені, що хочете видалити {user}?",
"album_search_not_found": "Альбомів, що відповідають вашому запиту, не знайдено",
"album_share_no_users": "Схоже, ви поділилися цим альбомом з усіма користувачами або у вас немає жодного користувача, з яким можна було б поділитися.",
"album_summary": "Короткий опис альбому",
"album_updated": "Альбом оновлено",
"album_updated_setting_description": "Отримуйте сповіщення на електронну пошту, коли у спільному альбомі з'являються нові ресурси",
"album_user_left": "Ви покинули {album}",
@ -496,6 +502,8 @@
"asset_restored_successfully": "Елемент успішно відновлено",
"asset_skipped": "Пропущено",
"asset_skipped_in_trash": "У кошику",
"asset_trashed": "Об'єкт видалено з кошика",
"asset_troubleshoot": "Вирішення проблем з активами",
"asset_uploaded": "Завантажено",
"asset_uploading": "Завантаження…",
"asset_viewer_settings_subtitle": "Керуйте налаштуваннями переглядача галереї",
@ -529,8 +537,10 @@
"autoplay_slideshow": "Автоматичне відтворення слайдшоу",
"back": "Назад",
"back_close_deselect": "Повернутися, закрити або скасувати вибір",
"background_backup_running_error": "Наразі виконується фонове резервне копіювання, неможливо розпочати резервне копіювання вручну",
"background_location_permission": "Дозвіл до місцезнаходження у фоні",
"background_location_permission_content": "Щоб перемикати мережі у фоновому режимі, Immich має *завжди* мати доступ до точної геолокації, щоб зчитувати назву Wi-Fi мережі",
"background_options": "Параметри фону",
"backup": "Резервне копіювання",
"backup_album_selection_page_albums_device": "Альбоми на пристрої ({count})",
"backup_album_selection_page_albums_tap": "Торкніться, щоб включити, двічі, щоб виключити",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "Оберіть альбоми",
"backup_album_selection_page_selection_info": "Інформація про обране",
"backup_album_selection_page_total_assets": "Загальна кількість унікальних елементів",
"backup_albums_sync": "Синхронізація резервних копій альбомів",
"backup_all": "Усі",
"backup_background_service_backup_failed_message": "Не вдалося зробити резервну копію елементів. Повторюю…",
"backup_background_service_connection_failed_message": "Не вдалося зв'язатися із сервером. Повторюю…",
@ -654,6 +665,8 @@
"change_pin_code": "Змінити PIN-код",
"change_your_password": "Змініть свій пароль",
"changed_visibility_successfully": "Видимість успішно змінено",
"charging": "Зарядка",
"charging_requirement_mobile_backup": "Для фонового резервного копіювання пристрій повинен заряджатися",
"check_corrupt_asset_backup": "Перевірити на пошкоджені резервні копії ресурсів",
"check_corrupt_asset_backup_button": "Виконати перевірку",
"check_corrupt_asset_backup_description": "Запустити цю перевірку лише через Wi-Fi та після того, як всі ресурси будуть завантажені на сервер. Процес може зайняти кілька хвилин.",
@ -740,6 +753,7 @@
"create_user": "Створити користувача",
"created": "Створено",
"created_at": "Створено",
"creating_linked_albums": "Створення пов’язаних альбомів...",
"crop": "Кадрувати",
"curated_object_page_title": "Речі",
"current_device": "Поточний пристрій",
@ -889,7 +903,9 @@
"error": "Помилка",
"error_change_sort_album": "Не вдалося змінити порядок сортування альбому",
"error_delete_face": "Помилка при видаленні обличчя з елементу",
"error_getting_places": "Помилка отримання місць",
"error_loading_image": "Помилка завантаження зображення",
"error_loading_partners": "Помилка завантаження партнерів: {error}",
"error_saving_image": "Помилка: {error}",
"error_tag_face_bounding_box": "Помилка під час позначення обличчя не вдалося отримати координати рамки",
"error_title": "Помилка: щось пішло не так",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "Немає улюблених елементів",
"feature_photo_updated": "Вибране фото оновлено",
"features": "Додаткові можливості",
"features_in_development": "Функції в розробці",
"features_setting_description": "Керування додатковими можливостями додатка",
"file_name": "Ім'я файлу",
"file_name_or_extension": "Ім'я файлу або розширення",
@ -1218,6 +1235,7 @@
"local": "На пристрої",
"local_asset_cast_failed": "Неможливо транслювати ресурс, який не завантажено на сервер",
"local_assets": "Локальні фото та відео",
"local_media_summary": "Зведення місцевих ЗМІ",
"local_network": "Локальна мережа",
"local_network_sheet_info": "Застосунок підключатиметься до сервера через цей URL, коли використовується вказана Wi-Fi мережа",
"location_permission": "Дозвіл до місцезнаходження",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "Вкажіть довготу",
"lock": "Заблокувати",
"locked_folder": "Особиста папка",
"log_detail_title": "Деталі журналу",
"log_out": "Вийти",
"log_out_all_devices": "Вийти з усіх пристроїв",
"logged_in_as": "Вхід виконано як {user}",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "Пароль оновлено успішно",
"logout_all_device_confirmation": "Ви впевнені, що хочете вийти з усіх пристроїв?",
"logout_this_device_confirmation": "Ви впевнені, що хочете вийти з цього пристрою?",
"logs": "Журнали",
"longitude": "Довгота",
"look": "Дивитися",
"loop_videos": "Циклічні відео",
@ -1301,6 +1321,7 @@
"mark_as_read": "Позначити як прочитане",
"marked_all_as_read": "Позначено всі як прочитані",
"matches": "Збіги",
"matching_assets": "Відповідні активи",
"media_type": "Тип медіа",
"memories": "Спогади",
"memories_all_caught_up": "Це все на сьогодні",
@ -1341,6 +1362,7 @@
"name_or_nickname": "Ім'я або псевдонім",
"network_requirement_photos_upload": "Використовувати стільникові дані для резервного копіювання фото",
"network_requirement_videos_upload": "Використовувати стільникові дані для резервного копіювання відео",
"network_requirements": "Вимоги до мережі",
"network_requirements_updated": "Вимоги до мережі змінилися, черга резервного копіювання очищена",
"networking_settings": "Мережеві налаштування",
"networking_subtitle": "Керування налаштуваннями кінцевої точки сервера",
@ -1351,6 +1373,7 @@
"new_person": "Нова людина",
"new_pin_code": "Новий PIN-код",
"new_pin_code_subtitle": "Ви вперше отримуєте доступ до особистої папки. Створіть PIN-код для безпечного доступу до цієї сторінки",
"new_timeline": "Нова хронологія",
"new_user_created": "Створено нового користувача",
"new_version_available": "ДОСТУПНА НОВА ВЕРСІЯ",
"newest_first": "Спочатку нові",
@ -1364,20 +1387,25 @@
"no_assets_message": "НАТИСНІТЬ, ЩОБ ЗАВАНТАЖИТИ ВАШЕ ПЕРШЕ ФОТО",
"no_assets_to_show": "Елементи відсутні",
"no_cast_devices_found": "Пристрої для трансляції не знайдено",
"no_checksum_local": "Контрольна сума недоступна неможливо отримати локальні ресурси",
"no_checksum_remote": "Контрольна сума недоступна неможливо отримати віддалений ресурс",
"no_duplicates_found": "Дублікатів не виявлено.",
"no_exif_info_available": "Відсутня інформація про exif",
"no_explore_results_message": "Завантажуйте більше фотографій, щоб насолоджуватися вашою колекцією.",
"no_favorites_message": "Додавайте улюблені файли, щоб швидко знаходити ваші найкращі зображення та відео",
"no_libraries_message": "Створіть зовнішню бібліотеку для перегляду фотографій і відео",
"no_local_assets_found": "З цією контрольною сумою не знайдено локальних ресурсів",
"no_locked_photos_message": "Фото та відео в особистій папці приховані і не відображаються під час перегляду чи пошуку у вашій бібліотеці.",
"no_name": "Без імені",
"no_notifications": "Немає сповіщень",
"no_people_found": "Людей, що відповідають запиту, не знайдено",
"no_places": "Місць немає",
"no_remote_assets_found": "З цією контрольною сумою не знайдено віддалених ресурсів",
"no_results": "Немає результатів",
"no_results_description": "Спробуйте використовувати синонім або більш загальне ключове слово",
"no_shared_albums_message": "Створіть альбом, щоб ділитися фотографіями та відео з людьми у вашій мережі",
"no_uploads_in_progress": "Немає активних завантажень",
"not_available": "Немає даних",
"not_in_any_album": "У жодному альбомі",
"not_selected": "Не вибрано",
"note_apply_storage_label_to_previously_uploaded assets": "Примітка: Щоб застосувати мітку сховища до раніше завантажених ресурсів, виконайте команду",
@ -1588,6 +1616,7 @@
"regenerating_thumbnails": "Відновлення мініатюр",
"remote": "На сервері",
"remote_assets": "Віддалені фото та відео",
"remote_media_summary": "Зведення віддалених медіафайлів",
"remove": "Вилучити",
"remove_assets_album_confirmation": "Ви впевнені, що хочете видалити {count, plural, one {# ресурс} few {# ресурси} many {# ресурсів} other {# ресурсів}} з альбому?",
"remove_assets_shared_link_confirmation": "Ви впевнені, що хочете видалити {count, plural, one {# ресурс} few {# ресурси} many {# ресурсів} other {# ресурсів}} з цього спільного посилання?",
@ -1863,6 +1892,7 @@
"show_slideshow_transition": "Показати перехід слайд-шоу",
"show_supporter_badge": "Значок підтримки",
"show_supporter_badge_description": "Показати значок підтримки",
"show_text_search_menu": "Показати меню текстового пошуку",
"shuffle": "Перемішати",
"sidebar": "Бічна панель",
"sidebar_display_description": "Відобразити посилання на перегляд у бічній панелі",
@ -1893,6 +1923,7 @@
"stacktrace": "Стек викликів",
"start": "Старт",
"start_date": "Дата початку",
"start_date_before_end_date": "Дата початку має бути раніше дати завершення",
"state": "Регіон",
"status": "Стан",
"stop_casting": "Зупинити трансляцію",
@ -2095,5 +2126,6 @@
"yes": "Так",
"you_dont_have_any_shared_links": "У вас немає спільних посилань",
"your_wifi_name": "Назва вашої Wi-Fi мережі",
"zoom_image": "Збільшити зображення"
"zoom_image": "Збільшити зображення",
"zoom_to_bounds": "Збільшити масштаб до меж"
}

View File

@ -360,8 +360,6 @@
"admin_password": "Mật khẩu Quản trị viên",
"administration": "Quản trị",
"advanced": "Nâng cao",
"advanced_settings_beta_timeline_subtitle": "Trải nghiệm giao diện app mới",
"advanced_settings_beta_timeline_title": "Timeline Beta",
"advanced_settings_enable_alternate_media_filter_subtitle": "Dùng tùy chọn này để lọc phương tiện khi đồng bộ theo tiêu chí khác. Chỉ thử khi ứng dụng không nhận diện được tất cả các album.",
"advanced_settings_enable_alternate_media_filter_title": "[THỬ NGHIỆM] Dùng bộ lọc đồng bộ album thay thế",
"advanced_settings_log_level_title": "Phân loại nhật ký: {level}",

View File

@ -387,8 +387,6 @@
"admin_password": "管理員密碼",
"administration": "管理",
"advanced": "進階",
"advanced_settings_beta_timeline_subtitle": "試用全新的應用程式體驗",
"advanced_settings_beta_timeline_title": "測試版時間軸",
"advanced_settings_enable_alternate_media_filter_subtitle": "使用此選項可在同步時依其他條件篩選媒體。僅在應用程式無法偵測到所有相簿時再嘗試使用。",
"advanced_settings_enable_alternate_media_filter_title": "[實驗性] 使用替代的裝置相簿同步篩選器",
"advanced_settings_log_level_title": "日誌等級:{level}",

View File

@ -123,6 +123,13 @@
"logging_enable_description": "启用日志记录",
"logging_level_description": "启用时,要使用的日志级别。",
"logging_settings": "日志",
"machine_learning_availability_checks": "可用性检查",
"machine_learning_availability_checks_description": "自动检测并优先选择可用的机器学习服务器",
"machine_learning_availability_checks_enabled": "启用可用性检查",
"machine_learning_availability_checks_interval": "检查间隔",
"machine_learning_availability_checks_interval_description": "两次可用性检查之间的间隔(毫秒)",
"machine_learning_availability_checks_timeout": "请求超时",
"machine_learning_availability_checks_timeout_description": "用于可用性检查的超时时间(毫秒)",
"machine_learning_clip_model": "CLIP 模型",
"machine_learning_clip_model_description": "请于 <link>此处</link>查看支持的 CLIP 模型名称。注意,更换模型后需要对所有图片重新运行“智能搜索”任务。",
"machine_learning_duplicate_detection": "重复项检测",
@ -387,8 +394,6 @@
"admin_password": "管理员密码",
"administration": "系统管理",
"advanced": "高级",
"advanced_settings_beta_timeline_subtitle": "体验全新的应用程序",
"advanced_settings_beta_timeline_title": "测试版时间线",
"advanced_settings_enable_alternate_media_filter_subtitle": "使用此选项可在同步过程中根据备用条件筛选项目。仅当您在应用程序检测所有相册均遇到问题时才尝试此功能。",
"advanced_settings_enable_alternate_media_filter_title": "[实验] 使用备用的设备相册同步筛选条件",
"advanced_settings_log_level_title": "日志等级: {level}",
@ -425,6 +430,7 @@
"album_remove_user_confirmation": "确定要移除“{user}”吗?",
"album_search_not_found": "未找到符合搜索条件的相册",
"album_share_no_users": "看起来您已与所有用户共享了此相册,或者您根本没有任何用户可共享。",
"album_summary": "相册摘要",
"album_updated": "相册有更新",
"album_updated_setting_description": "当共享相册有新项目时接收邮件通知",
"album_user_left": "离开“{album}”",
@ -496,6 +502,8 @@
"asset_restored_successfully": "已成功恢复所有项目",
"asset_skipped": "已跳过",
"asset_skipped_in_trash": "已回收",
"asset_trashed": "资产已被删除",
"asset_troubleshoot": "资产故障排除",
"asset_uploaded": "已上传",
"asset_uploading": "上传中…",
"asset_viewer_settings_subtitle": "管理图库浏览器设置",
@ -529,8 +537,10 @@
"autoplay_slideshow": "自动播放幻灯片",
"back": "返回",
"back_close_deselect": "返回、关闭或反选",
"background_backup_running_error": "后台备份正在运行,无法启动手动备份",
"background_location_permission": "后台定位权限",
"background_location_permission_content": "为确保后台运行时自动切换网络,需授予 Immich *始终允许精确定位* 权限,以识别 Wi-Fi 网络名称",
"background_options": "背景选项",
"backup": "备份",
"backup_album_selection_page_albums_device": "设备上的相册({count}",
"backup_album_selection_page_albums_tap": "单击选中,双击取消",
@ -538,6 +548,7 @@
"backup_album_selection_page_select_albums": "选择相册",
"backup_album_selection_page_selection_info": "选择信息",
"backup_album_selection_page_total_assets": "总计",
"backup_albums_sync": "备份相册同步",
"backup_all": "全部",
"backup_background_service_backup_failed_message": "备份失败,正在重试…",
"backup_background_service_connection_failed_message": "连接服务器失败,正在重试…",
@ -654,6 +665,8 @@
"change_pin_code": "修改PIN码",
"change_your_password": "修改您的密码",
"changed_visibility_successfully": "更改可见性成功",
"charging": "充电",
"charging_requirement_mobile_backup": "后台备份需要设备处于充电状态",
"check_corrupt_asset_backup": "检查备份是否损坏",
"check_corrupt_asset_backup_button": "执行检查",
"check_corrupt_asset_backup_description": "仅在连接到 Wi-Fi 并完成所有项目备份后执行此检查。该过程可能需要几分钟。",
@ -740,6 +753,7 @@
"create_user": "创建用户",
"created": "已创建",
"created_at": "已创建",
"creating_linked_albums": "正在创建相册链接…",
"crop": "裁剪",
"curated_object_page_title": "事物",
"current_device": "当前设备",
@ -889,7 +903,9 @@
"error": "错误",
"error_change_sort_album": "更改相册排序失败",
"error_delete_face": "删除人脸失败",
"error_getting_places": "获取位置时出错",
"error_loading_image": "加载图片时出错",
"error_loading_partners": "加载同伴时出错:{error}",
"error_saving_image": "错误:{error}",
"error_tag_face_bounding_box": "标记人脸出错 - 无法获取人脸框坐标",
"error_title": "错误 - 好像出了问题",
@ -1054,6 +1070,7 @@
"favorites_page_no_favorites": "未找到收藏项目",
"feature_photo_updated": "人物头像已更新",
"features": "功能",
"features_in_development": "开发中的功能",
"features_setting_description": "管理 App 功能",
"file_name": "文件名",
"file_name_or_extension": "文件名",
@ -1218,6 +1235,7 @@
"local": "本地",
"local_asset_cast_failed": "无法投放未上传至服务器的项目",
"local_assets": "本地项目",
"local_media_summary": "本地媒体摘要",
"local_network": "本地网络",
"local_network_sheet_info": "当使用指定的 Wi-Fi 网络时,应用程序将通过此 URL 访问服务器",
"location_permission": "定位权限",
@ -1229,6 +1247,7 @@
"location_picker_longitude_hint": "请在此处输入经度",
"lock": "锁定",
"locked_folder": "锁定文件夹",
"log_detail_title": "日志详细信息",
"log_out": "注销",
"log_out_all_devices": "注销所有设备",
"logged_in_as": "以 {user} 身份登录",
@ -1259,6 +1278,7 @@
"login_password_changed_success": "密码更新成功",
"logout_all_device_confirmation": "确定要从所有设备注销?",
"logout_this_device_confirmation": "确定要从本设备注销?",
"logs": "日志",
"longitude": "经度",
"look": "样式",
"loop_videos": "循环视频",
@ -1293,7 +1313,7 @@
"map_settings_date_range_option_years": "{years} 年前",
"map_settings_dialog_title": "地图设置",
"map_settings_include_show_archived": "包括已归档项目",
"map_settings_include_show_partners": "包含伴",
"map_settings_include_show_partners": "包含伴",
"map_settings_only_show_favorites": "仅显示收藏的项目",
"map_settings_theme_settings": "地图主题",
"map_zoom_to_see_photos": "缩小以查看项目",
@ -1301,6 +1321,7 @@
"mark_as_read": "标记为已读",
"marked_all_as_read": "已全部标记为已读",
"matches": "匹配",
"matching_assets": "匹配资产",
"media_type": "媒体类型",
"memories": "回忆",
"memories_all_caught_up": "已全部看完",
@ -1341,6 +1362,7 @@
"name_or_nickname": "名称或昵称",
"network_requirement_photos_upload": "使用蜂窝数据备份照片",
"network_requirement_videos_upload": "使用蜂窝数据备份视频",
"network_requirements": "网络要求",
"network_requirements_updated": "网络要求发生变化,正在重置备份队列",
"networking_settings": "网络",
"networking_subtitle": "管理服务器接口设置",
@ -1351,6 +1373,7 @@
"new_person": "新人物",
"new_pin_code": "新的PIN码",
"new_pin_code_subtitle": "这是您第一次访问此锁定文件夹。创建一个PIN码以安全访问此页面",
"new_timeline": "新建时间轴",
"new_user_created": "已创建新用户",
"new_version_available": "有新版本发布啦",
"newest_first": "最新优先",
@ -1364,20 +1387,25 @@
"no_assets_message": "点击上传您的第一张照片",
"no_assets_to_show": "没有要显示的资产",
"no_cast_devices_found": "未找到投放设备",
"no_checksum_local": "没有可用的校验和-无法获取本地资产",
"no_checksum_remote": "没有可用的校验和-无法获取远程资产",
"no_duplicates_found": "未发现重复项。",
"no_exif_info_available": "没有可用的 EXIF 信息",
"no_explore_results_message": "上传更多照片来探索。",
"no_favorites_message": "添加到收藏夹,快速查找最佳图片和视频",
"no_libraries_message": "创建外部图库来查看您的照片和视频",
"no_local_assets_found": "未找到具有此校验和的本地资产",
"no_locked_photos_message": "锁定文件夹中的照片和视频将被隐藏,不会在您浏览、搜索图库时出现。",
"no_name": "未命名",
"no_notifications": "没有通知",
"no_people_found": "未找到匹配的人物",
"no_places": "无位置",
"no_remote_assets_found": "未找到具有此校验和的远程资产",
"no_results": "无结果",
"no_results_description": "尝试使用同义词或更通用的关键词",
"no_shared_albums_message": "创建相册以共享照片和视频",
"no_uploads_in_progress": "没有正在进行的上传",
"not_available": "不适用",
"not_in_any_album": "不在任何相册中",
"not_selected": "未选择",
"note_apply_storage_label_to_previously_uploaded assets": "提示:要将存储标签应用于之前上传的项目,需要运行",
@ -1588,6 +1616,7 @@
"regenerating_thumbnails": "正在重新生成缩略图",
"remote": "远程",
"remote_assets": "远程项目",
"remote_media_summary": "远程媒体摘要",
"remove": "移除",
"remove_assets_album_confirmation": "确定要从图库中移除{count, plural, one {#个项目} other {#个项目}}",
"remove_assets_shared_link_confirmation": "确定要从共享链接中移除{count, plural, one {#个项目} other {#个项目}}",
@ -1863,6 +1892,7 @@
"show_slideshow_transition": "显示幻灯片过渡效果",
"show_supporter_badge": "支持者徽章",
"show_supporter_badge_description": "展示支持者徽章",
"show_text_search_menu": "显示文本搜索菜单",
"shuffle": "随机",
"sidebar": "侧边栏",
"sidebar_display_description": "在侧边栏中显示链接",
@ -1893,6 +1923,7 @@
"stacktrace": "堆栈跟踪",
"start": "开始",
"start_date": "开始日期",
"start_date_before_end_date": "开始日期必须在结束日期之前",
"state": "省份",
"status": "状态",
"stop_casting": "停止投放",
@ -2095,5 +2126,6 @@
"yes": "是",
"you_dont_have_any_shared_links": "您没有任何共享链接",
"your_wifi_name": "您的 Wi-Fi 名称",
"zoom_image": "缩放图像"
"zoom_image": "缩放图像",
"zoom_to_bounds": "缩放到边界"
}

138
machine-learning/uv.lock generated
View File

@ -507,61 +507,87 @@ wheels = [
[[package]]
name = "coverage"
version = "7.6.4"
version = "7.10.6"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/52/12/3669b6382792783e92046730ad3327f53b2726f0603f4c311c4da4824222/coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", size = 798716, upload-time = "2024-10-20T22:57:39.682Z" }
sdist = { url = "https://files.pythonhosted.org/packages/14/70/025b179c993f019105b79575ac6edb5e084fb0f0e63f15cdebef4e454fb5/coverage-7.10.6.tar.gz", hash = "sha256:f644a3ae5933a552a29dbb9aa2f90c677a875f80ebea028e5a52a4f429044b90", size = 823736, upload-time = "2025-08-29T15:35:16.668Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a5/93/4ad92f71e28ece5c0326e5f4a6630aa4928a8846654a65cfff69b49b95b9/coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", size = 206713, upload-time = "2024-10-20T22:56:03.877Z" },
{ url = "https://files.pythonhosted.org/packages/01/ae/747a580b1eda3f2e431d87de48f0604bd7bc92e52a1a95185a4aa585bc47/coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", size = 207149, upload-time = "2024-10-20T22:56:06.511Z" },
{ url = "https://files.pythonhosted.org/packages/07/1a/1f573f8a6145f6d4c9130bbc120e0024daf1b24cf2a78d7393fa6eb6aba7/coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", size = 235584, upload-time = "2024-10-20T22:56:07.678Z" },
{ url = "https://files.pythonhosted.org/packages/40/42/c8523f2e4db34aa9389caee0d3688b6ada7a84fcc782e943a868a7f302bd/coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", size = 233486, upload-time = "2024-10-20T22:56:09.496Z" },
{ url = "https://files.pythonhosted.org/packages/8d/95/565c310fffa16ede1a042e9ea1ca3962af0d8eb5543bc72df6b91dc0c3d5/coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", size = 234649, upload-time = "2024-10-20T22:56:11.326Z" },
{ url = "https://files.pythonhosted.org/packages/d5/81/3b550674d98968ec29c92e3e8650682be6c8b1fa7581a059e7e12e74c431/coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", size = 233744, upload-time = "2024-10-20T22:56:12.481Z" },
{ url = "https://files.pythonhosted.org/packages/0d/70/d66c7f51b3e33aabc5ea9f9624c1c9d9655472962270eb5e7b0d32707224/coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", size = 232204, upload-time = "2024-10-20T22:56:14.236Z" },
{ url = "https://files.pythonhosted.org/packages/23/2d/2b3a2dbed7a5f40693404c8a09e779d7c1a5fbed089d3e7224c002129ec8/coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", size = 233335, upload-time = "2024-10-20T22:56:15.521Z" },
{ url = "https://files.pythonhosted.org/packages/5a/4f/92d1d2ad720d698a4e71c176eacf531bfb8e0721d5ad560556f2c484a513/coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", size = 209435, upload-time = "2024-10-20T22:56:17.309Z" },
{ url = "https://files.pythonhosted.org/packages/c7/b9/cdf158e7991e2287bcf9082670928badb73d310047facac203ff8dcd5ff3/coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", size = 210243, upload-time = "2024-10-20T22:56:18.366Z" },
{ url = "https://files.pythonhosted.org/packages/87/31/9c0cf84f0dfcbe4215b7eb95c31777cdc0483c13390e69584c8150c85175/coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", size = 206819, upload-time = "2024-10-20T22:56:20.132Z" },
{ url = "https://files.pythonhosted.org/packages/53/ed/a38401079ad320ad6e054a01ec2b61d270511aeb3c201c80e99c841229d5/coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", size = 207263, upload-time = "2024-10-20T22:56:21.88Z" },
{ url = "https://files.pythonhosted.org/packages/20/e7/c3ad33b179ab4213f0d70da25a9c214d52464efa11caeab438592eb1d837/coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", size = 239205, upload-time = "2024-10-20T22:56:23.03Z" },
{ url = "https://files.pythonhosted.org/packages/36/91/fc02e8d8e694f557752120487fd982f654ba1421bbaa5560debf96ddceda/coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", size = 236612, upload-time = "2024-10-20T22:56:24.882Z" },
{ url = "https://files.pythonhosted.org/packages/cc/57/cb08f0eda0389a9a8aaa4fc1f9fec7ac361c3e2d68efd5890d7042c18aa3/coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", size = 238479, upload-time = "2024-10-20T22:56:26.749Z" },
{ url = "https://files.pythonhosted.org/packages/d5/c9/2c7681a9b3ca6e6f43d489c2e6653a53278ed857fd6e7010490c307b0a47/coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", size = 237405, upload-time = "2024-10-20T22:56:27.958Z" },
{ url = "https://files.pythonhosted.org/packages/b5/4e/ebfc6944b96317df8b537ae875d2e57c27b84eb98820bc0a1055f358f056/coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", size = 236038, upload-time = "2024-10-20T22:56:29.816Z" },
{ url = "https://files.pythonhosted.org/packages/13/f2/3a0bf1841a97c0654905e2ef531170f02c89fad2555879db8fe41a097871/coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", size = 236812, upload-time = "2024-10-20T22:56:31.654Z" },
{ url = "https://files.pythonhosted.org/packages/b9/9c/66bf59226b52ce6ed9541b02d33e80a6e816a832558fbdc1111a7bd3abd4/coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", size = 209400, upload-time = "2024-10-20T22:56:33.569Z" },
{ url = "https://files.pythonhosted.org/packages/2a/a0/b0790934c04dfc8d658d4a62acb8f7ca0efdf3818456fcad757b11c6479d/coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", size = 210243, upload-time = "2024-10-20T22:56:34.863Z" },
{ url = "https://files.pythonhosted.org/packages/7d/e7/9291de916d084f41adddfd4b82246e68d61d6a75747f075f7e64628998d2/coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", size = 207013, upload-time = "2024-10-20T22:56:36.034Z" },
{ url = "https://files.pythonhosted.org/packages/27/03/932c2c5717a7fa80cd43c6a07d3177076d97b79f12f40f882f9916db0063/coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", size = 207251, upload-time = "2024-10-20T22:56:38.054Z" },
{ url = "https://files.pythonhosted.org/packages/d5/3f/0af47dcb9327f65a45455fbca846fe96eb57c153af46c4754a3ba678938a/coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", size = 240268, upload-time = "2024-10-20T22:56:40.051Z" },
{ url = "https://files.pythonhosted.org/packages/8a/3c/37a9d81bbd4b23bc7d46ca820e16174c613579c66342faa390a271d2e18b/coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", size = 237298, upload-time = "2024-10-20T22:56:41.929Z" },
{ url = "https://files.pythonhosted.org/packages/c0/70/6b0627e5bd68204ee580126ed3513140b2298995c1233bd67404b4e44d0e/coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", size = 239367, upload-time = "2024-10-20T22:56:43.141Z" },
{ url = "https://files.pythonhosted.org/packages/3c/eb/634d7dfab24ac3b790bebaf9da0f4a5352cbc125ce6a9d5c6cf4c6cae3c7/coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", size = 238853, upload-time = "2024-10-20T22:56:44.33Z" },
{ url = "https://files.pythonhosted.org/packages/d9/0d/8e3ed00f1266ef7472a4e33458f42e39492e01a64281084fb3043553d3f1/coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", size = 237160, upload-time = "2024-10-20T22:56:46.258Z" },
{ url = "https://files.pythonhosted.org/packages/ce/9c/4337f468ef0ab7a2e0887a9c9da0e58e2eada6fc6cbee637a4acd5dfd8a9/coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", size = 238824, upload-time = "2024-10-20T22:56:48.666Z" },
{ url = "https://files.pythonhosted.org/packages/5e/09/3e94912b8dd37251377bb02727a33a67ee96b84bbbe092f132b401ca5dd9/coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", size = 209639, upload-time = "2024-10-20T22:56:50.664Z" },
{ url = "https://files.pythonhosted.org/packages/01/69/d4f3a4101171f32bc5b3caec8ff94c2c60f700107a6aaef7244b2c166793/coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", size = 210428, upload-time = "2024-10-20T22:56:52.468Z" },
{ url = "https://files.pythonhosted.org/packages/c2/4d/2dede4f7cb5a70fb0bb40a57627fddf1dbdc6b9c1db81f7c4dcdcb19e2f4/coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", size = 207039, upload-time = "2024-10-20T22:56:53.656Z" },
{ url = "https://files.pythonhosted.org/packages/3f/f9/d86368ae8c79e28f1fb458ebc76ae9ff3e8bd8069adc24e8f2fed03c58b7/coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", size = 207298, upload-time = "2024-10-20T22:56:54.979Z" },
{ url = "https://files.pythonhosted.org/packages/64/c5/b4cc3c3f64622c58fbfd4d8b9a7a8ce9d355f172f91fcabbba1f026852f6/coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", size = 239813, upload-time = "2024-10-20T22:56:56.209Z" },
{ url = "https://files.pythonhosted.org/packages/8a/86/14c42e60b70a79b26099e4d289ccdfefbc68624d096f4481163085aa614c/coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", size = 236959, upload-time = "2024-10-20T22:56:58.06Z" },
{ url = "https://files.pythonhosted.org/packages/7f/f8/4436a643631a2fbab4b44d54f515028f6099bfb1cd95b13cfbf701e7f2f2/coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", size = 238950, upload-time = "2024-10-20T22:56:59.329Z" },
{ url = "https://files.pythonhosted.org/packages/49/50/1571810ddd01f99a0a8be464a4ac8b147f322cd1e8e296a1528984fc560b/coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", size = 238610, upload-time = "2024-10-20T22:57:00.645Z" },
{ url = "https://files.pythonhosted.org/packages/f3/8c/6312d241fe7cbd1f0cade34a62fea6f333d1a261255d76b9a87074d8703c/coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", size = 236697, upload-time = "2024-10-20T22:57:01.944Z" },
{ url = "https://files.pythonhosted.org/packages/ce/5f/fef33dfd05d87ee9030f614c857deb6df6556b8f6a1c51bbbb41e24ee5ac/coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", size = 238541, upload-time = "2024-10-20T22:57:03.848Z" },
{ url = "https://files.pythonhosted.org/packages/a9/64/6a984b6e92e1ea1353b7ffa08e27f707a5e29b044622445859200f541e8c/coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", size = 209707, upload-time = "2024-10-20T22:57:05.123Z" },
{ url = "https://files.pythonhosted.org/packages/5c/60/ce5a9e942e9543783b3db5d942e0578b391c25cdd5e7f342d854ea83d6b7/coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", size = 210439, upload-time = "2024-10-20T22:57:06.35Z" },
{ url = "https://files.pythonhosted.org/packages/78/53/6719677e92c308207e7f10561a1b16ab8b5c00e9328efc9af7cfd6fb703e/coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", size = 207784, upload-time = "2024-10-20T22:57:07.857Z" },
{ url = "https://files.pythonhosted.org/packages/fa/dd/7054928930671fcb39ae6a83bb71d9ab5f0afb733172543ced4b09a115ca/coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", size = 208058, upload-time = "2024-10-20T22:57:09.845Z" },
{ url = "https://files.pythonhosted.org/packages/b5/7d/fd656ddc2b38301927b9eb3aae3fe827e7aa82e691923ed43721fd9423c9/coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", size = 250772, upload-time = "2024-10-20T22:57:11.147Z" },
{ url = "https://files.pythonhosted.org/packages/90/d0/eb9a3cc2100b83064bb086f18aedde3afffd7de6ead28f69736c00b7f302/coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", size = 246490, upload-time = "2024-10-20T22:57:13.02Z" },
{ url = "https://files.pythonhosted.org/packages/45/44/3f64f38f6faab8a0cfd2c6bc6eb4c6daead246b97cf5f8fc23bf3788f841/coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", size = 248848, upload-time = "2024-10-20T22:57:14.927Z" },
{ url = "https://files.pythonhosted.org/packages/5d/11/4c465a5f98656821e499f4b4619929bd5a34639c466021740ecdca42aa30/coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", size = 248340, upload-time = "2024-10-20T22:57:16.246Z" },
{ url = "https://files.pythonhosted.org/packages/f1/96/ebecda2d016cce9da812f404f720ca5df83c6b29f65dc80d2000d0078741/coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", size = 246229, upload-time = "2024-10-20T22:57:17.546Z" },
{ url = "https://files.pythonhosted.org/packages/16/d9/3d820c00066ae55d69e6d0eae11d6149a5ca7546de469ba9d597f01bf2d7/coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", size = 247510, upload-time = "2024-10-20T22:57:18.925Z" },
{ url = "https://files.pythonhosted.org/packages/8f/c3/4fa1eb412bb288ff6bfcc163c11700ff06e02c5fad8513817186e460ed43/coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", size = 210353, upload-time = "2024-10-20T22:57:20.891Z" },
{ url = "https://files.pythonhosted.org/packages/7e/77/03fc2979d1538884d921c2013075917fc927f41cd8526909852fe4494112/coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", size = 211502, upload-time = "2024-10-20T22:57:22.21Z" },
{ url = "https://files.pythonhosted.org/packages/cc/56/e1d75e8981a2a92c2a777e67c26efa96c66da59d645423146eb9ff3a851b/coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", size = 198954, upload-time = "2024-10-20T22:57:38.28Z" },
{ url = "https://files.pythonhosted.org/packages/a8/1d/2e64b43d978b5bd184e0756a41415597dfef30fcbd90b747474bd749d45f/coverage-7.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70e7bfbd57126b5554aa482691145f798d7df77489a177a6bef80de78860a356", size = 217025, upload-time = "2025-08-29T15:32:57.169Z" },
{ url = "https://files.pythonhosted.org/packages/23/62/b1e0f513417c02cc10ef735c3ee5186df55f190f70498b3702d516aad06f/coverage-7.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e41be6f0f19da64af13403e52f2dec38bbc2937af54df8ecef10850ff8d35301", size = 217419, upload-time = "2025-08-29T15:32:59.908Z" },
{ url = "https://files.pythonhosted.org/packages/e7/16/b800640b7a43e7c538429e4d7223e0a94fd72453a1a048f70bf766f12e96/coverage-7.10.6-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c61fc91ab80b23f5fddbee342d19662f3d3328173229caded831aa0bd7595460", size = 244180, upload-time = "2025-08-29T15:33:01.608Z" },
{ url = "https://files.pythonhosted.org/packages/fb/6f/5e03631c3305cad187eaf76af0b559fff88af9a0b0c180d006fb02413d7a/coverage-7.10.6-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10356fdd33a7cc06e8051413140bbdc6f972137508a3572e3f59f805cd2832fd", size = 245992, upload-time = "2025-08-29T15:33:03.239Z" },
{ url = "https://files.pythonhosted.org/packages/eb/a1/f30ea0fb400b080730125b490771ec62b3375789f90af0bb68bfb8a921d7/coverage-7.10.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80b1695cf7c5ebe7b44bf2521221b9bb8cdf69b1f24231149a7e3eb1ae5fa2fb", size = 247851, upload-time = "2025-08-29T15:33:04.603Z" },
{ url = "https://files.pythonhosted.org/packages/02/8e/cfa8fee8e8ef9a6bb76c7bef039f3302f44e615d2194161a21d3d83ac2e9/coverage-7.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2e4c33e6378b9d52d3454bd08847a8651f4ed23ddbb4a0520227bd346382bbc6", size = 245891, upload-time = "2025-08-29T15:33:06.176Z" },
{ url = "https://files.pythonhosted.org/packages/93/a9/51be09b75c55c4f6c16d8d73a6a1d46ad764acca0eab48fa2ffaef5958fe/coverage-7.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c8a3ec16e34ef980a46f60dc6ad86ec60f763c3f2fa0db6d261e6e754f72e945", size = 243909, upload-time = "2025-08-29T15:33:07.74Z" },
{ url = "https://files.pythonhosted.org/packages/e9/a6/ba188b376529ce36483b2d585ca7bdac64aacbe5aa10da5978029a9c94db/coverage-7.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7d79dabc0a56f5af990cc6da9ad1e40766e82773c075f09cc571e2076fef882e", size = 244786, upload-time = "2025-08-29T15:33:08.965Z" },
{ url = "https://files.pythonhosted.org/packages/d0/4c/37ed872374a21813e0d3215256180c9a382c3f5ced6f2e5da0102fc2fd3e/coverage-7.10.6-cp310-cp310-win32.whl", hash = "sha256:86b9b59f2b16e981906e9d6383eb6446d5b46c278460ae2c36487667717eccf1", size = 219521, upload-time = "2025-08-29T15:33:10.599Z" },
{ url = "https://files.pythonhosted.org/packages/8e/36/9311352fdc551dec5b973b61f4e453227ce482985a9368305880af4f85dd/coverage-7.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:e132b9152749bd33534e5bd8565c7576f135f157b4029b975e15ee184325f528", size = 220417, upload-time = "2025-08-29T15:33:11.907Z" },
{ url = "https://files.pythonhosted.org/packages/d4/16/2bea27e212c4980753d6d563a0803c150edeaaddb0771a50d2afc410a261/coverage-7.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c706db3cabb7ceef779de68270150665e710b46d56372455cd741184f3868d8f", size = 217129, upload-time = "2025-08-29T15:33:13.575Z" },
{ url = "https://files.pythonhosted.org/packages/2a/51/e7159e068831ab37e31aac0969d47b8c5ee25b7d307b51e310ec34869315/coverage-7.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e0c38dc289e0508ef68ec95834cb5d2e96fdbe792eaccaa1bccac3966bbadcc", size = 217532, upload-time = "2025-08-29T15:33:14.872Z" },
{ url = "https://files.pythonhosted.org/packages/e7/c0/246ccbea53d6099325d25cd208df94ea435cd55f0db38099dd721efc7a1f/coverage-7.10.6-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:752a3005a1ded28f2f3a6e8787e24f28d6abe176ca64677bcd8d53d6fe2ec08a", size = 247931, upload-time = "2025-08-29T15:33:16.142Z" },
{ url = "https://files.pythonhosted.org/packages/7d/fb/7435ef8ab9b2594a6e3f58505cc30e98ae8b33265d844007737946c59389/coverage-7.10.6-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:689920ecfd60f992cafca4f5477d55720466ad2c7fa29bb56ac8d44a1ac2b47a", size = 249864, upload-time = "2025-08-29T15:33:17.434Z" },
{ url = "https://files.pythonhosted.org/packages/51/f8/d9d64e8da7bcddb094d511154824038833c81e3a039020a9d6539bf303e9/coverage-7.10.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec98435796d2624d6905820a42f82149ee9fc4f2d45c2c5bc5a44481cc50db62", size = 251969, upload-time = "2025-08-29T15:33:18.822Z" },
{ url = "https://files.pythonhosted.org/packages/43/28/c43ba0ef19f446d6463c751315140d8f2a521e04c3e79e5c5fe211bfa430/coverage-7.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b37201ce4a458c7a758ecc4efa92fa8ed783c66e0fa3c42ae19fc454a0792153", size = 249659, upload-time = "2025-08-29T15:33:20.407Z" },
{ url = "https://files.pythonhosted.org/packages/79/3e/53635bd0b72beaacf265784508a0b386defc9ab7fad99ff95f79ce9db555/coverage-7.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2904271c80898663c810a6b067920a61dd8d38341244a3605bd31ab55250dad5", size = 247714, upload-time = "2025-08-29T15:33:21.751Z" },
{ url = "https://files.pythonhosted.org/packages/4c/55/0964aa87126624e8c159e32b0bc4e84edef78c89a1a4b924d28dd8265625/coverage-7.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5aea98383463d6e1fa4e95416d8de66f2d0cb588774ee20ae1b28df826bcb619", size = 248351, upload-time = "2025-08-29T15:33:23.105Z" },
{ url = "https://files.pythonhosted.org/packages/eb/ab/6cfa9dc518c6c8e14a691c54e53a9433ba67336c760607e299bfcf520cb1/coverage-7.10.6-cp311-cp311-win32.whl", hash = "sha256:e3fb1fa01d3598002777dd259c0c2e6d9d5e10e7222976fc8e03992f972a2cba", size = 219562, upload-time = "2025-08-29T15:33:24.717Z" },
{ url = "https://files.pythonhosted.org/packages/5b/18/99b25346690cbc55922e7cfef06d755d4abee803ef335baff0014268eff4/coverage-7.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:f35ed9d945bece26553d5b4c8630453169672bea0050a564456eb88bdffd927e", size = 220453, upload-time = "2025-08-29T15:33:26.482Z" },
{ url = "https://files.pythonhosted.org/packages/d8/ed/81d86648a07ccb124a5cf1f1a7788712b8d7216b593562683cd5c9b0d2c1/coverage-7.10.6-cp311-cp311-win_arm64.whl", hash = "sha256:99e1a305c7765631d74b98bf7dbf54eeea931f975e80f115437d23848ee8c27c", size = 219127, upload-time = "2025-08-29T15:33:27.777Z" },
{ url = "https://files.pythonhosted.org/packages/26/06/263f3305c97ad78aab066d116b52250dd316e74fcc20c197b61e07eb391a/coverage-7.10.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5b2dd6059938063a2c9fee1af729d4f2af28fd1a545e9b7652861f0d752ebcea", size = 217324, upload-time = "2025-08-29T15:33:29.06Z" },
{ url = "https://files.pythonhosted.org/packages/e9/60/1e1ded9a4fe80d843d7d53b3e395c1db3ff32d6c301e501f393b2e6c1c1f/coverage-7.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:388d80e56191bf846c485c14ae2bc8898aa3124d9d35903fef7d907780477634", size = 217560, upload-time = "2025-08-29T15:33:30.748Z" },
{ url = "https://files.pythonhosted.org/packages/b8/25/52136173c14e26dfed8b106ed725811bb53c30b896d04d28d74cb64318b3/coverage-7.10.6-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:90cb5b1a4670662719591aa92d0095bb41714970c0b065b02a2610172dbf0af6", size = 249053, upload-time = "2025-08-29T15:33:32.041Z" },
{ url = "https://files.pythonhosted.org/packages/cb/1d/ae25a7dc58fcce8b172d42ffe5313fc267afe61c97fa872b80ee72d9515a/coverage-7.10.6-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:961834e2f2b863a0e14260a9a273aff07ff7818ab6e66d2addf5628590c628f9", size = 251802, upload-time = "2025-08-29T15:33:33.625Z" },
{ url = "https://files.pythonhosted.org/packages/f5/7a/1f561d47743710fe996957ed7c124b421320f150f1d38523d8d9102d3e2a/coverage-7.10.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf9a19f5012dab774628491659646335b1928cfc931bf8d97b0d5918dd58033c", size = 252935, upload-time = "2025-08-29T15:33:34.909Z" },
{ url = "https://files.pythonhosted.org/packages/6c/ad/8b97cd5d28aecdfde792dcbf646bac141167a5cacae2cd775998b45fabb5/coverage-7.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99c4283e2a0e147b9c9cc6bc9c96124de9419d6044837e9799763a0e29a7321a", size = 250855, upload-time = "2025-08-29T15:33:36.922Z" },
{ url = "https://files.pythonhosted.org/packages/33/6a/95c32b558d9a61858ff9d79580d3877df3eb5bc9eed0941b1f187c89e143/coverage-7.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:282b1b20f45df57cc508c1e033403f02283adfb67d4c9c35a90281d81e5c52c5", size = 248974, upload-time = "2025-08-29T15:33:38.175Z" },
{ url = "https://files.pythonhosted.org/packages/0d/9c/8ce95dee640a38e760d5b747c10913e7a06554704d60b41e73fdea6a1ffd/coverage-7.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cdbe264f11afd69841bd8c0d83ca10b5b32853263ee62e6ac6a0ab63895f972", size = 250409, upload-time = "2025-08-29T15:33:39.447Z" },
{ url = "https://files.pythonhosted.org/packages/04/12/7a55b0bdde78a98e2eb2356771fd2dcddb96579e8342bb52aa5bc52e96f0/coverage-7.10.6-cp312-cp312-win32.whl", hash = "sha256:a517feaf3a0a3eca1ee985d8373135cfdedfbba3882a5eab4362bda7c7cf518d", size = 219724, upload-time = "2025-08-29T15:33:41.172Z" },
{ url = "https://files.pythonhosted.org/packages/36/4a/32b185b8b8e327802c9efce3d3108d2fe2d9d31f153a0f7ecfd59c773705/coverage-7.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:856986eadf41f52b214176d894a7de05331117f6035a28ac0016c0f63d887629", size = 220536, upload-time = "2025-08-29T15:33:42.524Z" },
{ url = "https://files.pythonhosted.org/packages/08/3a/d5d8dc703e4998038c3099eaf77adddb00536a3cec08c8dcd556a36a3eb4/coverage-7.10.6-cp312-cp312-win_arm64.whl", hash = "sha256:acf36b8268785aad739443fa2780c16260ee3fa09d12b3a70f772ef100939d80", size = 219171, upload-time = "2025-08-29T15:33:43.974Z" },
{ url = "https://files.pythonhosted.org/packages/bd/e7/917e5953ea29a28c1057729c1d5af9084ab6d9c66217523fd0e10f14d8f6/coverage-7.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ffea0575345e9ee0144dfe5701aa17f3ba546f8c3bb48db62ae101afb740e7d6", size = 217351, upload-time = "2025-08-29T15:33:45.438Z" },
{ url = "https://files.pythonhosted.org/packages/eb/86/2e161b93a4f11d0ea93f9bebb6a53f113d5d6e416d7561ca41bb0a29996b/coverage-7.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d91d7317cde40a1c249d6b7382750b7e6d86fad9d8eaf4fa3f8f44cf171e80", size = 217600, upload-time = "2025-08-29T15:33:47.269Z" },
{ url = "https://files.pythonhosted.org/packages/0e/66/d03348fdd8df262b3a7fb4ee5727e6e4936e39e2f3a842e803196946f200/coverage-7.10.6-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e23dd5408fe71a356b41baa82892772a4cefcf758f2ca3383d2aa39e1b7a003", size = 248600, upload-time = "2025-08-29T15:33:48.953Z" },
{ url = "https://files.pythonhosted.org/packages/73/dd/508420fb47d09d904d962f123221bc249f64b5e56aa93d5f5f7603be475f/coverage-7.10.6-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0f3f56e4cb573755e96a16501a98bf211f100463d70275759e73f3cbc00d4f27", size = 251206, upload-time = "2025-08-29T15:33:50.697Z" },
{ url = "https://files.pythonhosted.org/packages/e9/1f/9020135734184f439da85c70ea78194c2730e56c2d18aee6e8ff1719d50d/coverage-7.10.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db4a1d897bbbe7339946ffa2fe60c10cc81c43fab8b062d3fcb84188688174a4", size = 252478, upload-time = "2025-08-29T15:33:52.303Z" },
{ url = "https://files.pythonhosted.org/packages/a4/a4/3d228f3942bb5a2051fde28c136eea23a761177dc4ff4ef54533164ce255/coverage-7.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8fd7879082953c156d5b13c74aa6cca37f6a6f4747b39538504c3f9c63d043d", size = 250637, upload-time = "2025-08-29T15:33:53.67Z" },
{ url = "https://files.pythonhosted.org/packages/36/e3/293dce8cdb9a83de971637afc59b7190faad60603b40e32635cbd15fbf61/coverage-7.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:28395ca3f71cd103b8c116333fa9db867f3a3e1ad6a084aa3725ae002b6583bc", size = 248529, upload-time = "2025-08-29T15:33:55.022Z" },
{ url = "https://files.pythonhosted.org/packages/90/26/64eecfa214e80dd1d101e420cab2901827de0e49631d666543d0e53cf597/coverage-7.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:61c950fc33d29c91b9e18540e1aed7d9f6787cc870a3e4032493bbbe641d12fc", size = 250143, upload-time = "2025-08-29T15:33:56.386Z" },
{ url = "https://files.pythonhosted.org/packages/3e/70/bd80588338f65ea5b0d97e424b820fb4068b9cfb9597fbd91963086e004b/coverage-7.10.6-cp313-cp313-win32.whl", hash = "sha256:160c00a5e6b6bdf4e5984b0ef21fc860bc94416c41b7df4d63f536d17c38902e", size = 219770, upload-time = "2025-08-29T15:33:58.063Z" },
{ url = "https://files.pythonhosted.org/packages/a7/14/0b831122305abcc1060c008f6c97bbdc0a913ab47d65070a01dc50293c2b/coverage-7.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:628055297f3e2aa181464c3808402887643405573eb3d9de060d81531fa79d32", size = 220566, upload-time = "2025-08-29T15:33:59.766Z" },
{ url = "https://files.pythonhosted.org/packages/83/c6/81a83778c1f83f1a4a168ed6673eeedc205afb562d8500175292ca64b94e/coverage-7.10.6-cp313-cp313-win_arm64.whl", hash = "sha256:df4ec1f8540b0bcbe26ca7dd0f541847cc8a108b35596f9f91f59f0c060bfdd2", size = 219195, upload-time = "2025-08-29T15:34:01.191Z" },
{ url = "https://files.pythonhosted.org/packages/d7/1c/ccccf4bf116f9517275fa85047495515add43e41dfe8e0bef6e333c6b344/coverage-7.10.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c9a8b7a34a4de3ed987f636f71881cd3b8339f61118b1aa311fbda12741bff0b", size = 218059, upload-time = "2025-08-29T15:34:02.91Z" },
{ url = "https://files.pythonhosted.org/packages/92/97/8a3ceff833d27c7492af4f39d5da6761e9ff624831db9e9f25b3886ddbca/coverage-7.10.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd5af36092430c2b075cee966719898f2ae87b636cefb85a653f1d0ba5d5393", size = 218287, upload-time = "2025-08-29T15:34:05.106Z" },
{ url = "https://files.pythonhosted.org/packages/92/d8/50b4a32580cf41ff0423777a2791aaf3269ab60c840b62009aec12d3970d/coverage-7.10.6-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0353b0f0850d49ada66fdd7d0c7cdb0f86b900bb9e367024fd14a60cecc1e27", size = 259625, upload-time = "2025-08-29T15:34:06.575Z" },
{ url = "https://files.pythonhosted.org/packages/7e/7e/6a7df5a6fb440a0179d94a348eb6616ed4745e7df26bf2a02bc4db72c421/coverage-7.10.6-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d6b9ae13d5d3e8aeca9ca94198aa7b3ebbc5acfada557d724f2a1f03d2c0b0df", size = 261801, upload-time = "2025-08-29T15:34:08.006Z" },
{ url = "https://files.pythonhosted.org/packages/3a/4c/a270a414f4ed5d196b9d3d67922968e768cd971d1b251e1b4f75e9362f75/coverage-7.10.6-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:675824a363cc05781b1527b39dc2587b8984965834a748177ee3c37b64ffeafb", size = 264027, upload-time = "2025-08-29T15:34:09.806Z" },
{ url = "https://files.pythonhosted.org/packages/9c/8b/3210d663d594926c12f373c5370bf1e7c5c3a427519a8afa65b561b9a55c/coverage-7.10.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:692d70ea725f471a547c305f0d0fc6a73480c62fb0da726370c088ab21aed282", size = 261576, upload-time = "2025-08-29T15:34:11.585Z" },
{ url = "https://files.pythonhosted.org/packages/72/d0/e1961eff67e9e1dba3fc5eb7a4caf726b35a5b03776892da8d79ec895775/coverage-7.10.6-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:851430a9a361c7a8484a36126d1d0ff8d529d97385eacc8dfdc9bfc8c2d2cbe4", size = 259341, upload-time = "2025-08-29T15:34:13.159Z" },
{ url = "https://files.pythonhosted.org/packages/3a/06/d6478d152cd189b33eac691cba27a40704990ba95de49771285f34a5861e/coverage-7.10.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d9369a23186d189b2fc95cc08b8160ba242057e887d766864f7adf3c46b2df21", size = 260468, upload-time = "2025-08-29T15:34:14.571Z" },
{ url = "https://files.pythonhosted.org/packages/ed/73/737440247c914a332f0b47f7598535b29965bf305e19bbc22d4c39615d2b/coverage-7.10.6-cp313-cp313t-win32.whl", hash = "sha256:92be86fcb125e9bda0da7806afd29a3fd33fdf58fba5d60318399adf40bf37d0", size = 220429, upload-time = "2025-08-29T15:34:16.394Z" },
{ url = "https://files.pythonhosted.org/packages/bd/76/b92d3214740f2357ef4a27c75a526eb6c28f79c402e9f20a922c295c05e2/coverage-7.10.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6b3039e2ca459a70c79523d39347d83b73f2f06af5624905eba7ec34d64d80b5", size = 221493, upload-time = "2025-08-29T15:34:17.835Z" },
{ url = "https://files.pythonhosted.org/packages/fc/8e/6dcb29c599c8a1f654ec6cb68d76644fe635513af16e932d2d4ad1e5ac6e/coverage-7.10.6-cp313-cp313t-win_arm64.whl", hash = "sha256:3fb99d0786fe17b228eab663d16bee2288e8724d26a199c29325aac4b0319b9b", size = 219757, upload-time = "2025-08-29T15:34:19.248Z" },
{ url = "https://files.pythonhosted.org/packages/d3/aa/76cf0b5ec00619ef208da4689281d48b57f2c7fde883d14bf9441b74d59f/coverage-7.10.6-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6008a021907be8c4c02f37cdc3ffb258493bdebfeaf9a839f9e71dfdc47b018e", size = 217331, upload-time = "2025-08-29T15:34:20.846Z" },
{ url = "https://files.pythonhosted.org/packages/65/91/8e41b8c7c505d398d7730206f3cbb4a875a35ca1041efc518051bfce0f6b/coverage-7.10.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5e75e37f23eb144e78940b40395b42f2321951206a4f50e23cfd6e8a198d3ceb", size = 217607, upload-time = "2025-08-29T15:34:22.433Z" },
{ url = "https://files.pythonhosted.org/packages/87/7f/f718e732a423d442e6616580a951b8d1ec3575ea48bcd0e2228386805e79/coverage-7.10.6-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0f7cb359a448e043c576f0da00aa8bfd796a01b06aa610ca453d4dde09cc1034", size = 248663, upload-time = "2025-08-29T15:34:24.425Z" },
{ url = "https://files.pythonhosted.org/packages/e6/52/c1106120e6d801ac03e12b5285e971e758e925b6f82ee9b86db3aa10045d/coverage-7.10.6-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c68018e4fc4e14b5668f1353b41ccf4bc83ba355f0e1b3836861c6f042d89ac1", size = 251197, upload-time = "2025-08-29T15:34:25.906Z" },
{ url = "https://files.pythonhosted.org/packages/3d/ec/3a8645b1bb40e36acde9c0609f08942852a4af91a937fe2c129a38f2d3f5/coverage-7.10.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd4b2b0707fc55afa160cd5fc33b27ccbf75ca11d81f4ec9863d5793fc6df56a", size = 252551, upload-time = "2025-08-29T15:34:27.337Z" },
{ url = "https://files.pythonhosted.org/packages/a1/70/09ecb68eeb1155b28a1d16525fd3a9b65fbe75337311a99830df935d62b6/coverage-7.10.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cec13817a651f8804a86e4f79d815b3b28472c910e099e4d5a0e8a3b6a1d4cb", size = 250553, upload-time = "2025-08-29T15:34:29.065Z" },
{ url = "https://files.pythonhosted.org/packages/c6/80/47df374b893fa812e953b5bc93dcb1427a7b3d7a1a7d2db33043d17f74b9/coverage-7.10.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f2a6a8e06bbda06f78739f40bfb56c45d14eb8249d0f0ea6d4b3d48e1f7c695d", size = 248486, upload-time = "2025-08-29T15:34:30.897Z" },
{ url = "https://files.pythonhosted.org/packages/4a/65/9f98640979ecee1b0d1a7164b589de720ddf8100d1747d9bbdb84be0c0fb/coverage-7.10.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:081b98395ced0d9bcf60ada7661a0b75f36b78b9d7e39ea0790bb4ed8da14747", size = 249981, upload-time = "2025-08-29T15:34:32.365Z" },
{ url = "https://files.pythonhosted.org/packages/1f/55/eeb6603371e6629037f47bd25bef300387257ed53a3c5fdb159b7ac8c651/coverage-7.10.6-cp314-cp314-win32.whl", hash = "sha256:6937347c5d7d069ee776b2bf4e1212f912a9f1f141a429c475e6089462fcecc5", size = 220054, upload-time = "2025-08-29T15:34:34.124Z" },
{ url = "https://files.pythonhosted.org/packages/15/d1/a0912b7611bc35412e919a2cd59ae98e7ea3b475e562668040a43fb27897/coverage-7.10.6-cp314-cp314-win_amd64.whl", hash = "sha256:adec1d980fa07e60b6ef865f9e5410ba760e4e1d26f60f7e5772c73b9a5b0713", size = 220851, upload-time = "2025-08-29T15:34:35.651Z" },
{ url = "https://files.pythonhosted.org/packages/ef/2d/11880bb8ef80a45338e0b3e0725e4c2d73ffbb4822c29d987078224fd6a5/coverage-7.10.6-cp314-cp314-win_arm64.whl", hash = "sha256:a80f7aef9535442bdcf562e5a0d5a5538ce8abe6bb209cfbf170c462ac2c2a32", size = 219429, upload-time = "2025-08-29T15:34:37.16Z" },
{ url = "https://files.pythonhosted.org/packages/83/c0/1f00caad775c03a700146f55536ecd097a881ff08d310a58b353a1421be0/coverage-7.10.6-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0de434f4fbbe5af4fa7989521c655c8c779afb61c53ab561b64dcee6149e4c65", size = 218080, upload-time = "2025-08-29T15:34:38.919Z" },
{ url = "https://files.pythonhosted.org/packages/a9/c4/b1c5d2bd7cc412cbeb035e257fd06ed4e3e139ac871d16a07434e145d18d/coverage-7.10.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e31b8155150c57e5ac43ccd289d079eb3f825187d7c66e755a055d2c85794c6", size = 218293, upload-time = "2025-08-29T15:34:40.425Z" },
{ url = "https://files.pythonhosted.org/packages/3f/07/4468d37c94724bf6ec354e4ec2f205fda194343e3e85fd2e59cec57e6a54/coverage-7.10.6-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:98cede73eb83c31e2118ae8d379c12e3e42736903a8afcca92a7218e1f2903b0", size = 259800, upload-time = "2025-08-29T15:34:41.996Z" },
{ url = "https://files.pythonhosted.org/packages/82/d8/f8fb351be5fee31690cd8da768fd62f1cfab33c31d9f7baba6cd8960f6b8/coverage-7.10.6-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f863c08f4ff6b64fa8045b1e3da480f5374779ef187f07b82e0538c68cb4ff8e", size = 261965, upload-time = "2025-08-29T15:34:43.61Z" },
{ url = "https://files.pythonhosted.org/packages/e8/70/65d4d7cfc75c5c6eb2fed3ee5cdf420fd8ae09c4808723a89a81d5b1b9c3/coverage-7.10.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b38261034fda87be356f2c3f42221fdb4171c3ce7658066ae449241485390d5", size = 264220, upload-time = "2025-08-29T15:34:45.387Z" },
{ url = "https://files.pythonhosted.org/packages/98/3c/069df106d19024324cde10e4ec379fe2fb978017d25e97ebee23002fbadf/coverage-7.10.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e93b1476b79eae849dc3872faeb0bf7948fd9ea34869590bc16a2a00b9c82a7", size = 261660, upload-time = "2025-08-29T15:34:47.288Z" },
{ url = "https://files.pythonhosted.org/packages/fc/8a/2974d53904080c5dc91af798b3a54a4ccb99a45595cc0dcec6eb9616a57d/coverage-7.10.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ff8a991f70f4c0cf53088abf1e3886edcc87d53004c7bb94e78650b4d3dac3b5", size = 259417, upload-time = "2025-08-29T15:34:48.779Z" },
{ url = "https://files.pythonhosted.org/packages/30/38/9616a6b49c686394b318974d7f6e08f38b8af2270ce7488e879888d1e5db/coverage-7.10.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ac765b026c9f33044419cbba1da913cfb82cca1b60598ac1c7a5ed6aac4621a0", size = 260567, upload-time = "2025-08-29T15:34:50.718Z" },
{ url = "https://files.pythonhosted.org/packages/76/16/3ed2d6312b371a8cf804abf4e14895b70e4c3491c6e53536d63fd0958a8d/coverage-7.10.6-cp314-cp314t-win32.whl", hash = "sha256:441c357d55f4936875636ef2cfb3bee36e466dcf50df9afbd398ce79dba1ebb7", size = 220831, upload-time = "2025-08-29T15:34:52.653Z" },
{ url = "https://files.pythonhosted.org/packages/d5/e5/d38d0cb830abede2adb8b147770d2a3d0e7fecc7228245b9b1ae6c24930a/coverage-7.10.6-cp314-cp314t-win_amd64.whl", hash = "sha256:073711de3181b2e204e4870ac83a7c4853115b42e9cd4d145f2231e12d670930", size = 221950, upload-time = "2025-08-29T15:34:54.212Z" },
{ url = "https://files.pythonhosted.org/packages/f4/51/e48e550f6279349895b0ffcd6d2a690e3131ba3a7f4eafccc141966d4dea/coverage-7.10.6-cp314-cp314t-win_arm64.whl", hash = "sha256:137921f2bac5559334ba66122b753db6dc5d1cf01eb7b64eb412bb0d064ef35b", size = 219969, upload-time = "2025-08-29T15:34:55.83Z" },
{ url = "https://files.pythonhosted.org/packages/44/0c/50db5379b615854b5cf89146f8f5bd1d5a9693d7f3a987e269693521c404/coverage-7.10.6-py3-none-any.whl", hash = "sha256:92c4ecf6bf11b2e85fd4d8204814dc26e6a19f0c9d938c207c5cb0eadfcabbe3", size = 208986, upload-time = "2025-08-29T15:35:14.506Z" },
]
[package.optional-dependencies]
@ -2236,16 +2262,16 @@ wheels = [
[[package]]
name = "pytest-cov"
version = "6.2.1"
version = "7.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "coverage", extra = ["toml"] },
{ name = "pluggy" },
{ name = "pytest" },
]
sdist = { url = "https://files.pythonhosted.org/packages/18/99/668cade231f434aaa59bbfbf49469068d2ddd945000621d3d165d2e7dd7b/pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", size = 69432, upload-time = "2025-06-12T10:47:47.684Z" }
sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5", size = 24644, upload-time = "2025-06-12T10:47:45.932Z" },
{ url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" },
]
[[package]]

View File

@ -1,34 +0,0 @@
[tools.dart]
version = "3.8.2"
backend = "asdf:dart"
[tools.flutter]
version = "3.35.3-stable"
backend = "asdf:flutter"
[tools."github:CQLabs/homebrew-dcm"]
version = "1.31.4"
backend = "github:CQLabs/homebrew-dcm"
[tools."github:CQLabs/homebrew-dcm".platforms.linux-x64]
checksum = "blake3:e9df5b765df327e1248fccf2c6165a89d632a065667f99c01765bf3047b94955"
size = 8821083
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.31.4/dcm-linux-x64-release.zip"
[tools.node]
version = "22.18.0"
backend = "core:node"
[tools.node.platforms.linux-x64]
checksum = "sha256:a2e703725d8683be86bb5da967bf8272f4518bdaf10f21389e2b2c9eaeae8c8a"
size = 54824343
url = "https://nodejs.org/dist/v22.18.0/node-v22.18.0-linux-x64.tar.gz"
[tools.pnpm]
version = "10.14.0"
backend = "aqua:pnpm/pnpm"
[tools.pnpm.platforms.linux-x64]
checksum = "blake3:13dfa46b7173d3cad3bad60a756a492ecf0bce48b23eb9f793e7ccec5a09b46d"
size = 66231525
url = "https://github.com/pnpm/pnpm/releases/download/v10.14.0/pnpm-linux-x64"

203
mise.toml
View File

@ -1,17 +1,15 @@
[tools]
node = "22.19.0"
flutter = "3.35.4"
pnpm = "10.14.0"
dart = "3.8.2"
pnpm = "10.15.1"
[tools."github:CQLabs/homebrew-dcm"]
version = "1.31.4"
version = "1.30.0"
bin = "dcm"
postinstall = "chmod +x $MISE_TOOL_INSTALL_PATH/dcm"
[settings]
experimental = true
lockfile = true
pin = true
# .github
@ -310,3 +308,200 @@ run = [
"mise run web:test --run",
"mise run web:lint",
]
# mobile
[tasks."mobile:codegen:dart"]
alias = "mobile:codegen"
description = "Execute build_runner to auto-generate dart code"
dir = "mobile"
sources = ["pubspec.yaml", "build.yaml", "lib/**/*.dart"]
outputs = { auto = true }
run = "dart run build_runner build --delete-conflicting-outputs"
[tasks."mobile:codegen:pigeon"]
alias = "mobile:pigeon"
description = "Generate pigeon platform code"
dir = "mobile"
depends = [
"mobile:pigeon:native-sync",
"mobile:pigeon:thumbnail",
"mobile:pigeon:background-worker",
"mobile:pigeon:background-worker-lock",
"mobile:pigeon:connectivity",
]
[tasks."mobile:codegen:translation"]
alias = "mobile:translation"
description = "Generate translations from i18n JSONs"
dir = "mobile"
run = [
{ task = "i18n:format-fix" },
{ tasks = [
"mobile:i18n:loader",
"mobile:i18n:keys",
] },
]
[tasks."mobile:codegen:app-icon"]
description = "Generate app icons"
dir = "mobile"
run = "flutter pub run flutter_launcher_icons:main"
[tasks."mobile:codegen:splash"]
description = "Generate splash screen"
dir = "mobile"
run = "flutter pub run flutter_native_splash:create"
[tasks."mobile:test"]
description = "Run mobile tests"
dir = "mobile"
run = "flutter test"
[tasks."mobile:lint"]
description = "Analyze Dart code"
dir = "mobile"
depends = ["mobile:analyze:dart", "mobile:analyze:dcm"]
[tasks."mobile:lint-fix"]
description = "Auto-fix Dart code"
dir = "mobile"
depends = ["mobile:analyze:fix:dart", "mobile:analyze:fix:dcm"]
[tasks."mobile:format"]
description = "Format Dart code"
dir = "mobile"
run = "dart format --set-exit-if-changed $(find lib -name '*.dart' -not \\( -name '*.g.dart' -o -name '*.drift.dart' -o -name '*.gr.dart' \\))"
[tasks."mobile:build:android"]
description = "Build Android release"
dir = "mobile"
run = "flutter build appbundle"
[tasks."mobile:drift:migration"]
alias = "mobile:migration"
description = "Generate database migrations"
dir = "mobile"
run = "dart run drift_dev make-migrations"
# mobile internal tasks
[tasks."mobile:pigeon:native-sync"]
description = "Generate native sync API pigeon code"
dir = "mobile"
hide = true
sources = ["pigeon/native_sync_api.dart"]
outputs = [
"lib/platform/native_sync_api.g.dart",
"ios/Runner/Sync/Messages.g.swift",
"android/app/src/main/kotlin/app/alextran/immich/sync/Messages.g.kt",
]
run = [
"dart run pigeon --input pigeon/native_sync_api.dart",
"dart format lib/platform/native_sync_api.g.dart",
]
[tasks."mobile:pigeon:thumbnail"]
description = "Generate thumbnail API pigeon code"
dir = "mobile"
hide = true
sources = ["pigeon/thumbnail_api.dart"]
outputs = [
"lib/platform/thumbnail_api.g.dart",
"ios/Runner/Images/Thumbnails.g.swift",
"android/app/src/main/kotlin/app/alextran/immich/images/Thumbnails.g.kt",
]
run = [
"dart run pigeon --input pigeon/thumbnail_api.dart",
"dart format lib/platform/thumbnail_api.g.dart",
]
[tasks."mobile:pigeon:background-worker"]
description = "Generate background worker API pigeon code"
dir = "mobile"
hide = true
sources = ["pigeon/background_worker_api.dart"]
outputs = [
"lib/platform/background_worker_api.g.dart",
"ios/Runner/Background/BackgroundWorker.g.swift",
"android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorker.g.kt",
]
run = [
"dart run pigeon --input pigeon/background_worker_api.dart",
"dart format lib/platform/background_worker_api.g.dart",
]
[tasks."mobile:pigeon:background-worker-lock"]
description = "Generate background worker lock API pigeon code"
dir = "mobile"
hide = true
sources = ["pigeon/background_worker_lock_api.dart"]
outputs = [
"lib/platform/background_worker_lock_api.g.dart",
"android/app/src/main/kotlin/app/alextran/immich/background/BackgroundWorkerLock.g.kt",
]
run = [
"dart run pigeon --input pigeon/background_worker_lock_api.dart",
"dart format lib/platform/background_worker_lock_api.g.dart",
]
[tasks."mobile:pigeon:connectivity"]
description = "Generate connectivity API pigeon code"
dir = "mobile"
hide = true
sources = ["pigeon/connectivity_api.dart"]
outputs = [
"lib/platform/connectivity_api.g.dart",
"ios/Runner/Connectivity/Connectivity.g.swift",
"android/app/src/main/kotlin/app/alextran/immich/connectivity/Connectivity.g.kt",
]
run = [
"dart run pigeon --input pigeon/connectivity_api.dart",
"dart format lib/platform/connectivity_api.g.dart",
]
[tasks."mobile:i18n:loader"]
description = "Generate i18n loader"
dir = "mobile"
hide = true
sources = ["i18n/"]
outputs = "lib/generated/codegen_loader.g.dart"
run = [
"dart run easy_localization:generate -S ../i18n",
"dart format lib/generated/codegen_loader.g.dart",
]
[tasks."mobile:i18n:keys"]
description = "Generate i18n keys"
dir = "mobile"
hide = true
sources = ["i18n/en.json"]
outputs = "lib/generated/intl_keys.g.dart"
run = [
"dart run bin/generate_keys.dart",
"dart format lib/generated/intl_keys.g.dart",
]
[tasks."mobile:analyze:dart"]
description = "Run Dart analysis"
dir = "mobile"
hide = true
run = "dart analyze --fatal-infos"
[tasks."mobile:analyze:dcm"]
description = "Run Dart Code Metrics"
dir = "mobile"
hide = true
run = "dcm analyze lib --fatal-style --fatal-warnings"
[tasks."mobile:analyze:fix:dart"]
description = "Auto-fix Dart analysis"
dir = "mobile"
hide = true
run = "dart fix --apply"
[tasks."mobile:analyze:fix:dcm"]
description = "Auto-fix Dart Code Metrics"
dir = "mobile"
hide = true
run = "dcm fix lib"

View File

@ -6,6 +6,7 @@ import android.os.ext.SdkExtensions
import app.alextran.immich.background.BackgroundEngineLock
import app.alextran.immich.background.BackgroundWorkerApiImpl
import app.alextran.immich.background.BackgroundWorkerFgHostApi
import app.alextran.immich.background.BackgroundWorkerLockApi
import app.alextran.immich.connectivity.ConnectivityApi
import app.alextran.immich.connectivity.ConnectivityApiImpl
import app.alextran.immich.images.ThumbnailApi
@ -24,11 +25,9 @@ class MainActivity : FlutterFragmentActivity() {
companion object {
fun registerPlugins(ctx: Context, flutterEngine: FlutterEngine) {
flutterEngine.plugins.add(BackgroundServicePlugin())
flutterEngine.plugins.add(HttpSSLOptionsPlugin())
flutterEngine.plugins.add(BackgroundEngineLock())
val messenger = flutterEngine.dartExecutor.binaryMessenger
val backgroundEngineLockImpl = BackgroundEngineLock(ctx)
BackgroundWorkerLockApi.setUp(messenger, backgroundEngineLockImpl)
val nativeSyncApiImpl =
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R || SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) < 1) {
NativeSyncApiImpl26(ctx)
@ -39,6 +38,10 @@ class MainActivity : FlutterFragmentActivity() {
ThumbnailApi.setUp(messenger, ThumbnailsImpl(ctx))
BackgroundWorkerFgHostApi.setUp(messenger, BackgroundWorkerApiImpl(ctx))
ConnectivityApi.setUp(messenger, ConnectivityApiImpl(ctx))
flutterEngine.plugins.add(BackgroundServicePlugin())
flutterEngine.plugins.add(HttpSSLOptionsPlugin())
flutterEngine.plugins.add(backgroundEngineLockImpl)
}
}
}

View File

@ -1,33 +1,50 @@
package app.alextran.immich.background
import android.content.Context
import android.util.Log
import androidx.work.WorkManager
import io.flutter.embedding.engine.FlutterEngineCache
import io.flutter.embedding.engine.plugins.FlutterPlugin
import java.util.concurrent.atomic.AtomicInteger
private const val TAG = "BackgroundEngineLock"
class BackgroundEngineLock : FlutterPlugin {
companion object {
const val ENGINE_CACHE_KEY = "immich::background_worker::engine"
var engineCount = AtomicInteger(0)
}
class BackgroundEngineLock(context: Context) : BackgroundWorkerLockApi, FlutterPlugin {
private val ctx: Context = context.applicationContext
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
// work manager task is running while the main app is opened, cancel the worker
if (engineCount.incrementAndGet() > 1 && FlutterEngineCache.getInstance()
.get(ENGINE_CACHE_KEY) != null
) {
WorkManager.getInstance(binding.applicationContext)
.cancelUniqueWork(BackgroundWorkerApiImpl.BACKGROUND_WORKER_NAME)
FlutterEngineCache.getInstance().remove(ENGINE_CACHE_KEY)
companion object {
private var engineCount = AtomicInteger(0)
private fun checkAndEnforceBackgroundLock(ctx: Context) {
// work manager task is running while the main app is opened, cancel the worker
if (BackgroundWorkerPreferences(ctx).isLocked() &&
engineCount.get() > 1 &&
BackgroundWorkerApiImpl.isBackgroundWorkerRunning()
) {
Log.i(TAG, "Background worker is locked, cancelling the background worker")
BackgroundWorkerApiImpl.cancelBackgroundWorker(ctx)
}
}
}
Log.i(TAG, "Flutter engine attached. Attached Engines count: $engineCount")
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
engineCount.decrementAndGet()
Log.i(TAG, "Flutter engine detached. Attached Engines count: $engineCount")
}
override fun lock() {
BackgroundWorkerPreferences(ctx).setLocked(true)
checkAndEnforceBackgroundLock(ctx)
Log.i(TAG, "Background worker is locked")
}
override fun unlock() {
BackgroundWorkerPreferences(ctx).setLocked(false)
Log.i(TAG, "Background worker is unlocked")
}
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
checkAndEnforceBackgroundLock(binding.applicationContext)
engineCount.incrementAndGet()
Log.i(TAG, "Flutter engine attached. Attached Engines count: $engineCount")
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
engineCount.decrementAndGet()
Log.i(TAG, "Flutter engine detached. Attached Engines count: $engineCount")
}
}

View File

@ -76,9 +76,7 @@ class BackgroundWorker(context: Context, params: WorkerParameters) :
loader.ensureInitializationCompleteAsync(ctx, null, Handler(Looper.getMainLooper())) {
engine = FlutterEngine(ctx)
FlutterEngineCache.getInstance().remove(BackgroundEngineLock.ENGINE_CACHE_KEY);
FlutterEngineCache.getInstance()
.put(BackgroundEngineLock.ENGINE_CACHE_KEY, engine!!)
FlutterEngineCache.getInstance().put(BackgroundWorkerApiImpl.ENGINE_CACHE_KEY, engine!!)
// Register custom plugins
MainActivity.registerPlugins(ctx, engine!!)
@ -192,9 +190,9 @@ class BackgroundWorker(context: Context, params: WorkerParameters) :
isComplete = true
engine?.destroy()
engine = null
FlutterEngineCache.getInstance().remove(BackgroundEngineLock.ENGINE_CACHE_KEY);
flutterApi = null
notificationManager.cancel(NOTIFICATION_ID)
FlutterEngineCache.getInstance().remove(BackgroundWorkerApiImpl.ENGINE_CACHE_KEY)
waitForForegroundPromotion()
completionHandler.set(success)
}

View File

@ -1,7 +1,6 @@
package app.alextran.immich.background
import android.content.Context
import android.content.SharedPreferences
import android.provider.MediaStore
import android.util.Log
import androidx.work.BackoffPolicy
@ -9,6 +8,7 @@ import androidx.work.Constraints
import androidx.work.ExistingWorkPolicy
import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager
import io.flutter.embedding.engine.FlutterEngineCache
import java.util.concurrent.TimeUnit
private const val TAG = "BackgroundWorkerApiImpl"
@ -34,8 +34,10 @@ class BackgroundWorkerApiImpl(context: Context) : BackgroundWorkerFgHostApi {
}
companion object {
const val BACKGROUND_WORKER_NAME = "immich/BackgroundWorkerV1"
private const val BACKGROUND_WORKER_NAME = "immich/BackgroundWorkerV1"
private const val OBSERVER_WORKER_NAME = "immich/MediaObserverV1"
const val ENGINE_CACHE_KEY = "immich::background_worker::engine"
fun enqueueMediaObserver(ctx: Context) {
val settings = BackgroundWorkerPreferences(ctx).getSettings()
@ -73,35 +75,18 @@ class BackgroundWorkerApiImpl(context: Context) : BackgroundWorkerFgHostApi {
Log.i(TAG, "Enqueued background worker with name: $BACKGROUND_WORKER_NAME")
}
}
}
private class BackgroundWorkerPreferences(private val ctx: Context) {
companion object {
private const val SHARED_PREF_NAME = "Immich::BackgroundWorker"
private const val SHARED_PREF_MIN_DELAY_KEY = "BackgroundWorker::minDelaySeconds"
private const val SHARED_PREF_REQUIRE_CHARGING_KEY = "BackgroundWorker::requireCharging"
fun isBackgroundWorkerRunning(): Boolean {
// Easier to check if the engine is cached as we always cache the engine when starting the worker
// and remove it when the worker is finished
return FlutterEngineCache.getInstance().get(ENGINE_CACHE_KEY) != null
}
private const val DEFAULT_MIN_DELAY_SECONDS = 30L
private const val DEFAULT_REQUIRE_CHARGING = false
}
fun cancelBackgroundWorker(ctx: Context) {
WorkManager.getInstance(ctx).cancelUniqueWork(BACKGROUND_WORKER_NAME)
FlutterEngineCache.getInstance().remove(ENGINE_CACHE_KEY)
private val sp: SharedPreferences by lazy {
ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)
}
fun updateSettings(settings: BackgroundWorkerSettings) {
sp.edit().apply {
putLong(SHARED_PREF_MIN_DELAY_KEY, settings.minimumDelaySeconds)
putBoolean(SHARED_PREF_REQUIRE_CHARGING_KEY, settings.requiresCharging)
apply()
Log.i(TAG, "Cancelled background upload task")
}
}
fun getSettings(): BackgroundWorkerSettings {
return BackgroundWorkerSettings(
minimumDelaySeconds = sp.getLong(SHARED_PREF_MIN_DELAY_KEY, DEFAULT_MIN_DELAY_SECONDS),
requiresCharging = sp.getBoolean(SHARED_PREF_REQUIRE_CHARGING_KEY, DEFAULT_REQUIRE_CHARGING),
)
}
}

View File

@ -0,0 +1,95 @@
// Autogenerated from Pigeon (v26.0.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon
@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass")
package app.alextran.immich.background
import android.util.Log
import io.flutter.plugin.common.BasicMessageChannel
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.MessageCodec
import io.flutter.plugin.common.StandardMethodCodec
import io.flutter.plugin.common.StandardMessageCodec
import java.io.ByteArrayOutputStream
import java.nio.ByteBuffer
private object BackgroundWorkerLockPigeonUtils {
fun wrapResult(result: Any?): List<Any?> {
return listOf(result)
}
fun wrapError(exception: Throwable): List<Any?> {
return if (exception is FlutterError) {
listOf(
exception.code,
exception.message,
exception.details
)
} else {
listOf(
exception.javaClass.simpleName,
exception.toString(),
"Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception)
)
}
}
}
private open class BackgroundWorkerLockPigeonCodec : StandardMessageCodec() {
override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? {
return super.readValueOfType(type, buffer)
}
override fun writeValue(stream: ByteArrayOutputStream, value: Any?) {
super.writeValue(stream, value)
}
}
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
interface BackgroundWorkerLockApi {
fun lock()
fun unlock()
companion object {
/** The codec used by BackgroundWorkerLockApi. */
val codec: MessageCodec<Any?> by lazy {
BackgroundWorkerLockPigeonCodec()
}
/** Sets up an instance of `BackgroundWorkerLockApi` to handle messages through the `binaryMessenger`. */
@JvmOverloads
fun setUp(binaryMessenger: BinaryMessenger, api: BackgroundWorkerLockApi?, messageChannelSuffix: String = "") {
val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else ""
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.immich_mobile.BackgroundWorkerLockApi.lock$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { _, reply ->
val wrapped: List<Any?> = try {
api.lock()
listOf(null)
} catch (exception: Throwable) {
BackgroundWorkerLockPigeonUtils.wrapError(exception)
}
reply.reply(wrapped)
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.immich_mobile.BackgroundWorkerLockApi.unlock$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { _, reply ->
val wrapped: List<Any?> = try {
api.unlock()
listOf(null)
} catch (exception: Throwable) {
BackgroundWorkerLockPigeonUtils.wrapError(exception)
}
reply.reply(wrapped)
}
} else {
channel.setMessageHandler(null)
}
}
}
}
}

View File

@ -0,0 +1,49 @@
package app.alextran.immich.background
import android.content.Context
import android.content.SharedPreferences
import androidx.core.content.edit
class BackgroundWorkerPreferences(private val ctx: Context) {
companion object {
const val SHARED_PREF_NAME = "Immich::BackgroundWorker"
private const val SHARED_PREF_MIN_DELAY_KEY = "BackgroundWorker::minDelaySeconds"
private const val SHARED_PREF_REQUIRE_CHARGING_KEY = "BackgroundWorker::requireCharging"
private const val SHARED_PREF_LOCK_KEY = "BackgroundWorker::isLocked"
private const val DEFAULT_MIN_DELAY_SECONDS = 30L
private const val DEFAULT_REQUIRE_CHARGING = false
}
private val sp: SharedPreferences by lazy {
ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)
}
fun updateSettings(settings: BackgroundWorkerSettings) {
sp.edit {
putLong(SHARED_PREF_MIN_DELAY_KEY, settings.minimumDelaySeconds)
putBoolean(SHARED_PREF_REQUIRE_CHARGING_KEY, settings.requiresCharging)
}
}
fun getSettings(): BackgroundWorkerSettings {
return BackgroundWorkerSettings(
minimumDelaySeconds = sp.getLong(SHARED_PREF_MIN_DELAY_KEY, DEFAULT_MIN_DELAY_SECONDS),
requiresCharging = sp.getBoolean(
SHARED_PREF_REQUIRE_CHARGING_KEY,
DEFAULT_REQUIRE_CHARGING
),
)
}
fun setLocked(paused: Boolean) {
sp.edit {
putBoolean(SHARED_PREF_LOCK_KEY, paused)
}
}
fun isLocked(): Boolean {
return sp.getBoolean(SHARED_PREF_LOCK_KEY, true)
}
}

View File

@ -17,6 +17,7 @@ import java.util.concurrent.Executors
import com.bumptech.glide.Glide
import com.bumptech.glide.Priority
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
import java.util.Base64
import java.util.concurrent.CancellationException
import java.util.concurrent.ConcurrentHashMap
@ -120,15 +121,14 @@ class ThumbnailsImpl(context: Context) : ThumbnailApi {
signal: CancellationSignal
) {
signal.throwIfCanceled()
val targetWidth = width.toInt()
val targetHeight = height.toInt()
val size = Size(width.toInt(), height.toInt())
val id = assetId.toLong()
signal.throwIfCanceled()
val bitmap = if (isVideo) {
decodeVideoThumbnail(id, targetWidth, targetHeight, signal)
decodeVideoThumbnail(id, size, signal)
} else {
decodeImage(id, targetWidth, targetHeight, signal)
decodeImage(id, size, signal)
}
processBitmap(bitmap, callback, signal)
@ -151,9 +151,7 @@ class ThumbnailsImpl(context: Context) : ThumbnailApi {
bitmap.recycle()
signal.throwIfCanceled()
val res = mapOf(
"pointer" to pointer,
"width" to actualWidth.toLong(),
"height" to actualHeight.toLong()
"pointer" to pointer, "width" to actualWidth.toLong(), "height" to actualHeight.toLong()
)
callback(Result.success(res))
} catch (e: Exception) {
@ -162,55 +160,54 @@ class ThumbnailsImpl(context: Context) : ThumbnailApi {
}
}
private fun decodeImage(
id: Long, targetWidth: Int, targetHeight: Int, signal: CancellationSignal
): Bitmap {
private fun decodeImage(id: Long, size: Size, signal: CancellationSignal): Bitmap {
signal.throwIfCanceled()
val uri = ContentUris.withAppendedId(Images.Media.EXTERNAL_CONTENT_URI, id)
if (targetHeight > 768 || targetWidth > 768) {
return decodeSource(uri, targetWidth, targetHeight, signal)
if (size.width <= 0 || size.height <= 0 || size.width > 768 || size.height > 768) {
return decodeSource(uri, size, signal)
}
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
resolver.loadThumbnail(uri, Size(targetWidth, targetHeight), signal)
resolver.loadThumbnail(uri, size, signal)
} else {
signal.setOnCancelListener { Images.Thumbnails.cancelThumbnailRequest(resolver, id) }
Images.Thumbnails.getThumbnail(resolver, id, Images.Thumbnails.MINI_KIND, OPTIONS)
}
}
private fun decodeVideoThumbnail(
id: Long, targetWidth: Int, targetHeight: Int, signal: CancellationSignal
): Bitmap {
private fun decodeVideoThumbnail(id: Long, target: Size, signal: CancellationSignal): Bitmap {
signal.throwIfCanceled()
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val uri = ContentUris.withAppendedId(Video.Media.EXTERNAL_CONTENT_URI, id)
resolver.loadThumbnail(uri, Size(targetWidth, targetHeight), signal)
// ensure a valid resolution as the thumbnail is used for videos even when no scaling is needed
val size = if (target.width > 0 && target.height > 0) target else Size(768, 768)
resolver.loadThumbnail(uri, size, signal)
} else {
signal.setOnCancelListener { Video.Thumbnails.cancelThumbnailRequest(resolver, id) }
Video.Thumbnails.getThumbnail(resolver, id, Video.Thumbnails.MINI_KIND, OPTIONS)
}
}
private fun decodeSource(
uri: Uri, targetWidth: Int, targetHeight: Int, signal: CancellationSignal
): Bitmap {
private fun decodeSource(uri: Uri, target: Size, signal: CancellationSignal): Bitmap {
signal.throwIfCanceled()
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val source = ImageDecoder.createSource(resolver, uri)
signal.throwIfCanceled()
ImageDecoder.decodeBitmap(source) { decoder, info, _ ->
if (targetWidth > 0 && targetHeight > 0) {
val sample = max(1, min(info.size.width / targetWidth, info.size.height / targetHeight))
if (target.width > 0 && target.height > 0) {
val sample = max(1, min(info.size.width / target.width, info.size.height / target.height))
decoder.setTargetSampleSize(sample)
}
decoder.allocator = ImageDecoder.ALLOCATOR_SOFTWARE
decoder.setTargetColorSpace(ColorSpace.get(ColorSpace.Named.SRGB))
}
} else {
val ref = Glide.with(ctx).asBitmap().priority(Priority.IMMEDIATE).load(uri)
.disallowHardwareConfig().format(DecodeFormat.PREFER_ARGB_8888)
.submit(targetWidth, targetHeight)
val ref =
Glide.with(ctx).asBitmap().priority(Priority.IMMEDIATE).load(uri).disallowHardwareConfig()
.format(DecodeFormat.PREFER_ARGB_8888).submit(
if (target.width > 0) target.width else SIZE_ORIGINAL,
if (target.height > 0) target.height else SIZE_ORIGINAL,
)
signal.setOnCancelListener { Glide.with(ctx).clear(ref) }
ref.get()
}

View File

@ -209,6 +209,40 @@ data class SyncDelta (
override fun hashCode(): Int = toList().hashCode()
}
/** Generated class from Pigeon that represents data sent in messages. */
data class HashResult (
val assetId: String,
val error: String? = null,
val hash: String? = null
)
{
companion object {
fun fromList(pigeonVar_list: List<Any?>): HashResult {
val assetId = pigeonVar_list[0] as String
val error = pigeonVar_list[1] as String?
val hash = pigeonVar_list[2] as String?
return HashResult(assetId, error, hash)
}
}
fun toList(): List<Any?> {
return listOf(
assetId,
error,
hash,
)
}
override fun equals(other: Any?): Boolean {
if (other !is HashResult) {
return false
}
if (this === other) {
return true
}
return MessagesPigeonUtils.deepEquals(toList(), other.toList()) }
override fun hashCode(): Int = toList().hashCode()
}
private open class MessagesPigeonCodec : StandardMessageCodec() {
override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? {
return when (type) {
@ -227,6 +261,11 @@ private open class MessagesPigeonCodec : StandardMessageCodec() {
SyncDelta.fromList(it)
}
}
132.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let {
HashResult.fromList(it)
}
}
else -> super.readValueOfType(type, buffer)
}
}
@ -244,11 +283,16 @@ private open class MessagesPigeonCodec : StandardMessageCodec() {
stream.write(131)
writeValue(stream, value.toList())
}
is HashResult -> {
stream.write(132)
writeValue(stream, value.toList())
}
else -> super.writeValue(stream, value)
}
}
}
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
interface NativeSyncApi {
fun shouldFullSync(): Boolean
@ -259,7 +303,8 @@ interface NativeSyncApi {
fun getAlbums(): List<PlatformAlbum>
fun getAssetsCountSince(albumId: String, timestamp: Long): Long
fun getAssetsForAlbum(albumId: String, updatedTimeCond: Long?): List<PlatformAsset>
fun hashPaths(paths: List<String>): List<ByteArray?>
fun hashAssets(assetIds: List<String>, allowNetworkAccess: Boolean, callback: (Result<List<HashResult>>) -> Unit)
fun cancelHashing()
companion object {
/** The codec used by NativeSyncApi. */
@ -402,13 +447,33 @@ interface NativeSyncApi {
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashPaths$separatedMessageChannelSuffix", codec, taskQueue)
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashAssets$separatedMessageChannelSuffix", codec, taskQueue)
if (api != null) {
channel.setMessageHandler { message, reply ->
val args = message as List<Any?>
val pathsArg = args[0] as List<String>
val assetIdsArg = args[0] as List<String>
val allowNetworkAccessArg = args[1] as Boolean
api.hashAssets(assetIdsArg, allowNetworkAccessArg) { result: Result<List<HashResult>> ->
val error = result.exceptionOrNull()
if (error != null) {
reply.reply(MessagesPigeonUtils.wrapError(error))
} else {
val data = result.getOrNull()
reply.reply(MessagesPigeonUtils.wrapResult(data))
}
}
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.immich_mobile.NativeSyncApi.cancelHashing$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { _, reply ->
val wrapped: List<Any?> = try {
listOf(api.hashPaths(pathsArg))
api.cancelHashing()
listOf(null)
} catch (exception: Throwable) {
MessagesPigeonUtils.wrapError(exception)
}

View File

@ -1,14 +1,25 @@
package app.alextran.immich.sync
import android.annotation.SuppressLint
import android.content.ContentUris
import android.content.Context
import android.database.Cursor
import android.provider.MediaStore
import android.util.Log
import android.util.Base64
import androidx.core.database.getStringOrNull
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
import java.io.File
import java.io.FileInputStream
import java.security.MessageDigest
import kotlin.coroutines.cancellation.CancellationException
import kotlin.coroutines.coroutineContext
sealed class AssetResult {
data class ValidAsset(val asset: PlatformAsset, val albumId: String) : AssetResult()
@ -19,8 +30,12 @@ sealed class AssetResult {
open class NativeSyncApiImplBase(context: Context) {
private val ctx: Context = context.applicationContext
private var hashTask: Job? = null
companion object {
private const val TAG = "NativeSyncApiImplBase"
private const val MAX_CONCURRENT_HASH_OPERATIONS = 16
private val hashSemaphore = Semaphore(MAX_CONCURRENT_HASH_OPERATIONS)
private const val HASHING_CANCELLED_CODE = "HASH_CANCELLED"
const val MEDIA_SELECTION =
"(${MediaStore.Files.FileColumns.MEDIA_TYPE} = ? OR ${MediaStore.Files.FileColumns.MEDIA_TYPE} = ?)"
@ -215,23 +230,74 @@ open class NativeSyncApiImplBase(context: Context) {
.toList()
}
fun hashPaths(paths: List<String>): List<ByteArray?> {
val buffer = ByteArray(HASH_BUFFER_SIZE)
val digest = MessageDigest.getInstance("SHA-1")
fun hashAssets(
assetIds: List<String>,
// allowNetworkAccess is only used on the iOS implementation
@Suppress("UNUSED_PARAMETER") allowNetworkAccess: Boolean,
callback: (Result<List<HashResult>>) -> Unit
) {
if (assetIds.isEmpty()) {
callback(Result.success(emptyList()))
return
}
return paths.map { path ->
hashTask?.cancel()
hashTask = CoroutineScope(Dispatchers.IO).launch {
try {
FileInputStream(path).use { file ->
var bytesRead: Int
while (file.read(buffer).also { bytesRead = it } > 0) {
digest.update(buffer, 0, bytesRead)
val results = assetIds.map { assetId ->
async {
hashSemaphore.withPermit {
ensureActive()
hashAsset(assetId)
}
}
}
digest.digest()
}.awaitAll()
callback(Result.success(results))
} catch (e: CancellationException) {
callback(
Result.failure(
FlutterError(
HASHING_CANCELLED_CODE,
"Hashing operation was cancelled",
null
)
)
)
} catch (e: Exception) {
Log.w(TAG, "Failed to hash file $path: $e")
null
callback(Result.failure(e))
}
}
}
private suspend fun hashAsset(assetId: String): HashResult {
return try {
val assetUri = ContentUris.withAppendedId(
MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL),
assetId.toLong()
)
val digest = MessageDigest.getInstance("SHA-1")
ctx.contentResolver.openInputStream(assetUri)?.use { inputStream ->
var bytesRead: Int
val buffer = ByteArray(HASH_BUFFER_SIZE)
while (inputStream.read(buffer).also { bytesRead = it } > 0) {
coroutineContext.ensureActive()
digest.update(buffer, 0, bytesRead)
}
} ?: return HashResult(assetId, "Cannot open input stream for asset", null)
val hashString = Base64.encodeToString(digest.digest(), Base64.NO_WRAP)
HashResult(assetId, null, hashString)
} catch (e: SecurityException) {
HashResult(assetId, "Permission denied accessing asset: ${e.message}", null)
} catch (e: Exception) {
HashResult(assetId, "Failed to hash asset: ${e.message}", null)
}
}
fun cancelHashing() {
hashTask?.cancel()
hashTask = null
}
}

View File

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

File diff suppressed because one or more lines are too long

View File

@ -4,7 +4,6 @@
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/

View File

@ -5,7 +5,7 @@ class BackgroundWorkerApiImpl: BackgroundWorkerFgHostApi {
func enable() throws {
BackgroundWorkerApiImpl.scheduleRefreshWorker()
BackgroundWorkerApiImpl.scheduleProcessingWorker()
print("BackgroundUploadImpl:enbale Background worker scheduled")
print("BackgroundWorkerApiImpl:enable Background worker scheduled")
}
func configure(settings: BackgroundWorkerSettings) throws {
@ -15,7 +15,7 @@ class BackgroundWorkerApiImpl: BackgroundWorkerFgHostApi {
func disable() throws {
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: BackgroundWorkerApiImpl.refreshTaskID);
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: BackgroundWorkerApiImpl.processingTaskID);
print("BackgroundUploadImpl:disableUploadWorker Disabled background workers")
print("BackgroundWorkerApiImpl:disableUploadWorker Disabled background workers")
}
private static let refreshTaskID = "app.alextran.immich.background.refreshUpload"

View File

@ -267,6 +267,39 @@ struct SyncDelta: Hashable {
}
}
/// Generated class from Pigeon that represents data sent in messages.
struct HashResult: Hashable {
var assetId: String
var error: String? = nil
var hash: String? = nil
// swift-format-ignore: AlwaysUseLowerCamelCase
static func fromList(_ pigeonVar_list: [Any?]) -> HashResult? {
let assetId = pigeonVar_list[0] as! String
let error: String? = nilOrValue(pigeonVar_list[1])
let hash: String? = nilOrValue(pigeonVar_list[2])
return HashResult(
assetId: assetId,
error: error,
hash: hash
)
}
func toList() -> [Any?] {
return [
assetId,
error,
hash,
]
}
static func == (lhs: HashResult, rhs: HashResult) -> Bool {
return deepEqualsMessages(lhs.toList(), rhs.toList()) }
func hash(into hasher: inout Hasher) {
deepHashMessages(value: toList(), hasher: &hasher)
}
}
private class MessagesPigeonCodecReader: FlutterStandardReader {
override func readValue(ofType type: UInt8) -> Any? {
switch type {
@ -276,6 +309,8 @@ private class MessagesPigeonCodecReader: FlutterStandardReader {
return PlatformAlbum.fromList(self.readValue() as! [Any?])
case 131:
return SyncDelta.fromList(self.readValue() as! [Any?])
case 132:
return HashResult.fromList(self.readValue() as! [Any?])
default:
return super.readValue(ofType: type)
}
@ -293,6 +328,9 @@ private class MessagesPigeonCodecWriter: FlutterStandardWriter {
} else if let value = value as? SyncDelta {
super.writeByte(131)
super.writeValue(value.toList())
} else if let value = value as? HashResult {
super.writeByte(132)
super.writeValue(value.toList())
} else {
super.writeValue(value)
}
@ -313,6 +351,7 @@ class MessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable {
static let shared = MessagesPigeonCodec(readerWriter: MessagesPigeonCodecReaderWriter())
}
/// Generated protocol from Pigeon that represents a handler of messages from Flutter.
protocol NativeSyncApi {
func shouldFullSync() throws -> Bool
@ -323,7 +362,8 @@ protocol NativeSyncApi {
func getAlbums() throws -> [PlatformAlbum]
func getAssetsCountSince(albumId: String, timestamp: Int64) throws -> Int64
func getAssetsForAlbum(albumId: String, updatedTimeCond: Int64?) throws -> [PlatformAsset]
func hashPaths(paths: [String]) throws -> [FlutterStandardTypedData?]
func hashAssets(assetIds: [String], allowNetworkAccess: Bool, completion: @escaping (Result<[HashResult], Error>) -> Void)
func cancelHashing() throws
}
/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`.
@ -459,22 +499,38 @@ class NativeSyncApiSetup {
} else {
getAssetsForAlbumChannel.setMessageHandler(nil)
}
let hashPathsChannel = taskQueue == nil
? FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashPaths\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
: FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashPaths\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec, taskQueue: taskQueue)
let hashAssetsChannel = taskQueue == nil
? FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashAssets\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
: FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashAssets\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec, taskQueue: taskQueue)
if let api = api {
hashPathsChannel.setMessageHandler { message, reply in
hashAssetsChannel.setMessageHandler { message, reply in
let args = message as! [Any?]
let pathsArg = args[0] as! [String]
let assetIdsArg = args[0] as! [String]
let allowNetworkAccessArg = args[1] as! Bool
api.hashAssets(assetIds: assetIdsArg, allowNetworkAccess: allowNetworkAccessArg) { result in
switch result {
case .success(let res):
reply(wrapResult(res))
case .failure(let error):
reply(wrapError(error))
}
}
}
} else {
hashAssetsChannel.setMessageHandler(nil)
}
let cancelHashingChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.cancelHashing\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
if let api = api {
cancelHashingChannel.setMessageHandler { _, reply in
do {
let result = try api.hashPaths(paths: pathsArg)
reply(wrapResult(result))
try api.cancelHashing()
reply(wrapResult(nil))
} catch {
reply(wrapError(error))
}
}
} else {
hashPathsChannel.setMessageHandler(nil)
cancelHashingChannel.setMessageHandler(nil)
}
}
}

View File

@ -17,30 +17,16 @@ struct AssetWrapper: Hashable, Equatable {
}
}
extension PHAsset {
func toPlatformAsset() -> PlatformAsset {
return PlatformAsset(
id: localIdentifier,
name: title(),
type: Int64(mediaType.rawValue),
createdAt: creationDate.map { Int64($0.timeIntervalSince1970) },
updatedAt: modificationDate.map { Int64($0.timeIntervalSince1970) },
width: Int64(pixelWidth),
height: Int64(pixelHeight),
durationInSeconds: Int64(duration),
orientation: 0,
isFavorite: isFavorite
)
}
}
class NativeSyncApiImpl: NativeSyncApi {
private let defaults: UserDefaults
private let changeTokenKey = "immich:changeToken"
private let albumTypes: [PHAssetCollectionType] = [.album, .smartAlbum]
private let recoveredAlbumSubType = 1000000219
private let hashBufferSize = 2 * 1024 * 1024
private var hashTask: Task<Void, Error>?
private static let hashCancelledCode = "HASH_CANCELLED"
private static let hashCancelled = Result<[HashResult], Error>.failure(PigeonError(code: hashCancelledCode, message: "Hashing cancelled", details: nil))
init(with defaults: UserDefaults = .standard) {
self.defaults = defaults
@ -96,7 +82,7 @@ class NativeSyncApiImpl: NativeSyncApi {
let collections = PHAssetCollection.fetchAssetCollections(with: type, subtype: .any, options: nil)
for i in 0..<collections.count {
let album = collections.object(at: i)
// Ignore recovered album
if(album.assetCollectionSubtype.rawValue == self.recoveredAlbumSubType) {
continue;
@ -254,7 +240,7 @@ class NativeSyncApiImpl: NativeSyncApi {
let date = NSDate(timeIntervalSince1970: TimeInterval(updatedTimeCond!))
options.predicate = NSPredicate(format: "creationDate > %@ OR modificationDate > %@", date, date)
}
let result = PHAsset.fetchAssets(in: album, options: options)
if(result.count == 0) {
return []
@ -267,23 +253,114 @@ class NativeSyncApiImpl: NativeSyncApi {
return assets
}
func hashPaths(paths: [String]) throws -> [FlutterStandardTypedData?] {
return paths.map { path in
guard let file = FileHandle(forReadingAtPath: path) else {
print("Cannot open file: \(path)")
return nil
}
var hasher = Insecure.SHA1()
while autoreleasepool(invoking: {
let chunk = file.readData(ofLength: hashBufferSize)
guard !chunk.isEmpty else { return false }
hasher.update(data: chunk)
return true
}) { }
let digest = hasher.finalize()
return FlutterStandardTypedData(bytes: Data(digest))
func hashAssets(assetIds: [String], allowNetworkAccess: Bool, completion: @escaping (Result<[HashResult], Error>) -> Void) {
if let prevTask = hashTask {
prevTask.cancel()
hashTask = nil
}
hashTask = Task { [weak self] in
var missingAssetIds = Set(assetIds)
var assets = [PHAsset]()
assets.reserveCapacity(assetIds.count)
PHAsset.fetchAssets(withLocalIdentifiers: assetIds, options: nil).enumerateObjects { (asset, _, stop) in
if Task.isCancelled {
stop.pointee = true
return
}
missingAssetIds.remove(asset.localIdentifier)
assets.append(asset)
}
if Task.isCancelled {
return completion(Self.hashCancelled)
}
await withTaskGroup(of: HashResult?.self) { taskGroup in
var results = [HashResult]()
results.reserveCapacity(assets.count)
for asset in assets {
if Task.isCancelled {
return completion(Self.hashCancelled)
}
taskGroup.addTask {
guard let self = self else { return nil }
return await self.hashAsset(asset, allowNetworkAccess: allowNetworkAccess)
}
}
for await result in taskGroup {
guard let result = result else {
return completion(Self.hashCancelled)
}
results.append(result)
}
for missing in missingAssetIds {
results.append(HashResult(assetId: missing, error: "Asset not found in library", hash: nil))
}
completion(.success(results))
}
}
}
func cancelHashing() {
hashTask?.cancel()
hashTask = nil
}
private func hashAsset(_ asset: PHAsset, allowNetworkAccess: Bool) async -> HashResult? {
class RequestRef {
var id: PHAssetResourceDataRequestID?
}
let requestRef = RequestRef()
return await withTaskCancellationHandler(operation: {
if Task.isCancelled {
return nil
}
guard let resource = asset.getResource() else {
return HashResult(assetId: asset.localIdentifier, error: "Cannot get asset resource", hash: nil)
}
if Task.isCancelled {
return nil
}
let options = PHAssetResourceRequestOptions()
options.isNetworkAccessAllowed = allowNetworkAccess
return await withCheckedContinuation { continuation in
var hasher = Insecure.SHA1()
requestRef.id = PHAssetResourceManager.default().requestData(
for: resource,
options: options,
dataReceivedHandler: { data in
hasher.update(data: data)
},
completionHandler: { error in
let result: HashResult? = switch (error) {
case let e as PHPhotosError where e.code == .userCancelled: nil
case let .some(e): HashResult(
assetId: asset.localIdentifier,
error: "Failed to hash asset: \(e.localizedDescription)",
hash: nil
)
case .none:
HashResult(
assetId: asset.localIdentifier,
error: nil,
hash: Data(hasher.finalize()).base64EncodedString()
)
}
continuation.resume(returning: result)
}
)
}
}, onCancel: {
guard let requestId = requestRef.id else { return }
PHAssetResourceManager.default().cancelDataRequest(requestId)
})
}
}

View File

@ -0,0 +1,77 @@
import Photos
extension PHAsset {
func toPlatformAsset() -> PlatformAsset {
return PlatformAsset(
id: localIdentifier,
name: title,
type: Int64(mediaType.rawValue),
createdAt: creationDate.map { Int64($0.timeIntervalSince1970) },
updatedAt: modificationDate.map { Int64($0.timeIntervalSince1970) },
width: Int64(pixelWidth),
height: Int64(pixelHeight),
durationInSeconds: Int64(duration),
orientation: 0,
isFavorite: isFavorite
)
}
var title: String {
return filename ?? originalFilename ?? "<unknown>"
}
var filename: String? {
return value(forKey: "filename") as? String
}
// This method is expected to be slow as it goes through the asset resources to fetch the originalFilename
var originalFilename: String? {
return getResource()?.originalFilename
}
func getResource() -> PHAssetResource? {
let resources = PHAssetResource.assetResources(for: self)
let filteredResources = resources.filter { $0.isMediaResource && isValidResourceType($0.type) }
guard !filteredResources.isEmpty else {
return nil
}
if filteredResources.count == 1 {
return filteredResources.first
}
if let currentResource = filteredResources.first(where: { $0.isCurrent }) {
return currentResource
}
if let fullSizeResource = filteredResources.first(where: { isFullSizeResourceType($0.type) }) {
return fullSizeResource
}
return nil
}
private func isValidResourceType(_ type: PHAssetResourceType) -> Bool {
switch mediaType {
case .image:
return [.photo, .alternatePhoto, .fullSizePhoto].contains(type)
case .video:
return [.video, .fullSizeVideo, .fullSizePairedVideo].contains(type)
default:
return false
}
}
private func isFullSizeResourceType(_ type: PHAssetResourceType) -> Bool {
switch mediaType {
case .image:
return type == .fullSizePhoto
case .video:
return type == .fullSizeVideo
default:
return false
}
}
}

View File

@ -0,0 +1,16 @@
import Photos
extension PHAssetResource {
var isCurrent: Bool {
return value(forKey: "isCurrent") as? Bool ?? false
}
var isMediaResource: Bool {
var isMedia = type != .adjustmentData
if #available(iOS 17, *) {
isMedia = isMedia && type != .photoProxy
}
return isMedia
}
}

View File

@ -22,7 +22,7 @@ platform :ios do
path: "./Runner.xcodeproj",
)
increment_version_number(
version_number: "1.142.1"
version_number: "1.143.0"
)
increment_build_number(
build_number: latest_testflight_build_number + 1,

View File

@ -1,3 +1,5 @@
import 'dart:io';
const int noDbId = -9223372036854775808; // from Isar
const double downloadCompleted = -1;
const double downloadFailed = -2;
@ -10,7 +12,7 @@ const int kSyncEventBatchSize = 5000;
const int kFetchLocalAssetsBatchSize = 40000;
// Hash batch limits
const int kBatchHashFileLimit = 256;
final int kBatchHashFileLimit = Platform.isIOS ? 32 : 512;
const int kBatchHashSizeLimit = 1024 * 1024 * 1024; // 1GB
// Secure storage keys

View File

@ -40,13 +40,12 @@ class AssetService {
Future<List<RemoteAsset>> getStack(RemoteAsset asset) async {
if (asset.stackId == null) {
return [];
return const [];
}
return _remoteAssetRepository.getStackChildren(asset).then((assets) {
// Include the primary asset in the stack as the first item
return [asset, ...assets];
});
final stack = await _remoteAssetRepository.getStackChildren(asset);
// Include the primary asset in the stack as the first item
return [asset, ...stack];
}
Future<ExifInfo?> getExif(BaseAsset asset) async {

View File

@ -10,11 +10,13 @@ import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/services/log.service.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/extensions/network_capability_extensions.dart';
import 'package:immich_mobile/extensions/platform_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/intl_keys.g.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/logger_db.repository.dart';
import 'package:immich_mobile/platform/background_worker_api.g.dart';
import 'package:immich_mobile/platform/background_worker_lock_api.g.dart';
import 'package:immich_mobile/providers/app_settings.provider.dart';
import 'package:immich_mobile/providers/background_sync.provider.dart';
import 'package:immich_mobile/providers/backup/drift_backup.provider.dart';
@ -58,7 +60,7 @@ class BackgroundWorkerFgService {
}
class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
late final ProviderContainer _ref;
ProviderContainer? _ref;
final Isar _isar;
final Drift _drift;
final DriftLogger _driftLogger;
@ -83,29 +85,31 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
BackgroundWorkerFlutterApi.setUp(this);
}
bool get _isBackupEnabled => _ref.read(appSettingsServiceProvider).getSetting(AppSettingsEnum.enableBackup);
bool get _isBackupEnabled => _ref?.read(appSettingsServiceProvider).getSetting(AppSettingsEnum.enableBackup) ?? false;
Future<void> init() async {
try {
HttpSSLOptions.apply(applyNative: false);
await Future.wait([
loadTranslations(),
workerManager.init(dynamicSpawning: true),
_ref.read(authServiceProvider).setOpenApiServiceEndpoint(),
// Initialize the file downloader
FileDownloader().configure(
globalConfig: [
// maxConcurrent: 6, maxConcurrentByHost(server):6, maxConcurrentByGroup: 3
(Config.holdingQueue, (6, 6, 3)),
// On Android, if files are larger than 256MB, run in foreground service
(Config.runInForegroundIfFileLargerThan, 256),
],
),
FileDownloader().trackTasksInGroup(kDownloadGroupLivePhoto, markDownloadedComplete: false),
FileDownloader().trackTasks(),
_ref.read(fileMediaRepositoryProvider).enableBackgroundAccess(),
]);
await Future.wait(
[
loadTranslations(),
workerManager.init(dynamicSpawning: true),
_ref?.read(authServiceProvider).setOpenApiServiceEndpoint(),
// Initialize the file downloader
FileDownloader().configure(
globalConfig: [
// maxConcurrent: 6, maxConcurrentByHost(server):6, maxConcurrentByGroup: 3
(Config.holdingQueue, (6, 6, 3)),
// On Android, if files are larger than 256MB, run in foreground service
(Config.runInForegroundIfFileLargerThan, 256),
],
),
FileDownloader().trackTasksInGroup(kDownloadGroupLivePhoto, markDownloadedComplete: false),
FileDownloader().trackTasks(),
_ref?.read(fileMediaRepositoryProvider).enableBackgroundAccess(),
].nonNulls,
);
configureFileDownloaderNotifications();
@ -178,14 +182,17 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
}
Future<void> _cleanup() async {
if (_isCleanedUp) {
// If ref is null, it means the service was never initialized properly
if (_isCleanedUp || _ref == null) {
return;
}
try {
final backgroundSyncManager = _ref.read(backgroundSyncProvider);
_isCleanedUp = true;
_ref.dispose();
final backgroundSyncManager = _ref?.read(backgroundSyncProvider);
final nativeSyncApi = _ref?.read(nativeSyncApiProvider);
_ref?.dispose();
_ref = null;
_cancellationToken.cancel();
_logger.info("Cleaning up background worker");
@ -198,14 +205,14 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
Store.dispose(),
_drift.close(),
_driftLogger.close(),
backgroundSyncManager.cancel(),
backgroundSyncManager.cancelLocal(),
backgroundSyncManager?.cancel(),
nativeSyncApi?.cancelHashing(),
];
if (_isar.isOpen) {
cleanupFutures.add(_isar.close());
}
await Future.wait(cleanupFutures);
await Future.wait(cleanupFutures.nonNulls);
_logger.info("Background worker resources cleaned up");
} catch (error, stack) {
dPrint(() => 'Failed to cleanup background worker: $error with stack: $stack');
@ -215,14 +222,18 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
Future<void> _handleBackup() async {
await runZonedGuarded(
() async {
if (!_isBackupEnabled || _isCleanedUp) {
if (_isCleanedUp) {
return;
}
if (!_isBackupEnabled) {
_logger.info("[_handleBackup 1] Backup is disabled. Skipping backup routine");
return;
}
_logger.info("[_handleBackup 2] Enqueuing assets for backup from the background service");
final currentUser = _ref.read(currentUserProvider);
final currentUser = _ref?.read(currentUserProvider);
if (currentUser == null) {
_logger.warning("[_handleBackup 3] No current user found. Skipping backup from background");
return;
@ -230,19 +241,18 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
_logger.info("[_handleBackup 4] Resume backup from background");
if (Platform.isIOS) {
return _ref.read(driftBackupProvider.notifier).handleBackupResume(currentUser.id);
return _ref?.read(driftBackupProvider.notifier).handleBackupResume(currentUser.id);
}
final canPing = await _ref.read(serverInfoServiceProvider).ping();
final canPing = await _ref?.read(serverInfoServiceProvider).ping() ?? false;
if (!canPing) {
_logger.warning("[_handleBackup 5] Server is not reachable. Skipping backup from background");
return;
}
final networkCapabilities = await _ref.read(connectivityApiProvider).getCapabilities();
final networkCapabilities = await _ref?.read(connectivityApiProvider).getCapabilities() ?? [];
return _ref
.read(uploadServiceProvider)
?.read(uploadServiceProvider)
.startBackupWithHttpClient(currentUser.id, networkCapabilities.hasWifi, _cancellationToken);
},
(error, stack) {
@ -252,18 +262,18 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
}
Future<void> _syncAssets({Duration? hashTimeout}) async {
await _ref.read(backgroundSyncProvider).syncLocal();
await _ref?.read(backgroundSyncProvider).syncLocal();
if (_isCleanedUp) {
return;
}
await _ref.read(backgroundSyncProvider).syncRemote();
await _ref?.read(backgroundSyncProvider).syncRemote();
if (_isCleanedUp) {
return;
}
var hashFuture = _ref.read(backgroundSyncProvider).hashAssets();
if (hashTimeout != null) {
var hashFuture = _ref?.read(backgroundSyncProvider).hashAssets();
if (hashTimeout != null && hashFuture != null) {
hashFuture = hashFuture.timeout(
hashTimeout,
onTimeout: () {
@ -276,6 +286,23 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
}
}
class BackgroundWorkerLockService {
final BackgroundWorkerLockApi _hostApi;
const BackgroundWorkerLockService(this._hostApi);
Future<void> lock() async {
if (CurrentPlatform.isAndroid) {
return _hostApi.lock();
}
}
Future<void> unlock() async {
if (CurrentPlatform.isAndroid) {
return _hostApi.unlock();
}
}
}
/// Native entry invoked from the background worker. If renaming or moving this to a different
/// library, make sure to update the entry points and URI in native workers as well
@pragma('vm:entry-point')

View File

@ -1,20 +1,18 @@
import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/storage.repository.dart';
import 'package:immich_mobile/platform/native_sync_api.g.dart';
import 'package:logging/logging.dart';
const String _kHashCancelledCode = "HASH_CANCELLED";
class HashService {
final int batchSizeLimit;
final int batchFileLimit;
final int _batchSize;
final DriftLocalAlbumRepository _localAlbumRepository;
final DriftLocalAssetRepository _localAssetRepository;
final StorageRepository _storageRepository;
final NativeSyncApi _nativeSyncApi;
final bool Function()? _cancelChecker;
final _log = Logger('HashService');
@ -22,37 +20,42 @@ class HashService {
HashService({
required DriftLocalAlbumRepository localAlbumRepository,
required DriftLocalAssetRepository localAssetRepository,
required StorageRepository storageRepository,
required NativeSyncApi nativeSyncApi,
bool Function()? cancelChecker,
this.batchSizeLimit = kBatchHashSizeLimit,
this.batchFileLimit = kBatchHashFileLimit,
int? batchSize,
}) : _localAlbumRepository = localAlbumRepository,
_localAssetRepository = localAssetRepository,
_storageRepository = storageRepository,
_cancelChecker = cancelChecker,
_nativeSyncApi = nativeSyncApi;
_nativeSyncApi = nativeSyncApi,
_batchSize = batchSize ?? kBatchHashFileLimit;
bool get isCancelled => _cancelChecker?.call() ?? false;
Future<void> hashAssets() async {
_log.info("Starting hashing of assets");
final Stopwatch stopwatch = Stopwatch()..start();
// Sorted by backupSelection followed by isCloud
final localAlbums = await _localAlbumRepository.getAll(
sortBy: {SortLocalAlbumsBy.backupSelection, SortLocalAlbumsBy.isIosSharedAlbum},
);
try {
// Sorted by backupSelection followed by isCloud
final localAlbums = await _localAlbumRepository.getBackupAlbums();
for (final album in localAlbums) {
if (isCancelled) {
_log.warning("Hashing cancelled. Stopped processing albums.");
break;
}
for (final album in localAlbums) {
if (isCancelled) {
_log.warning("Hashing cancelled. Stopped processing albums.");
break;
}
final assetsToHash = await _localAlbumRepository.getAssetsToHash(album.id);
if (assetsToHash.isNotEmpty) {
await _hashAssets(album, assetsToHash);
final assetsToHash = await _localAlbumRepository.getAssetsToHash(album.id);
if (assetsToHash.isNotEmpty) {
await _hashAssets(album, assetsToHash);
}
}
} on PlatformException catch (e) {
if (e.code == _kHashCancelledCode) {
_log.warning("Hashing cancelled by platform");
return;
}
} catch (e, s) {
_log.severe("Error during hashing", e, s);
}
stopwatch.stop();
@ -63,8 +66,7 @@ class HashService {
/// with hash for those that were successfully hashed. Hashes are looked up in a table
/// [LocalAssetHashEntity] by local id. Only missing entries are newly hashed and added to the DB.
Future<void> _hashAssets(LocalAlbum album, List<LocalAsset> assetsToHash) async {
int bytesProcessed = 0;
final toHash = <_AssetToPath>[];
final toHash = <String, LocalAsset>{};
for (final asset in assetsToHash) {
if (isCancelled) {
@ -72,21 +74,10 @@ class HashService {
return;
}
final file = await _storageRepository.getFileForAsset(asset.id);
if (file == null) {
_log.warning(
"Cannot get file for asset ${asset.id}, name: ${asset.name}, created on: ${asset.createdAt} from album: ${album.name}",
);
continue;
}
bytesProcessed += await file.length();
toHash.add(_AssetToPath(asset: asset, path: file.path));
if (toHash.length >= batchFileLimit || bytesProcessed >= batchSizeLimit) {
toHash[asset.id] = asset;
if (toHash.length == _batchSize) {
await _processBatch(album, toHash);
toHash.clear();
bytesProcessed = 0;
}
}
@ -94,33 +85,36 @@ class HashService {
}
/// Processes a batch of assets.
Future<void> _processBatch(LocalAlbum album, List<_AssetToPath> toHash) async {
Future<void> _processBatch(LocalAlbum album, Map<String, LocalAsset> toHash) async {
if (toHash.isEmpty) {
return;
}
_log.fine("Hashing ${toHash.length} files");
final hashed = <LocalAsset>[];
final hashes = await _nativeSyncApi.hashPaths(toHash.map((e) => e.path).toList());
final hashed = <String, String>{};
final hashResults = await _nativeSyncApi.hashAssets(
toHash.keys.toList(),
allowNetworkAccess: album.backupSelection == BackupSelection.selected,
);
assert(
hashes.length == toHash.length,
"Hashes length does not match toHash length: ${hashes.length} != ${toHash.length}",
hashResults.length == toHash.length,
"Hashes length does not match toHash length: ${hashResults.length} != ${toHash.length}",
);
for (int i = 0; i < hashes.length; i++) {
for (int i = 0; i < hashResults.length; i++) {
if (isCancelled) {
_log.warning("Hashing cancelled. Stopped processing batch.");
return;
}
final hash = hashes[i];
final asset = toHash[i].asset;
if (hash?.length == 20) {
hashed.add(asset.copyWith(checksum: base64.encode(hash!)));
final hashResult = hashResults[i];
if (hashResult.hash != null) {
hashed[hashResult.assetId] = hashResult.hash!;
} else {
final asset = toHash[hashResult.assetId];
_log.warning(
"Failed to hash file for ${asset.id}: ${asset.name} created at ${asset.createdAt} from album: ${album.name}",
"Failed to hash asset with id: ${hashResult.assetId}, name: ${asset?.name}, createdAt: ${asset?.createdAt}, from album: ${album.name}. Error: ${hashResult.error ?? "unknown"}",
);
}
}
@ -128,13 +122,5 @@ class HashService {
_log.fine("Hashed ${hashed.length}/${toHash.length} assets");
await _localAssetRepository.updateHashes(hashed);
await _storageRepository.clearCache();
}
}
class _AssetToPath {
final LocalAsset asset;
final String path;
const _AssetToPath({required this.asset, required this.path});
}

View File

@ -4,8 +4,8 @@ import 'package:immich_mobile/infrastructure/repositories/local_album.repository
import 'package:immich_mobile/infrastructure/repositories/remote_album.repository.dart';
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
import 'package:immich_mobile/repositories/drift_album_api_repository.dart';
import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
import 'package:logging/logging.dart';
final syncLinkedAlbumServiceProvider = Provider(
(ref) => SyncLinkedAlbumService(
@ -31,17 +31,19 @@ class SyncLinkedAlbumService {
selectedAlbums.map((localAlbum) async {
final linkedRemoteAlbumId = localAlbum.linkedRemoteAlbumId;
if (linkedRemoteAlbumId == null) {
_log.warning("No linked remote album ID found for local album: ${localAlbum.name}");
return;
}
final remoteAlbum = await _remoteAlbumRepository.get(linkedRemoteAlbumId);
if (remoteAlbum == null) {
_log.warning("Linked remote album not found for ID: $linkedRemoteAlbumId");
return;
}
// get assets that are uploaded but not in the remote album
final assetIds = await _remoteAlbumRepository.getLinkedAssetIds(userId, localAlbum.id, linkedRemoteAlbumId);
_log.fine("Syncing ${assetIds.length} assets to remote album: ${remoteAlbum.name}");
if (assetIds.isNotEmpty) {
final album = await _albumApiRepository.addAssets(remoteAlbum.id, assetIds);
await _remoteAlbumRepository.addAssets(remoteAlbum.id, album.added);

View File

@ -2,10 +2,12 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/domain/services/sync_linked_album.service.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:logging/logging.dart';
Future<void> syncLinkedAlbumsIsolated(ProviderContainer ref) {
final user = Store.tryGet(StoreKey.currentUser);
if (user == null) {
Logger("SyncLinkedAlbum").warning("No user logged in, skipping linked album sync");
return Future.value();
}
return ref.read(syncLinkedAlbumServiceProvider).syncLinkedAlbums(user.id);

View File

@ -10,6 +10,9 @@ class LocalAlbumAssetEntity extends Table with DriftDefaultsMixin {
TextColumn get albumId => text().references(LocalAlbumEntity, #id, onDelete: KeyAction.cascade)();
// Used for mark & sweep
BoolColumn get marker_ => boolean().nullable()();
@override
Set<Column> get primaryKey => {assetId, albumId};
}

View File

@ -15,11 +15,13 @@ typedef $$LocalAlbumAssetEntityTableCreateCompanionBuilder =
i1.LocalAlbumAssetEntityCompanion Function({
required String assetId,
required String albumId,
i0.Value<bool?> marker_,
});
typedef $$LocalAlbumAssetEntityTableUpdateCompanionBuilder =
i1.LocalAlbumAssetEntityCompanion Function({
i0.Value<String> assetId,
i0.Value<String> albumId,
i0.Value<bool?> marker_,
});
final class $$LocalAlbumAssetEntityTableReferences
@ -113,6 +115,11 @@ class $$LocalAlbumAssetEntityTableFilterComposer
super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer,
});
i0.ColumnFilters<bool> get marker_ => $composableBuilder(
column: $table.marker_,
builder: (column) => i0.ColumnFilters(column),
);
i3.$$LocalAssetEntityTableFilterComposer get assetId {
final i3.$$LocalAssetEntityTableFilterComposer composer = $composerBuilder(
composer: this,
@ -177,6 +184,11 @@ class $$LocalAlbumAssetEntityTableOrderingComposer
super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer,
});
i0.ColumnOrderings<bool> get marker_ => $composableBuilder(
column: $table.marker_,
builder: (column) => i0.ColumnOrderings(column),
);
i3.$$LocalAssetEntityTableOrderingComposer get assetId {
final i3.$$LocalAssetEntityTableOrderingComposer composer =
$composerBuilder(
@ -243,6 +255,9 @@ class $$LocalAlbumAssetEntityTableAnnotationComposer
super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer,
});
i0.GeneratedColumn<bool> get marker_ =>
$composableBuilder(column: $table.marker_, builder: (column) => column);
i3.$$LocalAssetEntityTableAnnotationComposer get assetId {
final i3.$$LocalAssetEntityTableAnnotationComposer composer =
$composerBuilder(
@ -344,16 +359,22 @@ class $$LocalAlbumAssetEntityTableTableManager
({
i0.Value<String> assetId = const i0.Value.absent(),
i0.Value<String> albumId = const i0.Value.absent(),
i0.Value<bool?> marker_ = const i0.Value.absent(),
}) => i1.LocalAlbumAssetEntityCompanion(
assetId: assetId,
albumId: albumId,
marker_: marker_,
),
createCompanionCallback:
({required String assetId, required String albumId}) =>
i1.LocalAlbumAssetEntityCompanion.insert(
assetId: assetId,
albumId: albumId,
),
({
required String assetId,
required String albumId,
i0.Value<bool?> marker_ = const i0.Value.absent(),
}) => i1.LocalAlbumAssetEntityCompanion.insert(
assetId: assetId,
albumId: albumId,
marker_: marker_,
),
withReferenceMapper: (p0) => p0
.map(
(e) => (
@ -477,8 +498,22 @@ class $LocalAlbumAssetEntityTable extends i2.LocalAlbumAssetEntity
'REFERENCES local_album_entity (id) ON DELETE CASCADE',
),
);
static const i0.VerificationMeta _marker_Meta = const i0.VerificationMeta(
'marker_',
);
@override
List<i0.GeneratedColumn> get $columns => [assetId, albumId];
late final i0.GeneratedColumn<bool> marker_ = i0.GeneratedColumn<bool>(
'marker',
aliasedName,
true,
type: i0.DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: i0.GeneratedColumn.constraintIsAlways(
'CHECK ("marker" IN (0, 1))',
),
);
@override
List<i0.GeneratedColumn> get $columns => [assetId, albumId, marker_];
@override
String get aliasedName => _alias ?? actualTableName;
@override
@ -507,6 +542,12 @@ class $LocalAlbumAssetEntityTable extends i2.LocalAlbumAssetEntity
} else if (isInserting) {
context.missing(_albumIdMeta);
}
if (data.containsKey('marker')) {
context.handle(
_marker_Meta,
marker_.isAcceptableOrUnknown(data['marker']!, _marker_Meta),
);
}
return context;
}
@ -527,6 +568,10 @@ class $LocalAlbumAssetEntityTable extends i2.LocalAlbumAssetEntity
i0.DriftSqlType.string,
data['${effectivePrefix}album_id'],
)!,
marker_: attachedDatabase.typeMapping.read(
i0.DriftSqlType.bool,
data['${effectivePrefix}marker'],
),
);
}
@ -545,15 +590,20 @@ class LocalAlbumAssetEntityData extends i0.DataClass
implements i0.Insertable<i1.LocalAlbumAssetEntityData> {
final String assetId;
final String albumId;
final bool? marker_;
const LocalAlbumAssetEntityData({
required this.assetId,
required this.albumId,
this.marker_,
});
@override
Map<String, i0.Expression> toColumns(bool nullToAbsent) {
final map = <String, i0.Expression>{};
map['asset_id'] = i0.Variable<String>(assetId);
map['album_id'] = i0.Variable<String>(albumId);
if (!nullToAbsent || marker_ != null) {
map['marker'] = i0.Variable<bool>(marker_);
}
return map;
}
@ -565,6 +615,7 @@ class LocalAlbumAssetEntityData extends i0.DataClass
return LocalAlbumAssetEntityData(
assetId: serializer.fromJson<String>(json['assetId']),
albumId: serializer.fromJson<String>(json['albumId']),
marker_: serializer.fromJson<bool?>(json['marker_']),
);
}
@override
@ -573,20 +624,26 @@ class LocalAlbumAssetEntityData extends i0.DataClass
return <String, dynamic>{
'assetId': serializer.toJson<String>(assetId),
'albumId': serializer.toJson<String>(albumId),
'marker_': serializer.toJson<bool?>(marker_),
};
}
i1.LocalAlbumAssetEntityData copyWith({String? assetId, String? albumId}) =>
i1.LocalAlbumAssetEntityData(
assetId: assetId ?? this.assetId,
albumId: albumId ?? this.albumId,
);
i1.LocalAlbumAssetEntityData copyWith({
String? assetId,
String? albumId,
i0.Value<bool?> marker_ = const i0.Value.absent(),
}) => i1.LocalAlbumAssetEntityData(
assetId: assetId ?? this.assetId,
albumId: albumId ?? this.albumId,
marker_: marker_.present ? marker_.value : this.marker_,
);
LocalAlbumAssetEntityData copyWithCompanion(
i1.LocalAlbumAssetEntityCompanion data,
) {
return LocalAlbumAssetEntityData(
assetId: data.assetId.present ? data.assetId.value : this.assetId,
albumId: data.albumId.present ? data.albumId.value : this.albumId,
marker_: data.marker_.present ? data.marker_.value : this.marker_,
);
}
@ -594,51 +651,60 @@ class LocalAlbumAssetEntityData extends i0.DataClass
String toString() {
return (StringBuffer('LocalAlbumAssetEntityData(')
..write('assetId: $assetId, ')
..write('albumId: $albumId')
..write('albumId: $albumId, ')
..write('marker_: $marker_')
..write(')'))
.toString();
}
@override
int get hashCode => Object.hash(assetId, albumId);
int get hashCode => Object.hash(assetId, albumId, marker_);
@override
bool operator ==(Object other) =>
identical(this, other) ||
(other is i1.LocalAlbumAssetEntityData &&
other.assetId == this.assetId &&
other.albumId == this.albumId);
other.albumId == this.albumId &&
other.marker_ == this.marker_);
}
class LocalAlbumAssetEntityCompanion
extends i0.UpdateCompanion<i1.LocalAlbumAssetEntityData> {
final i0.Value<String> assetId;
final i0.Value<String> albumId;
final i0.Value<bool?> marker_;
const LocalAlbumAssetEntityCompanion({
this.assetId = const i0.Value.absent(),
this.albumId = const i0.Value.absent(),
this.marker_ = const i0.Value.absent(),
});
LocalAlbumAssetEntityCompanion.insert({
required String assetId,
required String albumId,
this.marker_ = const i0.Value.absent(),
}) : assetId = i0.Value(assetId),
albumId = i0.Value(albumId);
static i0.Insertable<i1.LocalAlbumAssetEntityData> custom({
i0.Expression<String>? assetId,
i0.Expression<String>? albumId,
i0.Expression<bool>? marker_,
}) {
return i0.RawValuesInsertable({
if (assetId != null) 'asset_id': assetId,
if (albumId != null) 'album_id': albumId,
if (marker_ != null) 'marker': marker_,
});
}
i1.LocalAlbumAssetEntityCompanion copyWith({
i0.Value<String>? assetId,
i0.Value<String>? albumId,
i0.Value<bool?>? marker_,
}) {
return i1.LocalAlbumAssetEntityCompanion(
assetId: assetId ?? this.assetId,
albumId: albumId ?? this.albumId,
marker_: marker_ ?? this.marker_,
);
}
@ -651,6 +717,9 @@ class LocalAlbumAssetEntityCompanion
if (albumId.present) {
map['album_id'] = i0.Variable<String>(albumId.value);
}
if (marker_.present) {
map['marker'] = i0.Variable<bool>(marker_.value);
}
return map;
}
@ -658,7 +727,8 @@ class LocalAlbumAssetEntityCompanion
String toString() {
return (StringBuffer('LocalAlbumAssetEntityCompanion(')
..write('assetId: $assetId, ')
..write('albumId: $albumId')
..write('albumId: $albumId, ')
..write('marker_: $marker_')
..write(')'))
.toString();
}

View File

@ -29,82 +29,56 @@ class DriftBackupRepository extends DriftDatabaseRepository {
..where(_db.localAlbumEntity.backupSelection.equalsValue(BackupSelection.excluded));
}
Future<int> getTotalCount() async {
final query = _db.localAlbumAssetEntity.selectOnly(distinct: true)
..addColumns([_db.localAlbumAssetEntity.assetId])
..join([
innerJoin(
_db.localAlbumEntity,
_db.localAlbumAssetEntity.albumId.equalsExp(_db.localAlbumEntity.id),
useColumns: false,
),
])
..where(
_db.localAlbumEntity.backupSelection.equalsValue(BackupSelection.selected) &
_db.localAlbumAssetEntity.assetId.isNotInQuery(_getExcludedSubquery()),
);
/// Returns all backup-related counts in a single query.
///
/// - total: number of distinct assets in selected albums, excluding those that are also in excluded albums
/// - backup: number of those assets that already exist on the server for [userId]
/// - remainder: number of those assets that do not yet exist on the server for [userId]
/// (includes processing)
/// - processing: number of those assets that are still preparing/have a null checksum
Future<({int total, int remainder, int processing})> getAllCounts(String userId) async {
const sql = '''
SELECT
COUNT(*) AS total_count,
COUNT(*) FILTER (WHERE lae.checksum IS NULL) AS processing_count,
COUNT(*) FILTER (WHERE rae.id IS NULL) AS remainder_count
FROM local_asset_entity lae
LEFT JOIN main.remote_asset_entity rae
ON lae.checksum = rae.checksum AND rae.owner_id = ?1
WHERE EXISTS (
SELECT 1
FROM local_album_asset_entity laa
INNER JOIN main.local_album_entity la on laa.album_id = la.id
WHERE laa.asset_id = lae.id
AND la.backup_selection = ?2
)
AND NOT EXISTS (
SELECT 1
FROM local_album_asset_entity laa
INNER JOIN main.local_album_entity la on laa.album_id = la.id
WHERE laa.asset_id = lae.id
AND la.backup_selection = ?3
);
''';
return query.get().then((rows) => rows.length);
}
final row = await _db
.customSelect(
sql,
variables: [
Variable.withString(userId),
Variable.withInt(BackupSelection.selected.index),
Variable.withInt(BackupSelection.excluded.index),
],
readsFrom: {_db.localAlbumAssetEntity, _db.localAlbumEntity, _db.localAssetEntity, _db.remoteAssetEntity},
)
.getSingle();
Future<int> getRemainderCount(String userId) async {
final query = _db.localAlbumAssetEntity.selectOnly(distinct: true)
..addColumns([_db.localAlbumAssetEntity.assetId])
..join([
innerJoin(
_db.localAlbumEntity,
_db.localAlbumAssetEntity.albumId.equalsExp(_db.localAlbumEntity.id),
useColumns: false,
),
innerJoin(
_db.localAssetEntity,
_db.localAlbumAssetEntity.assetId.equalsExp(_db.localAssetEntity.id),
useColumns: false,
),
leftOuterJoin(
_db.remoteAssetEntity,
_db.localAssetEntity.checksum.equalsExp(_db.remoteAssetEntity.checksum) &
_db.remoteAssetEntity.ownerId.equals(userId),
useColumns: false,
),
])
..where(
_db.localAlbumEntity.backupSelection.equalsValue(BackupSelection.selected) &
_db.remoteAssetEntity.id.isNull() &
_db.localAlbumAssetEntity.assetId.isNotInQuery(_getExcludedSubquery()),
);
return query.get().then((rows) => rows.length);
}
Future<int> getBackupCount(String userId) async {
final query = _db.localAlbumAssetEntity.selectOnly(distinct: true)
..addColumns([_db.localAlbumAssetEntity.assetId])
..join([
innerJoin(
_db.localAlbumEntity,
_db.localAlbumAssetEntity.albumId.equalsExp(_db.localAlbumEntity.id),
useColumns: false,
),
innerJoin(
_db.localAssetEntity,
_db.localAlbumAssetEntity.assetId.equalsExp(_db.localAssetEntity.id),
useColumns: false,
),
innerJoin(
_db.remoteAssetEntity,
_db.localAssetEntity.checksum.equalsExp(_db.remoteAssetEntity.checksum),
useColumns: false,
),
])
..where(
_db.localAlbumEntity.backupSelection.equalsValue(BackupSelection.selected) &
_db.remoteAssetEntity.id.isNotNull() &
_db.remoteAssetEntity.ownerId.equals(userId) &
_db.localAlbumAssetEntity.assetId.isNotInQuery(_getExcludedSubquery()),
);
return query.get().then((rows) => rows.length);
final data = row.data;
return (
total: (data['total_count'] as int?) ?? 0,
remainder: (data['remainder_count'] as int?) ?? 0,
processing: (data['processing_count'] as int?) ?? 0,
);
}
Future<List<LocalAsset>> getCandidates(String userId) async {

View File

@ -93,7 +93,7 @@ class Drift extends $Drift implements IDatabaseRepository {
}
@override
int get schemaVersion => 10;
int get schemaVersion => 11;
@override
MigrationStrategy get migration => MigrationStrategy(
@ -156,6 +156,9 @@ class Drift extends $Drift implements IDatabaseRepository {
await m.addColumn(v10.userEntity, v10.userEntity.avatarColor);
await m.alterTable(TableMigration(v10.userEntity));
},
from10To11: (m, v11) async {
await m.addColumn(v11.localAlbumAssetEntity, v11.localAlbumAssetEntity.marker_);
},
),
);

View File

@ -4270,6 +4270,395 @@ i1.GeneratedColumn<String> _column_94(String aliasedName) =>
true,
type: i1.DriftSqlType.string,
);
final class Schema11 extends i0.VersionedSchema {
Schema11({required super.database}) : super(version: 11);
@override
late final List<i1.DatabaseSchemaEntity> entities = [
userEntity,
remoteAssetEntity,
stackEntity,
localAssetEntity,
remoteAlbumEntity,
localAlbumEntity,
localAlbumAssetEntity,
idxLocalAssetChecksum,
idxRemoteAssetOwnerChecksum,
uQRemoteAssetsOwnerChecksum,
uQRemoteAssetsOwnerLibraryChecksum,
idxRemoteAssetChecksum,
authUserEntity,
userMetadataEntity,
partnerEntity,
remoteExifEntity,
remoteAlbumAssetEntity,
remoteAlbumUserEntity,
memoryEntity,
memoryAssetEntity,
personEntity,
assetFaceEntity,
storeEntity,
idxLatLng,
];
late final Shape20 userEntity = Shape20(
source: i0.VersionedTable(
entityName: 'user_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [
_column_0,
_column_1,
_column_3,
_column_84,
_column_85,
_column_91,
],
attachedDatabase: database,
),
alias: null,
);
late final Shape17 remoteAssetEntity = Shape17(
source: i0.VersionedTable(
entityName: 'remote_asset_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [
_column_1,
_column_8,
_column_9,
_column_5,
_column_10,
_column_11,
_column_12,
_column_0,
_column_13,
_column_14,
_column_15,
_column_16,
_column_17,
_column_18,
_column_19,
_column_20,
_column_21,
_column_86,
],
attachedDatabase: database,
),
alias: null,
);
late final Shape3 stackEntity = Shape3(
source: i0.VersionedTable(
entityName: 'stack_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [_column_0, _column_9, _column_5, _column_15, _column_75],
attachedDatabase: database,
),
alias: null,
);
late final Shape2 localAssetEntity = Shape2(
source: i0.VersionedTable(
entityName: 'local_asset_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [
_column_1,
_column_8,
_column_9,
_column_5,
_column_10,
_column_11,
_column_12,
_column_0,
_column_22,
_column_14,
_column_23,
],
attachedDatabase: database,
),
alias: null,
);
late final Shape9 remoteAlbumEntity = Shape9(
source: i0.VersionedTable(
entityName: 'remote_album_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [
_column_0,
_column_1,
_column_56,
_column_9,
_column_5,
_column_15,
_column_57,
_column_58,
_column_59,
],
attachedDatabase: database,
),
alias: null,
);
late final Shape19 localAlbumEntity = Shape19(
source: i0.VersionedTable(
entityName: 'local_album_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [
_column_0,
_column_1,
_column_5,
_column_31,
_column_32,
_column_90,
_column_33,
],
attachedDatabase: database,
),
alias: null,
);
late final Shape22 localAlbumAssetEntity = Shape22(
source: i0.VersionedTable(
entityName: 'local_album_asset_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(asset_id, album_id)'],
columns: [_column_34, _column_35, _column_33],
attachedDatabase: database,
),
alias: null,
);
final i1.Index idxLocalAssetChecksum = i1.Index(
'idx_local_asset_checksum',
'CREATE INDEX IF NOT EXISTS idx_local_asset_checksum ON local_asset_entity (checksum)',
);
final i1.Index idxRemoteAssetOwnerChecksum = i1.Index(
'idx_remote_asset_owner_checksum',
'CREATE INDEX IF NOT EXISTS idx_remote_asset_owner_checksum ON remote_asset_entity (owner_id, checksum)',
);
final i1.Index uQRemoteAssetsOwnerChecksum = i1.Index(
'UQ_remote_assets_owner_checksum',
'CREATE UNIQUE INDEX IF NOT EXISTS UQ_remote_assets_owner_checksum ON remote_asset_entity (owner_id, checksum) WHERE(library_id IS NULL)',
);
final i1.Index uQRemoteAssetsOwnerLibraryChecksum = i1.Index(
'UQ_remote_assets_owner_library_checksum',
'CREATE UNIQUE INDEX IF NOT EXISTS UQ_remote_assets_owner_library_checksum ON remote_asset_entity (owner_id, library_id, checksum) WHERE(library_id IS NOT NULL)',
);
final i1.Index idxRemoteAssetChecksum = i1.Index(
'idx_remote_asset_checksum',
'CREATE INDEX IF NOT EXISTS idx_remote_asset_checksum ON remote_asset_entity (checksum)',
);
late final Shape21 authUserEntity = Shape21(
source: i0.VersionedTable(
entityName: 'auth_user_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [
_column_0,
_column_1,
_column_3,
_column_2,
_column_84,
_column_85,
_column_92,
_column_93,
_column_7,
_column_94,
],
attachedDatabase: database,
),
alias: null,
);
late final Shape4 userMetadataEntity = Shape4(
source: i0.VersionedTable(
entityName: 'user_metadata_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(user_id, "key")'],
columns: [_column_25, _column_26, _column_27],
attachedDatabase: database,
),
alias: null,
);
late final Shape5 partnerEntity = Shape5(
source: i0.VersionedTable(
entityName: 'partner_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(shared_by_id, shared_with_id)'],
columns: [_column_28, _column_29, _column_30],
attachedDatabase: database,
),
alias: null,
);
late final Shape8 remoteExifEntity = Shape8(
source: i0.VersionedTable(
entityName: 'remote_exif_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(asset_id)'],
columns: [
_column_36,
_column_37,
_column_38,
_column_39,
_column_40,
_column_41,
_column_11,
_column_10,
_column_42,
_column_43,
_column_44,
_column_45,
_column_46,
_column_47,
_column_48,
_column_49,
_column_50,
_column_51,
_column_52,
_column_53,
_column_54,
_column_55,
],
attachedDatabase: database,
),
alias: null,
);
late final Shape7 remoteAlbumAssetEntity = Shape7(
source: i0.VersionedTable(
entityName: 'remote_album_asset_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(asset_id, album_id)'],
columns: [_column_36, _column_60],
attachedDatabase: database,
),
alias: null,
);
late final Shape10 remoteAlbumUserEntity = Shape10(
source: i0.VersionedTable(
entityName: 'remote_album_user_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(album_id, user_id)'],
columns: [_column_60, _column_25, _column_61],
attachedDatabase: database,
),
alias: null,
);
late final Shape11 memoryEntity = Shape11(
source: i0.VersionedTable(
entityName: 'memory_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [
_column_0,
_column_9,
_column_5,
_column_18,
_column_15,
_column_8,
_column_62,
_column_63,
_column_64,
_column_65,
_column_66,
_column_67,
],
attachedDatabase: database,
),
alias: null,
);
late final Shape12 memoryAssetEntity = Shape12(
source: i0.VersionedTable(
entityName: 'memory_asset_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(asset_id, memory_id)'],
columns: [_column_36, _column_68],
attachedDatabase: database,
),
alias: null,
);
late final Shape14 personEntity = Shape14(
source: i0.VersionedTable(
entityName: 'person_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [
_column_0,
_column_9,
_column_5,
_column_15,
_column_1,
_column_69,
_column_71,
_column_72,
_column_73,
_column_74,
],
attachedDatabase: database,
),
alias: null,
);
late final Shape15 assetFaceEntity = Shape15(
source: i0.VersionedTable(
entityName: 'asset_face_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [
_column_0,
_column_36,
_column_76,
_column_77,
_column_78,
_column_79,
_column_80,
_column_81,
_column_82,
_column_83,
],
attachedDatabase: database,
),
alias: null,
);
late final Shape18 storeEntity = Shape18(
source: i0.VersionedTable(
entityName: 'store_entity',
withoutRowId: true,
isStrict: true,
tableConstraints: ['PRIMARY KEY(id)'],
columns: [_column_87, _column_88, _column_89],
attachedDatabase: database,
),
alias: null,
);
final i1.Index idxLatLng = i1.Index(
'idx_lat_lng',
'CREATE INDEX IF NOT EXISTS idx_lat_lng ON remote_exif_entity (latitude, longitude)',
);
}
class Shape22 extends i0.VersionedTable {
Shape22({required super.source, required super.alias}) : super.aliased();
i1.GeneratedColumn<String> get assetId =>
columnsByName['asset_id']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get albumId =>
columnsByName['album_id']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<bool> get marker_ =>
columnsByName['marker']! as i1.GeneratedColumn<bool>;
}
i0.MigrationStepWithVersion migrationSteps({
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
@ -4280,6 +4669,7 @@ i0.MigrationStepWithVersion migrationSteps({
required Future<void> Function(i1.Migrator m, Schema8 schema) from7To8,
required Future<void> Function(i1.Migrator m, Schema9 schema) from8To9,
required Future<void> Function(i1.Migrator m, Schema10 schema) from9To10,
required Future<void> Function(i1.Migrator m, Schema11 schema) from10To11,
}) {
return (currentVersion, database) async {
switch (currentVersion) {
@ -4328,6 +4718,11 @@ i0.MigrationStepWithVersion migrationSteps({
final migrator = i1.Migrator(database, schema);
await from9To10(migrator, schema);
return 10;
case 10:
final schema = Schema11(database: database);
final migrator = i1.Migrator(database, schema);
await from10To11(migrator, schema);
return 11;
default:
throw ArgumentError.value('Unknown migration from $currentVersion');
}
@ -4344,6 +4739,7 @@ i1.OnUpgrade stepByStep({
required Future<void> Function(i1.Migrator m, Schema8 schema) from7To8,
required Future<void> Function(i1.Migrator m, Schema9 schema) from8To9,
required Future<void> Function(i1.Migrator m, Schema10 schema) from9To10,
required Future<void> Function(i1.Migrator m, Schema11 schema) from10To11,
}) => i0.VersionedSchema.stepByStepHelper(
step: migrationSteps(
from1To2: from1To2,
@ -4355,5 +4751,6 @@ i1.OnUpgrade stepByStep({
from7To8: from7To8,
from8To9: from8To9,
from9To10: from9To10,
from10To11: from10To11,
),
);

View File

@ -72,17 +72,33 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository {
return Future.value();
}
final deleteSmt = _db.localAssetEntity.delete();
deleteSmt.where((localAsset) {
final subQuery = _db.localAlbumAssetEntity.selectOnly()
..addColumns([_db.localAlbumAssetEntity.assetId])
..join([innerJoin(_db.localAlbumEntity, _db.localAlbumAssetEntity.albumId.equalsExp(_db.localAlbumEntity.id))]);
subQuery.where(
_db.localAlbumEntity.id.equals(albumId) & _db.localAlbumAssetEntity.assetId.isNotIn(assetIdsToKeep),
);
return localAsset.id.isInQuery(subQuery);
return _db.transaction(() async {
await _db.managers.localAlbumAssetEntity
.filter((row) => row.albumId.id.equals(albumId))
.update((album) => album(marker_: const Value(true)));
await _db.batch((batch) {
for (final assetId in assetIdsToKeep) {
batch.update(
_db.localAlbumAssetEntity,
const LocalAlbumAssetEntityCompanion(marker_: Value(null)),
where: (row) => row.assetId.equals(assetId) & row.albumId.equals(albumId),
);
}
});
final query = _db.localAssetEntity.delete()
..where(
(row) => row.id.isInQuery(
_db.localAlbumAssetEntity.selectOnly()
..addColumns([_db.localAlbumAssetEntity.assetId])
..where(
_db.localAlbumAssetEntity.albumId.equals(albumId) & _db.localAlbumAssetEntity.marker_.isNotNull(),
),
),
);
await query.go();
});
await deleteSmt.go();
}
Future<void> upsert(
@ -198,10 +214,9 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository {
// List<String>
await _db.batch((batch) async {
assetAlbums.cast<String, List<Object?>>().forEach((assetId, albumIds) {
batch.deleteWhere(
_db.localAlbumAssetEntity,
(f) => f.albumId.isNotIn(albumIds.cast<String?>().nonNulls) & f.assetId.equals(assetId),
);
for (final albumId in albumIds.cast<String?>().nonNulls) {
batch.deleteWhere(_db.localAlbumAssetEntity, (f) => f.albumId.equals(albumId) & f.assetId.equals(assetId));
}
});
});
await _db.batch((batch) async {
@ -288,12 +303,14 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository {
return transaction(() async {
if (assetsToUnLink.isNotEmpty) {
await _db.batch(
(batch) => batch.deleteWhere(
_db.localAlbumAssetEntity,
(f) => f.assetId.isIn(assetsToUnLink) & f.albumId.equals(albumId),
),
);
await _db.batch((batch) {
for (final assetId in assetsToUnLink) {
batch.deleteWhere(
_db.localAlbumAssetEntity,
(row) => row.assetId.equals(assetId) & row.albumId.equals(albumId),
);
}
});
}
await _deleteAssets(assetsToDelete);
@ -320,7 +337,9 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository {
}
return _db.batch((batch) {
batch.deleteWhere(_db.localAssetEntity, (f) => f.id.isIn(ids));
for (final id in ids) {
batch.deleteWhere(_db.localAssetEntity, (row) => row.id.equals(id));
}
});
}

View File

@ -1,4 +1,3 @@
import 'package:collection/collection.dart';
import 'package:drift/drift.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
@ -36,17 +35,17 @@ class DriftLocalAssetRepository extends DriftDatabaseRepository {
Stream<LocalAsset?> watch(String id) => _assetSelectable(id).watchSingleOrNull();
Future<void> updateHashes(Iterable<LocalAsset> hashes) {
Future<void> updateHashes(Map<String, String> hashes) {
if (hashes.isEmpty) {
return Future.value();
}
return _db.batch((batch) async {
for (final asset in hashes) {
for (final entry in hashes.entries) {
batch.update(
_db.localAssetEntity,
LocalAssetEntityCompanion(checksum: Value(asset.checksum)),
where: (e) => e.id.equals(asset.id),
LocalAssetEntityCompanion(checksum: Value(entry.value)),
where: (e) => e.id.equals(entry.key),
);
}
});
@ -58,8 +57,8 @@ class DriftLocalAssetRepository extends DriftDatabaseRepository {
}
return _db.batch((batch) {
for (final slice in ids.slices(32000)) {
batch.deleteWhere(_db.localAssetEntity, (e) => e.id.isIn(slice));
for (final id in ids) {
batch.deleteWhere(_db.localAssetEntity, (e) => e.id.equals(id));
}
});
}

View File

@ -166,8 +166,15 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository {
);
}
Future<int> removeAssets(String albumId, List<String> assetIds) {
return _db.remoteAlbumAssetEntity.deleteWhere((tbl) => tbl.albumId.equals(albumId) & tbl.assetId.isIn(assetIds));
Future<void> removeAssets(String albumId, List<String> assetIds) {
return _db.batch((batch) {
for (final assetId in assetIds) {
batch.deleteWhere(
_db.remoteAlbumAssetEntity,
(row) => row.albumId.equals(albumId) & row.assetId.equals(assetId),
);
}
});
}
FutureOr<(DateTime, DateTime)> getDateRange(String albumId) {

View File

@ -62,12 +62,13 @@ class RemoteAssetRepository extends DriftDatabaseRepository {
}
Future<List<RemoteAsset>> getStackChildren(RemoteAsset asset) {
if (asset.stackId == null) {
return Future.value([]);
final stackId = asset.stackId;
if (stackId == null) {
return Future.value(const []);
}
final query = _db.remoteAssetEntity.select()
..where((row) => row.stackId.equals(asset.stackId!) & row.id.equals(asset.id).not())
..where((row) => row.stackId.equals(stackId) & row.id.equals(asset.id).not())
..orderBy([(row) => OrderingTerm.desc(row.createdAt)]);
return query.map((row) => row.toDto()).get();
@ -159,7 +160,11 @@ class RemoteAssetRepository extends DriftDatabaseRepository {
}
Future<void> delete(List<String> ids) {
return _db.remoteAssetEntity.deleteWhere((row) => row.id.isIn(ids));
return _db.batch((batch) {
for (final id in ids) {
batch.deleteWhere(_db.remoteAssetEntity, (row) => row.id.equals(id));
}
});
}
Future<void> updateLocation(List<String> ids, LatLng location) {
@ -198,7 +203,11 @@ class RemoteAssetRepository extends DriftDatabaseRepository {
.map((row) => row.id)
.get();
await _db.stackEntity.deleteWhere((row) => row.id.isIn(stackIds));
await _db.batch((batch) {
for (final stackId in stackIds) {
batch.deleteWhere(_db.stackEntity, (row) => row.id.equals(stackId));
}
});
await _db.batch((batch) {
final companion = StackEntityCompanion(ownerId: Value(userId), primaryAssetId: Value(stack.primaryAssetId));
@ -218,15 +227,21 @@ class RemoteAssetRepository extends DriftDatabaseRepository {
Future<void> unStack(List<String> stackIds) {
return _db.transaction(() async {
await _db.stackEntity.deleteWhere((row) => row.id.isIn(stackIds));
await _db.batch((batch) {
for (final stackId in stackIds) {
batch.deleteWhere(_db.stackEntity, (row) => row.id.equals(stackId));
}
});
// TODO: delete this after adding foreign key on stackId
await _db.batch((batch) {
batch.update(
_db.remoteAssetEntity,
const RemoteAssetEntityCompanion(stackId: Value(null)),
where: (e) => e.stackId.isIn(stackIds),
);
for (final stackId in stackIds) {
batch.update(
_db.remoteAssetEntity,
const RemoteAssetEntityCompanion(stackId: Value(null)),
where: (e) => e.stackId.equals(stackId),
);
}
});
});
}

View File

@ -33,7 +33,7 @@ class SearchApiRepository extends ApiRepository {
personIds: filter.people.map((e) => e.id).toList(),
type: type,
page: page,
size: 1000,
size: 100,
),
);
}

View File

@ -93,7 +93,11 @@ class SyncStreamRepository extends DriftDatabaseRepository {
Future<void> deleteUsersV1(Iterable<SyncUserDeleteV1> data) async {
try {
await _db.userEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.userId)));
await _db.batch((batch) {
for (final user in data) {
batch.deleteWhere(_db.userEntity, (row) => row.id.equals(user.userId));
}
});
} catch (error, stack) {
_logger.severe('Error: SyncUserDeleteV1', error, stack);
rethrow;
@ -158,7 +162,11 @@ class SyncStreamRepository extends DriftDatabaseRepository {
Future<void> deleteAssetsV1(Iterable<SyncAssetDeleteV1> data, {String debugLabel = 'user'}) async {
try {
await _db.remoteAssetEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.assetId)));
await _db.batch((batch) {
for (final asset in data) {
batch.deleteWhere(_db.remoteAssetEntity, (row) => row.id.equals(asset.assetId));
}
});
} catch (error, stack) {
_logger.severe('Error: deleteAssetsV1 - $debugLabel', error, stack);
rethrow;
@ -243,7 +251,11 @@ class SyncStreamRepository extends DriftDatabaseRepository {
Future<void> deleteAlbumsV1(Iterable<SyncAlbumDeleteV1> data) async {
try {
await _db.remoteAlbumEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.albumId)));
await _db.batch((batch) {
for (final album in data) {
batch.deleteWhere(_db.remoteAlbumEntity, (row) => row.id.equals(album.albumId));
}
});
} catch (error, stack) {
_logger.severe('Error: deleteAlbumsV1', error, stack);
rethrow;
@ -379,7 +391,11 @@ class SyncStreamRepository extends DriftDatabaseRepository {
Future<void> deleteMemoriesV1(Iterable<SyncMemoryDeleteV1> data) async {
try {
await _db.memoryEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.memoryId)));
await _db.batch((batch) {
for (final memory in data) {
batch.deleteWhere(_db.memoryEntity, (row) => row.id.equals(memory.memoryId));
}
});
} catch (error, stack) {
_logger.severe('Error: deleteMemoriesV1', error, stack);
rethrow;
@ -443,7 +459,11 @@ class SyncStreamRepository extends DriftDatabaseRepository {
Future<void> deleteStacksV1(Iterable<SyncStackDeleteV1> data, {String debugLabel = 'user'}) async {
try {
await _db.stackEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.stackId)));
await _db.batch((batch) {
for (final stack in data) {
batch.deleteWhere(_db.stackEntity, (row) => row.id.equals(stack.stackId));
}
});
} catch (error, stack) {
_logger.severe('Error: deleteStacksV1 - $debugLabel', error, stack);
rethrow;

View File

@ -12,9 +12,11 @@ import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/constants/locales.dart';
import 'package:immich_mobile/domain/services/background_worker.service.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/generated/codegen_loader.g.dart';
import 'package:immich_mobile/platform/background_worker_lock_api.g.dart';
import 'package:immich_mobile/providers/app_life_cycle.provider.dart';
import 'package:immich_mobile/providers/asset_viewer/share_intent_upload.provider.dart';
import 'package:immich_mobile/providers/db.provider.dart';
@ -32,6 +34,7 @@ import 'package:immich_mobile/theme/dynamic_theme.dart';
import 'package:immich_mobile/theme/theme_data.dart';
import 'package:immich_mobile/utils/bootstrap.dart';
import 'package:immich_mobile/utils/cache/widgets_binding.dart';
import 'package:immich_mobile/utils/debug_print.dart';
import 'package:immich_mobile/utils/http_ssl_options.dart';
import 'package:immich_mobile/utils/licenses.dart';
import 'package:immich_mobile/utils/migration.dart';
@ -39,10 +42,10 @@ import 'package:intl/date_symbol_data_local.dart';
import 'package:logging/logging.dart';
import 'package:timezone/data/latest.dart';
import 'package:worker_manager/worker_manager.dart';
import 'package:immich_mobile/utils/debug_print.dart';
void main() async {
ImmichWidgetsBinding();
unawaited(BackgroundWorkerLockService(BackgroundWorkerLockApi()).lock());
final (isar, drift, logDb) = await Bootstrap.initDB();
await Bootstrap.initDomain(isar, drift, logDb);
await initApp();

View File

@ -12,9 +12,13 @@ import 'package:immich_mobile/presentation/widgets/backup/backup_toggle_button.w
import 'package:immich_mobile/providers/background_sync.provider.dart';
import 'package:immich_mobile/providers/backup/backup_album.provider.dart';
import 'package:immich_mobile/providers/backup/drift_backup.provider.dart';
import 'package:immich_mobile/providers/sync_status.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/routing/router.dart';
import 'package:immich_mobile/widgets/backup/backup_info_card.dart';
import 'dart:async';
import 'package:wakelock_plus/wakelock_plus.dart';
@RoutePage()
class DriftBackupPage extends ConsumerStatefulWidget {
@ -28,12 +32,28 @@ class _DriftBackupPageState extends ConsumerState<DriftBackupPage> {
@override
void initState() {
super.initState();
WakelockPlus.enable();
final currentUser = ref.read(currentUserProvider);
if (currentUser == null) {
return;
}
ref.read(driftBackupProvider.notifier).getBackupStatus(currentUser.id);
WidgetsBinding.instance.addPostFrameCallback((_) async {
await ref.read(driftBackupProvider.notifier).getBackupStatus(currentUser.id);
await ref.read(backgroundSyncProvider).syncRemote();
if (mounted) {
await ref.read(driftBackupProvider.notifier).getBackupStatus(currentUser.id);
}
});
}
@override
dispose() {
super.dispose();
WakelockPlus.disable();
}
@override
@ -44,7 +64,6 @@ class _DriftBackupPageState extends ConsumerState<DriftBackupPage> {
.toList();
final backupNotifier = ref.read(driftBackupProvider.notifier);
final backgroundManager = ref.read(backgroundSyncProvider);
Future<void> startBackup() async {
final currentUser = Store.tryGet(StoreKey.currentUser);
@ -52,7 +71,6 @@ class _DriftBackupPageState extends ConsumerState<DriftBackupPage> {
return;
}
await backgroundManager.syncRemote();
await backupNotifier.getBackupStatus(currentUser.id);
await backupNotifier.startBackup(currentUser.id);
}
@ -235,11 +253,13 @@ class _BackupCard extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final backupCount = ref.watch(driftBackupProvider.select((p) => p.backupCount));
final syncStatus = ref.watch(syncStatusProvider);
return BackupInfoCard(
title: "backup_controller_page_backup".tr(),
subtitle: "backup_controller_page_backup_sub".tr(),
info: backupCount.toString(),
isLoading: syncStatus.isRemoteSyncing,
);
}
}
@ -250,11 +270,207 @@ class _RemainderCard extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final remainderCount = ref.watch(driftBackupProvider.select((p) => p.remainderCount));
return BackupInfoCard(
title: "backup_controller_page_remainder".tr(),
subtitle: "backup_controller_page_remainder_sub".tr(),
info: remainderCount.toString(),
onTap: () => context.pushRoute(const DriftBackupAssetDetailRoute()),
final syncStatus = ref.watch(syncStatusProvider);
return Card(
shape: RoundedRectangleBorder(
borderRadius: const BorderRadius.all(Radius.circular(20)),
side: BorderSide(color: context.colorScheme.outlineVariant, width: 1),
),
elevation: 0,
borderOnForeground: false,
child: Column(
children: [
ListTile(
minVerticalPadding: 18,
isThreeLine: true,
title: Text("backup_controller_page_remainder".t(context: context), style: context.textTheme.titleMedium),
subtitle: Padding(
padding: const EdgeInsets.only(top: 4.0, right: 18.0),
child: Text(
"backup_controller_page_remainder_sub".t(context: context),
style: context.textTheme.bodyMedium?.copyWith(color: context.colorScheme.onSurfaceSecondary),
),
),
trailing: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Stack(
children: [
Text(
remainderCount.toString(),
style: context.textTheme.titleLarge?.copyWith(
color: context.colorScheme.onSurface.withAlpha(syncStatus.isRemoteSyncing ? 50 : 255),
),
),
if (syncStatus.isRemoteSyncing)
Positioned.fill(
child: Align(
alignment: Alignment.center,
child: SizedBox(
width: 16,
height: 16,
child: CircularProgressIndicator(
strokeWidth: 2,
color: context.colorScheme.onSurface.withAlpha(150),
),
),
),
),
],
),
Text(
"backup_info_card_assets",
style: context.textTheme.labelLarge?.copyWith(
color: context.colorScheme.onSurface.withAlpha(syncStatus.isRemoteSyncing ? 50 : 255),
),
).tr(),
],
),
),
const Divider(height: 0),
const _PreparingStatus(),
const Divider(height: 0),
ListTile(
enableFeedback: true,
visualDensity: VisualDensity.compact,
contentPadding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 0.0),
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20)),
),
onTap: () => context.pushRoute(const DriftBackupAssetDetailRoute()),
title: Text(
"view_details".t(context: context),
style: context.textTheme.labelLarge?.copyWith(color: context.colorScheme.onSurface.withAlpha(200)),
),
trailing: Icon(Icons.arrow_forward_ios, size: 16, color: context.colorScheme.onSurfaceVariant),
),
],
),
);
}
}
class _PreparingStatus extends ConsumerStatefulWidget {
const _PreparingStatus();
@override
_PreparingStatusState createState() => _PreparingStatusState();
}
class _PreparingStatusState extends ConsumerState {
Timer? _pollingTimer;
@override
void dispose() {
_pollingTimer?.cancel();
super.dispose();
}
void _startPollingIfNeeded() {
if (_pollingTimer != null) return;
_pollingTimer = Timer.periodic(const Duration(seconds: 3), (timer) async {
final currentUser = ref.read(currentUserProvider);
if (currentUser != null && mounted) {
await ref.read(driftBackupProvider.notifier).getBackupStatus(currentUser.id);
// Stop polling if processing count reaches 0
final updatedProcessingCount = ref.read(driftBackupProvider.select((p) => p.processingCount));
if (updatedProcessingCount == 0) {
timer.cancel();
_pollingTimer = null;
}
} else {
timer.cancel();
_pollingTimer = null;
}
});
}
@override
Widget build(BuildContext context) {
final syncStatus = ref.watch(syncStatusProvider);
final remainderCount = ref.watch(driftBackupProvider.select((p) => p.remainderCount));
final processingCount = ref.watch(driftBackupProvider.select((p) => p.processingCount));
final readyForUploadCount = remainderCount - processingCount;
ref.listen<int>(driftBackupProvider.select((p) => p.processingCount), (previous, next) {
if (next > 0 && _pollingTimer == null) {
_startPollingIfNeeded();
} else if (next == 0 && _pollingTimer != null) {
_pollingTimer?.cancel();
_pollingTimer = null;
}
});
if (!syncStatus.isHashing) {
return const SizedBox.shrink();
}
return Row(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(left: 1.0),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8),
decoration: BoxDecoration(
color: context.colorScheme.surfaceContainerHigh.withValues(alpha: 0.5),
shape: BoxShape.rectangle,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Text(
"preparing".t(context: context),
style: context.textTheme.labelLarge?.copyWith(
color: context.colorScheme.onSurface.withAlpha(200),
),
),
const SizedBox(width: 18, height: 18, child: CircularProgressIndicator(strokeWidth: 1.5)),
],
),
const SizedBox(height: 2),
Text(
processingCount.toString(),
style: context.textTheme.titleMedium?.copyWith(
color: context.colorScheme.primary,
fontWeight: FontWeight.w600,
),
),
],
),
),
),
),
Expanded(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8),
decoration: BoxDecoration(color: context.colorScheme.primary.withValues(alpha: 0.1)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
"ready_for_upload".t(context: context),
style: context.textTheme.labelLarge?.copyWith(color: context.colorScheme.onSurface.withAlpha(200)),
),
const SizedBox(height: 2),
Text(
readyForUploadCount.toString(),
style: context.textTheme.titleMedium?.copyWith(
color: context.primaryColor,
fontWeight: FontWeight.w600,
),
),
],
),
),
),
],
);
}
}

View File

@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:io';
import 'package:auto_route/auto_route.dart';
@ -5,12 +6,14 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.dart';
import 'package:immich_mobile/domain/services/sync_linked_album.service.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/providers/app_settings.provider.dart';
import 'package:immich_mobile/domain/services/sync_linked_album.service.dart';
import 'package:immich_mobile/providers/background_sync.provider.dart';
import 'package:immich_mobile/providers/backup/backup_album.provider.dart';
import 'package:immich_mobile/providers/backup/drift_backup.provider.dart';
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:immich_mobile/widgets/backup/drift_album_info_list_tile.dart';
@ -64,16 +67,6 @@ class _DriftBackupAlbumSelectionPageState extends ConsumerState<DriftBackupAlbum
});
await _handleLinkedAlbumFuture;
}
// Restart backup if total count changed and backup is enabled
final currentTotalAssetCount = ref.read(driftBackupProvider.select((p) => p.totalCount));
final totalChanged = currentTotalAssetCount != _initialTotalAssetCount;
final isBackupEnabled = ref.read(appSettingsServiceProvider).getSetting(AppSettingsEnum.enableBackup);
if (totalChanged && isBackupEnabled) {
await ref.read(driftBackupProvider.notifier).cancel();
await ref.read(driftBackupProvider.notifier).startBackup(user.id);
}
}
@override
@ -102,6 +95,27 @@ class _DriftBackupAlbumSelectionPageState extends ConsumerState<DriftBackupAlbum
onPopInvokedWithResult: (didPop, _) async {
if (!didPop) {
await _handlePagePopped();
final user = ref.read(currentUserProvider);
if (user == null) {
return;
}
final isBackupEnabled = ref.read(appSettingsServiceProvider).getSetting(AppSettingsEnum.enableBackup);
await ref.read(driftBackupProvider.notifier).getBackupStatus(user.id);
final currentTotalAssetCount = ref.read(driftBackupProvider.select((p) => p.totalCount));
final totalChanged = currentTotalAssetCount != _initialTotalAssetCount;
final backupNotifier = ref.read(driftBackupProvider.notifier);
final backgroundSync = ref.read(backgroundSyncProvider);
final nativeSync = ref.read(nativeSyncApiProvider);
if (totalChanged) {
// Waits for hashing to be cancelled before starting a new one
unawaited(nativeSync.cancelHashing().whenComplete(() => backgroundSync.hashAssets()));
if (isBackupEnabled) {
unawaited(backupNotifier.cancel().whenComplete(() => backupNotifier.startBackup(user.id)));
}
}
Navigator.of(context).pop();
}
},

View File

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

View File

@ -0,0 +1,97 @@
// Autogenerated from Pigeon (v26.0.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon
// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers
import 'dart:async';
import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List;
import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;
import 'package:flutter/services.dart';
PlatformException _createConnectionError(String channelName) {
return PlatformException(
code: 'channel-error',
message: 'Unable to establish connection on channel: "$channelName".',
);
}
class _PigeonCodec extends StandardMessageCodec {
const _PigeonCodec();
@override
void writeValue(WriteBuffer buffer, Object? value) {
if (value is int) {
buffer.putUint8(4);
buffer.putInt64(value);
} else {
super.writeValue(buffer, value);
}
}
@override
Object? readValueOfType(int type, ReadBuffer buffer) {
switch (type) {
default:
return super.readValueOfType(type, buffer);
}
}
}
class BackgroundWorkerLockApi {
/// Constructor for [BackgroundWorkerLockApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
BackgroundWorkerLockApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})
: pigeonVar_binaryMessenger = binaryMessenger,
pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
final BinaryMessenger? pigeonVar_binaryMessenger;
static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();
final String pigeonVar_messageChannelSuffix;
Future<void> lock() async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.immich_mobile.BackgroundWorkerLockApi.lock$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
final List<Object?>? pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
throw _createConnectionError(pigeonVar_channelName);
} else if (pigeonVar_replyList.length > 1) {
throw PlatformException(
code: pigeonVar_replyList[0]! as String,
message: pigeonVar_replyList[1] as String?,
details: pigeonVar_replyList[2],
);
} else {
return;
}
}
Future<void> unlock() async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.immich_mobile.BackgroundWorkerLockApi.unlock$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
final List<Object?>? pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
throw _createConnectionError(pigeonVar_channelName);
} else if (pigeonVar_replyList.length > 1) {
throw PlatformException(
code: pigeonVar_replyList[0]! as String,
message: pigeonVar_replyList[1] as String?,
details: pigeonVar_replyList[2],
);
} else {
return;
}
}
}

View File

@ -205,6 +205,45 @@ class SyncDelta {
int get hashCode => Object.hashAll(_toList());
}
class HashResult {
HashResult({required this.assetId, this.error, this.hash});
String assetId;
String? error;
String? hash;
List<Object?> _toList() {
return <Object?>[assetId, error, hash];
}
Object encode() {
return _toList();
}
static HashResult decode(Object result) {
result as List<Object?>;
return HashResult(assetId: result[0]! as String, error: result[1] as String?, hash: result[2] as String?);
}
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
bool operator ==(Object other) {
if (other is! HashResult || other.runtimeType != runtimeType) {
return false;
}
if (identical(this, other)) {
return true;
}
return _deepEquals(encode(), other.encode());
}
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
int get hashCode => Object.hashAll(_toList());
}
class _PigeonCodec extends StandardMessageCodec {
const _PigeonCodec();
@override
@ -221,6 +260,9 @@ class _PigeonCodec extends StandardMessageCodec {
} else if (value is SyncDelta) {
buffer.putUint8(131);
writeValue(buffer, value.encode());
} else if (value is HashResult) {
buffer.putUint8(132);
writeValue(buffer, value.encode());
} else {
super.writeValue(buffer, value);
}
@ -235,6 +277,8 @@ class _PigeonCodec extends StandardMessageCodec {
return PlatformAlbum.decode(readValue(buffer)!);
case 131:
return SyncDelta.decode(readValue(buffer)!);
case 132:
return HashResult.decode(readValue(buffer)!);
default:
return super.readValueOfType(type, buffer);
}
@ -468,15 +512,15 @@ class NativeSyncApi {
}
}
Future<List<Uint8List?>> hashPaths(List<String> paths) async {
Future<List<HashResult>> hashAssets(List<String> assetIds, {bool allowNetworkAccess = false}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashPaths$pigeonVar_messageChannelSuffix';
'dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashAssets$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[paths]);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[assetIds, allowNetworkAccess]);
final List<Object?>? pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
throw _createConnectionError(pigeonVar_channelName);
@ -492,7 +536,30 @@ class NativeSyncApi {
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (pigeonVar_replyList[0] as List<Object?>?)!.cast<Uint8List?>();
return (pigeonVar_replyList[0] as List<Object?>?)!.cast<HashResult>();
}
}
Future<void> cancelHashing() async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.immich_mobile.NativeSyncApi.cancelHashing$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
final List<Object?>? pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
throw _createConnectionError(pigeonVar_channelName);
} else if (pigeonVar_replyList.length > 1) {
throw PlatformException(
code: pigeonVar_replyList[0]! as String,
message: pigeonVar_replyList[1] as String?,
details: pigeonVar_replyList[2],
);
} else {
return;
}
}
}

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