Compare commits

...

48 Commits

Author SHA1 Message Date
midzelis
53aced666e refactor: Update AssetGrid to wrap new timeline
- Update asset-grid.svelte to wrap Timeline component  
- Map old AssetGrid props to new Timeline props
- Convert onThumbnailClick to onAssetOpen callback
- Update change-date component to support icon and confirmText props

This allows existing code to continue using AssetGrid API while internally using the new Timeline implementation.
2025-09-17 00:53:30 +00:00
midzelis
6c9d506c74 refactor: new timeline component
- Create new timeline component (extracted from asset-gird) without removing old code
- Add timeline/, timeline/actions/, timeline/base-components/, and timeline/internal-components/ directories
- Copy needed components (delete-asset-dialog, scrubber, skeleton) to new locations
- Add new timeline components (base-timeline, base-timeline-viewer, timeline-month, etc.)
- Update timeline-util.ts with new functions (findMonthAtScrollPosition, formatGroupTitleFull)
- Add asset-viewer-actions and asset-viewer-and-actions components

This allows the timeline to exist alongside the current AssetGrid component.
2025-09-17 00:53:30 +00:00
Tom Laermans
df7ea4d8ea docs: add community immich-birthday and immich-stack projects (#21934) 2025-09-16 04:01:18 +00:00
bo0tzz
1e7cb1165f fix: add pnpm setup to fix-format worflow (#21805) 2025-09-15 23:57:58 -04:00
Alex
d9ef041b87 chore: remove beta wording and badges (#22040)
* chore: remove beta wordings and badges

* chore: remove beta wordings and badges
2025-09-15 22:55:29 -05:00
Alex
87a172ab0c fix: distance of segment label overlapsed scrubber label (#22043) 2025-09-15 22:55:07 -05:00
Jason Rasmussen
9e0553e0c4 fix(server): bulk edit rating (#21839) 2025-09-16 03:50:27 +00:00
uphillcheddar
a7addfece8 fix(oauth): omit blank pkce from url when not supported (#21976)
* fix(oauth): omit blank pkce from url when now pkce

* fix(oauth): use spread operator for pkce params

* chore: use first method

---------

Co-authored-by: Your Name <you@example.com>
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
2025-09-16 03:48:33 +00:00
renovate[bot]
fda215f97f chore(deps): update dependency vite to v7.1.5 [security] (#21783)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-16 03:47:29 +00:00
Jason Rasmussen
5fad1fd899 chore: split Dockerfile (#22007) 2025-09-15 23:41:35 -04:00
Sergey Katsubo
880f2bc2c5 chore(docs): TypeORM error: force recommend v1.132.3 and avoid v1.136 (#22033)
* TypeORM error: force recommend v1.132.3 and avoid v1.136

* Add extra line break for clarity

* Fix formatting error: remove an asterisk

* chore: use admonitions

---------

Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
2025-09-16 03:29:12 +00:00
Stewart Rand
0f79e0c38e fix: Use CSS for uppercase text (#22011) 2025-09-15 23:28:42 -04:00
renovate[bot]
5fb0afb0d0 chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 docker digest to c44be5f (#22038)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-15 23:13:21 -04:00
renovate[bot]
4f4a50ac11 chore(deps): update dependency @types/node to ^22.18.1 (#22042)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-15 23:12:15 -04:00
Alex
3d883b27aa fix: sidebar link hightlight (#22035)
* fix: sidebar link hightlight

* check if current route start with href
2025-09-15 22:19:55 -04:00
Zack Pollard
01fddd58c6 chore: update ROCm image (#22034) 2025-09-15 20:42:17 -04:00
shenlong
81eb5ab40d fix: close menu anchor on navigation (#22021)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-15 15:05:22 -05:00
Zack Pollard
8d849d226d chore: remove workflows that are now applied org-wide (#22019) 2025-09-15 19:16:11 +01:00
Alex
a9b82a8e32 chore: post release tasks (#22014) 2025-09-15 18:08:25 +00:00
immich-tofu[bot]
cc9e07401f chore: modify .github/workflows/org-zizmor.yml 2025-09-15 17:59:16 +00:00
immich-tofu[bot]
9b5f3552c0 chore: modify .github/workflows/org-zizmor.yml 2025-09-15 17:47:59 +00:00
immich-tofu[bot]
a52a3247d7 chore: modify .github/workflows/org-zizmor.yml 2025-09-15 17:28:11 +00:00
immich-tofu[bot]
c86c957860 chore: modify .github/workflows/org-pr-require-conventional-commit.yml 2025-09-15 17:27:51 +00:00
immich-tofu[bot]
eb15a2725a chore: modify .github/workflows/org-checks.yml 2025-09-15 17:26:57 +00:00
Weblate (bot)
b394046d2a chore(web): update translations (#21842)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/be/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/eu/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/gl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/mr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Latn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich

Co-authored-by: Abhijeet Bonde <abhijeetbonde19@gmail.com>
Co-authored-by: Adrián Nieto Rodríguez <adrian.nieto7@gmail.com>
Co-authored-by: Alexander Lohnes <alex.lohnes@googlemail.com>
Co-authored-by: Dawider10 <dawider110@gmail.com>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Jordy H <jordy@hoebergen.net>
Co-authored-by: Marcelo Popper Costa <marcelo_popper@hotmail.com>
Co-authored-by: Matjaž T <matjaz@moj-svet.si>
Co-authored-by: Mārtiņš Bruņenieks <martinsb@gmail.com>
Co-authored-by: Nuno Rodrigues <nunogand@gmail.com>
Co-authored-by: Pavlogal <pavledosen.p@gmail.com>
Co-authored-by: Pazystamas <pazystamas@gmail.com>
Co-authored-by: Phantom0174 <darrenhsiou@gmail.com>
Co-authored-by: PontusÖsterlindh <pontus@osterlindh.com>
Co-authored-by: Sergey Katsubo <skatsubo@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: TV Box <realceday.tvbox@gmail.com>
Co-authored-by: Taiki M <vexingly-many-mace@duck.com>
Co-authored-by: Urko Perez Azkarragaurizar <urkoperez16@gmail.com>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: Xo <xocodokie@users.noreply.hosted.weblate.org>
Co-authored-by: cube64 <204@tuta.io>
Co-authored-by: millallo <millallo@tiscali.it>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: vzvl <lojewski.vitus@gmail.com>
2025-09-15 17:15:41 +00:00
github-actions
859b2451bb chore: version v1.142.1 2025-09-15 17:08:25 +00:00
Mert
b79a2eb6b9 chore(mobile): const platform checks (#21878)
* use `defaultTargetPlatform`

* extension

* formatting
2025-09-15 11:13:39 -04:00
Yaros
ee96b285f2 chore(mobile): minor changes to bottom sheet (#22008) 2025-09-15 10:09:27 -05:00
Alex
77340075f0 chore: making order of background tasks better (#21928)
* chore: making order of background tasks better

* chore: prevent action not running when returning from backup screen too soon after toggle backup
2025-09-15 10:07:41 -05:00
shenlong
5c06ec5e0b fix: move startInitialization to inside the doWork method (#21984)
fix: android background backup

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-15 10:06:30 -05:00
shenlong
dcee34095b fix: reset sqlite on beta migration (#20735)
reset sync stream on migration

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-14 16:30:25 -05:00
Alex
15f182902f fix: check if preferencesStore is defined (#21958) 2025-09-14 20:30:15 +00:00
shenlong
b26b452530 fix: do not listen for store updates in isolates (#21947)
* dispose store on isolate cleanup

* do not listen for store updates in isolates

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-14 14:50:17 -05:00
shenlong
2dcb32f7d0 chore: update background downloader (#21909)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-14 14:44:48 -05:00
Brandon Wees
27d2f3efe2 feat: disable snapping when a timeline has less than 12 months (#21649)
* feat: disable snapping when a timeline has less than 12 months

* fix: disable placeholders when not snapping

also moved month constant to constants.dart

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-14 19:24:52 +00:00
shenlong
d38468439b fix: complete does not destroy engine on close (#21943)
* fix: complete does not destroy engine on close

* reset flutterApi on cleanup

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-14 14:17:12 -05:00
Alex
0166e99d90 chore: remove main timeline query watch throttle (#21942) 2025-09-14 02:09:07 -05:00
Alex
71e33e35dc chore: check before sync linked albums from websocket events (#21941) 2025-09-14 02:08:41 -05:00
Mert
a122d4b969 fix(mobile): double hero animation (#21927)
fix double hero animation
2025-09-13 16:47:07 -05:00
shenlong
dad81af6e3 fix: show view in timeline from search page (#21873)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-12 22:44:31 -05:00
shenlong
ac6b42e1e8 fix: do not show stack action if there is only one selection (#21868)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-12 22:43:51 -05:00
Stewart Rand
4059638151 fix: context menu jank (#21844)
* Fix issue with context menu jank by only applying overflow styling when transition is complete

* Remove comment

Co-authored-by: Alex <alex.tran1502@gmail.com>

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-12 22:43:22 -05:00
Stewart Rand
1823a28e59 chore: improve date text slide-in transition (#21879)
* Make date text slide-in transition smooth

* fix: lint

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-09-13 03:42:42 +00:00
Stewart Rand
b6bf1852cd fix: keep adequate space around page title (#21881)
Keep space around page title
2025-09-12 22:42:25 -05:00
Stewart Rand
cdc26f2c7b fix: z-index of top bar on show/hide people view (#21847)
Fix z-index of top bar on show/hide people view
2025-09-12 22:32:50 -05:00
Alex
913b3789cc chore: simplify timeline switcher toggle (#21864)
chore: timeline switcher option simplify
2025-09-12 22:32:15 -05:00
Stewart Rand
994a770921 chore: improve context button accessibility (#21876)
Make context menu button filled on album list and faces page
2025-09-12 22:31:52 -05:00
Mert
17bbcdf584 chore(mobile): add debugPrint lint rule (#21872)
* add lint rule

* update usages

* stragglers

* use dcm

* formatting

* test ci

* Revert "test ci"

This reverts commit 8f864c4e4d.

* revert whitespace change
2025-09-12 18:56:00 -04:00
201 changed files with 5374 additions and 2422 deletions

View File

@@ -28,6 +28,9 @@ jobs:
token: ${{ steps.generate-token.outputs.token }} token: ${{ steps.generate-token.outputs.token }}
persist-credentials: true persist-credentials: true
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:

View File

@@ -1,13 +0,0 @@
name: Org Checks
on:
pull_request_review:
pull_request:
jobs:
check-approvals:
name: Check for Team/Admin Review
uses: immich-app/devtools/.github/workflows/required-approval.yml@main
permissions:
pull-requests: read
contents: read

View File

@@ -0,0 +1,12 @@
name: PR Conventional Commit
on:
pull_request:
types: [opened, synchronize, reopened, edited]
jobs:
validate-pr-title:
name: Validate PR Title (conventional commit)
uses: immich-app/devtools/.github/workflows/shared-pr-require-conventional-commit.yml@main
permissions:
pull-requests: write

15
.github/workflows/org-zizmor.yml vendored Normal file
View File

@@ -0,0 +1,15 @@
name: Zizmor
on:
pull_request:
push:
branches: [main]
jobs:
zizmor:
name: Zizmor
uses: immich-app/devtools/.github/workflows/shared-zizmor.yml@main
permissions:
actions: read
contents: read
security-events: write

View File

@@ -1,19 +0,0 @@
name: PR Conventional Commit Validation
on:
pull_request:
types: [opened, synchronize, reopened, edited]
permissions: {}
jobs:
validate-pr-title:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: PR Conventional Commit Validation
uses: ytanikin/PRConventionalCommits@b628c5a234cc32513014b7bfdd1e47b532124d98 # 1.3.0
with:
task_types: '["feat","fix","docs","test","ci","refactor","perf","chore","revert"]'
add_label: 'false'

View File

@@ -106,30 +106,3 @@ jobs:
# TODO: Use https://github.com/CQLabs/dcm-action # TODO: Use https://github.com/CQLabs/dcm-action
- name: Run DCM - name: Run DCM
run: dcm analyze lib --fatal-style --fatal-warnings run: dcm analyze lib --fatal-style --fatal-warnings
zizmor:
name: zizmor
runs-on: ubuntu-latest
permissions:
security-events: write
contents: read
actions: read
steps:
- name: Checkout repository
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Install the latest version of uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
- name: Run zizmor 🌈
run: uvx zizmor --format=sarif . > results.sarif
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload SARIF file
uses: github/codeql-action/upload-sarif@2d92b76c45b91eb80fc44c74ce3fce0ee94e8f9d # v3.30.0
with:
sarif_file: results.sarif
category: zizmor

View File

@@ -1,6 +1,6 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.89", "version": "2.2.90",
"description": "Command Line Interface (CLI) for Immich", "description": "Command Line Interface (CLI) for Immich",
"type": "module", "type": "module",
"exports": "./dist/index.js", "exports": "./dist/index.js",
@@ -20,7 +20,7 @@
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/micromatch": "^4.0.9", "@types/micromatch": "^4.0.9",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^22.18.0", "@types/node": "^22.18.1",
"@vitest/coverage-v8": "^3.0.0", "@vitest/coverage-v8": "^3.0.0",
"byte-size": "^9.0.0", "byte-size": "^9.0.0",
"cli-progress": "^3.12.0", "cli-progress": "^3.12.0",

View File

@@ -24,7 +24,7 @@ services:
user: '${UID:-0}:${GID:-0}' user: '${UID:-0}:${GID:-0}'
build: build:
context: ../ context: ../
dockerfile: server/Dockerfile dockerfile: server/Dockerfile.dev
target: dev target: dev
restart: unless-stopped restart: unless-stopped
volumes: volumes:
@@ -85,7 +85,7 @@ services:
user: '${UID:-0}:${GID:-0}' user: '${UID:-0}:${GID:-0}'
build: build:
context: ../ context: ../
dockerfile: server/Dockerfile dockerfile: server/Dockerfile.dev
target: dev target: dev
command: ['immich-web'] command: ['immich-web']
env_file: env_file:
@@ -149,7 +149,7 @@ services:
database: database:
container_name: immich_postgres container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:8d292bdb796aa58bbbaa47fe971c8516f6f57d6a47e7172e62754feb6ed4e7b0 image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107
env_file: env_file:
- .env - .env
environment: environment:

View File

@@ -63,7 +63,7 @@ services:
database: database:
container_name: immich_postgres container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:8d292bdb796aa58bbbaa47fe971c8516f6f57d6a47e7172e62754feb6ed4e7b0 image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107
env_file: env_file:
- .env - .env
environment: environment:

View File

@@ -56,7 +56,7 @@ services:
database: database:
container_name: immich_postgres container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:8d292bdb796aa58bbbaa47fe971c8516f6f57d6a47e7172e62754feb6ed4e7b0 image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107
environment: environment:
POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME} POSTGRES_USER: ${DB_USERNAME}

View File

@@ -110,6 +110,16 @@ const projects: CommunityProjectProps[] = [
description: 'A tiny, zero-login web app for collecting photos/videos from anyone into your Immich server.', description: 'A tiny, zero-login web app for collecting photos/videos from anyone into your Immich server.',
url: 'https://github.com/Nasogaa/immich-drop', url: 'https://github.com/Nasogaa/immich-drop',
}, },
{
title: 'Immich Birthday Sync',
description: 'Bulk-upload and -download birthdays, with CardDAV sync support',
url: 'https://github.com/sid3windr/immich-birthday',
},
{
title: 'Immich Stack',
description: 'Auto-stack photos with identical filenames and differing extensions (i.e. JPG+RAW)',
url: 'https://github.com/sid3windr/immich-stack',
},
]; ];
function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element { function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element {

View File

@@ -2,7 +2,17 @@
## TypeORM Upgrade ## TypeORM Upgrade
In order to update to Immich to `v1.137.0` (or above), the application must be started at least once on a version in the range between `1.132.0` and `1.136.0`. Doing so will complete database schema upgrades that are required for `v1.137.0` (and above). After Immich has successfully updated to a version in this range, you can now attempt to update to v1.137.0 (or above). We recommend users upgrade to `1.132.0` since it does not have any other breaking changes. If you encountered "Migrations failed: Error: Invalid upgrade path" then perform an intermediate upgrade to `v1.132.3` first.
:::tip
We recommend users upgrade to `v1.132.3` since it does not have any breaking changes or bugs on this upgrade path.
:::
In order to update to Immich `v1.137.0` or above, the application must be started at least once on a version in the range between `1.132.0` and `1.136.0`. Doing so will complete database schema upgrades that are required for `v1.137.0` (and above). After Immich has successfully updated to a version in this range, you can now attempt to update to `v1.137.0` (or above).
:::caution
Avoid `v1.136.0` if upgrading from `v1.131.0` (or earlier) due to a bug blocking this upgrade in some installations.
:::
## Inconsistent Media Location ## Inconsistent Media Location

View File

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

View File

@@ -1,6 +1,6 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.142.0", "version": "1.142.1",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",
@@ -25,7 +25,7 @@
"@playwright/test": "^1.44.1", "@playwright/test": "^1.44.1",
"@socket.io/component-emitter": "^3.1.2", "@socket.io/component-emitter": "^3.1.2",
"@types/luxon": "^3.4.2", "@types/luxon": "^3.4.2",
"@types/node": "^22.18.0", "@types/node": "^22.18.1",
"@types/oidc-provider": "^9.0.0", "@types/oidc-provider": "^9.0.0",
"@types/pg": "^8.15.1", "@types/pg": "^8.15.1",
"@types/pngjs": "^6.0.4", "@types/pngjs": "^6.0.4",

View File

@@ -409,6 +409,7 @@
"recent-albums": "Нядаўнія альбомы", "recent-albums": "Нядаўнія альбомы",
"recent_searches": "Нядаўнія пошукі", "recent_searches": "Нядаўнія пошукі",
"recently_added": "Нядаўна дададзена", "recently_added": "Нядаўна дададзена",
"refresh_faces": "Абнавіць твары",
"remove": "Выдаліць", "remove": "Выдаліць",
"remove_from_album": "Выдаліць з альбома", "remove_from_album": "Выдаліць з альбома",
"remove_from_favorites": "Выдаліць з абраных", "remove_from_favorites": "Выдаліць з абраных",

View File

@@ -1515,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Mobile-App ist veraltet. Bitte aktualisiere auf die neueste Minor-Version.", "profile_drawer_client_out_of_date_minor": "Mobile-App ist veraltet. Bitte aktualisiere auf die neueste Minor-Version.",
"profile_drawer_client_server_up_to_date": "Die App- und Server-Versionen sind aktuell", "profile_drawer_client_server_up_to_date": "Die App- und Server-Versionen sind aktuell",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Schreibgeschützter Modus aktiviert. Tippe zweimal auf das Benutzer-Avatar-Symbol, um den Modus zu verlassen.", "profile_drawer_readonly_mode": "Schreibgeschützter Modus aktiviert. Halte das Benutzer-Avatar-Symbol gedrückt, um den Modus zu verlassen.",
"profile_drawer_server_out_of_date_major": "Server-Version ist veraltet. Bitte aktualisiere auf die neueste Major-Version.", "profile_drawer_server_out_of_date_major": "Server-Version ist veraltet. Bitte aktualisiere auf die neueste Major-Version.",
"profile_drawer_server_out_of_date_minor": "Server-Version ist veraltet. Bitte aktualisiere auf die neueste Minor-Version.", "profile_drawer_server_out_of_date_minor": "Server-Version ist veraltet. Bitte aktualisiere auf die neueste Minor-Version.",
"profile_image_of_user": "Profilbild von {user}", "profile_image_of_user": "Profilbild von {user}",
@@ -1547,7 +1547,7 @@
"purchase_per_server": "Pro Server", "purchase_per_server": "Pro Server",
"purchase_per_user": "Pro Benutzer", "purchase_per_user": "Pro Benutzer",
"purchase_remove_product_key": "Produktschlüssel entfernen", "purchase_remove_product_key": "Produktschlüssel entfernen",
"purchase_remove_product_key_prompt": "Sicher, dass der Produktschlüssel entfernt werden soll?", "purchase_remove_product_key_prompt": "Bist Du sicher, dass der Produktschlüssel entfernt werden soll?",
"purchase_remove_server_product_key": "Server-Produktschlüssel entfernen", "purchase_remove_server_product_key": "Server-Produktschlüssel entfernen",
"purchase_remove_server_product_key_prompt": "Sicher, dass der Server-Produktschlüssel entfernt werden soll?", "purchase_remove_server_product_key_prompt": "Sicher, dass der Server-Produktschlüssel entfernt werden soll?",
"purchase_server_description_1": "Für den gesamten Server", "purchase_server_description_1": "Für den gesamten Server",
@@ -1917,6 +1917,8 @@
"sync_albums_manual_subtitle": "Synchronisiere alle hochgeladenen Videos und Fotos in die ausgewählten Backup-Alben", "sync_albums_manual_subtitle": "Synchronisiere alle hochgeladenen Videos und Fotos in die ausgewählten Backup-Alben",
"sync_local": "Lokal synchronisieren", "sync_local": "Lokal synchronisieren",
"sync_remote": "mit Server synchronisieren", "sync_remote": "mit Server synchronisieren",
"sync_status": "Synchronisierungstatus",
"sync_status_subtitle": "Synchronisierungssystem anzeigen und bearbeiten",
"sync_upload_album_setting_subtitle": "Erstelle deine ausgewählten Alben in Immich und lade die Fotos und Videos dort hoch", "sync_upload_album_setting_subtitle": "Erstelle deine ausgewählten Alben in Immich und lade die Fotos und Videos dort hoch",
"tag": "Tag", "tag": "Tag",
"tag_assets": "Dateien taggen", "tag_assets": "Dateien taggen",
@@ -1976,6 +1978,7 @@
"trash_page_select_assets_btn": "Elemente auswählen", "trash_page_select_assets_btn": "Elemente auswählen",
"trash_page_title": "Papierkorb ({count})", "trash_page_title": "Papierkorb ({count})",
"trashed_items_will_be_permanently_deleted_after": "Gelöschte Objekte werden nach {days, plural, one {# Tag} other {# Tagen}} endgültig gelöscht.", "trashed_items_will_be_permanently_deleted_after": "Gelöschte Objekte werden nach {days, plural, one {# Tag} other {# Tagen}} endgültig gelöscht.",
"troubleshoot": "Fehler beheben",
"type": "Typ", "type": "Typ",
"unable_to_change_pin_code": "PIN Code konnte nicht geändert werden", "unable_to_change_pin_code": "PIN Code konnte nicht geändert werden",
"unable_to_setup_pin_code": "PIN Code konnte nicht festgelegt werden", "unable_to_setup_pin_code": "PIN Code konnte nicht festgelegt werden",

View File

@@ -387,8 +387,6 @@
"admin_password": "Admin Password", "admin_password": "Admin Password",
"administration": "Administration", "administration": "Administration",
"advanced": "Advanced", "advanced": "Advanced",
"advanced_settings_beta_timeline_subtitle": "Try the new app experience",
"advanced_settings_beta_timeline_title": "Beta Timeline",
"advanced_settings_enable_alternate_media_filter_subtitle": "Use this option to filter media during sync based on alternate criteria. Only try this if you have issues with the app detecting all albums.", "advanced_settings_enable_alternate_media_filter_subtitle": "Use this option to filter media during sync based on alternate criteria. Only try this if you have issues with the app detecting all albums.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Use alternate device album sync filter", "advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Use alternate device album sync filter",
"advanced_settings_log_level_title": "Log level: {level}", "advanced_settings_log_level_title": "Log level: {level}",
@@ -1339,6 +1337,8 @@
"my_albums": "My albums", "my_albums": "My albums",
"name": "Name", "name": "Name",
"name_or_nickname": "Name or nickname", "name_or_nickname": "Name or nickname",
"navigate": "Navigate",
"navigate_to_time": "Navigate to Time",
"network_requirement_photos_upload": "Use cellular data to backup photos", "network_requirement_photos_upload": "Use cellular data to backup photos",
"network_requirement_videos_upload": "Use cellular data to backup videos", "network_requirement_videos_upload": "Use cellular data to backup videos",
"network_requirements_updated": "Network requirements changed, resetting backup queue", "network_requirements_updated": "Network requirements changed, resetting backup queue",
@@ -1351,6 +1351,7 @@
"new_person": "New person", "new_person": "New person",
"new_pin_code": "New PIN code", "new_pin_code": "New PIN code",
"new_pin_code_subtitle": "This is your first time accessing the locked folder. Create a PIN code to securely access this page", "new_pin_code_subtitle": "This is your first time accessing the locked folder. Create a PIN code to securely access this page",
"new_timeline": "New Timeline",
"new_user_created": "New user created", "new_user_created": "New user created",
"new_version_available": "NEW VERSION AVAILABLE", "new_version_available": "NEW VERSION AVAILABLE",
"newest_first": "Newest first", "newest_first": "Newest first",

View File

@@ -38,7 +38,7 @@
"added_to_favorites_count": "Agregado {count, number} a favoritos", "added_to_favorites_count": "Agregado {count, number} a favoritos",
"admin": { "admin": {
"add_exclusion_pattern_description": "Agrega patrones de exclusión. Puedes utilizar los caracteres *, ** y ? (globbing). Ejemplos: para ignorar todos los archivos en cualquier directorio llamado \"Raw\", utiliza \"**/Raw/**\". Para ignorar todos los archivos que terminan en \".tif\", utiliza \"**/*.tif\". Para ignorar una ruta absoluta, utiliza \"/carpeta/a/ignorar/**\".", "add_exclusion_pattern_description": "Agrega patrones de exclusión. Puedes utilizar los caracteres *, ** y ? (globbing). Ejemplos: para ignorar todos los archivos en cualquier directorio llamado \"Raw\", utiliza \"**/Raw/**\". Para ignorar todos los archivos que terminan en \".tif\", utiliza \"**/*.tif\". Para ignorar una ruta absoluta, utiliza \"/carpeta/a/ignorar/**\".",
"admin_user": "Usuario administrativo", "admin_user": "Usuario administrador",
"asset_offline_description": "Este recurso externo de la biblioteca ya no se encuentra en el disco y se ha movido a la papelera. Si el archivo se movió dentro de la biblioteca, comprueba la línea temporal para el nuevo recurso correspondiente. Para restaurar este recurso, asegúrate de que Immich puede acceder a la siguiente ruta de archivo y escanear la biblioteca.", "asset_offline_description": "Este recurso externo de la biblioteca ya no se encuentra en el disco y se ha movido a la papelera. Si el archivo se movió dentro de la biblioteca, comprueba la línea temporal para el nuevo recurso correspondiente. Para restaurar este recurso, asegúrate de que Immich puede acceder a la siguiente ruta de archivo y escanear la biblioteca.",
"authentication_settings": "Parámetros de autenticación", "authentication_settings": "Parámetros de autenticación",
"authentication_settings_description": "Gestionar contraseñas, OAuth y otros parámetros de autenticación", "authentication_settings_description": "Gestionar contraseñas, OAuth y otros parámetros de autenticación",
@@ -1515,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "La app está desactualizada. Por favor actualiza a la última versión menor.", "profile_drawer_client_out_of_date_minor": "La app está desactualizada. Por favor actualiza a la última versión menor.",
"profile_drawer_client_server_up_to_date": "Cliente y Servidor están actualizados", "profile_drawer_client_server_up_to_date": "Cliente y Servidor están actualizados",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Modo Solo lectura habilitado. Toque dos veces el ícono del avatar del usuario para salir.", "profile_drawer_readonly_mode": "Modo Solo lectura habilitado. Mantén pulsado el icono del avatar del usuario para salir.",
"profile_drawer_server_out_of_date_major": "El servidor está desactualizado. Por favor actualiza a la última versión principal.", "profile_drawer_server_out_of_date_major": "El servidor está desactualizado. Por favor actualiza a la última versión principal.",
"profile_drawer_server_out_of_date_minor": "El servidor está desactualizado. Por favor actualiza a la última versión menor.", "profile_drawer_server_out_of_date_minor": "El servidor está desactualizado. Por favor actualiza a la última versión menor.",
"profile_image_of_user": "Foto de perfil de {user}", "profile_image_of_user": "Foto de perfil de {user}",
@@ -1917,6 +1917,8 @@
"sync_albums_manual_subtitle": "Sincroniza todos los videos y fotos subidos con los álbumes seleccionados a respaldar", "sync_albums_manual_subtitle": "Sincroniza todos los videos y fotos subidos con los álbumes seleccionados a respaldar",
"sync_local": "Sincronización Local", "sync_local": "Sincronización Local",
"sync_remote": "Sincronización Remota", "sync_remote": "Sincronización Remota",
"sync_status": "Estado de la sincronización",
"sync_status_subtitle": "Ver y gestionar el estado de la sincronización",
"sync_upload_album_setting_subtitle": "Crea y sube tus fotos y videos a los álbumes seleccionados en Immich", "sync_upload_album_setting_subtitle": "Crea y sube tus fotos y videos a los álbumes seleccionados en Immich",
"tag": "Etiqueta", "tag": "Etiqueta",
"tag_assets": "Etiquetar activos", "tag_assets": "Etiquetar activos",
@@ -1976,6 +1978,7 @@
"trash_page_select_assets_btn": "Seleccionar elementos", "trash_page_select_assets_btn": "Seleccionar elementos",
"trash_page_title": "Papelera ({count})", "trash_page_title": "Papelera ({count})",
"trashed_items_will_be_permanently_deleted_after": "Los elementos en la papelera serán eliminados permanentemente tras {days, plural, one {# día} other {# días}}.", "trashed_items_will_be_permanently_deleted_after": "Los elementos en la papelera serán eliminados permanentemente tras {days, plural, one {# día} other {# días}}.",
"troubleshoot": "Solucionar problemas",
"type": "Tipo", "type": "Tipo",
"unable_to_change_pin_code": "No se ha podido cambiar el PIN", "unable_to_change_pin_code": "No se ha podido cambiar el PIN",
"unable_to_setup_pin_code": "No se ha podido establecer el PIN", "unable_to_setup_pin_code": "No se ha podido establecer el PIN",

View File

@@ -42,6 +42,7 @@
"authentication_settings_description": "Kudeatu pasahitza, OAuth edo beste segurtasun konfigurazio bat", "authentication_settings_description": "Kudeatu pasahitza, OAuth edo beste segurtasun konfigurazio bat",
"authentication_settings_disable_all": "Seguru zaude saioa hasteko modu guztiak desgaitu nahi dituzula? Saioa hastea guztiz desgaitua izango da.", "authentication_settings_disable_all": "Seguru zaude saioa hasteko modu guztiak desgaitu nahi dituzula? Saioa hastea guztiz desgaitua izango da.",
"authentication_settings_reenable": "Berriro gaitzeko, erabili <link>Server Command</link>.", "authentication_settings_reenable": "Berriro gaitzeko, erabili <link>Server Command</link>.",
"background_task_job": "Atzealdeko Lanak",
"backup_onboarding_footer": "Immich-en babes kopiei buruzko informazio gehiago nahi baduzu, mesedez irakurri <link>dokumentazioa</link>.", "backup_onboarding_footer": "Immich-en babes kopiei buruzko informazio gehiago nahi baduzu, mesedez irakurri <link>dokumentazioa</link>.",
"backup_onboarding_title": "Babes Kopiak", "backup_onboarding_title": "Babes Kopiak",
"confirm_delete_library": "Seguru zaude {library} ezabatu nahi duzula?", "confirm_delete_library": "Seguru zaude {library} ezabatu nahi duzula?",
@@ -62,6 +63,15 @@
"job_created": "Zeregina sortuta", "job_created": "Zeregina sortuta",
"job_settings": "Zereginaren konfigurazioa", "job_settings": "Zereginaren konfigurazioa",
"job_status": "Zereginaren Egoera", "job_status": "Zereginaren Egoera",
"logging_enable_description": "Gaitu erregistroak",
"logging_level_description": "Erregistroak gaituta daudenean, nolako erregistro maila erabili.",
"logging_settings": "Erregistroak",
"machine_learning_duplicate_detection": "Bizkoizketa Detekzioa",
"machine_learning_duplicate_detection_enabled": "Gaitu bikoizketa detekezioa",
"machine_learning_facial_recognition": "Aurpegi-Ezagutza",
"machine_learning_facial_recognition_description": "Detektatu, ezagutu eta aurpegiak banatu argazkietan",
"machine_learning_facial_recognition_model": "Aurpegi-Ezagutza eredua",
"machine_learning_facial_recognition_setting": "Aurpegi-Ezagutza Gaitu",
"machine_learning_smart_search_enabled": "Gaitu bilaketa arina", "machine_learning_smart_search_enabled": "Gaitu bilaketa arina",
"manage_log_settings": "Kudeatu erregistroen konfigurazioa", "manage_log_settings": "Kudeatu erregistroen konfigurazioa",
"map_dark_style": "Beltz estiloa", "map_dark_style": "Beltz estiloa",

View File

@@ -389,7 +389,7 @@
"advanced": "Avancé", "advanced": "Avancé",
"advanced_settings_beta_timeline_subtitle": "Essayer la nouvelle application", "advanced_settings_beta_timeline_subtitle": "Essayer la nouvelle application",
"advanced_settings_beta_timeline_title": "Timeline de la béta", "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 tout les albums.", "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_enable_alternate_media_filter_title": "[EXPÉRIMENTAL] Utiliser le filtre de synchronisation d'album alternatif",
"advanced_settings_log_level_title": "Niveau de journalisation : {level}", "advanced_settings_log_level_title": "Niveau de journalisation : {level}",
"advanced_settings_prefer_remote_subtitle": "Certains appareils sont très lents à charger des miniatures à partir de ressources locales. Activez ce paramètre pour charger des images externes à la place.", "advanced_settings_prefer_remote_subtitle": "Certains appareils sont très lents à charger des miniatures à partir de ressources locales. Activez ce paramètre pour charger des images externes à la place.",
@@ -1964,7 +1964,7 @@
"total": "Total", "total": "Total",
"total_usage": "Utilisation globale", "total_usage": "Utilisation globale",
"trash": "Corbeille", "trash": "Corbeille",
"trash_action_prompt": "{count} mis à la corbeille", "trash_action_prompt": "{count} média(s) mis à la corbeille",
"trash_all": "Tout supprimer", "trash_all": "Tout supprimer",
"trash_count": "Corbeille {count, number}", "trash_count": "Corbeille {count, number}",
"trash_delete_asset": "Mettre à la corbeille/Supprimer un média", "trash_delete_asset": "Mettre à la corbeille/Supprimer un média",

View File

@@ -14,6 +14,7 @@
"add_a_location": "Engadir unha ubicación", "add_a_location": "Engadir unha ubicación",
"add_a_name": "Engadir un nome", "add_a_name": "Engadir un nome",
"add_a_title": "Engadir un título", "add_a_title": "Engadir un título",
"add_birthday": "Engadir cumpleanos",
"add_endpoint": "Engadir endpoint", "add_endpoint": "Engadir endpoint",
"add_exclusion_pattern": "Engadir patrón de exclusión", "add_exclusion_pattern": "Engadir patrón de exclusión",
"add_import_path": "Engadir ruta de importación", "add_import_path": "Engadir ruta de importación",
@@ -22,10 +23,14 @@
"add_partner": "Engadir compañeiro/a", "add_partner": "Engadir compañeiro/a",
"add_path": "Engadir ruta", "add_path": "Engadir ruta",
"add_photos": "Engadir fotos", "add_photos": "Engadir fotos",
"add_tag": "Engadir etiqueta",
"add_to": "Engadir a…", "add_to": "Engadir a…",
"add_to_album": "Engadir ao álbum", "add_to_album": "Engadir ao álbum",
"add_to_album_bottom_sheet_added": "Engadido a {album}", "add_to_album_bottom_sheet_added": "Engadido a {album}",
"add_to_album_bottom_sheet_already_exists": "Xa está en {album}", "add_to_album_bottom_sheet_already_exists": "Xa está en {album}",
"add_to_album_toggle": "Alternar selección para o {album}",
"add_to_albums": "Engadir en álbums",
"add_to_albums_count": "Engadir a {count} álbums",
"add_to_shared_album": "Engadir ao álbum compartido", "add_to_shared_album": "Engadir ao álbum compartido",
"add_url": "Engadir URL", "add_url": "Engadir URL",
"added_to_archive": "Engadido ao arquivo", "added_to_archive": "Engadido ao arquivo",
@@ -33,6 +38,7 @@
"added_to_favorites_count": "Engadido {count, number} a favoritos", "added_to_favorites_count": "Engadido {count, number} a favoritos",
"admin": { "admin": {
"add_exclusion_pattern_description": "Engadir patróns de exclusión. Admítense caracteres comodín usando *, ** e ?. Para ignorar todos os ficheiros en calquera directorio chamado \"Raw\", emprega \"**/Raw/**\". Para ignorar todos os ficheiros que rematen en \".tif\", usa \"**/*.tif\". Para ignorar unha ruta absoluta, emprega \"/ruta/a/ignorar/**\".", "add_exclusion_pattern_description": "Engadir patróns de exclusión. Admítense caracteres comodín usando *, ** e ?. Para ignorar todos os ficheiros en calquera directorio chamado \"Raw\", emprega \"**/Raw/**\". Para ignorar todos os ficheiros que rematen en \".tif\", usa \"**/*.tif\". Para ignorar unha ruta absoluta, emprega \"/ruta/a/ignorar/**\".",
"admin_user": "Usuario administrador",
"asset_offline_description": "Este activo da biblioteca externa xa non se atopa no disco e moveuse ao lixo. Se o ficheiro se moveu dentro da biblioteca, comproba a túa liña de tempo para o novo activo correspondente. Para restaurar este activo, asegúrate de que Immich poida acceder á ruta do ficheiro a continuación e escanee a biblioteca.", "asset_offline_description": "Este activo da biblioteca externa xa non se atopa no disco e moveuse ao lixo. Se o ficheiro se moveu dentro da biblioteca, comproba a túa liña de tempo para o novo activo correspondente. Para restaurar este activo, asegúrate de que Immich poida acceder á ruta do ficheiro a continuación e escanee a biblioteca.",
"authentication_settings": "Configuración de autenticación", "authentication_settings": "Configuración de autenticación",
"authentication_settings_description": "Xestionar contrasinal, OAuth e outras configuracións de autenticación", "authentication_settings_description": "Xestionar contrasinal, OAuth e outras configuracións de autenticación",

View File

@@ -1093,7 +1093,7 @@
"haptic_feedback_switch": "אפשר משוב ברטט", "haptic_feedback_switch": "אפשר משוב ברטט",
"haptic_feedback_title": "משוב ברטט", "haptic_feedback_title": "משוב ברטט",
"has_quota": "יש מכסה", "has_quota": "יש מכסה",
"hash_asset": יבוב תמונה", "hash_asset": בב פריט",
"hashed_assets": "תמונות מגובבות", "hashed_assets": "תמונות מגובבות",
"hashing": "מגבב", "hashing": "מגבב",
"header_settings_add_header_tip": "הוסף כותרת", "header_settings_add_header_tip": "הוסף כותרת",
@@ -1129,7 +1129,7 @@
"hour": "שעה", "hour": "שעה",
"hours": "שעות", "hours": "שעות",
"id": "מזהה", "id": "מזהה",
"idle": "ממתין", "idle": "במצב סרק",
"ignore_icloud_photos": "התעלם מתמונות iCloud", "ignore_icloud_photos": "התעלם מתמונות iCloud",
"ignore_icloud_photos_description": "תמונות שמאוחסנות ב-iCloud לא יועלו לשרת", "ignore_icloud_photos_description": "תמונות שמאוחסנות ב-iCloud לא יועלו לשרת",
"image": "תמונה", "image": "תמונה",
@@ -1412,6 +1412,8 @@
"open_the_search_filters": "פתח את מסנני החיפוש", "open_the_search_filters": "פתח את מסנני החיפוש",
"options": "אפשרויות", "options": "אפשרויות",
"or": "או", "or": "או",
"organize_into_albums": "ארגן בתוך אלבומים",
"organize_into_albums_description": "שים תמונות קיימות בתוך אלבומים באמצעות הגדרות הסנכרון הנוכחיות",
"organize_your_library": "ארגן את הספרייה שלך", "organize_your_library": "ארגן את הספרייה שלך",
"original": "מקורי", "original": "מקורי",
"other": "אחר", "other": "אחר",
@@ -1471,9 +1473,9 @@
"permission_onboarding_permission_limited": "הרשאה מוגבלת. כדי לתת ליישום לגבות ולנהל את כל אוסף הגלריה שלך, הענק הרשאה לתמונות וסרטונים בהגדרות.", "permission_onboarding_permission_limited": "הרשאה מוגבלת. כדי לתת ליישום לגבות ולנהל את כל אוסף הגלריה שלך, הענק הרשאה לתמונות וסרטונים בהגדרות.",
"permission_onboarding_request": "היישום דורש הרשאה כדי לראות את התמונות והסרטונים שלך.", "permission_onboarding_request": "היישום דורש הרשאה כדי לראות את התמונות והסרטונים שלך.",
"person": "אדם", "person": "אדם",
"person_age_months": ן {months, plural, one {חודש #} other {# חודשים}}", "person_age_months": גיל {months, plural, one {חודש #} other {# חודשים}}",
"person_age_year_months": ן שנה, {months, plural, one {חודש #} other {# חודשים}}", "person_age_year_months": גיל שנה ו{months, plural, one {חודש #} other {# חודשים}}",
"person_age_years": ן {years, plural, other {# שנים}}", "person_age_years": גיל {years, plural, other {# שנים}}",
"person_birthdate": "נולד בתאריך {date}", "person_birthdate": "נולד בתאריך {date}",
"person_hidden": "{name}{hidden, select, true { (מוסתר)} other {}}", "person_hidden": "{name}{hidden, select, true { (מוסתר)} other {}}",
"photo_shared_all_users": "נראה ששיתפת את התמונות שלך עם כל המשתמשים או שאין לך אף משתמש לשתף איתו.", "photo_shared_all_users": "נראה ששיתפת את התמונות שלך עם כל המשתמשים או שאין לך אף משתמש לשתף איתו.",
@@ -1513,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "גרסת היישום לנייד מיושנת. נא לעדכן לגרסה המשנית האחרונה.", "profile_drawer_client_out_of_date_minor": "גרסת היישום לנייד מיושנת. נא לעדכן לגרסה המשנית האחרונה.",
"profile_drawer_client_server_up_to_date": "היישום והשרת מעודכנים", "profile_drawer_client_server_up_to_date": "היישום והשרת מעודכנים",
"profile_drawer_github": "GitHub", "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_major": "השרת אינו מעודכן. נא לעדכן לגרסה הראשית האחרונה.",
"profile_drawer_server_out_of_date_minor": "השרת אינו מעודכן. נא לעדכן לגרסה המשנית האחרונה.", "profile_drawer_server_out_of_date_minor": "השרת אינו מעודכן. נא לעדכן לגרסה המשנית האחרונה.",
"profile_image_of_user": "תמונת פרופיל של {user}", "profile_image_of_user": "תמונת פרופיל של {user}",
@@ -1552,7 +1554,8 @@
"purchase_server_description_2": "מעמד תומך", "purchase_server_description_2": "מעמד תומך",
"purchase_server_title": "שרת", "purchase_server_title": "שרת",
"purchase_settings_server_activated": "מפתח המוצר של השרת מנוהל על ידי מנהל המערכת", "purchase_settings_server_activated": "מפתח המוצר של השרת מנוהל על ידי מנהל המערכת",
"queue_status": "בתור {count}/{total}", "query_asset_id": "שאילתה על מזהה הפריט",
"queue_status": "{count} מתוך {total} עומדים בתור",
"rating": "דירוג כוכב", "rating": "דירוג כוכב",
"rating_clear": "נקה דירוג", "rating_clear": "נקה דירוג",
"rating_count": "{count, plural, one {כוכב #} other {# כוכבים}}", "rating_count": "{count, plural, one {כוכב #} other {# כוכבים}}",
@@ -1637,6 +1640,7 @@
"restore_user": "שחזר משתמש", "restore_user": "שחזר משתמש",
"restored_asset": "התמונה שוחזרה", "restored_asset": "התמונה שוחזרה",
"resume": "המשך", "resume": "המשך",
"resume_paused_jobs": "המשך {count, plural, one {עבודה # שהופסקה} other {# עבודות שהופסקו}}",
"retry_upload": "נסה שוב להעלות", "retry_upload": "נסה שוב להעלות",
"review_duplicates": "בדוק כפילויות", "review_duplicates": "בדוק כפילויות",
"review_large_files": "צפייה בקבצים גדולים", "review_large_files": "צפייה בקבצים גדולים",
@@ -1903,7 +1907,7 @@
"submit": "שלח", "submit": "שלח",
"success": "בוצע בהצלחה", "success": "בוצע בהצלחה",
"suggestions": "הצעות", "suggestions": "הצעות",
"sunrise_on_the_beach": "Sunrise on the beach (מומלץ לחפש באנגלית לתוצאות טובות יותר)", "sunrise_on_the_beach": "שקיעה בחוף",
"support": "תמיכה", "support": "תמיכה",
"support_and_feedback": "תמיכה & משוב", "support_and_feedback": "תמיכה & משוב",
"support_third_party_description": "התקנת ה-Immich שלך נארזה על ידי צד שלישי. בעיות שאתה חווה עשויות להיגרם על ידי חבילה זו, אז בבקשה תעלה בעיות איתם ראשית כל באמצעות הקישורים למטה.", "support_third_party_description": "התקנת ה-Immich שלך נארזה על ידי צד שלישי. בעיות שאתה חווה עשויות להיגרם על ידי חבילה זו, אז בבקשה תעלה בעיות איתם ראשית כל באמצעות הקישורים למטה.",
@@ -1912,7 +1916,9 @@
"sync_albums": "סנכרן אלבומים", "sync_albums": "סנכרן אלבומים",
"sync_albums_manual_subtitle": "סנכרן את כל הסרטונים והתמונות שהועלו לאלבומי הגיבוי שנבחרו", "sync_albums_manual_subtitle": "סנכרן את כל הסרטונים והתמונות שהועלו לאלבומי הגיבוי שנבחרו",
"sync_local": "סנכרן מקומי", "sync_local": "סנכרן מקומי",
"sync_remote": "סנכרן מרוחק", "sync_remote": "סנכרן נקודת קצה מרוחקת",
"sync_status": "סנכרן מצב",
"sync_status_subtitle": "הצג ונהל את מערכת הסנכרון",
"sync_upload_album_setting_subtitle": "צור והעלה תמונות וסרטונים שלך לאלבומים שנבחרו ביישום", "sync_upload_album_setting_subtitle": "צור והעלה תמונות וסרטונים שלך לאלבומים שנבחרו ביישום",
"tag": "תג", "tag": "תג",
"tag_assets": "תיוג תמונות", "tag_assets": "תיוג תמונות",
@@ -1972,6 +1978,7 @@
"trash_page_select_assets_btn": "בחר תמונות", "trash_page_select_assets_btn": "בחר תמונות",
"trash_page_title": "אשפה ({count})", "trash_page_title": "אשפה ({count})",
"trashed_items_will_be_permanently_deleted_after": "פריטים באשפה ימחקו לצמיתות לאחר {days, plural, one {יום #} other {# ימים}}.", "trashed_items_will_be_permanently_deleted_after": "פריטים באשפה ימחקו לצמיתות לאחר {days, plural, one {יום #} other {# ימים}}.",
"troubleshoot": "פתור בעיות",
"type": "סוג", "type": "סוג",
"unable_to_change_pin_code": "לא ניתן לשנות את קוד ה PIN", "unable_to_change_pin_code": "לא ניתן לשנות את קוד ה PIN",
"unable_to_setup_pin_code": "לא ניתן להגדיר קוד PIN", "unable_to_setup_pin_code": "לא ניתן להגדיר קוד PIN",
@@ -2069,6 +2076,7 @@
"view_next_asset": "הצג את התמונה הבאה", "view_next_asset": "הצג את התמונה הבאה",
"view_previous_asset": "הצג את התמונה הקודמת", "view_previous_asset": "הצג את התמונה הקודמת",
"view_qr_code": "הצג ברקוד", "view_qr_code": "הצג ברקוד",
"view_similar_photos": "הצג תמונות דומות",
"view_stack": "הצג ערימה", "view_stack": "הצג ערימה",
"view_user": "הצג משתמש", "view_user": "הצג משתמש",
"viewer_remove_from_stack": "הסר מערימה", "viewer_remove_from_stack": "הסר מערימה",

View File

@@ -1515,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "L'applicazione non è aggiornata. Aggiorna all'ultima versione minore.", "profile_drawer_client_out_of_date_minor": "L'applicazione non è aggiornata. Aggiorna all'ultima versione minore.",
"profile_drawer_client_server_up_to_date": "Client e server sono aggiornati", "profile_drawer_client_server_up_to_date": "Client e server sono aggiornati",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Modalità di sola lettura abilitata. Tocca due volte l'icona dell'avatar dell'utente per disabilitarla.", "profile_drawer_readonly_mode": "Modalità di sola lettura abilitata. Tieni premuto sull'avatar dell'utente per disabilitarla.",
"profile_drawer_server_out_of_date_major": "Il server non è aggiornato. Aggiorna all'ultima versione principale.", "profile_drawer_server_out_of_date_major": "Il server non è aggiornato. Aggiorna all'ultima versione principale.",
"profile_drawer_server_out_of_date_minor": "Il server non è aggiornato. Aggiorna all'ultima versione minore.", "profile_drawer_server_out_of_date_minor": "Il server non è aggiornato. Aggiorna all'ultima versione minore.",
"profile_image_of_user": "Immagine profilo di {user}", "profile_image_of_user": "Immagine profilo di {user}",

View File

@@ -1515,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "アプリが更新されてません。最新のバージョンに更新してください", "profile_drawer_client_out_of_date_minor": "アプリが更新されてません。最新のバージョンに更新してください",
"profile_drawer_client_server_up_to_date": "すべて最新版です", "profile_drawer_client_server_up_to_date": "すべて最新版です",
"profile_drawer_github": "GitHub", "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_major": "サーバーが更新されてません。最新のバージョンに更新してください",
"profile_drawer_server_out_of_date_minor": "サーバーが更新されてません。最新のバージョンに更新してください", "profile_drawer_server_out_of_date_minor": "サーバーが更新されてません。最新のバージョンに更新してください",
"profile_image_of_user": "{user} のプロフィール画像", "profile_image_of_user": "{user} のプロフィール画像",
@@ -1640,6 +1640,7 @@
"restore_user": "ユーザーを復元", "restore_user": "ユーザーを復元",
"restored_asset": "項目を復元しました", "restored_asset": "項目を復元しました",
"resume": "再開", "resume": "再開",
"resume_paused_jobs": "再開: {count, plural, one {# paused job} other {# paused jobs}}",
"retry_upload": "アップロードを再試行", "retry_upload": "アップロードを再試行",
"review_duplicates": "重複を調査", "review_duplicates": "重複を調査",
"review_large_files": "サイズの大きなファイルを見る", "review_large_files": "サイズの大きなファイルを見る",
@@ -1916,6 +1917,8 @@
"sync_albums_manual_subtitle": "アップロード済みの全ての写真や動画を選択されたバックアップアルバムに同期する", "sync_albums_manual_subtitle": "アップロード済みの全ての写真や動画を選択されたバックアップアルバムに同期する",
"sync_local": "ローカルを同期", "sync_local": "ローカルを同期",
"sync_remote": "リモートを同期", "sync_remote": "リモートを同期",
"sync_status": "同期の状態",
"sync_status_subtitle": "同期システムを確認・管理",
"sync_upload_album_setting_subtitle": "サーバー上のアルバムの内容を端末上のアルバムと同期します (サーバーにアルバムが無い場合自動で作成されます。また、アップロードされていない写真や動画は同期されません)", "sync_upload_album_setting_subtitle": "サーバー上のアルバムの内容を端末上のアルバムと同期します (サーバーにアルバムが無い場合自動で作成されます。また、アップロードされていない写真や動画は同期されません)",
"tag": "タグ付けする", "tag": "タグ付けする",
"tag_assets": "アセットにタグ付けする", "tag_assets": "アセットにタグ付けする",
@@ -1975,6 +1978,7 @@
"trash_page_select_assets_btn": "項目を選択", "trash_page_select_assets_btn": "項目を選択",
"trash_page_title": "ゴミ箱 ({count})", "trash_page_title": "ゴミ箱 ({count})",
"trashed_items_will_be_permanently_deleted_after": "ゴミ箱に入れられたアイテムは{days, plural, one {#日} other {#日}}後に完全に削除されます。", "trashed_items_will_be_permanently_deleted_after": "ゴミ箱に入れられたアイテムは{days, plural, one {#日} other {#日}}後に完全に削除されます。",
"troubleshoot": "トラブルシューティング",
"type": "タイプ", "type": "タイプ",
"unable_to_change_pin_code": "PINコードを変更できませんでした", "unable_to_change_pin_code": "PINコードを変更できませんでした",
"unable_to_setup_pin_code": "PINコードをセットアップできませんでした", "unable_to_setup_pin_code": "PINコードをセットアップできませんでした",

View File

@@ -28,13 +28,16 @@
"add_to_album": "Pridėti į albumą", "add_to_album": "Pridėti į albumą",
"add_to_album_bottom_sheet_added": "Pridėta į {album}", "add_to_album_bottom_sheet_added": "Pridėta į {album}",
"add_to_album_bottom_sheet_already_exists": "Jau yra albume {album}", "add_to_album_bottom_sheet_already_exists": "Jau yra albume {album}",
"add_to_album_toggle": "Perjungti pažymėjimus albumui {album}",
"add_to_albums": "Pridėti į albumus",
"add_to_albums_count": "Pridėti į albumus ({count})",
"add_to_shared_album": "Pridėti į bendrinamą albumą", "add_to_shared_album": "Pridėti į bendrinamą albumą",
"add_url": "Pridėti URL", "add_url": "Pridėti URL",
"added_to_archive": "Pridėta į archyvą", "added_to_archive": "Pridėta į archyvą",
"added_to_favorites": "Pridėta prie mėgstamiausių", "added_to_favorites": "Pridėta prie mėgstamiausių",
"added_to_favorites_count": "{count, plural, one {# pridėtas} few {# pridėti} other {# pridėta}} prie mėgstamiausių", "added_to_favorites_count": "{count, plural, one {# pridėtas} few {# pridėti} other {# pridėta}} prie mėgstamiausių",
"admin": { "admin": {
"add_exclusion_pattern_description": "Pridėti išimčių taisyklęs. Plaikomi simboliai *,**, ir ?. Ignoruoti bet kokius failus bet kuriame aplanke vadintame \"Raw\", naudokite \"**/RAW/**\". Ignoravimui failų su plėtiniu \".tif\", naudokite \"**/*.tiff\". Aplanko kelio nustatymams, naudokite \"/aplanko/kelias/ignoruoti/**\"", "add_exclusion_pattern_description": "Pridėti išimčių taisykles. Palaikomi simboliai *,**, ir ?. Ignoruoti bet kokius failus bet kuriame aplanke pavadintame \"Raw\", naudokite \"**/RAW/**\". Ignoravimui failų su plėtiniu \".tif\", naudokite \"**/*.tiff\". Aplanko kelio nustatymams, naudokite \"/aplanko/kelias/ignoruoti/**\".",
"admin_user": "Administratorius", "admin_user": "Administratorius",
"asset_offline_description": "Šis išorinės bibliotekos elementas nebepasiekiamas diske ir buvo perkeltas į šiukšliadėžę. Jei failas buvo perkeltas toje pačioje bibliotekoje, laiko skalėje rasite naują atitinkamą elementą. Jei norite šį elementą atkurti, įsitikinkite, kad Immich gali pasiekti failą žemiau nurodytu adresu, ir suvykdykite bibliotekos skenavimą.", "asset_offline_description": "Šis išorinės bibliotekos elementas nebepasiekiamas diske ir buvo perkeltas į šiukšliadėžę. Jei failas buvo perkeltas toje pačioje bibliotekoje, laiko skalėje rasite naują atitinkamą elementą. Jei norite šį elementą atkurti, įsitikinkite, kad Immich gali pasiekti failą žemiau nurodytu adresu, ir suvykdykite bibliotekos skenavimą.",
"authentication_settings": "Autentifikavimo nustatymai", "authentication_settings": "Autentifikavimo nustatymai",
@@ -45,6 +48,10 @@
"backup_database": "Sukurti duomenų bazės išklotinę", "backup_database": "Sukurti duomenų bazės išklotinę",
"backup_database_enable_description": "Įgalinti duomenų bazės išklotinės", "backup_database_enable_description": "Įgalinti duomenų bazės išklotinės",
"backup_keep_last_amount": "Išsaugomų ankstesnių duomenų bazės išklotinių skaičius", "backup_keep_last_amount": "Išsaugomų ankstesnių duomenų bazės išklotinių skaičius",
"backup_onboarding_1_description": "išorinė kopija debesyje arba kitoje fizinėje lokacijoje.",
"backup_onboarding_2_description": "vietinės kopijos kituose prietaisuose. Tai apima pagrindinius failus ir jų vietines kopijas.",
"backup_onboarding_3_description": "viso jūsų duomenų kopijų, įskaitant originalius failus. Tai apima 1 išorinę ir 2 vietines kopijas.",
"backup_onboarding_description": "Jūsų duomenų apsaugojimui rekomenduojama <backblaze-link>3-2-1 atsarginės kopijos strategija</backblaze-link> . Jūs turėtumėte saugoti įkeltų nuotraukų/video bei Immich duomenų bazės kopijas išsamiam atsarginių kopijų sprendimui.",
"backup_onboarding_footer": "Daugiau informacijos apie „Immich“ atsarginių kopijų kūrimą rasite <link>dokumentacijoje</link>.", "backup_onboarding_footer": "Daugiau informacijos apie „Immich“ atsarginių kopijų kūrimą rasite <link>dokumentacijoje</link>.",
"backup_onboarding_parts_title": "3-2-1 atsarginė kopija apima:", "backup_onboarding_parts_title": "3-2-1 atsarginė kopija apima:",
"backup_onboarding_title": "Atsarginės kopijos", "backup_onboarding_title": "Atsarginės kopijos",
@@ -75,7 +82,7 @@
"image_format_description": "WebP sukuria mažesnius failus nei JPEG, tačiau lėčiau juos apdoroja.", "image_format_description": "WebP sukuria mažesnius failus nei JPEG, tačiau lėčiau juos apdoroja.",
"image_fullsize_description": "Pilno dydžio nuotrauka be meta duomenų naudojama priartinus", "image_fullsize_description": "Pilno dydžio nuotrauka be meta duomenų naudojama priartinus",
"image_fullsize_enabled": "Įgalinti pilno dydžio nuotraukų generavimą", "image_fullsize_enabled": "Įgalinti pilno dydžio nuotraukų generavimą",
"image_fullsize_enabled_description": "Generuoti viso dydžio vaizdą neinternetui pritaikytiems formatams. Kai įjungta parinktis „Pirmenybė įterptai peržiūrai“, įterptosios peržiūros naudojamos tiesiogiai be konvertavimo. Tai neturi įtakos internetui pritaikytiems formatams, pvz., JPEG", "image_fullsize_enabled_description": "Generuoti viso dydžio vaizdą naršyklėms nepritaikytiems formatams. Kai įjungta parinktis „Pirmenybė įterptai peržiūrai“, įterptosios peržiūros naudojamos tiesiogiai be konvertavimo. Tai neturi įtakos internetui pritaikytiems formatams, pvz., JPEG.",
"image_fullsize_quality_description": "Pilno dydžio nuotraukų kokybė 1-100. Didesnė yra geresnė, tačiau sukuria didesniu failus.", "image_fullsize_quality_description": "Pilno dydžio nuotraukų kokybė 1-100. Didesnė yra geresnė, tačiau sukuria didesniu failus.",
"image_fullsize_title": "Pilno dydžio nuotraukų Nustatymai", "image_fullsize_title": "Pilno dydžio nuotraukų Nustatymai",
"image_prefer_embedded_preview": "Pageidautinai rodyti įterptą peržiūrą", "image_prefer_embedded_preview": "Pageidautinai rodyti įterptą peržiūrą",
@@ -99,8 +106,8 @@
"job_settings": "Užduočių nustatymai", "job_settings": "Užduočių nustatymai",
"job_settings_description": "Keisti užduočių lygiagretumą", "job_settings_description": "Keisti užduočių lygiagretumą",
"job_status": "Užduočių būsenos", "job_status": "Užduočių būsenos",
"jobs_delayed": "{jobCount, plural, other {# delayed}}", "jobs_delayed": "{jobCount, plural, one {# atidėtas} few {# atidėti} other {# atidėtų}}",
"jobs_failed": "{jobCount, plural, other {# failed}}", "jobs_failed": "{jobCount, plural, other {# nepavyko}}",
"library_created": "Sukurta biblioteka: {library}", "library_created": "Sukurta biblioteka: {library}",
"library_deleted": "Biblioteka ištrinta", "library_deleted": "Biblioteka ištrinta",
"library_import_path_description": "Nurodykite aplanką, kurį norite importuoti. Šiame aplanke, įskaitant poaplankius, bus nuskaityti vaizdai ir vaizdo įrašai.", "library_import_path_description": "Nurodykite aplanką, kurį norite importuoti. Šiame aplanke, įskaitant poaplankius, bus nuskaityti vaizdai ir vaizdo įrašai.",
@@ -165,7 +172,7 @@
"metadata_extraction_job": "Metaduomenų nuskaitymas", "metadata_extraction_job": "Metaduomenų nuskaitymas",
"metadata_extraction_job_description": "Kiekvieno bibliotekos elemento metaduomenų nuskaitymas, tokių kaip GPS koordinatės, veidai ar rezoliucija", "metadata_extraction_job_description": "Kiekvieno bibliotekos elemento metaduomenų nuskaitymas, tokių kaip GPS koordinatės, veidai ar rezoliucija",
"metadata_faces_import_setting": "Įjungti veidų importą", "metadata_faces_import_setting": "Įjungti veidų importą",
"metadata_faces_import_setting_description": "Importuoti veidus iš vaizdo EXIF duomenų ir papildomų failų", "metadata_faces_import_setting_description": "Importuoti veidus iš vaizdo EXIF duomenų ir susietų failų",
"metadata_settings": "Metaduomenų nustatymai", "metadata_settings": "Metaduomenų nustatymai",
"metadata_settings_description": "Tvarkyti metaduomenų nustatymus", "metadata_settings_description": "Tvarkyti metaduomenų nustatymus",
"migration_job": "Tvarkymas", "migration_job": "Tvarkymas",
@@ -182,6 +189,8 @@
"nightly_tasks_settings_description": "Valdyti naktines užduotis", "nightly_tasks_settings_description": "Valdyti naktines užduotis",
"nightly_tasks_start_time_setting": "Pradžios laikas", "nightly_tasks_start_time_setting": "Pradžios laikas",
"nightly_tasks_start_time_setting_description": "Laikas kada serveris pradės vykdyti naktines užduotis", "nightly_tasks_start_time_setting_description": "Laikas kada serveris pradės vykdyti naktines užduotis",
"nightly_tasks_sync_quota_usage_setting": "Sinchronizuoti kvotos naudojimą",
"nightly_tasks_sync_quota_usage_setting_description": "Atnaujinti vartotojo vietos kvotą remiantis dabartiniu vartojimu",
"no_paths_added": "Keliai nepridėti", "no_paths_added": "Keliai nepridėti",
"no_pattern_added": "Šablonas nepridėtas", "no_pattern_added": "Šablonas nepridėtas",
"note_apply_storage_label_previous_assets": "Pastaba: norėdami pritaikyti Saugyklos Žymą seniau įkeltiems ištekliams, paleiskite", "note_apply_storage_label_previous_assets": "Pastaba: norėdami pritaikyti Saugyklos Žymą seniau įkeltiems ištekliams, paleiskite",
@@ -303,29 +312,72 @@
"transcoding_codecs_learn_more": "Sužinoti daugiau apie naudojamą terminologiją, naudokite FFmpeg dokumentaciją <h264-link>H.264 codec</h264-link>, <hevc-link>HEVC codec</hevc-link> and <vp9-link>VP9 codec</vp9-link>.", "transcoding_codecs_learn_more": "Sužinoti daugiau apie naudojamą terminologiją, naudokite FFmpeg dokumentaciją <h264-link>H.264 codec</h264-link>, <hevc-link>HEVC codec</hevc-link> and <vp9-link>VP9 codec</vp9-link>.",
"transcoding_constant_quality_mode": "Pastovios kokybės režimas", "transcoding_constant_quality_mode": "Pastovios kokybės režimas",
"transcoding_constant_quality_mode_description": "ICQ yra geriau nei CPQ, tačiau ne visi įrenginiai palaiko šį spartinimo būdą. Šis pasirinkimas būtų naudojamas kai nustatytas Kodavimas Pagal Kokybę. NVENC nepalaiko šio pasirinkimo todėl bus ignoruojamas.", "transcoding_constant_quality_mode_description": "ICQ yra geriau nei CPQ, tačiau ne visi įrenginiai palaiko šį spartinimo būdą. Šis pasirinkimas būtų naudojamas kai nustatytas Kodavimas Pagal Kokybę. NVENC nepalaiko šio pasirinkimo todėl bus ignoruojamas.",
"transcoding_constant_rate_factor": "Pastovaus greičio faktorius (-crf)",
"transcoding_constant_rate_factor_description": "Video kokybės lygis. Tipinės reikšmės yra 23 jei H.264, 28 jei HVEC, 31 jei VP9, ir 35 jei AV1. Kuo mažesnis tuo kokybiškesnis tačiau didesni failai.", "transcoding_constant_rate_factor_description": "Video kokybės lygis. Tipinės reikšmės yra 23 jei H.264, 28 jei HVEC, 31 jei VP9, ir 35 jei AV1. Kuo mažesnis tuo kokybiškesnis tačiau didesni failai.",
"transcoding_disabled_description": "Nedaryti perkodavimo, įrašų peržiūra gali neveikti ant kai kūrių sąsajų", "transcoding_disabled_description": "Nedaryti perkodavimo, įrašų peržiūra gali neveikti ant kai kūrių sąsajų",
"transcoding_encoding_options": "Užkodavimo parinktys",
"transcoding_encoding_options_description": "Nustatyti kodekus, rezoliuciją, kokybę ir kitas parinktis užkoduojamiems vaizdo įrašams",
"transcoding_hardware_acceleration": "Techninės įrangos spartinimas", "transcoding_hardware_acceleration": "Techninės įrangos spartinimas",
"transcoding_hardware_acceleration_description": "Eksperimentinis: greitesnis perkodavimas, bet galimai prastesne kokybe prie tos pačios bitų spartos",
"transcoding_hardware_decoding": "Aparatinis dekodavimas", "transcoding_hardware_decoding": "Aparatinis dekodavimas",
"transcoding_hardware_decoding_setting_description": "Įgalina visapusišką paspartinimą vietoje tik užkodavimo paspartinimo. Gali neveikti su kai kuriais vaizdo įrašais.",
"transcoding_max_b_frames": "Maksimaliai B-kadrų",
"transcoding_max_b_frames_description": "Didesnės reikšmės pagerina suspaudimo efektyvumą, bet sulėtina užkodavimą. Senesniuose prietaisuose gali būti nepalaikomas aparatinis spartinimas. 0 išjungia B-kadrus, o -1 nustato reikšmę automatiškai.",
"transcoding_max_bitrate": "Maksimalus bitų srautas", "transcoding_max_bitrate": "Maksimalus bitų srautas",
"transcoding_max_bitrate_description": "Pasirenkant max bitrate galima pasiekti labiau nuspėjamą failų dydį su minimaliais kokybės praradimais. Prie 720p, tipinės reikšmės yra 2600 kbits/s jei BP9 ar HVEC, arba 4500 kbits/s jei H.264. Neveiksnus jei pasirenkamas 0.", "transcoding_max_bitrate_description": "Pasirenkant max bitrate galima pasiekti labiau nuspėjamą failų dydį su minimaliais kokybės praradimais. Prie 720p, tipinės reikšmės yra 2600 kbits/s jei BP9 ar HVEC, arba 4500 kbits/s jei H.264. Neveiksnus jei pasirenkamas 0.",
"transcoding_max_keyframe_interval": "Maksimalus raktinio kadro intervalas",
"transcoding_max_keyframe_interval_description": "Nustato maksimalų kadro atstumą tarp raktinių kadrų. Žemesnės reikšmės pablogina suspaudimo efektyvumą, bet pagerina prasukimo laiką ir gali pagerinti greito veiksmo scenų kokybę. 0 - nustato šią reikšmę automatiškai.",
"transcoding_optimal_description": "Vaizdo įrašai aukštesne nei tikslinė rezoliucija arba nepalaikomu formatu",
"transcoding_policy": "Transkodavimo politika", "transcoding_policy": "Transkodavimo politika",
"transcoding_policy_description": "Nustatyti kada vaizdo įrašas bus perkoduotas",
"transcoding_preferred_hardware_device": "Pageidaujamas aparatinės įrangos įrenginys",
"transcoding_preferred_hardware_device_description": "Galioja tik VAAPI ir QSV. Nustato dri mazgą aparatiniam perkodavimui.",
"transcoding_preset_preset": "Iš anksto nustatytas (-preset)",
"transcoding_preset_preset_description": "Kompresijos greitis. Siekiant tam tikro bitrate lėtesnis apdorojimas lems mažesnius failų dydžius ir padidins kokybę. VP9 ignoruos greičius virš \"gretesnis\" lygio.", "transcoding_preset_preset_description": "Kompresijos greitis. Siekiant tam tikro bitrate lėtesnis apdorojimas lems mažesnius failų dydžius ir padidins kokybę. VP9 ignoruos greičius virš \"gretesnis\" lygio.",
"transcoding_reference_frames": "Nuorodiniai kadrai",
"transcoding_reference_frames_description": "Kadrų, į kuriuos reikia remtis suspaudžiant duotą kadrą, skaičius. Aukštesnė reikšmė pagerina suspaudimo efektyvumą, bet sulėtina užkodavimą. 0 - nustato reikšmę automatiškai.",
"transcoding_required_description": "Tik nepalaikomo formato vaizdo įrašai",
"transcoding_settings": "Vaizdo įrašų perkodavimo nustatymai",
"transcoding_settings_description": "Valdyti kuriuos vaizdo įrašus perkoduoti ir kaip juos apdoroti",
"transcoding_target_resolution": "Skiriamoji geba",
"transcoding_target_resolution_description": "Didesnės skiriamosios gebos gali išsaugoti daugiau detalių, tačiau jas koduoti užtrunka ilgiau, failų dydžiai yra didesni ir gali sumažėti programos jautrumas.", "transcoding_target_resolution_description": "Didesnės skiriamosios gebos gali išsaugoti daugiau detalių, tačiau jas koduoti užtrunka ilgiau, failų dydžiai yra didesni ir gali sumažėti programos jautrumas.",
"transcoding_temporal_aq": "Laikinas adaptyvus kvantavimas",
"transcoding_temporal_aq_description": "Galioja tik NVENC. Pagerina detalių, mažo judesio scenų kokybę. Gali būti nepalaikoma senesnių įrenginių.",
"transcoding_threads": "Gijos",
"transcoding_threads_description": "Didesnės reikšmės pagreitina kodavimą, bet kol aktyvus palieka mažiau serverio resursų kitoms užduotims. Ši reikšmė negali būti didesnė už procesoriaus branduolių kiekį. Jei reikšmė 0, tai išnaudoja maksimaliai.",
"transcoding_tone_mapping": "Tonų atvaizdavimas",
"transcoding_tone_mapping_description": "Bandoma išsaugoti HDR vaizdo įrašų išvaizdą konvertuojant į SDR. Kiekvienas algoritmas taiko skirtingus kompromisus dėl spalvų, detalių ir šviesumo. Hable išsaugo detales, Mobius išsaugo spalvas, o Reinhard išsaugo šviesumą.",
"transcoding_transcode_policy": "Perkodavimo strategija",
"transcoding_transcode_policy_description": "Strategija, kada vaizdo įrašas turi būti perkoduotas. HDR vaizdo įrašai visada bus perkoduoti (išskyrus jei perkodavimas išjungtas).",
"transcoding_two_pass_encoding": "Dviejų perėjimų užkodavimas",
"transcoding_two_pass_encoding_setting_description": "Perkoduoti su dviem perėjimais, kad gauti geriau užkoduotą vaizdo įrašą. Kai maksimalus bitų srautas įjungtas (veikimui reikalaujamas H.264 ir HVEC), tada naudojamas bitų intervalas remiantis maksimaliu bitų srautu ir ignoruojamas CRF. Su VP9 gali būti naudojamas CRF, jei maksimalus bitų srautas yra išjungtas.",
"transcoding_video_codec": "Video kodekas", "transcoding_video_codec": "Video kodekas",
"transcoding_video_codec_description": "VP9 turi didelį efektyvumą ir tinklo suderinamumą, bet užtrunka ilgiau perkoduojant. HVEC veikia panašiai, bet turi mažesnį tinklo suderinamumą. H.264 yra plačiai palaikomas ir greitai perkoduojamas, bet kuria didelius failus. AV1 yra efektyviausias kodekas, bet nepalaikomas senesnių prietaisų.",
"trash_enabled_description": "Įgalinti šiukšliadėžės funkcijas", "trash_enabled_description": "Įgalinti šiukšliadėžės funkcijas",
"trash_number_of_days": "Dienų skaičius", "trash_number_of_days": "Dienų skaičius",
"trash_number_of_days_description": "Kiek dienų bus laikomi elementai šiukšliadėžėje prieš galutinai juos ištrinant",
"trash_settings": "Šiukšliadėžės nustatymai", "trash_settings": "Šiukšliadėžės nustatymai",
"trash_settings_description": "Tvarkyti šiukšliadėžės nustatymus", "trash_settings_description": "Tvarkyti šiukšliadėžės nustatymus",
"unlink_all_oauth_accounts": "Atsieti visas OAuth paskyras",
"unlink_all_oauth_accounts_description": "Nepamirškite atsieti visas OAuth paskyras prieš migruojant pas naują tiekėją.",
"unlink_all_oauth_accounts_prompt": "Ar tikrai norite atsieti visas OAuth paskyras? Tai negrįžtama operacija kuri atstatys OAuth ID kiekvienam vartotojui.",
"user_cleanup_job": "Vartotojų išvalymas", "user_cleanup_job": "Vartotojų išvalymas",
"user_delete_delay": "<b>{user}</b> paskyra ir elementai bus nustatyti galutiniam ištrynimui už {delay, plural, one {# dienos} other {# dienų}}.",
"user_delete_delay_settings": "Ištrynimo delsa", "user_delete_delay_settings": "Ištrynimo delsa",
"user_delete_delay_settings_description": "Skaičius dienų po ištrynimo kuomet vartotojo paskyrą ir susiję duomenys bus negražinamai ištrinti. Vartotojo Trynimo užduotis paleidžiama vidurnaktį ir tikrina kurie vartotojai gali būti trinami. Šio nustatymo pakeitimai bus naudojami sekančio užduoties paleidimo metu.", "user_delete_delay_settings_description": "Skaičius dienų po ištrynimo kuomet naudotojo paskyra ir susiję duomenys bus negražinamai ištrinti. Naudotojo trynimo užduotis paleidžiama vidurnaktį ir tikrina kurie naudotojai gali būti trinami. Šio nustatymo pakeitimai bus naudojami sekančio užduoties paleidimo metu.",
"user_delete_immediately": "<b>{user}</b> paskyra ir elementai bus <b>nedelsiant</b> įtraukti galutiniam pašalinimui.",
"user_delete_immediately_checkbox": "Ištrinti naudotoją ir elementus nedelsiant",
"user_details": "Naudotojo duomenys",
"user_management": "Naudotojų valdymas", "user_management": "Naudotojų valdymas",
"user_password_has_been_reset": "Naudotojo slaptažodis buvo iš naujo nustatytas:", "user_password_has_been_reset": "Naudotojo slaptažodis buvo iš naujo nustatytas:",
"user_password_reset_description": "Perduokite laikiną slaptažodį naudotojui ir informuokite, kad pasikeistų slaptažodį pirmo prisijungimo metu.",
"user_restore_description": "Naudotojo <b>{user}</b> paskyra bus atkurta.", "user_restore_description": "Naudotojo <b>{user}</b> paskyra bus atkurta.",
"user_restore_scheduled_removal": "Atkurti naudotoją - suplanuotas pašalinimas {date, date, long}",
"user_settings": "Naudotojo nustatymai", "user_settings": "Naudotojo nustatymai",
"user_settings_description": "Valdyti naudotojo nustatymus", "user_settings_description": "Valdyti naudotojo nustatymus",
"user_successfully_removed": "Naudotojas {email} sėkmingai pašalintas.", "user_successfully_removed": "Naudotojas {email} sėkmingai pašalintas.",
"version_check_enabled_description": "Įgalinti versijų tikrinimą",
"version_check_implications": "Versijų tikrinimas reikalauja periodiškos komunikacijos su github.com",
"version_check_settings": "Versijos tikrinimas", "version_check_settings": "Versijos tikrinimas",
"version_check_settings_description": "Įjungti/išjungti naujos versijos pranešimus", "version_check_settings_description": "Įjungti/išjungti naujos versijos pranešimus",
"video_conversion_job": "Vaizdo įrašų konvertavimas", "video_conversion_job": "Vaizdo įrašų konvertavimas",
@@ -334,10 +386,36 @@
"admin_email": "Administratoriaus el. paštas", "admin_email": "Administratoriaus el. paštas",
"admin_password": "Administratoriaus slaptažodis", "admin_password": "Administratoriaus slaptažodis",
"administration": "Administravimas", "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}",
"advanced_settings_prefer_remote_subtitle": "Kai kurie įrenginiai labai lėtai įkelia miniatiūras iš vietinių elementų. Aktyvuokite šį nustatymą, kad vietoje to užkrautumėte nuotolines nuotraukas.",
"advanced_settings_prefer_remote_title": "Teikti pirmenybę nuotolinėms nuotraukoms",
"advanced_settings_proxy_headers_subtitle": "Nustatykite tarpinio serverio antraštes kurias Immich siųs su kiekvienu užklausimu",
"advanced_settings_proxy_headers_title": "Tarpinio serverio antraštės",
"advanced_settings_readonly_mode_subtitle": "Įgalina tik skaitymo režimą kai nuotraukas galima tik žiūrėti, draudžiama pažymėti kelias, dalintis, transliuoti ar ištrinti. Įgalinkit/uždrauskit tik skaitymą per naudotojo avatar'ą iš pagrindinio lango",
"advanced_settings_readonly_mode_title": "Tik skaitymo režimas",
"advanced_settings_self_signed_ssl_subtitle": "Praleidžia SSL sertifikato tikrinimą serverio galutiniam taškui. Privaloma pačių pasirašytiems sertifikatams.",
"advanced_settings_self_signed_ssl_title": "Leisti pačių pasirašytus SSL sertifikatus",
"advanced_settings_sync_remote_deletions_subtitle": "Automatiškai ištrinti ar atkurti elementus įrenginyje, kai tie veiksmai atliekami naršyklėje",
"advanced_settings_sync_remote_deletions_title": "Sinchronizuoti nuotolinius ištrynimus [EKSPERIMENTINIS]",
"advanced_settings_tile_subtitle": "Pažangesni naudotojų nustatymai",
"advanced_settings_troubleshooting_subtitle": "Įgalinti papildomas galimybes trikčių šalinimui",
"advanced_settings_troubleshooting_title": "Trikčių šalinimas",
"age_months": "Amžius {months, plural, one {# mėnesis} few {# mėnesiai} other {# mėnesių}}",
"age_year_months": "Amžius 1 metai, {months, plural, one {# mėnesis} few {# mėnesiai} other {# mėnesių}}",
"age_years": "{years, plural, other {Amžius #}}",
"album_added": "Albumas pridėtas", "album_added": "Albumas pridėtas",
"album_added_notification_setting_description": "Gauti el. pašto pranešimą, kai būsite pridėtas prie bendrinamo albumo", "album_added_notification_setting_description": "Gauti el. pašto pranešimą, kai būsite pridėtas prie bendrinamo albumo",
"album_cover_updated": "Albumo viršelis atnaujintas", "album_cover_updated": "Albumo viršelis atnaujintas",
"album_delete_confirmation": "Ar tikrai norite ištrinti albumą {album}?", "album_delete_confirmation": "Ar tikrai norite ištrinti albumą {album}?",
"album_delete_confirmation_description": "Jei šiuo albumu dalijamasi, tai kiti naudotojai jo nebegalės pasiekti.",
"album_deleted": "Albumas ištrintas",
"album_info_card_backup_album_excluded": "neįtrauktas",
"album_info_card_backup_album_included": "įtrauktas",
"album_info_updated": "Albumo informacija atnaujinta", "album_info_updated": "Albumo informacija atnaujinta",
"album_leave": "Palikti albumą?", "album_leave": "Palikti albumą?",
"album_leave_confirmation": "Ar tikrai norite palikti albumą {album}?", "album_leave_confirmation": "Ar tikrai norite palikti albumą {album}?",
@@ -345,16 +423,27 @@
"album_options": "Albumo parinktys", "album_options": "Albumo parinktys",
"album_remove_user": "Pašalinti naudotoją?", "album_remove_user": "Pašalinti naudotoją?",
"album_remove_user_confirmation": "Ar tikrai norite pašalinti naudotoją {user}?", "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_share_no_users": "Atrodo, kad bendrinate šį albumą su visais naudotojais, arba neturite naudotojų, su kuriais galėtumėte bendrinti.",
"album_updated": "Albumas atnaujintas", "album_updated": "Albumas atnaujintas",
"album_updated_setting_description": "Gauti pranešimą el. paštu, kai bendrinamas albumas turi naujų elementų", "album_updated_setting_description": "Gauti pranešimą el. paštu, kai bendrinamas albumas turi naujų elementų",
"album_user_left": "Paliko {album}",
"album_user_removed": "Pašalintas {user}", "album_user_removed": "Pašalintas {user}",
"album_viewer_appbar_delete_confirm": "Ar tikrai norite ištrinti šį albumą iš savo paskyros?",
"album_viewer_appbar_share_err_delete": "Nepavyko ištrinti albumo", "album_viewer_appbar_share_err_delete": "Nepavyko ištrinti albumo",
"album_viewer_appbar_share_err_leave": "Nepavyko išeiti iš albumo", "album_viewer_appbar_share_err_leave": "Nepavyko išeiti iš albumo",
"album_viewer_appbar_share_err_remove": "Kilo problemų pašalinant elementus iš albumo",
"album_viewer_appbar_share_err_title": "Nepavyko pakeisti albumo pavadinimą", "album_viewer_appbar_share_err_title": "Nepavyko pakeisti albumo pavadinimą",
"album_viewer_appbar_share_leave": "Palikti albumą",
"album_viewer_appbar_share_to": "Dalintis su",
"album_viewer_page_share_add_users": "Pridėti naudotojų",
"album_with_link_access": "Tegul visi, turintys nuorodą, mato šio albumo nuotraukas ir žmones.", "album_with_link_access": "Tegul visi, turintys nuorodą, mato šio albumo nuotraukas ir žmones.",
"albums": "Albumai", "albums": "Albumai",
"albums_count": "{count, plural, one {# albumas} few {# albumai} other {# albumų}}", "albums_count": "{count, plural, one {# albumas} few {# albumai} other {# albumų}}",
"albums_default_sort_order": "Pradinė albumo rūšiavimo tvarka",
"albums_default_sort_order_description": "Pradinė elementų rūšiavimo tvarka kai kuriamas naujas albumas.",
"albums_feature_description": "Elementų rinkinys kuriuo galima dalintis su kitais naudotojais.",
"albums_on_device_count": "Albumų įrenginyje ({count})",
"all": "Visi", "all": "Visi",
"all_albums": "Visi albumai", "all_albums": "Visi albumai",
"all_people": "Visi žmonės", "all_people": "Visi žmonės",
@@ -363,51 +452,154 @@
"allow_edits": "Leisti redagavimus", "allow_edits": "Leisti redagavimus",
"allow_public_user_to_download": "Leisti viešam naudotojui atsisiųsti", "allow_public_user_to_download": "Leisti viešam naudotojui atsisiųsti",
"allow_public_user_to_upload": "Leisti viešam naudotojui įkelti", "allow_public_user_to_upload": "Leisti viešam naudotojui įkelti",
"alt_text_qr_code": "QR kodo paveiksliukas",
"anti_clockwise": "Prieš laikrodžio rodykles",
"api_key": "API raktas", "api_key": "API raktas",
"api_key_description": "Ši reikšmė bus parodyta tik vieną kartą. Prašome nusikopijuoti prieš uždarant šį langą.",
"api_key_empty": "Jūsų API rakto pavadinimas netūrėtų būti tuščias", "api_key_empty": "Jūsų API rakto pavadinimas netūrėtų būti tuščias",
"api_keys": "API raktai", "api_keys": "API raktai",
"app_bar_signout_dialog_content": "Ar tikrai norite atsijungti?",
"app_bar_signout_dialog_ok": "Taip",
"app_bar_signout_dialog_title": "Atsijungti",
"app_settings": "Programos nustatymai", "app_settings": "Programos nustatymai",
"appears_in": "Susiję",
"apply_count": "Taikyti ({count, number})",
"archive": "Archyvas", "archive": "Archyvas",
"archive_action_prompt": "{count} pridėta į archyvą",
"archive_or_unarchive_photo": "Archyvuoti arba išarchyvuoti nuotrauką", "archive_or_unarchive_photo": "Archyvuoti arba išarchyvuoti nuotrauką",
"archive_page_no_archived_assets": "Nerasta jokių archyvuotų elementų", "archive_page_no_archived_assets": "Nerasta jokių archyvuotų elementų",
"archive_page_title": "Archyve ({count})",
"archive_size": "Archyvo dydis", "archive_size": "Archyvo dydis",
"archive_size_description": "Konfigūruoti archyvo dydį atsisiuntimams (GiB)", "archive_size_description": "Konfigūruoti archyvo dydį atsisiuntimams (GiB)",
"archived": "Archyvuota", "archived": "Archyvuota",
"archived_count": "{count, plural, other {# suarchyvuota}}", "archived_count": "{count, plural, other {# suarchyvuota}}",
"are_these_the_same_person": "Ar tai tas pats asmuo?", "are_these_the_same_person": "Ar tai tas pats asmuo?",
"are_you_sure_to_do_this": "Ar tikrai norite tai daryti?", "are_you_sure_to_do_this": "Ar tikrai norite tai daryti?",
"asset_action_delete_err_read_only": "Negalima ištrinti tik skaitom(o, ų) element(o, ų), praleidžiama",
"asset_action_share_err_offline": "Negalima užkrauti neprisijungusių elementų, praleidžiama",
"asset_added_to_album": "Pridėta į albumą", "asset_added_to_album": "Pridėta į albumą",
"asset_adding_to_album": "Pridedama į albumą...", "asset_adding_to_album": "Pridedama į albumą",
"asset_description_updated": "Elemento aprašymas buvo atnaujintas", "asset_description_updated": "Elemento aprašymas buvo atnaujintas",
"asset_filename_is_offline": "Elementas {filename} nepasiekiamas", "asset_filename_is_offline": "Elementas {filename} nepasiekiamas",
"asset_has_unassigned_faces": "Elementas turi nepriskirtų veidų",
"asset_hashing": "Maišoma…",
"asset_list_group_by_sub_title": "Grupuoti pagal",
"asset_list_layout_settings_dynamic_layout_title": "Dinaminis išdėstymas",
"asset_list_layout_settings_group_automatically": "Automatiškai",
"asset_list_layout_settings_group_by": "Grupuoti elementus pagal",
"asset_list_layout_settings_group_by_month_day": "Mėnesis + diena",
"asset_list_layout_sub_title": "Išdėstymas",
"asset_list_settings_subtitle": "Nuotraukų tinklelio išdėstymo nustatymai",
"asset_list_settings_title": "Nuotraukų tinklelis",
"asset_offline": "Elementas nepasiekiamas", "asset_offline": "Elementas nepasiekiamas",
"asset_offline_description": "Šis išorinis elementas neberandamas diske. Dėl pagalbos susisiekite su savo Immich administratoriumi.", "asset_offline_description": "Šis išorinis elementas neberandamas diske. Dėl pagalbos susisiekite su savo Immich administratoriumi.",
"asset_restored_successfully": "Elementas atkurtas sėkmingai",
"asset_skipped": "Praleista",
"asset_skipped_in_trash": "Šiukšliadėžėje",
"asset_uploaded": "Įkelta", "asset_uploaded": "Įkelta",
"asset_uploading": "Įkeliama...", "asset_uploading": "Įkeliama",
"asset_viewer_settings_subtitle": "Tvarkykite savo galerijos peržiūros nustatymus",
"asset_viewer_settings_title": "Elementų peržiūra",
"assets": "Elementai", "assets": "Elementai",
"assets_added_count": "{count, plural, one {Pridėtas # elementas} few {Pridėti # elementai} other {Pridėta # elementų}}", "assets_added_count": "{count, plural, one {Pridėtas # elementas} few {Pridėti # elementai} other {Pridėta # elementų}}",
"assets_added_to_album_count": "Į albumą {count, plural, one {įtrauktas # elementas} few {įtraukti # elementai} other {įtraukta # elementų}}", "assets_added_to_album_count": "Į albumą {count, plural, one {įtrauktas # elementas} few {įtraukti # elementai} other {įtraukta # elementų}}",
"assets_added_to_albums_count": "Pridėta {assetTotal, plural, one {# elementas} few {# elementai} other {# elementų}} į {albumTotal, plural, one {# albumą} few {# albumus} other {# albumų}}",
"assets_cannot_be_added_to_album_count": "{count, plural, one {Elementas negali būti pridėtas} few {Elementai negali būti pridėti} other {Elementų negali būti pridėta}} į albumą",
"assets_cannot_be_added_to_albums": "{count, plural, one {Elementas negali būti pridėtas} few {Elementai negali būti pridėti} other {Elementų negali būti pridėta}} į nei vieną albumą",
"assets_count": "{count, plural, one {# elementas} few {# elementai} other {# elementų}}", "assets_count": "{count, plural, one {# elementas} few {# elementai} other {# elementų}}",
"assets_deleted_permanently": "{count} elementų ištrinta galutinai",
"assets_deleted_permanently_from_server": "{count} elementų ištrinta galutinai iš Immich serverio",
"assets_downloaded_failed": "{count, plural, one {Atsisiųstas # failas - {error} failas nepavyko} few {Atsisiųsti # failai - {error} failai nepavyko} other {Atsisiųsta # failų - {error} failų nepavyko}}",
"assets_downloaded_successfully": "{count, plural, one {Atsisiųstas # failas sėkmingai} few {Atsisiųsti # failai sėkmingai} other {Atsisiųsta # failų sėkmingai}}",
"assets_moved_to_trash_count": "{count, plural, one {# elementas perkeltas} few {# elementai perkelti} other {# elementų perkelta}} į šiukšliadėžę", "assets_moved_to_trash_count": "{count, plural, one {# elementas perkeltas} few {# elementai perkelti} other {# elementų perkelta}} į šiukšliadėžę",
"assets_permanently_deleted_count": "{count, plural, one {# elementas ištrintas} few {# elementai ištrinti} other {# elementų ištrinta}} visam laikui", "assets_permanently_deleted_count": "{count, plural, one {# elementas ištrintas} few {# elementai ištrinti} other {# elementų ištrinta}} visam laikui",
"assets_removed_count": "{count, plural, one {Pašalintas # elementas} few {Pašalinti # elementai} other {Pašalinta # elementų}}", "assets_removed_count": "{count, plural, one {Pašalintas # elementas} few {Pašalinti # elementai} other {Pašalinta # elementų}}",
"assets_removed_permanently_from_device": "{count} elementų pašalinta galutinai iš jūsų įrenginio",
"assets_restore_confirmation": "Ar tikrai norite atkurti visus šiukšliadėžėje esančius perkeltus elementus? Šio veiksmo atšaukti negalėsite! Pastaba: nepasiekiami elementai tokiu būdu atkurti nebus.", "assets_restore_confirmation": "Ar tikrai norite atkurti visus šiukšliadėžėje esančius perkeltus elementus? Šio veiksmo atšaukti negalėsite! Pastaba: nepasiekiami elementai tokiu būdu atkurti nebus.",
"assets_restored_count": "{count, plural, one {Atkurtas # elementas} few {Atkurti # elementai} other {Atkurta # elementų}}", "assets_restored_count": "{count, plural, one {Atkurtas # elementas} few {Atkurti # elementai} other {Atkurta # elementų}}",
"assets_restored_successfully": "{count} element(as, ai, ų) atkurta sėkmingai",
"assets_trashed": "{count} element(ai,ų,as) perkelta į šiukšliadėžę",
"assets_trashed_count": "Perkelta į šiukšliadėžę {count, plural, one {# elementas} few {# elementai} other {# elementų}}",
"assets_trashed_from_server": "{count} element(as, ai, ų) perkelta į šiukšliadėžę iš Immich serverio",
"assets_were_part_of_album_count": "{count, plural, one {# elementas} few {# elementai} other {# elementų}} jau prieš tai buvo albume", "assets_were_part_of_album_count": "{count, plural, one {# elementas} few {# elementai} other {# elementų}} jau prieš tai buvo albume",
"assets_were_part_of_albums_count": "{count, plural, one {Elementas } few {Elementai} other {Elementų}} jau buvo albumuose",
"authorized_devices": "Autorizuoti įrenginiai", "authorized_devices": "Autorizuoti įrenginiai",
"automatic_endpoint_switching_subtitle": "Prisijungti vietoje per priskirtą Wi-Fi kai įmanoma ir naudoti alternatyvų prisijungimą visur kitur",
"automatic_endpoint_switching_title": "Automatinis URL perjungimas",
"autoplay_slideshow": "Automatiškai rodyti skaidrių demonstraciją",
"back": "Atgal", "back": "Atgal",
"back_close_deselect": "Atgal, uždaryti arba atžymėti", "back_close_deselect": "Atgal, uždaryti arba atžymėti",
"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ą",
"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",
"backup_album_selection_page_assets_scatter": "Elementai gali išsibarstyti per kelis albumus. Todėl albumai gali būti įtraukti arba neįtraukti per atsarginio kopijavimo procesą.",
"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_all": "Visi",
"backup_background_service_backup_failed_message": "Nepavyko sukurti atsarginių kopijų. Bandoma dar kartą…", "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ą…", "backup_background_service_connection_failed_message": "Nepavyko prisijungti prie serverio. Bandoma dar kartą…",
"backup_background_service_current_upload_notification": "Įkeliamas {filename}", "backup_background_service_current_upload_notification": "Įkeliamas {filename}",
"backup_background_service_default_notification": "Ieškoma naujų elementų…",
"backup_background_service_error_title": "Atsarginio kopijavimo klaida",
"backup_background_service_in_progress_notification": "Kuriama elementų atsarginė kopija…",
"backup_background_service_upload_failure_notification": "Nepavyko įkelti {filename}", "backup_background_service_upload_failure_notification": "Nepavyko įkelti {filename}",
"backup_controller_page_background_wifi": "Only on WiFi", "backup_controller_page_albums": "Atsarginės kopijos albumai",
"backup_controller_page_background_app_refresh_disabled_title": "Foninis programos atnaujinimas išjungtas",
"backup_controller_page_background_app_refresh_enable_button_text": "Eiti į nustatymus",
"backup_controller_page_background_battery_info_link": "Parodyk man kaip",
"backup_controller_page_background_battery_info_message": "Norint geriausių foninio atsarginio kopijavimo rezultatų, prašome išjungti akumuliatoriaus optimizavimą ribojantį foninį Immich veikimą.\n\nKadangi tai priklauso nuo įrenginio, prašome susirasti reikiamą informaciją pas įrenginio gamintoją.",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Akumuliatoriaus optimizavimai",
"backup_controller_page_background_charging": "Tik kol kraunasi",
"backup_controller_page_background_configure_error": "Nepavyko sukonfigūruoti foninių paslaugų",
"backup_controller_page_background_delay": "Atidėti naujų elementų atsarginį kopijavimą: {duration}",
"backup_controller_page_background_description": "Įjunkite fonines paslaugas, kad galėtumėte automatiškai kurti atsargines kopijas neatidarant programos",
"backup_controller_page_background_is_off": "Automatinis atsarginis kopijavimas yra išjungtas",
"backup_controller_page_background_is_on": "Automatinis atsarginis kopijavimas yra įjungtas",
"backup_controller_page_background_turn_off": "Išjungti fonines paslaugas",
"backup_controller_page_background_turn_on": "Įjungti fonines paslaugas",
"backup_controller_page_background_wifi": "Tik su Wi-Fi",
"backup_controller_page_backup": "Atsarginis kopijavimas",
"backup_controller_page_backup_selected": "Pasirinkta: ",
"backup_controller_page_backup_sub": "Perkeltos nuotraukos ir vaizdo įrašai",
"backup_controller_page_created": "Sukurta: {date}", "backup_controller_page_created": "Sukurta: {date}",
"backup_controller_page_desc_backup": "Įjunkite foninį atsarginį kopijavimą, kad būtų automatiškai perkeliami nauji elementai į serverį kai atidaroma programa.",
"backup_controller_page_excluded": "Neįtraukta: ",
"backup_controller_page_failed": "Nepavyko ({count})",
"backup_controller_page_filename": "Failo pavadinimas: {filename}[{size}]", "backup_controller_page_filename": "Failo pavadinimas: {filename}[{size}]",
"backup_controller_page_id": "ID: {id}",
"backup_controller_page_info": "Atsarginio kopijavimo informacija",
"backup_controller_page_none_selected": "Niekas nepasirinkta",
"backup_controller_page_remainder": "Dar liko",
"backup_controller_page_remainder_sub": "Likusios pasirinktos atsarginio kopijavimo nuotraukos ir vaizdo įrašai",
"backup_controller_page_server_storage": "Serverio saugykla", "backup_controller_page_server_storage": "Serverio saugykla",
"backup_controller_page_start_backup": "Pradėti atsarginį kopijavimą",
"backup_controller_page_status_off": "Automatinis foninis atsarginis kopijavimas yra išjungtas",
"backup_controller_page_status_on": "Automatinis foninis atsarginis kopijavimas yra įjungtas",
"backup_controller_page_storage_format": "{used} iš {total} panaudota", "backup_controller_page_storage_format": "{used} iš {total} panaudota",
"backup_controller_page_to_backup": "Albumai kurių atsarginis kopijavimas bus atliktas",
"backup_controller_page_total_sub": "Visos unikalios nuotraukos ir video įrašai iš pažymėtų albumų",
"backup_controller_page_turn_off": "Išjungti foninį atsarginį kopijavimą",
"backup_controller_page_turn_on": "Įjungti foninį atsarginį kopijavimą",
"backup_controller_page_uploading_file_info": "Įkeliama failo info", "backup_controller_page_uploading_file_info": "Įkeliama failo info",
"backup_err_only_album": "Negalima pašalinti vienintelio albumo",
"backup_info_card_assets": "elementai",
"backup_manual_cancelled": "Atšaukta",
"backup_manual_in_progress": "Jau įkeliama, bandykite dar kartą vėliau", "backup_manual_in_progress": "Jau įkeliama, bandykite dar kartą vėliau",
"backup_manual_success": "Pavyko",
"backup_manual_title": "Įkėlimo būklė",
"backup_options": "Atsarginio kopijavimo nustatymai",
"backup_options_page_title": "Atsarginio kopijavimo nustatymai",
"backup_setting_subtitle": "Tvarkyti foninio ir priekinio plano įkėlimo nustatymus",
"backup_settings_subtitle": "Tvarkyti įkėlimo nustatymus",
"backward": "Atgalinis",
"biometric_auth_enabled": "Biometrinis autentifikavimas įgalintas",
"biometric_locked_out": "Jūs esate užblokuotas biometrinio autentifikavimo funkcijai",
"biometric_no_options": "Nėra galimų biometrinių nustatymų",
"biometric_not_available": "Biometrinis autentifikavimas šiame įrenginyje negalimas",
"birthdate_saved": "Sėkmingai išsaugota gimimo data", "birthdate_saved": "Sėkmingai išsaugota gimimo data",
"birthdate_set_description": "Gimimo data naudojama apskaičiuoti asmens amžių nuotraukos darymo metu.", "birthdate_set_description": "Gimimo data naudojama apskaičiuoti asmens amžių nuotraukos darymo metu.",
"blurred_background": "Neryškus fonas", "blurred_background": "Neryškus fonas",
@@ -416,42 +608,104 @@
"bulk_keep_duplicates_confirmation": "Ar tikrai norite palikti visus {count, plural, one {# besidubliuojantį elementą} few {# besidubliuojančius elementus} other {# besidubliuojančių elementų}}? Tokiu būdu nieko netrinant bus sutvarkytos visos dublikatų grupės.", "bulk_keep_duplicates_confirmation": "Ar tikrai norite palikti visus {count, plural, one {# besidubliuojantį elementą} few {# besidubliuojančius elementus} other {# besidubliuojančių elementų}}? Tokiu būdu nieko netrinant bus sutvarkytos visos dublikatų grupės.",
"bulk_trash_duplicates_confirmation": "Ar tikrai norite perkelti į šiukšliadėžę visus {count, plural, one {# besidubliuojantį elementą} few {# besidubliuojančius elementus} other {# besidubliuojančių elementų}}? Bus paliktas didžiausias kiekvienos grupės elementas ir į šiukšliadėžę perkelti kiti besidubliuojantys elementai.", "bulk_trash_duplicates_confirmation": "Ar tikrai norite perkelti į šiukšliadėžę visus {count, plural, one {# besidubliuojantį elementą} few {# besidubliuojančius elementus} other {# besidubliuojančių elementų}}? Bus paliktas didžiausias kiekvienos grupės elementas ir į šiukšliadėžę perkelti kiti besidubliuojantys elementai.",
"buy": "Įsigyti Immich", "buy": "Įsigyti Immich",
"cache_settings_clear_cache_button": "Išvalyti laikiną talpyklą",
"cache_settings_clear_cache_button_title": "Išvalo programos laikiną talpyklą. Tai gali smarkiai paveikti programos greitį, kol bus sukurta nauja laikinoji talpykla.",
"cache_settings_duplicated_assets_clear_button": "IŠVALYTI",
"cache_settings_duplicated_assets_subtitle": "Nuotraukos ir video įrašai kurie yra programos ignoruojamų sąraše",
"cache_settings_duplicated_assets_title": "Sudubliuoti elementai ({count})",
"cache_settings_statistics_album": "Bibliotekos miniatiūros",
"cache_settings_statistics_full": "Pilno dydžio nuotraukos",
"cache_settings_statistics_shared": "Bendrinamų albumų miniatiūros",
"cache_settings_statistics_thumbnail": "Miniatiūros",
"cache_settings_statistics_title": "Laikinos talpyklos naudojimas",
"cache_settings_subtitle": "Valdykite Immich mobiliosios programos laikinosios talpyklos elgesį",
"cache_settings_tile_subtitle": "Valdykite vietinės talpyklos elgesį",
"cache_settings_tile_title": "Vietinė talpykla",
"cache_settings_title": "Laikinosios talpyklos nustatymai",
"camera": "Fotoaparatas", "camera": "Fotoaparatas",
"camera_brand": "Fotoaparato prekės ženklas", "camera_brand": "Fotoaparato prekės ženklas",
"camera_model": "Fotoaparato modelis", "camera_model": "Fotoaparato modelis",
"cancel": "Atšaukti", "cancel": "Atšaukti",
"cancel_search": "Atšaukti paiešką", "cancel_search": "Atšaukti paiešką",
"canceled": "Atšaukta",
"canceling": "Atšaukiama",
"cannot_merge_people": "Negalima sujungti asmenų", "cannot_merge_people": "Negalima sujungti asmenų",
"cannot_undo_this_action": "Jūs negalėsite atkurti po šio veiksmo!",
"cannot_update_the_description": "Negalima atnaujinti aprašymo", "cannot_update_the_description": "Negalima atnaujinti aprašymo",
"cast": "Transliuoti",
"cast_description": "Valdyti galimas transliavimo kryptis",
"change_date": "Pakeisti datą", "change_date": "Pakeisti datą",
"change_description": "Pakeisti aprašymus",
"change_display_order": "Pakeisti atvaizdavimo tvarką",
"change_expiration_time": "Pakeisti galiojimo trukmę", "change_expiration_time": "Pakeisti galiojimo trukmę",
"change_location": "Pakeisti vietovę", "change_location": "Pakeisti vietovę",
"change_name": "Pakeisti vardą", "change_name": "Pakeisti vardą",
"change_name_successfully": "Vardas pakeistas sėkmingai",
"change_password": "Pakeisti slaptažodį", "change_password": "Pakeisti slaptažodį",
"change_password_description": "Tai arba pirmas kartas, kai jungiatės prie sistemos, arba buvo pateikta užklausa pakeisti jūsų slaptažodį. Prašome įvesti naują slaptažodį žemiau.", "change_password_description": "Tai arba pirmas kartas, kai jungiatės prie sistemos, arba buvo pateikta užklausa pakeisti jūsų slaptažodį. Prašome įvesti naują slaptažodį žemiau.",
"change_password_form_confirm_password": "Patvirtinti slaptažodį",
"change_password_form_description": "Labas {name},\n\nTai yra pirmas kartas kai tu prisijungei prie sistemos arba buvo prašymas pakeisti slaptažodį. Prašome įvesti naują slaptažodį žemiau.",
"change_password_form_new_password": "Naujas slaptažodis",
"change_password_form_password_mismatch": "Slaptažodžiai nesutampa",
"change_password_form_reenter_new_password": "Pakartotinai įveskite naują slaptažodį",
"change_pin_code": "Pakeisti PIN kodą",
"change_your_password": "Pakeisti slaptažodį", "change_your_password": "Pakeisti slaptažodį",
"changed_visibility_successfully": "Matomumas pakeistas sėkmingai", "changed_visibility_successfully": "Matomumas pakeistas sėkmingai",
"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.",
"check_logs": "Tikrinti žurnalus", "check_logs": "Tikrinti žurnalus",
"choose_matching_people_to_merge": "Pasirinkite atitinkančius žmones sujungimui",
"city": "Miestas", "city": "Miestas",
"clear": "Išvalyti", "clear": "Išvalyti",
"clear_all": "Išvalyti viską", "clear_all": "Išvalyti viską",
"clear_all_recent_searches": "Išvalyti visas naujausias paieškas",
"clear_file_cache": "Išvalyti failų laikiną talpyklą",
"clear_message": "Išvalyti pranešimą", "clear_message": "Išvalyti pranešimą",
"clear_value": "Išvalyti reikšmę", "clear_value": "Išvalyti reikšmę",
"client_cert_dialog_msg_confirm": "OK",
"client_cert_enter_password": "Įveskite slaptažodį",
"client_cert_import": "Importuoti",
"client_cert_import_success_msg": "Kliento sertifikatas yra importuotas",
"client_cert_invalid_msg": "Netinkamas sertifikato failas arba neteisingas slaptažodis", "client_cert_invalid_msg": "Netinkamas sertifikato failas arba neteisingas slaptažodis",
"client_cert_remove_msg": "Kliento sertifikatas yra pašalintas",
"client_cert_subtitle": "Palaikomi tik PKCS12 (.p12, .pfx) formatai. Sertifikato importavimas/pašalinimas galimas tik prieš prisijungimą",
"client_cert_title": "SSL kliento sertifikatas",
"clockwise": "Pagal laikrodžio rodykles",
"close": "Uždaryti", "close": "Uždaryti",
"collapse": "Suskleisti", "collapse": "Suskleisti",
"collapse_all": "Suskleisti viską", "collapse_all": "Suskleisti viską",
"color": "Spalva",
"color_theme": "Temos spalva", "color_theme": "Temos spalva",
"comment_deleted": "Komentaras ištrintas", "comment_deleted": "Komentaras ištrintas",
"comment_options": "Komentarų parinktys", "comment_options": "Komentarų parinktys",
"comments_and_likes": "Komentarai ir patiktukai", "comments_and_likes": "Komentarai ir patiktukai",
"comments_are_disabled": "Komentarai yra išjungti", "comments_are_disabled": "Komentarai yra išjungti",
"common_create_new_album": "Sukurti naują albumą",
"common_server_error": "Prašome patikrinti tinklo prisijungimą ir įsitikinti, kad serveris pasiekiamas ir programos/serverio versija sutampa.",
"completed": "Atlikta",
"confirm": "Patvirtinti", "confirm": "Patvirtinti",
"confirm_admin_password": "Patvirtinti administratoriaus slaptažodį", "confirm_admin_password": "Patvirtinti administratoriaus slaptažodį",
"confirm_delete_face": "Ar tikrai norite ištrinti {name} veidą iš elementų?",
"confirm_delete_shared_link": "Ar tikrai norite ištrinti šią bendrinimo nuorodą?", "confirm_delete_shared_link": "Ar tikrai norite ištrinti šią bendrinimo nuorodą?",
"confirm_keep_this_delete_others": "Visi kiti elementai iš krūvos bus ištrinti išskyrus šį elementą. Ar tikrai norite tęsti?",
"confirm_new_pin_code": "Patvirtinkite naują PIN kodą",
"confirm_password": "Patvirtinti slaptažodį", "confirm_password": "Patvirtinti slaptažodį",
"confirm_tag_face": "Ar norite priskirti šį veidą kaip {name}?",
"confirm_tag_face_unnamed": "Ar norite priskirti šį veidą?",
"connected_device": "Prijungtas įrenginys",
"connected_to": "Prisijungta prie",
"contain": "Tilpti",
"context": "Kontekstas", "context": "Kontekstas",
"continue": "Tęsti", "continue": "Tęsti",
"control_bottom_app_bar_create_new_album": "Sukurti naują albumą",
"control_bottom_app_bar_delete_from_immich": "Ištrinti iš Immich",
"control_bottom_app_bar_delete_from_local": "Ištrinti iš įrenginio",
"control_bottom_app_bar_edit_location": "Redaguoti vietovę",
"control_bottom_app_bar_edit_time": "Redaguoti datą ir laiką",
"control_bottom_app_bar_share_link": "Dalintis nuoroda",
"control_bottom_app_bar_share_to": "Dalintis su",
"control_bottom_app_bar_trash_from_immich": "Perkelti į šiukšliadėžę",
"copied_image_to_clipboard": "Nuotrauka nukopijuota į iškarpinę.", "copied_image_to_clipboard": "Nuotrauka nukopijuota į iškarpinę.",
"copied_to_clipboard": "Nukopijuota į iškapinę!", "copied_to_clipboard": "Nukopijuota į iškapinę!",
"copy_error": "Kopijavimo klaida", "copy_error": "Kopijavimo klaida",
@@ -462,6 +716,8 @@
"copy_password": "Kopijuoti slaptažodį", "copy_password": "Kopijuoti slaptažodį",
"copy_to_clipboard": "Kopijuoti į iškarpinę", "copy_to_clipboard": "Kopijuoti į iškarpinę",
"country": "Šalis", "country": "Šalis",
"cover": "Užpildyti",
"covers": "Viršeliai",
"create": "Sukurti", "create": "Sukurti",
"create_album": "Sukurti albumą", "create_album": "Sukurti albumą",
"create_album_page_untitled": "Be pavadinimo", "create_album_page_untitled": "Be pavadinimo",
@@ -469,57 +725,115 @@
"create_link": "Sukurti nuorodą", "create_link": "Sukurti nuorodą",
"create_link_to_share": "Sukurti bendrinimo nuorodą", "create_link_to_share": "Sukurti bendrinimo nuorodą",
"create_link_to_share_description": "Leisti bet kam su nuoroda matyti pažymėtą(-as) nuotrauką(-as)", "create_link_to_share_description": "Leisti bet kam su nuoroda matyti pažymėtą(-as) nuotrauką(-as)",
"create_new": "SUKURTI NAUJĄ",
"create_new_person": "Sukurti naują žmogų", "create_new_person": "Sukurti naują žmogų",
"create_new_person_hint": "Priskirti pasirinktus elementus naujam žmogui", "create_new_person_hint": "Priskirti pasirinktus elementus naujam žmogui",
"create_new_user": "Sukurti naują varotoją", "create_new_user": "Sukurti naują varotoją",
"create_shared_album_page_share_add_assets": "PRIDĖTI ELEMENTŲ",
"create_shared_album_page_share_select_photos": "Pažymėti nuotraukas",
"create_shared_link": "Sukurti dalijimosi nuorodą",
"create_tag": "Sukurti žymą", "create_tag": "Sukurti žymą",
"create_tag_description": "Sukurti naują žymą. Įdėtinėms žymoms įveskite pilną kelią, įskaitant pasviruosius brūkšnius.", "create_tag_description": "Sukurti naują žymą. Įdėtinėms žymoms įveskite pilną kelią, įskaitant pasviruosius brūkšnius.",
"create_user": "Sukurti naudotoją", "create_user": "Sukurti naudotoją",
"created": "Sukurta", "created": "Sukurta",
"created_at": "Sukurta",
"crop": "Apkirpti",
"curated_object_page_title": "Daiktai",
"current_device": "Dabartinis įrenginys", "current_device": "Dabartinis įrenginys",
"current_pin_code": "Dabartinis PIN kodas",
"current_server_address": "Dabartinis serverio adresas",
"custom_locale": "Pasirinktinė vietovė",
"custom_locale_description": "Formatuoti datas ir skaičius pagal kalbą ir regioną", "custom_locale_description": "Formatuoti datas ir skaičius pagal kalbą ir regioną",
"custom_url": "Pasirinktinis URL",
"daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy",
"dark": "Tamsi",
"dark_theme": "Perjungti tamsią temą",
"date_after": "Data po", "date_after": "Data po",
"date_and_time": "Data ir laikas", "date_and_time": "Data ir laikas",
"date_before": "Data prieš", "date_before": "Data prieš",
"date_format": "E, LLL d, y • h:mm",
"date_of_birth_saved": "Gimimo data sėkmingai išsaugota", "date_of_birth_saved": "Gimimo data sėkmingai išsaugota",
"date_range": "Datų intervalas",
"day": "Diena", "day": "Diena",
"days": "Dienų",
"deduplicate_all": "Šalinti visus dublikatus", "deduplicate_all": "Šalinti visus dublikatus",
"deduplication_criteria_1": "Failo dydis baitais", "deduplication_criteria_1": "Failo dydis baitais",
"deduplication_criteria_2": "EXIF metaduomenų įrašų skaičius", "deduplication_criteria_2": "EXIF metaduomenų įrašų skaičius",
"deduplication_info": "Dublikatų šalinimo informacija", "deduplication_info": "Dublikatų šalinimo informacija",
"deduplication_info_description": "Automatinis elementų parinkimas ir masinis dublikatų šalinimas atliekamas atsižvelgiant į:", "deduplication_info_description": "Automatinis elementų parinkimas ir masinis dublikatų šalinimas atliekamas atsižvelgiant į:",
"default_locale": "Pradinė vietovė",
"default_locale_description": "Formatuoti datas ir skaičius pagal jūsų naršyklės lokalę", "default_locale_description": "Formatuoti datas ir skaičius pagal jūsų naršyklės lokalę",
"delete": "Ištrinti", "delete": "Ištrinti",
"delete_action_confirmation_message": "Ar tikrai norite ištrinti šį elementą? Šis veiksmas perkels elementą į serverio šiukšliadėžę ir paklaus ar norite ištrinti vietiniame įrenginyje",
"delete_action_prompt": "{count} ištrinta",
"delete_album": "Ištrinti albumą", "delete_album": "Ištrinti albumą",
"delete_api_key_prompt": "Ar tikrai norite ištrinti šį API raktą?", "delete_api_key_prompt": "Ar tikrai norite ištrinti šį API raktą?",
"delete_dialog_alert": "Šie elementai bus galutinai ištrinti iš Immich ir iš jūsų įrenginio",
"delete_dialog_alert_local": "Šie elementai bus galutinai pašalinti iš jūsų įrenginio, bet bus prieinami Immich serveryje",
"delete_dialog_alert_local_non_backed_up": "Kai kurie elementai be Immich atsarginės kopijos ir bus galutinai pašalinti iš jūsų įrenginio",
"delete_dialog_alert_remote": "Šie elementai bus galutinai ištrinti iš Immich serverio",
"delete_dialog_ok_force": "Vis tiek ištrinti",
"delete_dialog_title": "Ištrinti galutinai",
"delete_duplicates_confirmation": "Ar tikrai norite visam laikui ištrinti šiuos dublikatus?", "delete_duplicates_confirmation": "Ar tikrai norite visam laikui ištrinti šiuos dublikatus?",
"delete_face": "Ištrinti veidą",
"delete_key": "Ištrinti raktą", "delete_key": "Ištrinti raktą",
"delete_library": "Ištrinti biblioteką", "delete_library": "Ištrinti biblioteką",
"delete_link": "Ištrinti nuorodą", "delete_link": "Ištrinti nuorodą",
"delete_local_action_prompt": "{count} ištrinti vietiniame įrenginyje",
"delete_local_dialog_ok_backed_up_only": "Ištrinti tik turinčius atsarginę kopiją",
"delete_local_dialog_ok_force": "Vis tiek ištrinti",
"delete_others": "Ištrinti kitus",
"delete_permanently": "Ištrinti galutinai",
"delete_permanently_action_prompt": "{count} ištrinta galutinai",
"delete_shared_link": "Ištrinti bendrinimo nuorodą", "delete_shared_link": "Ištrinti bendrinimo nuorodą",
"delete_shared_link_dialog_title": "Ištrinti dalijimosi nuorodą",
"delete_tag": "Ištrinti žymą", "delete_tag": "Ištrinti žymą",
"delete_tag_confirmation_prompt": "Ar tikrai norite ištrinti žymą {tagName}?", "delete_tag_confirmation_prompt": "Ar tikrai norite ištrinti žymą {tagName}?",
"delete_user": "Ištrinti naudotoją", "delete_user": "Ištrinti naudotoją",
"deleted_shared_link": "Bendrinimo nuoroda ištrinta", "deleted_shared_link": "Bendrinimo nuoroda ištrinta",
"deletes_missing_assets": "Ištrinti diske trūkstamus elementus",
"description": "Aprašymas", "description": "Aprašymas",
"description_input_hint_text": "Pridėti aprašymą...",
"description_input_submit_error": "Klaida atnaujinant aprašymą, pasitikrinkite žurnalą norint detalesnės informacijos",
"deselect_all": "Atžymėti visus",
"details": "Detalės", "details": "Detalės",
"direction": "Kryptis", "direction": "Kryptis",
"disabled": "Išjungta", "disabled": "Išjungta",
"disallow_edits": "Neleisti redaguoti", "disallow_edits": "Neleisti redaguoti",
"discord": "Discord",
"discover": "Atrasti", "discover": "Atrasti",
"discovered_devices": "Aptikti įrenginiai",
"dismiss_all_errors": "Nepaisyti visų klaidų", "dismiss_all_errors": "Nepaisyti visų klaidų",
"dismiss_error": "Nepaisyti klaidos", "dismiss_error": "Nepaisyti klaidos",
"display_options": "Atvaizdavimo parinktys",
"display_order": "Atvaizdavimo tvarka", "display_order": "Atvaizdavimo tvarka",
"display_original_photos": "Rodyti originalias nuotraukas", "display_original_photos": "Rodyti originalias nuotraukas",
"display_original_photos_setting_description": "Pirmenybė rodyti originalią nuotrauką vietoje miniatiūros kai originalo elementas yra palaikomas naršyklės. Tai gali lemti lėtesnį nuotraukos rodymo greitį.",
"do_not_show_again": "Daugiau nerodyti šio pranešimo", "do_not_show_again": "Daugiau nerodyti šio pranešimo",
"documentation": "Dokumentacija", "documentation": "Dokumentacija",
"done": "Atlikta",
"download": "Atsisiųsti", "download": "Atsisiųsti",
"download_action_prompt": "Atsisiunčiami {count} elementai",
"download_canceled": "Atsisiuntimas atšauktas",
"download_complete": "Atsisiuntimas pabaigtas",
"download_enqueue": "Atsisiuntimai įtraukti į eilę",
"download_error": "Atsisiuntimo klaida",
"download_failed": "Nepavyko parsisiųsti", "download_failed": "Nepavyko parsisiųsti",
"download_finished": "Atsisiuntimas pabaigtas",
"download_include_embedded_motion_videos": "Įterpti vaizdo įrašai",
"download_include_embedded_motion_videos_description": "Pridėti prie judesio nuotraukų įterptus video kaip atskirą failą", "download_include_embedded_motion_videos_description": "Pridėti prie judesio nuotraukų įterptus video kaip atskirą failą",
"download_notfound": "Atsisiuntimas nerastas",
"download_paused": "Atsisiuntimas pristabdytas", "download_paused": "Atsisiuntimas pristabdytas",
"download_settings": "Atsisiųsti", "download_settings": "Atsisiųsti",
"download_settings_description": "Tvarkyti elementų atsisiuntimo nustatymus",
"download_started": "Atsisiuntimas pradėtas",
"download_sucess": "Atsisiuntimas pavyko",
"download_sucess_android": "Medija buvo atsiųsta į DCIM/Immich",
"download_waiting_to_retry": "Laukiama bandymo iš naujo",
"downloading": "Siunčiama", "downloading": "Siunčiama",
"downloading_asset_filename": "Parsisiunčiamas resursas {filename}", "downloading_asset_filename": "Parsisiunčiamas resursas {filename}",
"downloading_media": "Atsisiunčiama medija",
"drop_files_to_upload": "Užkelkite failus bet kurioje vietoje kad įkeltumėte", "drop_files_to_upload": "Užkelkite failus bet kurioje vietoje kad įkeltumėte",
"duplicates": "Dublikatai", "duplicates": "Dublikatai",
"duplicates_description": "Sutvarkykite kiekvieną elementų grupę nurodydami elementus, kurie yra dublikatai (jei tokių yra)", "duplicates_description": "Sutvarkykite kiekvieną elementų grupę nurodydami elementus, kurie yra dublikatai (jei tokių yra)",
@@ -527,8 +841,14 @@
"edit": "Redaguoti", "edit": "Redaguoti",
"edit_album": "Redaguoti albumą", "edit_album": "Redaguoti albumą",
"edit_avatar": "Redaguoti avatarą", "edit_avatar": "Redaguoti avatarą",
"edit_birthday": "Redaguoti gimtadienį",
"edit_date": "Redaguoti datą", "edit_date": "Redaguoti datą",
"edit_date_and_time": "Redaguoti datą ir laiką", "edit_date_and_time": "Redaguoti datą ir laiką",
"edit_date_and_time_action_prompt": "{count} data ir laikas redaguotas",
"edit_date_and_time_by_offset": "Keisti datą pagal poslinkį",
"edit_date_and_time_by_offset_interval": "Naujas datos intervalas: {from} - {to}",
"edit_description": "Redaguoti aprašymą",
"edit_description_prompt": "Prašome pasirinkti naują aprašymą:",
"edit_exclusion_pattern": "Redaguoti išimčių šabloną", "edit_exclusion_pattern": "Redaguoti išimčių šabloną",
"edit_faces": "Redaguoti veidus", "edit_faces": "Redaguoti veidus",
"edit_import_path": "Redaguoti importavimo kelią", "edit_import_path": "Redaguoti importavimo kelią",
@@ -536,41 +856,79 @@
"edit_key": "Redaguoti raktą", "edit_key": "Redaguoti raktą",
"edit_link": "Redaguoti nuorodą", "edit_link": "Redaguoti nuorodą",
"edit_location": "Redaguoti vietovę", "edit_location": "Redaguoti vietovę",
"edit_location_action_prompt": "{count} vietovės pakeistos",
"edit_location_dialog_title": "Vietovė",
"edit_name": "Redaguoti vardą", "edit_name": "Redaguoti vardą",
"edit_people": "Redaguoti žmones", "edit_people": "Redaguoti žmones",
"edit_tag": "Redaguoti žymą", "edit_tag": "Redaguoti žymą",
"edit_title": "Redaguoti antraštę", "edit_title": "Redaguoti antraštę",
"edit_user": "Redaguoti naudotoją", "edit_user": "Redaguoti naudotoją",
"edited": "Redaguota", "edited": "Redaguota",
"editor": "Redaktorius",
"editor_close_without_save_prompt": "Pakeitimai nebus išsaugoti",
"editor_close_without_save_title": "Uždaryti redaktorių?",
"editor_crop_tool_h2_aspect_ratios": "Vaizdo santykis",
"editor_crop_tool_h2_rotation": "Pasukimas",
"email": "El. paštas", "email": "El. paštas",
"email_notifications": "El. pašto pranešimai",
"empty_folder": "Šis katalogas yra tuščias",
"empty_trash": "Ištuštinti šiukšliadėžę", "empty_trash": "Ištuštinti šiukšliadėžę",
"empty_trash_confirmation": "Ar tikrai norite ištuštinti šiukšliadėžę? Tai galutinai pašalins elementus iš Immich.\nJūs negalėsite atkurti šio veiksmo!",
"enable": "Įgalinti", "enable": "Įgalinti",
"enable_backup": "Įgalinti atsargines kopijas",
"enable_biometric_auth_description": "Įveskite savo PIN kodą biometrinės autentifikacijos įjungimui",
"enabled": "Įgalintas", "enabled": "Įgalintas",
"end_date": "Pabaigos data", "end_date": "Pabaigos data",
"enter_wifi_name": "Enter WiFi name", "enqueued": "Įtraukta į eilę",
"enter_wifi_name": "Įveskite Wi-Fi pavadinimą",
"enter_your_pin_code": "Įveskite savo PIN kodą",
"enter_your_pin_code_subtitle": "Įveskite savo PIN kodą, kad pasiektumėte užrakintą aplanką", "enter_your_pin_code_subtitle": "Įveskite savo PIN kodą, kad pasiektumėte užrakintą aplanką",
"error": "Klaida", "error": "Klaida",
"error_change_sort_album": "Nepavyko pakeisti albumo rūšiavimo tvarkos",
"error_delete_face": "Klaida trinant veidą iš elementų",
"error_loading_image": "Klaida įkeliant vaizdą", "error_loading_image": "Klaida įkeliant vaizdą",
"error_saving_image": "Klaida: {error}",
"error_tag_face_bounding_box": "Klaida aprašant veidą - nepavyko gauti veido vietos koordinačių",
"error_title": "Klaida - Kažkas nutiko ne taip", "error_title": "Klaida - Kažkas nutiko ne taip",
"errors": { "errors": {
"cannot_navigate_next_asset": "Negalima pereiti prie sekančio elemento",
"cannot_navigate_previous_asset": "Negalima pereiti prie buvusio elemento",
"cant_apply_changes": "Negalima taikyti pakeitimų", "cant_apply_changes": "Negalima taikyti pakeitimų",
"cant_change_activity": "Negalima {enabled, select, true {išjungti} other {įjungti}} veiklos",
"cant_change_asset_favorite": "Elementui negalima pakeisti mėgstamiausio",
"cant_change_metadata_assets_count": "Negalima pakeisti {count, plural, one {# elemento} other {# elementų}} metadata",
"cant_get_faces": "Nepavyko gauti veidus",
"cant_get_number_of_comments": "Nepavyko gauti komentarų skaičiaus",
"cant_search_people": "Negalima ieškoti žmonių",
"cant_search_places": "Negalima ieškoti vietovių",
"error_adding_assets_to_album": "Klaida pridedant elementus į albumą", "error_adding_assets_to_album": "Klaida pridedant elementus į albumą",
"error_adding_users_to_album": "Klaida pridedant naudotojus prie albumo", "error_adding_users_to_album": "Klaida pridedant naudotojus prie albumo",
"error_deleting_shared_user": "Klaida trinant pasidalintą naudotoją",
"error_downloading": "Klaida atsisiunčiant {filename}", "error_downloading": "Klaida atsisiunčiant {filename}",
"error_hiding_buy_button": "Klaida slepiant pirkimo mygtuką", "error_hiding_buy_button": "Klaida slepiant pirkimo mygtuką",
"error_removing_assets_from_album": "Klaida šalinant elementus iš albumo, patikrinkite konsolę dėl išsamesnės informacijos", "error_removing_assets_from_album": "Klaida šalinant elementus iš albumo, patikrinkite konsolę dėl išsamesnės informacijos",
"error_selecting_all_assets": "Klaida pasirenkant visus elementus",
"exclusion_pattern_already_exists": "Šis išimčių šablonas jau egzistuoja.", "exclusion_pattern_already_exists": "Šis išimčių šablonas jau egzistuoja.",
"failed_to_create_album": "Nepavyko sukurti albumo", "failed_to_create_album": "Nepavyko sukurti albumo",
"failed_to_create_shared_link": "Nepavyko sukurti bendrinimo nuorodos", "failed_to_create_shared_link": "Nepavyko sukurti bendrinimo nuorodos",
"failed_to_edit_shared_link": "Nepavyko redaguoti bendrinimo nuorodos", "failed_to_edit_shared_link": "Nepavyko redaguoti bendrinimo nuorodos",
"failed_to_get_people": "Nepavyko gauti žmonių",
"failed_to_keep_this_delete_others": "Nepavyko palikti šį elementą ir ištrinti kitus elementus",
"failed_to_load_asset": "Nepavyko užkrauti elemento",
"failed_to_load_assets": "Nepavyko užrauti elementų",
"failed_to_load_notifications": "Nepavyko užkrauti pranešimų",
"failed_to_load_people": "Nepavyko užkrauti žmonių", "failed_to_load_people": "Nepavyko užkrauti žmonių",
"failed_to_remove_product_key": "Nepavyko pašalinti produkto rakto", "failed_to_remove_product_key": "Nepavyko pašalinti produkto rakto",
"failed_to_reset_pin_code": "Nepavyko atkurti PIN kodo",
"failed_to_stack_assets": "Nepavyko sugrupuoti elementų", "failed_to_stack_assets": "Nepavyko sugrupuoti elementų",
"failed_to_unstack_assets": "Nepavyko išgrupuoti elementų", "failed_to_unstack_assets": "Nepavyko išgrupuoti elementų",
"failed_to_update_notification_status": "Nepavyko atnaujinti pranešimo statuso",
"import_path_already_exists": "Šis importavimo kelias jau egzistuoja.", "import_path_already_exists": "Šis importavimo kelias jau egzistuoja.",
"incorrect_email_or_password": "Neteisingas el. pašto adresas arba slaptažodis", "incorrect_email_or_password": "Neteisingas el. pašto adresas arba slaptažodis",
"paths_validation_failed": "Nepavyko {paths, plural, one {# kelio} other {# kelių}} patvirtinimas",
"profile_picture_transparent_pixels": "Profilio nuotrauka negali turėti permatomų pikselių. Prašome priartinti ir/arba perkelkite nuotrauką.", "profile_picture_transparent_pixels": "Profilio nuotrauka negali turėti permatomų pikselių. Prašome priartinti ir/arba perkelkite nuotrauką.",
"quota_higher_than_disk_size": "Nustatyta kvota, viršija disko dydį", "quota_higher_than_disk_size": "Nustatyta kvota, viršija disko dydį",
"something_went_wrong": "Kažkas nepavyko",
"unable_to_add_album_users": "Nepavyksta pridėti naudotojų prie albumo", "unable_to_add_album_users": "Nepavyksta pridėti naudotojų prie albumo",
"unable_to_add_assets_to_shared_link": "Nepavyko į bendrinimo nuorodą pridėti elementų", "unable_to_add_assets_to_shared_link": "Nepavyko į bendrinimo nuorodą pridėti elementų",
"unable_to_add_comment": "Nepavyksta pridėti komentaro", "unable_to_add_comment": "Nepavyksta pridėti komentaro",
@@ -578,11 +936,15 @@
"unable_to_add_import_path": "Nepavyksta pridėti importavimo kelio", "unable_to_add_import_path": "Nepavyksta pridėti importavimo kelio",
"unable_to_add_partners": "Nepavyksta pridėti partnerių", "unable_to_add_partners": "Nepavyksta pridėti partnerių",
"unable_to_add_remove_archive": "Nepavyko {archived, select, true {ištraukti iš} other {pridėti prie}} arcyhvo", "unable_to_add_remove_archive": "Nepavyko {archived, select, true {ištraukti iš} other {pridėti prie}} arcyhvo",
"unable_to_add_remove_favorites": "Nepavyko {favorite, select, true {įtraukti elemento į mėgstamiausius} other {pašalinti elemento iš mėgstamiausių}}",
"unable_to_archive_unarchive": "Nepavyko {archived, select, true {archyvuoti} other {išarchyvuoti}}", "unable_to_archive_unarchive": "Nepavyko {archived, select, true {archyvuoti} other {išarchyvuoti}}",
"unable_to_change_album_user_role": "Nepavyksta pakeisti albumo naudotojo rolės", "unable_to_change_album_user_role": "Nepavyksta pakeisti albumo naudotojo rolės",
"unable_to_change_date": "Negalima pakeisti datos", "unable_to_change_date": "Negalima pakeisti datos",
"unable_to_change_description": "Nepavyko pakeisti aprašymo",
"unable_to_change_favorite": "Nepavyko pakeisti elementui mėgstamiausio",
"unable_to_change_location": "Negalima pakeisti vietos", "unable_to_change_location": "Negalima pakeisti vietos",
"unable_to_change_password": "Negalima pakeisti slaptažodžio", "unable_to_change_password": "Negalima pakeisti slaptažodžio",
"unable_to_change_visibility": "Nepavyko pakeisti matomumo {count, plural, one {# asmeniui} few {#asmenims} other {# asmenų}}",
"unable_to_complete_oauth_login": "Nepavyko prisijungti su OAuth", "unable_to_complete_oauth_login": "Nepavyko prisijungti su OAuth",
"unable_to_connect": "Nepavyko prisijungti", "unable_to_connect": "Nepavyko prisijungti",
"unable_to_copy_to_clipboard": "Negalima kopijuoti į iškarpinę, įsitikinkite, kad prie puslapio prieinate per https", "unable_to_copy_to_clipboard": "Negalima kopijuoti į iškarpinę, įsitikinkite, kad prie puslapio prieinate per https",
@@ -591,6 +953,8 @@
"unable_to_create_library": "Nepavyko sukurti bibliotekos", "unable_to_create_library": "Nepavyko sukurti bibliotekos",
"unable_to_create_user": "Nepavyko sukurti naudotojo", "unable_to_create_user": "Nepavyko sukurti naudotojo",
"unable_to_delete_album": "Nepavyksta ištrinti albumo", "unable_to_delete_album": "Nepavyksta ištrinti albumo",
"unable_to_delete_asset": "Nepavyko ištrinti elemento",
"unable_to_delete_assets": "Klaida trinant elementus",
"unable_to_delete_exclusion_pattern": "Nepavyksta ištrinti išimčių šablono", "unable_to_delete_exclusion_pattern": "Nepavyksta ištrinti išimčių šablono",
"unable_to_delete_import_path": "Nepavyksta ištrinti importavimo kelio", "unable_to_delete_import_path": "Nepavyksta ištrinti importavimo kelio",
"unable_to_delete_shared_link": "Nepavyko ištrinti bendrinimo nuorodos", "unable_to_delete_shared_link": "Nepavyko ištrinti bendrinimo nuorodos",
@@ -598,22 +962,37 @@
"unable_to_download_files": "Nepavyksta atsisiųsti failų", "unable_to_download_files": "Nepavyksta atsisiųsti failų",
"unable_to_edit_exclusion_pattern": "Nepavyksta redaguoti išimčių šablono", "unable_to_edit_exclusion_pattern": "Nepavyksta redaguoti išimčių šablono",
"unable_to_edit_import_path": "Nepavyksta redaguoti išimčių kelio", "unable_to_edit_import_path": "Nepavyksta redaguoti išimčių kelio",
"unable_to_empty_trash": "Nepavyko ištrinti šiukšliadėžės",
"unable_to_enter_fullscreen": "Nepavyksta pereiti į viso ekrano režimą", "unable_to_enter_fullscreen": "Nepavyksta pereiti į viso ekrano režimą",
"unable_to_exit_fullscreen": "Nepavyksta išeiti iš viso ekrano režimo", "unable_to_exit_fullscreen": "Nepavyksta išeiti iš viso ekrano režimo",
"unable_to_get_comments_number": "Nepavyko gauti komentarų skaičiaus",
"unable_to_get_shared_link": "Nepavyko gauti bendrinimo nuorodos", "unable_to_get_shared_link": "Nepavyko gauti bendrinimo nuorodos",
"unable_to_hide_person": "Nepavyksta paslėpti žmogaus", "unable_to_hide_person": "Nepavyksta paslėpti žmogaus",
"unable_to_link_motion_video": "Nepavyko susieti judesio video",
"unable_to_link_oauth_account": "Nepavyko susieti su OAuth paskyra", "unable_to_link_oauth_account": "Nepavyko susieti su OAuth paskyra",
"unable_to_log_out_all_devices": "Nepavyksta atjungti visų įrenginių", "unable_to_log_out_all_devices": "Nepavyksta atjungti visų įrenginių",
"unable_to_log_out_device": "Nepavyksta atjungti įrenginio", "unable_to_log_out_device": "Nepavyksta atjungti įrenginio",
"unable_to_login_with_oauth": "Nepavyko prisijungti su OAuth", "unable_to_login_with_oauth": "Nepavyko prisijungti su OAuth",
"unable_to_play_video": "Nepavyksta paleisti vaizdo įrašo", "unable_to_play_video": "Nepavyksta paleisti vaizdo įrašo",
"unable_to_reassign_assets_existing_person": "Nepavyko priskirti elementų {name, select, null {egzistuojančiam asmeniui} other {{name}}}",
"unable_to_reassign_assets_new_person": "Nepavyko priskirti elementų naujam asmeniui",
"unable_to_refresh_user": "Nepavyksta atnaujinti naudotojo", "unable_to_refresh_user": "Nepavyksta atnaujinti naudotojo",
"unable_to_remove_album_users": "Nepavyko pašalinti naudotojų iš albumo",
"unable_to_remove_api_key": "Nepavyko pašalinti API rakto", "unable_to_remove_api_key": "Nepavyko pašalinti API rakto",
"unable_to_remove_assets_from_shared_link": "Nepavyko iš bendrinimo nuorodos pašalinti elementų", "unable_to_remove_assets_from_shared_link": "Nepavyko iš bendrinimo nuorodos pašalinti elementų",
"unable_to_remove_library": "Nepavyksta pašalinti bibliotekos", "unable_to_remove_library": "Nepavyksta pašalinti bibliotekos",
"unable_to_remove_partner": "Nepavyksta pašalinti partnerio", "unable_to_remove_partner": "Nepavyksta pašalinti partnerio",
"unable_to_remove_reaction": "Nepavyksta pašalinti reakcijos", "unable_to_remove_reaction": "Nepavyksta pašalinti reakcijos",
"unable_to_reset_password": "Nepavyko atnaujinti slaptažodžio",
"unable_to_reset_pin_code": "Nepavyko atnaujinti PIN kodo",
"unable_to_resolve_duplicate": "Nepavyko sutvarkyti dublikatų", "unable_to_resolve_duplicate": "Nepavyko sutvarkyti dublikatų",
"unable_to_restore_assets": "Nepavyko atstatyti elementų",
"unable_to_restore_trash": "Nepavyko atstatyti iš šiukšliadėžės",
"unable_to_restore_user": "Nepavyko atstatyti naudotojo",
"unable_to_save_album": "Nepavyko išsaugoti albumo",
"unable_to_save_api_key": "Nepavyko išsaugoti API rakto",
"unable_to_save_date_of_birth": "Nepavyko išsaugoti gimimo datos",
"unable_to_save_name": "Nepavyko išsaugoti vardo",
"unable_to_save_profile": "Nepavyko išsaugoti profilio", "unable_to_save_profile": "Nepavyko išsaugoti profilio",
"unable_to_save_settings": "Nepavyksta išsaugoti nustatymų", "unable_to_save_settings": "Nepavyksta išsaugoti nustatymų",
"unable_to_scan_libraries": "Nepavyksta nuskaityti bibliotekų", "unable_to_scan_libraries": "Nepavyksta nuskaityti bibliotekų",
@@ -622,39 +1001,104 @@
"unable_to_set_profile_picture": "Nepavyksta nustatyti profilio nuotraukos", "unable_to_set_profile_picture": "Nepavyksta nustatyti profilio nuotraukos",
"unable_to_submit_job": "Napvyko sukurti užduoties", "unable_to_submit_job": "Napvyko sukurti užduoties",
"unable_to_trash_asset": "Nepavyko perkelti į šiukšliadėžę", "unable_to_trash_asset": "Nepavyko perkelti į šiukšliadėžę",
"unable_to_unlink_account": "Nepavyko atsieti paskyrų",
"unable_to_unlink_motion_video": "Nepavyko atsieti judesio video",
"unable_to_update_album_cover": "Nepavyko atnaujinti albumo viršelio",
"unable_to_update_album_info": "Nepavyko atnaujinti albumo informacijos",
"unable_to_update_library": "Nepavyko atnaujinti bibliotekos",
"unable_to_update_location": "Nepavyko atnaujinti vietovės",
"unable_to_update_settings": "Nepavyko atnaujinti nustatymų",
"unable_to_update_timeline_display_status": "Nepavyko atnaujinti laiko juostos rodymo statuso",
"unable_to_update_user": "Nepavyko atnaujinti naudotoją",
"unable_to_upload_file": "Nepavyksta įkelti failo" "unable_to_upload_file": "Nepavyksta įkelti failo"
}, },
"exif": "Exif",
"exif_bottom_sheet_description": "Pridėti aprašymą...",
"exif_bottom_sheet_description_error": "Klaida atnaujinant aprašymą",
"exif_bottom_sheet_details": "DETALĖS",
"exif_bottom_sheet_location": "VIETOVĖ",
"exif_bottom_sheet_people": "ŽMONĖS",
"exif_bottom_sheet_person_add_person": "Pridėti vardą",
"exit_slideshow": "Išeiti iš skaidrių peržiūros", "exit_slideshow": "Išeiti iš skaidrių peržiūros",
"expand_all": "Išskleisti viską", "expand_all": "Išskleisti viską",
"experimental_settings_new_asset_list_subtitle": "Dirbama",
"experimental_settings_new_asset_list_title": "Įgalinti eksperimentinį nuotraukų tinklelį",
"experimental_settings_subtitle": "Naudokite savo pačių rizika!",
"experimental_settings_title": "Eksperimentinis",
"expire_after": "Galiojimas baigiasi",
"expired": "Nebegalioja", "expired": "Nebegalioja",
"expires_date": "Nebegalios už {date}", "expires_date": "Nebegalios už {date}",
"explore": "Naršyti", "explore": "Naršyti",
"explorer": "Naršyklė",
"export": "Eksportuoti", "export": "Eksportuoti",
"export_as_json": "Eksportuoti kaip JSON", "export_as_json": "Eksportuoti kaip JSON",
"export_database": "Eksportuoti duomenų bazę",
"export_database_description": "Eksportuoti SQLite duomenų bazę",
"extension": "Plėtinys", "extension": "Plėtinys",
"external": "Išorinis", "external": "Išorinis",
"external_libraries": "Išorinės bibliotekos", "external_libraries": "Išorinės bibliotekos",
"external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom", "external_network": "Išorinis tinklas",
"external_network_sheet_info": "Kai neprisijungta prie pageidaujamo Wi-Fi tinklo, programa jungsis prie serverio per pirmą URL nuorodą, kurią galės pasiekti, pradedant nuo viršaus į apačią",
"face_unassigned": "Nepriskirta", "face_unassigned": "Nepriskirta",
"failed": "Įvyko klaida", "failed": "Įvyko klaida",
"failed_to_authenticate": "Nepavyko autentifikuoti",
"failed_to_load_assets": "Nepavyko įkelti elementų",
"failed_to_load_folder": "Nepavyko įkelti katalogą",
"favorite": "Mėgstamiausias", "favorite": "Mėgstamiausias",
"favorite_action_prompt": "{count} pridėta prie mėgstamiausių",
"favorite_or_unfavorite_photo": "Įtraukti prie arba pašalinti iš mėgstamiausių", "favorite_or_unfavorite_photo": "Įtraukti prie arba pašalinti iš mėgstamiausių",
"favorites": "Mėgstamiausi", "favorites": "Mėgstamiausi",
"favorites_page_no_favorites": "Nerasta mėgstamiausių elementų",
"feature_photo_updated": "Pageidaujama nuotrauka atnaujinta",
"features": "Funkcijos", "features": "Funkcijos",
"features_setting_description": "Valdyti aplikacijos funkcijas", "features_setting_description": "Valdyti aplikacijos funkcijas",
"file_name": "Failo pavadinimas", "file_name": "Failo pavadinimas",
"file_name_or_extension": "Failo pavadinimas arba plėtinys", "file_name_or_extension": "Failo pavadinimas arba plėtinys",
"filename": "Failopavadinimas", "filename": "Failopavadinimas",
"filetype": "Failo tipas", "filetype": "Failo tipas",
"filter": "Filtras",
"filter_people": "Filtruoti žmones", "filter_people": "Filtruoti žmones",
"filter_places": "Filtruoti vietoves",
"find_them_fast": "Raskite greitai paieškoje pagal vardą",
"first": "Pirmas",
"fix_incorrect_match": "Pataisyti neteisingą porą",
"folder": "Katalogas",
"folder_not_found": "Katalogas nerastas",
"folders": "Aplankai", "folders": "Aplankai",
"folders_feature_description": "Peržiūrėkite failų sistemoje esančias nuotraukas ir vaizdo įrašus aplankų rodinyje", "folders_feature_description": "Peržiūrėkite failų sistemoje esančias nuotraukas ir vaizdo įrašus aplankų rodinyje",
"forgot_pin_code_question": "Pamiršote savo PIN?",
"forward": "Pirmyn",
"gcast_enabled": "Google Cast",
"gcast_enabled_description": "Kad veiktų, ši funkcija įkelia išorinius „Google“ išteklius.",
"general": "Bendri",
"geolocation_instruction_location": "Paspauskite ant elemento su GPS koordinatėmis norint naudoti tą vietovę arba pasirinkite vietovę tiesiogiai žemėlapyje",
"get_help": "Gauti pagalbos", "get_help": "Gauti pagalbos",
"get_wifiname_error": "Nepavyko gauti Wi-Fi pavadinimo. Įsitikinkite, kad suteikti būtini leidimai ir esate prisijungę prie Wi-Fi tinklo",
"getting_started": "Pradedama",
"go_back": "Eiti atgal",
"go_to_folder": "Eiti į katalogą",
"go_to_search": "Eiti į paiešką",
"gps": "GPS",
"gps_missing": "Be GPS",
"grant_permission": "Suteikti leidimą",
"group_albums_by": "Grupuoti albumus pagal...", "group_albums_by": "Grupuoti albumus pagal...",
"group_country": "Grupuoti pagal šalis",
"group_no": "Negrupuoti", "group_no": "Negrupuoti",
"group_owner": "Grupuoti pagal savininką", "group_owner": "Grupuoti pagal savininką",
"group_places_by": "Grupuoti vietoves pagal...",
"group_year": "Grupuoti pagal metus", "group_year": "Grupuoti pagal metus",
"haptic_feedback_switch": "Įjungti haptinį grįžtamąjį ryšį",
"haptic_feedback_title": "Haptinis grįžtamasis ryšys",
"has_quota": "Turi kvotą", "has_quota": "Turi kvotą",
"hash_asset": "Maišymo elementas",
"hashed_assets": "Sumaišyti elementai",
"hashing": "Maišoma",
"header_settings_add_header_tip": "Pridėti antraštę",
"header_settings_field_validator_msg": "Reikšmė negali būti tuščia",
"header_settings_header_name_input": "Antraštės pavadinimas",
"header_settings_header_value_input": "Antraštės reikšmė",
"headers_settings_tile_subtitle": "Apibrėžkite tarpinio serverio antraštes, kurias programa turėtų siųsti su kiekviena tinklo užklausa",
"headers_settings_tile_title": "Pasirinktinės tarpinio serverio antraštės",
"hi_user": "Labas {name} ({email})", "hi_user": "Labas {name} ({email})",
"hide_all_people": "Slėpti visus asmenis", "hide_all_people": "Slėpti visus asmenis",
"hide_gallery": "Slėpti galeriją", "hide_gallery": "Slėpti galeriją",
@@ -662,7 +1106,17 @@
"hide_password": "Slėpti slaptažodį", "hide_password": "Slėpti slaptažodį",
"hide_person": "Slėpti asmenį", "hide_person": "Slėpti asmenį",
"hide_unnamed_people": "Slėpti neįvardintus asmenis", "hide_unnamed_people": "Slėpti neįvardintus asmenis",
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).", "home_page_add_to_album_conflicts": "Pridėta {added} elementų į albumą {album}. {failed} elementai jau yra albume.",
"home_page_add_to_album_err_local": "Kol kas negalima pridėti vietinių elementų į albumus, praleidžiama",
"home_page_add_to_album_success": "Pridėta {added} elementų į albumą {album}.",
"home_page_album_err_partner": "Kol kas negalima pridėti partnerio elementų į albumą, praleidžiama",
"home_page_archive_err_local": "Kol kas negalima archyvuoti vietinių elementų, praleidžiama",
"home_page_archive_err_partner": "Negalima archyvuoti partnerio elementų, praleidžiama",
"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_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_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_locked_error_partner": "Nepavyko perkelti partnerio failų į užrakintą aplanką, praleidžiama",
"hour": "Valanda", "hour": "Valanda",
@@ -707,7 +1161,7 @@
"list": "Sąrašas", "list": "Sąrašas",
"loading": "Kraunama", "loading": "Kraunama",
"loading_search_results_failed": "Nepavyko užkrauti paieškos rezultatų", "loading_search_results_failed": "Nepavyko užkrauti paieškos rezultatų",
"location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name", "location_permission_content": "Norint naudoti automatinio persijungimo opciją, Immich reikia tikslios vietovės leidimo, kad galėtų nuskaityti Wi-Fi tinklo pavadinimą",
"locked_folder": "Užrakintas aplankas", "locked_folder": "Užrakintas aplankas",
"log_out": "Atsijungti", "log_out": "Atsijungti",
"log_out_all_devices": "Atsijungti iš visų įrenginių", "log_out_all_devices": "Atsijungti iš visų įrenginių",
@@ -727,7 +1181,10 @@
"manage_your_devices": "Valdyti prijungtus įrenginius", "manage_your_devices": "Valdyti prijungtus įrenginius",
"manage_your_oauth_connection": "Tvarkyti OAuth prisijungimą", "manage_your_oauth_connection": "Tvarkyti OAuth prisijungimą",
"map": "Žemėlapis", "map": "Žemėlapis",
"map_assets_in_bounds": "{count, plural, =0 {Nuotraukų nėra} one {# nuotrauka} other {# nuotraukos}}",
"map_settings": "Žemėlapio nustatymai", "map_settings": "Žemėlapio nustatymai",
"map_settings_date_range_option_days": "Pastarąsias {days} dienas",
"map_settings_date_range_option_years": "Pastaruosius {years} metus",
"map_settings_include_show_archived": "Įtraukti archyvuotus", "map_settings_include_show_archived": "Įtraukti archyvuotus",
"matches": "Atitikmenys", "matches": "Atitikmenys",
"media_type": "Laikmenos tipas", "media_type": "Laikmenos tipas",
@@ -785,6 +1242,7 @@
"notification_toggle_setting_description": "Įjungti el. pašto pranešimus", "notification_toggle_setting_description": "Įjungti el. pašto pranešimus",
"notifications": "Pranešimai", "notifications": "Pranešimai",
"notifications_setting_description": "Tvarkyti pranešimus", "notifications_setting_description": "Tvarkyti pranešimus",
"oauth": "OAuth",
"official_immich_resources": "Oficialūs Immich ištekliai", "official_immich_resources": "Oficialūs Immich ištekliai",
"offline": "Neprisijungęs", "offline": "Neprisijungęs",
"oldest_first": "Seniausias pirmas", "oldest_first": "Seniausias pirmas",
@@ -805,6 +1263,7 @@
"partner_can_access": "{partner} gali naudotis", "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_assets": "Visos jūsų nuotraukos ir vaizdo įrašai, išskyrus archyvuotus ir ištrintus",
"partner_can_access_location": "Vieta, kurioje darytos nuotraukos", "partner_can_access_location": "Vieta, kurioje darytos nuotraukos",
"partner_page_stop_sharing_content": "{partner} daugiau nebegalės pasiekti jūsų nuotraukų.",
"partners": "Partneriai", "partners": "Partneriai",
"password": "Slaptažodis", "password": "Slaptažodis",
"password_does_not_match": "Slaptažodis nesutampa", "password_does_not_match": "Slaptažodis nesutampa",
@@ -859,7 +1318,7 @@
"purchase_lifetime_description": "Pirkimas visam gyvenimui", "purchase_lifetime_description": "Pirkimas visam gyvenimui",
"purchase_option_title": "PIRKIMO PASIRINKIMAS", "purchase_option_title": "PIRKIMO PASIRINKIMAS",
"purchase_panel_info_1": "„Immich“ kūrimas užima daug laiko ir pastangų, o visą darbo dieną dirba inžinieriai, kad jis būtų kuo geresnis. Mūsų misija yra, kad atvirojo kodo programinė įranga ir etiška verslo praktika taptų tvariu kūrėjų pajamų šaltiniu ir sukurtų privatumą gerbiančią ekosistemą su realiomis alternatyvomis išnaudojamoms debesijos paslaugoms.", "purchase_panel_info_1": "„Immich“ kūrimas užima daug laiko ir pastangų, o visą darbo dieną dirba inžinieriai, kad jis būtų kuo geresnis. Mūsų misija yra, kad atvirojo kodo programinė įranga ir etiška verslo praktika taptų tvariu kūrėjų pajamų šaltiniu ir sukurtų privatumą gerbiančią ekosistemą su realiomis alternatyvomis išnaudojamoms debesijos paslaugoms.",
"purchase_panel_info_2": "Kadangi esame įsipareigoję nepridėti mokamų sienų, šis pirkinys nesuteiks jums jokių papildomų Immich funkcijų. Mes tikime, kad tokie naudotojai kaip jūs palaikys nuolatinį Immich vystymąsi.", "purchase_panel_info_2": "Kadangi esame įsipareigoję nepridėti mokamų sienų, šis pirkinys nesuteiks jums jokių papildomų Immich funkcijų. Mes tikime, kad tokie naudotojai kaip jūs palaikys nuolatinį Immich vystymąsi.",
"purchase_panel_title": "Palaikykite projektą", "purchase_panel_title": "Palaikykite projektą",
"purchase_per_server": "Vienam serveriui", "purchase_per_server": "Vienam serveriui",
"purchase_per_user": "Vienam naudotojui", "purchase_per_user": "Vienam naudotojui",
@@ -998,7 +1457,11 @@
"setting_image_viewer_preview_title": "Užkrauti peržiūros nuotrauką", "setting_image_viewer_preview_title": "Užkrauti peržiūros nuotrauką",
"setting_image_viewer_title": "Nuotraukos", "setting_image_viewer_title": "Nuotraukos",
"setting_languages_apply": "Pritaikyti", "setting_languages_apply": "Pritaikyti",
"setting_notifications_notify_failures_grace_period": "Informuoti apie foninio atsarginio kopijavimo nesėkmes: {duration}",
"setting_notifications_notify_hours": "{count} valandų",
"setting_notifications_notify_minutes": "{count} minučių",
"setting_notifications_notify_never": "niekada", "setting_notifications_notify_never": "niekada",
"setting_notifications_notify_seconds": "{count} sekundžių",
"setting_notifications_single_progress_subtitle": "Detali įkėlimo progreso informacija kiekvienam elementui", "setting_notifications_single_progress_subtitle": "Detali įkėlimo progreso informacija kiekvienam elementui",
"settings": "Nustatymai", "settings": "Nustatymai",
"settings_require_restart": "Prašome perkrauti Immich, siekiant pritaikyti šį nustatymą", "settings_require_restart": "Prašome perkrauti Immich, siekiant pritaikyti šį nustatymą",
@@ -1006,13 +1469,29 @@
"setup_pin_code": "Nustatyti PIN kodą", "setup_pin_code": "Nustatyti PIN kodą",
"share": "Dalintis", "share": "Dalintis",
"share_add_photos": "Įtraukti nuotraukų", "share_add_photos": "Įtraukti nuotraukų",
"share_assets_selected": "{count} pažymėta",
"share_dialog_preparing": "Ruošiama...", "share_dialog_preparing": "Ruošiama...",
"share_link": "Bendrinti nuorodą", "share_link": "Bendrinti nuorodą",
"shared": "Bendrinami", "shared": "Bendrinami",
"shared_by_user": "Bendrina {user}", "shared_by_user": "Bendrina {user}",
"shared_by_you": "Bendrinama jūsų", "shared_by_you": "Bendrinama jūsų",
"shared_from_partner": "Nuotraukos iš {partner}", "shared_from_partner": "Nuotraukos iš {partner}",
"shared_intent_upload_button_progress_text": "{current} / {total} Įkelta",
"shared_link_clipboard_copied_massage": "Nukopijuota į iškarpinę", "shared_link_clipboard_copied_massage": "Nukopijuota į iškarpinę",
"shared_link_clipboard_text": "Nuoroda: {link}\nSlaptažodis: {password}",
"shared_link_edit_expire_after_option_days": "{count} dienų",
"shared_link_edit_expire_after_option_hours": "{count} valandų",
"shared_link_edit_expire_after_option_minutes": "{count} minučių",
"shared_link_edit_expire_after_option_months": "{count} mėnesių",
"shared_link_edit_expire_after_option_year": "{count} metų",
"shared_link_expires_day": "Galiojimas baigsis už {count} dienos",
"shared_link_expires_days": "Galiojimas baigsis už {count} dienų",
"shared_link_expires_hour": "Galiojimas baigsis už {count} valandos",
"shared_link_expires_hours": "Galiojimas baigsis už {count} valandų",
"shared_link_expires_minute": "Galiojimas baigsis už {count} minutės",
"shared_link_expires_minutes": "Galiojimas baigsis už {count} minučių",
"shared_link_expires_second": "Galiojimas baigsis už {count} sekundės",
"shared_link_expires_seconds": "Galiojimas baigsis už {count} sekundžių",
"shared_link_options": "Bendrinimo nuorodos parametrai", "shared_link_options": "Bendrinimo nuorodos parametrai",
"shared_links": "Bendrinimo nuorodos", "shared_links": "Bendrinimo nuorodos",
"shared_photos_and_videos_count": "{assetCount, plural, one {# bendrinama nuotrauka ir vaizdo įrašas} few {# bendrinamos nuotraukos ir vaizdo įrašai} other {# bendrinamų nuotraukų ir vaizdo įrašų}}", "shared_photos_and_videos_count": "{assetCount, plural, one {# bendrinama nuotrauka ir vaizdo įrašas} few {# bendrinamos nuotraukos ir vaizdo įrašai} other {# bendrinamų nuotraukų ir vaizdo įrašų}}",
@@ -1092,6 +1571,7 @@
"template": "Šablonas", "template": "Šablonas",
"theme": "Tema", "theme": "Tema",
"theme_selection": "Temos pasirinkimas", "theme_selection": "Temos pasirinkimas",
"theme_setting_asset_list_tiles_per_row_title": "Elementų per eilutę ({count})",
"theme_setting_primary_color_title": "Pagrindinė spalva", "theme_setting_primary_color_title": "Pagrindinė spalva",
"theme_setting_system_primary_color_title": "Naudoti sistemos spalvą", "theme_setting_system_primary_color_title": "Naudoti sistemos spalvą",
"theme_setting_system_theme_switch": "Automatinė (Naudoti sistemos nustatymus)", "theme_setting_system_theme_switch": "Automatinė (Naudoti sistemos nustatymus)",
@@ -1110,8 +1590,10 @@
"trash_no_results_message": "Į šiukšliadėžę perkeltos nuotraukos ir vaizdo įrašai bus rodomi čia.", "trash_no_results_message": "Į šiukšliadėžę perkeltos nuotraukos ir vaizdo įrašai bus rodomi čia.",
"trash_page_delete_all": "Ištrinti Visus", "trash_page_delete_all": "Ištrinti Visus",
"trash_page_empty_trash_dialog_content": "Ar norite ištrinti išmestus elementus? Šie elementai bus visam laikui pašalinti iš Immich", "trash_page_empty_trash_dialog_content": "Ar norite ištrinti išmestus elementus? Šie elementai bus visam laikui pašalinti iš Immich",
"trash_page_info": "Šiukšliadėžės elementai bus galutinai ištrinti už {days} dienų",
"trash_page_no_assets": "Nėra išmestų elementų", "trash_page_no_assets": "Nėra išmestų elementų",
"trash_page_restore_all": "Atkurti Visus", "trash_page_restore_all": "Atkurti Visus",
"trash_page_title": "Šiukšlių ({count})",
"trashed_items_will_be_permanently_deleted_after": "Į šiukšliadėžę perkelti elementai bus visam laikui ištrinti po {days, plural, one {# dienos} other {# dienų}}.", "trashed_items_will_be_permanently_deleted_after": "Į šiukšliadėžę perkelti elementai bus visam laikui ištrinti po {days, plural, one {# dienos} other {# dienų}}.",
"type": "Tipas", "type": "Tipas",
"unarchive": "Išarchyvuoti", "unarchive": "Išarchyvuoti",
@@ -1146,7 +1628,8 @@
"upload_success": "Įkėlimas pavyko, norėdami pamatyti naujai įkeltus elementus perkraukite puslapį.", "upload_success": "Įkėlimas pavyko, norėdami pamatyti naujai įkeltus elementus perkraukite puslapį.",
"upload_to_immich": "Įkelti į Immich ({count})", "upload_to_immich": "Įkelti į Immich ({count})",
"uploading": "Įkeliama", "uploading": "Įkeliama",
"usage": "Naudojymas", "url": "URL",
"usage": "Naudojimas",
"use_biometric": "Naudoti biometriją", "use_biometric": "Naudoti biometriją",
"use_current_connection": "naudoti dabartinį ryšį", "use_current_connection": "naudoti dabartinį ryšį",
"user": "Naudotojas", "user": "Naudotojas",

View File

@@ -23,7 +23,7 @@
"add_partner": "Pievienot partneri", "add_partner": "Pievienot partneri",
"add_path": "Pievienot ceļu", "add_path": "Pievienot ceļu",
"add_photos": "Pievienot fotoattēlus", "add_photos": "Pievienot fotoattēlus",
"add_tag": "Pievienot Atzīmi", "add_tag": "Pievienot atzīmi",
"add_to": "Pievienot…", "add_to": "Pievienot…",
"add_to_album": "Pievienot albumam", "add_to_album": "Pievienot albumam",
"add_to_album_bottom_sheet_added": "Pievienots {album}", "add_to_album_bottom_sheet_added": "Pievienots {album}",
@@ -45,13 +45,14 @@
"authentication_settings_disable_all": "Vai tiešām vēlaties atspējot visas pieteikšanās metodes? Pieteikšanās tiks pilnībā atspējota.", "authentication_settings_disable_all": "Vai tiešām vēlaties atspējot visas pieteikšanās metodes? Pieteikšanās tiks pilnībā atspējota.",
"authentication_settings_reenable": "Lai atkārtoti iespējotu, izmantojiet <link>Servera Komandu</link>.", "authentication_settings_reenable": "Lai atkārtoti iespējotu, izmantojiet <link>Servera Komandu</link>.",
"background_task_job": "Fona Uzdevumi", "background_task_job": "Fona Uzdevumi",
"backup_database": "Izveidot datu bāzes izgāztuvi", "backup_database": "Izveidot datu bāzes izrakstu",
"backup_database_enable_description": "Iespējot datu bāzes izgāztuvi", "backup_database_enable_description": "Iespējot datu bāzes izrakstus",
"backup_keep_last_amount": "Iepriekšējo izgāztuvju daudzums, kas jāsaglabā", "backup_keep_last_amount": "Iepriekšējo izrakstu daudzums, kas jāsaglabā",
"backup_onboarding_1_description": "ārpussaites kopēšana mākonī vai citā fiziskā vietā.", "backup_onboarding_1_description": "ārēja kopija mākonī vai citā fiziskā atrašanās vietā.",
"backup_onboarding_2_description": "lokālas kopijas citās ierīcēs. Šis iekļauj galvenos failus kā arī dublētu kōpiju ar tiem failiem lokāli.", "backup_onboarding_2_description": "vietējās kopijas citās ierīcēs. Tas ietver galvenos failus un šo failu vietējo rezerves kopiju.",
"backup_onboarding_title": "Rezerves kopijas", "backup_onboarding_title": "Rezerves kopijas",
"backup_settings_description": "Datubāzes dublēšanas iestatījumu pārvaldība", "backup_settings": "Datubāzes izrakstu iestatījumi",
"backup_settings_description": "Datubāzes izrakstu iestatījumu pārvaldība",
"cleared_jobs": "Notīrīti uzdevumi priekš: {job}", "cleared_jobs": "Notīrīti uzdevumi priekš: {job}",
"config_set_by_file": "Konfigurāciju pašlaik iestata konfigurācijas fails", "config_set_by_file": "Konfigurāciju pašlaik iestata konfigurācijas fails",
"confirm_delete_library": "Vai tiešām vēlaties dzēst {library} bibliotēku?", "confirm_delete_library": "Vai tiešām vēlaties dzēst {library} bibliotēku?",
@@ -777,6 +778,7 @@
"let_others_respond": "Ļaut citiem atbildēt", "let_others_respond": "Ļaut citiem atbildēt",
"level": "Līmenis", "level": "Līmenis",
"library": "Bibliotēka", "library": "Bibliotēka",
"library_options": "Bibliotēkas opcijas",
"library_page_device_albums": "Albumi ierīcē", "library_page_device_albums": "Albumi ierīcē",
"library_page_new_album": "Jauns albums", "library_page_new_album": "Jauns albums",
"library_page_sort_asset_count": "Failu skaits", "library_page_sort_asset_count": "Failu skaits",
@@ -784,6 +786,8 @@
"library_page_sort_last_modified": "Pēdējās izmaiņas", "library_page_sort_last_modified": "Pēdējās izmaiņas",
"library_page_sort_title": "Albuma virsraksts", "library_page_sort_title": "Albuma virsraksts",
"licenses": "Licences", "licenses": "Licences",
"link_to_oauth": "Piesaistīt OAuth",
"linked_oauth_account": "Piesaistītais OAuth konts",
"list": "Saraksts", "list": "Saraksts",
"loading": "Ielādē", "loading": "Ielādē",
"local_network": "Lokālais tīkls", "local_network": "Lokālais tīkls",
@@ -943,6 +947,8 @@
"open_the_search_filters": "Atvērt meklēšanas filtrus", "open_the_search_filters": "Atvērt meklēšanas filtrus",
"options": "Iestatījumi", "options": "Iestatījumi",
"or": "vai", "or": "vai",
"organize_into_albums": "Sakārtot albumos",
"organize_into_albums_description": "Ievietot esošās fotogrāfijas albumos, izmantojot pašreizējos sinhronizācijas iestatījumus",
"organize_your_library": "Bibliotēkas organizēšana", "organize_your_library": "Bibliotēkas organizēšana",
"original": "oriģināls", "original": "oriģināls",
"other": "Citi", "other": "Citi",
@@ -1297,6 +1303,8 @@
"support": "Atbalsts", "support": "Atbalsts",
"support_and_feedback": "Atbalsts un atsauksmes", "support_and_feedback": "Atbalsts un atsauksmes",
"sync": "Sinhronizēt", "sync": "Sinhronizēt",
"sync_status": "Sinhronizācijas statuss",
"sync_status_subtitle": "Skatīt un pārvaldīt sinhronizācijas sistēmu",
"theme": "Dizains", "theme": "Dizains",
"theme_setting_asset_list_storage_indicator_title": "Rādīt krātuves indikatoru uz aktīvu elementiem", "theme_setting_asset_list_storage_indicator_title": "Rādīt krātuves indikatoru uz aktīvu elementiem",
"theme_setting_asset_list_tiles_per_row_title": "Failu skaits rindā ({count})", "theme_setting_asset_list_tiles_per_row_title": "Failu skaits rindā ({count})",
@@ -1337,6 +1345,7 @@
"trash_page_select_assets_btn": "Atlasīt aktīvus", "trash_page_select_assets_btn": "Atlasīt aktīvus",
"trash_page_title": "Atkritne ({count})", "trash_page_title": "Atkritne ({count})",
"trashed_items_will_be_permanently_deleted_after": "Faili no atkritnes tiks neatgriezeniski dzēsti pēc {days, plural, one {# dienas} other {# dienām}}.", "trashed_items_will_be_permanently_deleted_after": "Faili no atkritnes tiks neatgriezeniski dzēsti pēc {days, plural, one {# dienas} other {# dienām}}.",
"troubleshoot": "Problēmu novēršana",
"type": "Veids", "type": "Veids",
"unable_to_change_pin_code": "Neizdevās nomainīt PIN kodu", "unable_to_change_pin_code": "Neizdevās nomainīt PIN kodu",
"unable_to_setup_pin_code": "Neizdevās uzstādīt PIN kodu", "unable_to_setup_pin_code": "Neizdevās uzstādīt PIN kodu",

View File

@@ -1056,6 +1056,706 @@
"group_no": "गटबद्ध नाही", "group_no": "गटबद्ध नाही",
"group_owner": "मालकानुसार गट करा", "group_owner": "मालकानुसार गट करा",
"group_places_by": "स्थळे गटबद्ध करा: …", "group_places_by": "स्थळे गटबद्ध करा: …",
"notification_permission_dialog_content": "सूचना सक्षम करण्यासाठी सेटिंग्जमध्ये जा आणि अनुमती द्या.",
"notification_permission_list_tile_content": "सूचना सक्षम करण्यासाठी परवानगी द्या.",
"notification_permission_list_tile_enable_button": "सूचना सक्षम करा",
"notification_permission_list_tile_title": "सूचना परवानगी",
"notification_toggle_setting_description": "ईमेल सूचना सक्षम करा",
"notifications": "सूचना",
"notifications_setting_description": "सूचना व्यवस्थापित करा",
"oauth": "OAuth",
"official_immich_resources": "अधिकृत Immich संसाधने",
"offline": "ऑफलाइन",
"offset": "ऑफसेट",
"ok": "ठीक",
"oldest_first": "सर्वात जुने आधी",
"on_this_device": "या डिव्हाइसवर",
"onboarding": "ऑनबोर्डिंग",
"onboarding_locale_description": "तुमची पसंतीची भाषा निवडा. हे नंतर सेटिंग्जमध्ये बदलू शकता.",
"onboarding_privacy_description": "खालील (पर्यायी) वैशिष्ट्ये बाह्य सेवांवर अवलंबून आहेत आणि सेटिंग्जमध्ये कधीही अक्षम करता येतात.",
"onboarding_server_welcome_description": "काही सामान्य सेटिंग्जसह तुमची इन्स्टन्स सेटअप करूया.",
"onboarding_theme_description": "तुमच्या इन्स्टन्ससाठी रंग थीम निवडा. हे नंतर सेटिंग्जमध्ये बदलू शकता.",
"onboarding_user_welcome_description": "चला, सुरुवात करूया!",
"onboarding_welcome_user": "स्वागत आहे, {user}",
"online": "ऑनलाइन",
"only_favorites": "फक्त आवडते",
"open": "उघडा",
"open_in_map_view": "नकाशा दृश्यात उघडा",
"open_in_openstreetmap": "OpenStreetMap मध्ये उघडा",
"open_the_search_filters": "शोध फिल्टर उघडा",
"options": "पर्याय",
"or": "किंवा",
"organize_into_albums": "अल्बममध्ये आयोजित करा",
"organize_into_albums_description": "सध्याच्या समक्रमण सेटिंग्ज वापरून विद्यमान फोटो अल्बममध्ये ठेवा",
"organize_your_library": "तुमची लायब्ररी व्यवस्थित करा",
"original": "मूळ",
"other": "इतर",
"other_devices": "इतर उपकरणे",
"other_entities": "इतर घटक",
"other_variables": "इतर चल",
"owned": "मालकीचे",
"owner": "मालक",
"partner": "भागीदार",
"partner_can_access": "{partner} ला प्रवेश आहे",
"partner_can_access_assets": "संग्रहित व हटविलेले वगळता तुमचे सर्व फोटो आणि व्हिडिओ",
"partner_can_access_location": "ज्या ठिकाणी तुमचे फोटो काढले गेले ते स्थान",
"partner_list_user_photos": "{user} चे फोटो",
"partner_list_view_all": "सर्व पहा",
"partner_page_empty_message": "तुमचे फोटो अजून कोणत्याही भागीदारासोबत शेअर केलेले नाहीत.",
"partner_page_no_more_users": "जोडण्यासाठी आणखी वापरकर्ते नाहीत",
"partner_page_partner_add_failed": "भागीदार जोडण्यात अयशस्वी",
"partner_page_select_partner": "भागीदार निवडा",
"partner_page_shared_to_title": "यांना शेअर केले",
"partner_page_stop_sharing_content": "{partner} आता तुमचे फोटो पाहू शकणार नाही.",
"partner_sharing": "भागीदार शेअरिंग",
"partners": "भागीदार",
"password": "पासवर्ड",
"password_does_not_match": "पासवर्ड जुळत नाही",
"password_required": "पासवर्ड आवश्यक",
"password_reset_success": "पासवर्ड रीसेट यशस्वी",
"past_durations": {
"days": "मागील {days, plural, one {# दिवस} other {# दिवस}}",
"hours": "मागील {hours, plural, one {# तास} other {# तास}}",
"years": "मागील {years, plural, one {# वर्ष} other {# वर्षे}}"
},
"path": "मार्ग",
"pattern": "नमुना",
"pause": "थांबवा",
"pause_memories": "आठवणी थांबवा",
"paused": "थांबवले",
"pending": "प्रलंबित",
"people": "लोक",
"people_edits_count": "संपादित {count, plural, one {# व्यक्ती} other {# लोक}}",
"people_feature_description": "लोकांनुसार गटबद्ध फोटो आणि व्हिडिओ ब्राउझ करा",
"people_sidebar_description": "साइडबारमध्ये “लोक” साठी दुवा दाखवा",
"permanent_deletion_warning": "कायमस्वरूपी विलोपन सूचना",
"permanent_deletion_warning_setting_description": "अ‍ॅसेट्स कायमचे हटवताना सूचना दाखवा",
"permanently_delete": "कायमचे हटवा",
"permanently_delete_assets_count": "{count, plural, one {अ‍ॅसेट} other {अ‍ॅसेट्स}} कायमचे हटवा",
"permanently_delete_assets_prompt": "आपण {count, plural, one {हा अ‍ॅसेट कायमचा हटवू इच्छिता?} other {हे <b></b> अ‍ॅसेट्स कायमचे हटवू इच्छिता?}} यामुळे {count, plural, one {तो त्याच्या} other {ते त्यांच्या}} अल्बम(मधून) देखील काढले जातील.",
"permanently_deleted_asset": "कायमचा हटवलेला अ‍ॅसेट",
"permanently_deleted_assets_count": "कायमचे हटवले {count, plural, one {# अ‍ॅसेट} other {# अ‍ॅसेट्स}}",
"permission": "परवानगी",
"permission_empty": "तुमची परवानगी रिक्त असू नये",
"permission_onboarding_back": "मागे",
"permission_onboarding_continue_anyway": "तरीही पुढे जा",
"permission_onboarding_get_started": "सुरू करा",
"permission_onboarding_go_to_settings": "सेटिंग्जमध्ये जा",
"permission_onboarding_permission_denied": "परवानगी नाकारली. Immich वापरण्यासाठी, सेटिंग्जमध्ये फोटो आणि व्हिडिओ परवानग्या द्या.",
"permission_onboarding_permission_granted": "परवानगी मंजूर! सर्व तयार.",
"permission_onboarding_permission_limited": "परवानगी मर्यादित. Immich ला संपूर्ण गॅलरी संग्रहाचा बॅकअप व व्यवस्थापन करण्यासाठी, सेटिंग्जमध्ये फोटो आणि व्हिडिओ परवानग्या द्या.",
"permission_onboarding_request": "तुमचे फोटो आणि व्हिडिओ पाहण्यासाठी Immich ला परवानगी आवश्यक आहे.",
"person": "व्यक्ती",
"person_age_months": "{months, plural, one {# महिना} other {# महिने}} वय",
"person_age_year_months": "1 वर्ष, {months, plural, one {# महिना} other {# महिने}} वय",
"person_age_years": "{years, plural, other {# वर्षांचे}}",
"person_birthdate": "जन्म {date} रोजी",
"person_hidden": "{name}{hidden, select, true { {hidden}} other {}}",
"photo_shared_all_users": "तुम्ही सर्व वापरकर्त्यांसोबत फोटो शेअर केले आहेत असे दिसते किंवा शेअर करण्यासाठी कोणताही वापरकर्ता नाही.",
"photos": "फोटो",
"photos_and_videos": "फोटो आणि व्हिडिओ",
"photos_count": "{count, plural, one {{count, number} फोटो} other {{count, number} फोटो}}",
"photos_from_previous_years": "मागील वर्षांतील फोटो",
"pick_a_location": "स्थान निवडा",
"pin_code_changed_successfully": "PIN कोड यशस्वीरित्या बदलला",
"pin_code_reset_successfully": "PIN कोड यशस्वीरित्या रीसेट केला",
"pin_code_setup_successfully": "PIN कोड यशस्वीरित्या सेट केला",
"pin_verification": "PIN कोड पडताळणी",
"place": "स्थान",
"places": "स्थाने",
"places_count": "{count, plural, one {{count, number} स्थान} other {{count, number} स्थाने}}",
"play": "प्ले करा",
"play_memories": "आठवणी प्ले करा",
"play_motion_photo": "मोशन फोटो प्ले करा",
"play_or_pause_video": "व्हिडिओ प्ले किंवा पॉज करा",
"please_auth_to_access": "प्रवेशासाठी कृपया प्रमाणीकरण करा",
"port": "पोर्ट",
"preferences_settings_subtitle": "अ‍ॅपची प्राधान्ये व्यवस्थापित करा",
"preferences_settings_title": "प्राधान्ये",
"preset": "प्रिसेट",
"preview": "पूर्वावलोकन",
"previous": "मागील",
"previous_memory": "मागील आठवण",
"previous_or_next_day": "दिवस पुढे/मागे",
"previous_or_next_month": "महिना पुढे/मागे",
"previous_or_next_photo": "फोटो पुढे/मागे",
"previous_or_next_year": "वर्ष पुढे/मागे",
"primary": "प्राथमिक",
"privacy": "गोपनीयता",
"profile": "प्रोफाइल",
"profile_drawer_app_logs": "लॉग्स",
"profile_drawer_client_out_of_date_major": "मोबाइल अ‍ॅप कालबाह्य आहे. कृपया नवीनतम मेजर आवृत्तीवर अद्यतन करा.",
"profile_drawer_client_out_of_date_minor": "मोबाइल अ‍ॅप कालबाह्य आहे. कृपया नवीनतम माइनर आवृत्तीवर अद्यतन करा.",
"profile_drawer_client_server_up_to_date": "क्लायंट आणि सर्व्हर अद्ययावत आहेत",
"profile_drawer_github": "गिटहब",
"profile_drawer_readonly_mode": "फक्त-वाचन मोड सक्षम. बाहेर पडण्यासाठी वापरकर्त्याच्या अवतार आयकॉनवर लांब-प्रेस करा.",
"profile_drawer_server_out_of_date_major": "सर्व्हर कालबाह्य आहे. कृपया नवीनतम मेजर आवृत्तीवर अद्यतन करा.",
"profile_drawer_server_out_of_date_minor": "सर्व्हर कालबाह्य आहे. कृपया नवीनतम माइनर आवृत्तीवर अद्यतन करा.",
"profile_image_of_user": "{user} ची प्रोफाइल प्रतिमा",
"profile_picture_set": "प्रोफाइल चित्र सेट केले.",
"public_album": "सार्वजनिक अल्बम",
"public_share": "सार्वजनिक शेअर",
"purchase_account_info": "समर्थक",
"purchase_activated_subtitle": "Immich आणि मुक्त-स्रोत सॉफ्टवेअरला पाठिंबा दिल्याबद्दल धन्यवाद",
"purchase_activated_time": "{date} रोजी सक्रिय केले",
"purchase_activated_title": "तुमची की यशस्वीपणे सक्रिय करण्यात आली आहे",
"purchase_button_activate": "सक्रिय करा",
"purchase_button_buy": "खरेदी करा",
"purchase_button_buy_immich": "Immich खरेदी करा",
"purchase_button_never_show_again": "पुन्हा दाखवू नका",
"purchase_button_reminder": "३० दिवसांनी मला आठवण करून द्या",
"purchase_button_remove_key": "की हटवा",
"purchase_button_select": "निवडा",
"purchase_failed_activation": "सक्रिय करण्यात अयशस्वी! योग्य प्रोडक्ट कीसाठी कृपया तुमचे ईमेल तपासा!",
"purchase_individual_description_1": "वैयक्तिक वापरासाठी",
"purchase_individual_description_2": "समर्थक स्थिती",
"purchase_individual_title": "वैयक्तिक",
"purchase_input_suggestion": "प्रॉडक्ट की आहे? खाली की टाका",
"purchase_license_subtitle": "सेवेच्या पुढील विकासासाठी Immich खरेदी करून साथ द्या",
"purchase_lifetime_description": "आयुष्यभराची खरेदी",
"purchase_option_title": "खरेदी पर्याय",
"purchase_panel_info_1": "Immich तयार करणे वेळखाऊ आणि कष्टाचे आहे. आमचे ध्येय मुक्त-स्रोत सॉफ्टवेअर व नैतिक व्यावसायिक पद्धतींमधून टिकाऊ उत्पन्न मिळवणे, विकसकांना आधार देणे आणि शोषणकारी क्लाउड सेवांना पर्याय देणारे गोपनीयतेचा मान राखणारे इकोसिस्टम तयार करणे हे आहे.",
"purchase_panel_info_2": "आम्ही पेवॉल न वाढवण्यास कटिबद्ध आहोत; त्यामुळे या खरेदीमुळे Immich मध्ये कोणतीही अतिरिक्त वैशिष्ट्ये उघडणार नाहीत. चालू विकासासाठी आम्ही तुमच्यासारख्या वापरकर्त्यांच्या पाठबळावर अवलंबून आहोत.",
"purchase_panel_title": "प्रकल्पाला साथ द्या",
"purchase_per_server": "प्रति सर्व्हर",
"purchase_per_user": "प्रति वापरकर्ता",
"purchase_remove_product_key": "प्रॉडक्ट की काढा",
"purchase_remove_product_key_prompt": "तुम्हाला नक्की प्रॉडक्ट की काढायची आहे का?",
"purchase_remove_server_product_key": "सर्व्हरची प्रॉडक्ट की काढा",
"purchase_remove_server_product_key_prompt": "तुम्हाला नक्की सर्व्हरची प्रॉडक्ट की काढायची आहे का?",
"purchase_server_description_1": "संपूर्ण सर्व्हरसाठी",
"purchase_server_description_2": "समर्थक स्थिती",
"purchase_server_title": "सर्व्हर",
"purchase_settings_server_activated": "सर्व्हरची प्रॉडक्ट की प्रशासकाद्वारे व्यवस्थापित केली जाते",
"query_asset_id": "अॅसेट ID चौकशी",
"queue_status": "रांगेत {count}/{total}",
"rating": "स्टार रेटिंग",
"rating_clear": "रेटिंग साफ करा",
"rating_count": "{count, plural, one {# तारा} other {# तारे}}",
"rating_description": "माहिती पॅनेलमध्ये EXIF रेटिंग दर्शवा",
"reaction_options": "रिऍक्शन पर्याय",
"read_changelog": "चेंजलॉग वाचा",
"readonly_mode_disabled": "फक्त-वाचन मोड निष्क्रिय केला",
"readonly_mode_enabled": "फक्त-वाचन मोड सक्षम केला",
"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": "निवडलेले आयटम विद्यमान व्यक्तीकडे नियुक्त करा",
"recent": "अलीकडील",
"recent-albums": "अलीकडील अल्बम",
"recent_searches": "अलीकडील शोध",
"recently_added": "नुकतेच जोडलेले",
"recently_added_page_title": "नुकतेच जोडलेले",
"recently_taken": "अलीकडे घेतलेले",
"recently_taken_page_title": "अलीकडे घेतलेले",
"refresh": "रीफ्रेश करा",
"refresh_encoded_videos": "एन्कोड केलेले व्हिडिओ रीफ्रेश करा",
"refresh_faces": "चेहरे रीफ्रेश करा",
"refresh_metadata": "मेटाडेटा रीफ्रेश करा",
"refresh_thumbnails": "थंबनेल रीफ्रेश करा",
"refreshed": "रीफ्रेश झाले",
"refreshes_every_file": "विद्यमान व नवीन सर्व फाइल्स पुन्हा वाचा",
"refreshing_encoded_video": "एन्कोड केलेला व्हिडिओ रीफ्रेश करत आहे",
"refreshing_faces": "चेहरे रीफ्रेश करत आहे",
"refreshing_metadata": "मेटाडेटा रीफ्रेश करत आहे",
"regenerating_thumbnails": "थंबनेल्स पुन्हा तयार करत आहे",
"remote": "दूरस्थ",
"remote_assets": "दूरस्थ आयटम",
"remove": "काढा",
"remove_assets_album_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_from_album_action_prompt": "अल्बममधून {count} काढले",
"remove_from_favorites": "आवडीतून काढा",
"remove_from_lock_folder_action_prompt": "लॉक केलेल्या फोल्डरमधून {count} काढले",
"remove_from_locked_folder": "लॉक फोल्डरमधून काढा",
"remove_from_locked_folder_confirmation": "हे फोटो आणि व्हिडिओ लॉक फोल्डरमधून बाहेर हलवायचे आहेत का? ते तुमच्या लायब्ररीमध्ये दिसतील.",
"remove_from_shared_link": "शेअर्ड दुव्यातून काढा",
"remove_memory": "मेमरी काढा",
"remove_photo_from_memory": "या मेमरीतून फोटो काढा",
"remove_tag": "टॅग काढा",
"remove_url": "URL काढा",
"remove_user": "वापरकर्ता काढा",
"removed_api_key": "काढलेली API की: {name}",
"removed_from_archive": "आर्काइव्हमधून काढले",
"removed_from_favorites": "आवडीतून काढले",
"removed_from_favorites_count": "{count, plural, other {आवडीतून # काढले}}",
"removed_memory": "मेमरी काढली",
"removed_photo_from_memory": "मेमरीतून फोटो काढला",
"removed_tagged_assets": "{count, plural, one {# आयटमवरून टॅग काढला} other {# आयटमवरून टॅग काढले}}",
"rename": "नाव बदला",
"repair": "दुरुस्ती",
"repair_no_results_message": "अनट्रॅक्ड व हरवलेल्या फाइल्स येथे दिसतील",
"replace_with_upload": "अपलोडने बदला",
"repository": "रिपॉझिटरी",
"require_password": "पासवर्ड आवश्यक",
"require_user_to_change_password_on_first_login": "पहिल्या लॉगिनवेळी वापरकर्त्याने पासवर्ड बदलणे आवश्यक",
"rescan": "पुन्हा स्कॅन करा",
"reset": "रीसेट करा",
"reset_password": "पासवर्ड रीसेट करा",
"reset_people_visibility": "लोकांची दृश्यता रीसेट करा",
"reset_pin_code": "PIN कोड रीसेट करा",
"reset_pin_code_description": "तुमचा PIN विसरला असल्यास, तो रीसेट करण्यासाठी सर्व्हर प्रशासकाशी संपर्क साधा",
"reset_pin_code_success": "PIN कोड यशस्वीरीत्या रीसेट केला",
"reset_pin_code_with_password": "पासवर्डने तुम्ही नेहमी PIN कोड रीसेट करू शकता",
"reset_sqlite": "SQLite डेटाबेस रीसेट करा",
"reset_sqlite_confirmation": "तुम्हाला नक्की SQLite डेटाबेस रीसेट करायचा आहे का? डेटा पुन्हा समक्रमित करण्यासाठी तुम्हाला लॉगआउट करून पुन्हा लॉगइन करावे लागेल",
"reset_sqlite_success": "SQLite डेटाबेस यशस्वीरीत्या रीसेट केला",
"reset_to_default": "डीफॉल्टवर रीसेट करा",
"resolve_duplicates": "डुप्लिकेट्स सोडवा",
"resolved_all_duplicates": "सर्व डुप्लिकेट्स सोडवले",
"restore": "पुनर्संचयित करा",
"restore_all": "सर्व पुनर्संचयित करा",
"restore_trash_action_prompt": "कचरापेटीतून {count} पुनर्संचयित केले",
"restore_user": "वापरकर्ता पुनर्संचयित करा",
"restored_asset": "पुनर्संचयित आयटम",
"resume": "पुन्हा सुरू करा",
"resume_paused_jobs": "{count, plural, one {# थांबवलेले काम} other {# थांबवलेली कामे}} पुन्हा सुरू करा",
"retry_upload": "अपलोड पुन्हा करा",
"review_duplicates": "डुप्लिकेट्सचे पुनरावलोकन करा",
"review_large_files": "मोठ्या फाइल्सचे पुनरावलोकन करा",
"role": "भूमिका",
"role_editor": "संपादक",
"role_viewer": "दर्शक",
"running": "चालू",
"save": "जतन करा",
"save_to_gallery": "गॅलरीमध्ये जतन करा",
"saved_api_key": "जतन केलेली API की",
"saved_profile": "जतन केलेले प्रोफाइल",
"saved_settings": "जतन केलेल्या सेटिंग्ज",
"say_something": "काहीतरी बोला",
"scaffold_body_error_occurred": "त्रुटी आली",
"scan_all_libraries": "सर्व लायब्ररी स्कॅन करा",
"scan_library": "स्कॅन करा",
"scan_settings": "स्कॅन सेटिंग्ज",
"scanning_for_album": "अल्बमसाठी स्कॅन करत आहे...",
"search": "शोधा",
"search_albums": "अल्बम शोधा",
"search_by_context": "परिस्थितीनुसार शोधा",
"search_by_description": "वर्णनानुसार शोधा",
"search_by_description_example": "सापा मधील हायकिंगचा दिवस",
"search_by_filename": "फाइल नाव/एक्स्टेंशननुसार शोधा",
"search_by_filename_example": "उदा. IMG_1234.JPG किंवा PNG",
"search_camera_make": "कॅमेरा निर्माता शोधा...",
"search_camera_model": "कॅमेरा मॉडेल शोधा...",
"search_city": "शहर शोधा...",
"search_country": "देश शोधा...",
"search_filter_apply": "फिल्टर लागू करा",
"search_filter_camera_title": "कॅमेरा प्रकार निवडा",
"search_filter_date": "तारीख",
"search_filter_date_interval": "{start} ते {end}",
"search_filter_date_title": "दिनांक श्रेणी निवडा",
"search_filter_display_option_not_in_album": "अल्बममध्ये नाही",
"search_filter_display_options": "प्रदर्शन पर्याय",
"search_filter_filename": "फाइल नावाने शोधा",
"search_filter_location": "स्थान",
"search_filter_location_title": "स्थान निवडा",
"search_filter_media_type": "माध्यम प्रकार",
"search_filter_media_type_title": "माध्यम प्रकार निवडा",
"search_filter_people_title": "लोक निवडा",
"search_for": "यासाठी शोधा",
"search_for_existing_person": "विद्यमान व्यक्ती शोधा",
"search_no_more_result": "आणखी परिणाम नाहीत",
"search_no_people": "कोणतीही व्यक्ती नाही",
"search_no_people_named": "“{name}” नावाची व्यक्ती सापडली नाही",
"search_no_result": "काहीही सापडले नाही; वेगळा शोध शब्द किंवा संयोजन वापरा",
"search_options": "शोध पर्याय",
"search_page_categories": "श्रेण्या",
"search_page_motion_photos": "मोशन फोटो",
"search_page_no_objects": "वस्तूंची माहिती उपलब्ध नाही",
"search_page_no_places": "ठिकाणांची माहिती उपलब्ध नाही",
"search_page_screenshots": "स्क्रीनशॉट्स",
"search_page_search_photos_videos": "तुमचे फोटो व व्हिडिओ शोधा",
"search_page_selfies": "सेल्फीज",
"search_page_things": "वस्तू",
"search_page_view_all_button": "सर्व पहा",
"search_page_your_activity": "तुमचे क्रियाकलाप",
"search_page_your_map": "तुमचा नकाशा",
"search_people": "लोक शोधा",
"search_places": "ठिकाणे शोधा",
"search_rating": "रेटिंगनुसार शोधा...",
"search_result_page_new_search_hint": "नवीन शोध",
"search_settings": "शोध सेटिंग्ज",
"search_state": "राज्य/स्टेट शोधा...",
"search_suggestion_list_smart_search_hint_1": "डीफॉल्टने स्मार्ट सर्च सुरू आहे; मेटाडेटा शोधण्यासाठी ही रचना वापरा. ",
"search_suggestion_list_smart_search_hint_2": "m:तुमचा-शोध-शब्द",
"search_tags": "टॅग्स शोधा...",
"search_timezone": "वेळक्षेत्र शोधा...",
"search_type": "शोध प्रकार",
"search_your_photos": "तुमचे फोटो शोधा",
"searching_locales": "लोकल्स शोधत आहे...",
"second": "सेकंद",
"see_all_people": "सर्व लोक पाहा",
"select": "निवडा",
"select_album_cover": "अल्बम कव्हर निवडा",
"select_all": "सर्व निवडा",
"select_all_duplicates": "सर्व डुप्लिकेट्स निवडा",
"select_all_in": "{group} मधील सर्व निवडा",
"select_avatar_color": "अवतारचा रंग निवडा",
"select_face": "चेहरा निवडा",
"select_featured_photo": "फिचर्ड फोटो निवडा",
"select_from_computer": "कॉम्प्युटरमधून निवडा",
"select_keep_all": "सर्व ठेवणे निवडा",
"select_library_owner": "लायब्ररी मालक निवडा",
"select_new_face": "नवा चेहरा निवडा",
"select_person_to_tag": "टॅग करण्यासाठी व्यक्ती निवडा",
"select_photos": "फोटो निवडा",
"select_trash_all": "कचरापेटीतील सर्व निवडा",
"select_user_for_sharing_page_err_album": "अल्बम तयार करण्यात अयशस्वी",
"selected": "निवडलेले",
"selected_count": "{count, plural, other {# निवडले}}",
"selected_gps_coordinates": "निवडलेल्या GPS स्थाननिर्देशांक",
"send_message": "संदेश पाठवा",
"send_welcome_email": "स्वागत ईमेल पाठवा",
"server_endpoint": "सर्व्हर एंडपॉइंट",
"server_info_box_app_version": "अॅप आवृत्ती",
"server_info_box_server_url": "सर्व्हर URL",
"server_offline": "सर्व्हर ऑफलाइन",
"server_online": "सर्व्हर ऑनलाइन",
"server_privacy": "सर्व्हर गोपनीयता",
"server_stats": "सर्व्हर आकडेवारी",
"server_version": "सर्व्हर आवृत्ती",
"set": "सेट करा",
"set_as_album_cover": "अल्बम कव्हर म्हणून सेट करा",
"set_as_featured_photo": "फिचर्ड फोटो म्हणून सेट करा",
"set_as_profile_picture": "प्रोफाइल फोटो म्हणून सेट करा",
"set_date_of_birth": "जन्मतारीख सेट करा",
"set_profile_picture": "प्रोफाइल फोटो सेट करा",
"set_slideshow_to_fullscreen": "स्लाइडशो फुलस्क्रीन करा",
"set_stack_primary_asset": "मुख्य आयटम म्हणून सेट करा",
"setting_image_viewer_help": "डीटेल व्ह्यूअर आधी लहान थंबनेल लोड करतो, नंतर (सक्षम असल्यास) मध्यम आकाराचे प्रिव्ह्यू लोड करतो, आणि शेवटी (सक्षम असल्यास) मूळ प्रतिमा लोड करतो.",
"setting_image_viewer_original_subtitle": "पूर्ण-रिझोल्यूशनची मूळ प्रतिमा लोड करण्यासाठी सक्षम करा (मोठी). डेटा वापर कमी करण्यासाठी (नेटवर्क व डिव्हाइस कॅश दोन्ही) अक्षम करा.",
"setting_image_viewer_original_title": "मूळ प्रतिमा लोड करा",
"setting_image_viewer_preview_subtitle": "मध्यम-रिझोल्यूशन प्रतिमा लोड करण्यासाठी सक्षम करा. अक्षम केल्यास थेट मूळ प्रतिमा लोड होईल किंवा फक्त थंबनेल वापरला जाईल.",
"setting_image_viewer_preview_title": "प्रिव्ह्यू प्रतिमा लोड करा",
"setting_image_viewer_title": "प्रतिमा",
"setting_languages_apply": "लागू करा",
"setting_languages_subtitle": "अॅपची भाषा बदला",
"setting_notifications_notify_failures_grace_period": "पार्श्वभूमी बॅकअप अपयशांची सूचना: {duration}",
"setting_notifications_notify_hours": "{count} तास",
"setting_notifications_notify_immediately": "तत्काळ",
"setting_notifications_notify_minutes": "{count} मिनिटे",
"setting_notifications_notify_never": "कधीच नाही",
"setting_notifications_notify_seconds": "{count} सेकंद",
"setting_notifications_single_progress_subtitle": "प्रत्येक आयटमसाठी तपशीलवार अपलोड प्रगती माहिती",
"setting_notifications_single_progress_title": "पार्श्वभूमी बॅकअपची तपशीलवार प्रगती दाखवा",
"setting_notifications_subtitle": "तुमची सूचना प्राधान्ये समायोजित करा",
"setting_notifications_total_progress_subtitle": "एकूण अपलोड प्रगती (पूर्ण/एकूण आयटम)",
"setting_notifications_total_progress_title": "पार्श्वभूमी बॅकअपची एकूण प्रगती दाखवा",
"setting_video_viewer_looping_title": "लूपिंग",
"setting_video_viewer_original_video_subtitle": "सर्व्हरवरून व्हिडिओ स्ट्रिम करताना ट्रान्सकोड उपलब्ध असला तरी मूळ व्हिडिओ प्ले करा. बफरिंग होऊ शकते. स्थानिकरीत्या उपलब्ध व्हिडिओ या सेटिंगपासून स्वतंत्रपणे मूळ गुणवत्तेत प्ले होतात.",
"setting_video_viewer_original_video_title": "मूळ व्हिडिओ सक्तीने प्ले करा",
"settings": "सेटिंग्ज",
"settings_require_restart": "ही सेटिंग लागू करण्यासाठी कृपया Immich रीस्टार्ट करा",
"settings_saved": "सेटिंग्ज जतन केल्या",
"setup_pin_code": "PIN कोड सेट करा",
"share": "शेअर करा",
"share_action_prompt": "{count} आयटम शेअर केले",
"share_add_photos": "फोटो जोडा",
"share_assets_selected": "{count} निवडले",
"share_dialog_preparing": "तयार करत आहे...",
"share_link": "शेअर दुवा",
"shared": "शेअर केले",
"shared_album_activities_input_disable": "टिप्पणी निष्क्रिय आहे",
"shared_album_activity_remove_content": "ही कृती हटवायची आहे का?",
"shared_album_activity_remove_title": "कृती हटवा",
"shared_album_section_people_action_error": "अल्बममधून बाहेर पडताना/काढताना त्रुटी",
"shared_album_section_people_action_leave": "अल्बममधून वापरकर्ता काढा",
"shared_album_section_people_action_remove_user": "अल्बममधून वापरकर्ता काढा",
"shared_album_section_people_title": "लोक",
"shared_by": "यांनी शेअर केले",
"shared_by_user": "{user} यांनी शेअर केले",
"shared_by_you": "तुमच्याकडून शेअर केले",
"shared_from_partner": "{partner} कडील फोटो",
"shared_intent_upload_button_progress_text": "{current}/{total} अपलोड झाले",
"shared_link_app_bar_title": "शेअर्ड दुवे",
"shared_link_clipboard_copied_massage": "क्लिपबोर्डवर कॉपी केले",
"shared_link_clipboard_text": "दुवा: {link}\nपासवर्ड: {password}",
"shared_link_create_error": "शेअर्ड दुवा तयार करताना त्रुटी",
"shared_link_custom_url_description": "सानुकूल URL द्वारे हा शेअर्ड दुवा उघडा",
"shared_link_edit_description_hint": "शेअरचे वर्णन प्रविष्ट करा",
"shared_link_edit_expire_after_option_day": "1 दिवस",
"shared_link_edit_expire_after_option_days": "{count} दिवस",
"shared_link_edit_expire_after_option_hour": "1 तास",
"shared_link_edit_expire_after_option_hours": "{count} तास",
"shared_link_edit_expire_after_option_minute": "1 मिनिट",
"shared_link_edit_expire_after_option_minutes": "{count} मिनिटे",
"shared_link_edit_expire_after_option_months": "{count} महिने",
"shared_link_edit_expire_after_option_year": "{count} वर्ष",
"shared_link_edit_password_hint": "शेअरचा पासवर्ड प्रविष्ट करा",
"shared_link_edit_submit_button": "दुवा अद्ययावत करा",
"shared_link_error_server_url_fetch": "सर्व्हर URL मिळू शकला नाही",
"shared_link_expires_day": "{count} दिवसात संपेल",
"shared_link_expires_days": "{count} दिवसात संपेल",
"shared_link_expires_hour": "{count} तासात संपेल",
"shared_link_expires_hours": "{count} तासांत संपेल",
"shared_link_expires_minute": "{count} मिनिटात संपेल",
"shared_link_expires_minutes": "{count} मिनिटांत संपेल",
"shared_link_expires_never": "कधीच संपत नाही ∞",
"shared_link_expires_second": "{count} सेकंदात संपेल",
"shared_link_expires_seconds": "{count} सेकंदात संपेल",
"shared_link_individual_shared": "वैयक्तिक शेअर",
"shared_link_info_chip_metadata": "EXIF (एक्सिफ)",
"shared_link_manage_links": "शेअर्ड दुवे व्यवस्थापित करा",
"shared_link_options": "शेअर्ड दुवा पर्याय",
"shared_link_password_description": "हा शेअर्ड दुवा पाहण्यासाठी पासवर्ड आवश्यक आहे",
"shared_links": "शेअर्ड दुवे",
"shared_links_description": "दुव्याद्वारे फोटो आणि व्हिडिओ शेअर करा",
"shared_photos_and_videos_count": "{assetCount, plural, other {# शेअर्ड फोटो आणि व्हिडिओ}}",
"shared_with_me": "माझ्यासोबत शेअर केलेले",
"shared_with_partner": "{partner} सोबत शेअर केले",
"sharing": "शेअरिंग",
"sharing_enter_password": "हे पृष्ठ पाहण्यासाठी कृपया पासवर्ड प्रविष्ट करा.",
"sharing_page_album": "शेअर्ड अल्बम",
"sharing_page_description": "तुमच्या नेटवर्कमधील लोकांसोबत फोटो-व्हिडिओ शेअर करण्यासाठी शेअर्ड अल्बम तयार करा.",
"sharing_page_empty_list": "रिकामी यादी",
"sharing_sidebar_description": "साइडबारमध्ये शेअरिंगचा दुवा दाखवा",
"sharing_silver_appbar_create_shared_album": "नवीन शेअर्ड अल्बम",
"sharing_silver_appbar_share_partner": "भागीदारासोबत शेअर करा",
"shift_to_permanent_delete": "अॅसेट कायमचे हटवण्यासाठी ⇧ दाबा",
"show_album_options": "अल्बम पर्याय दाखवा",
"show_albums": "अल्बम दाखवा",
"show_all_people": "सर्व लोक दाखवा",
"show_and_hide_people": "लोक दाखवा आणि लपवा",
"show_file_location": "फाइलचे स्थान दाखवा",
"show_gallery": "गॅलरी दाखवा",
"show_hidden_people": "लपवलेले लोक दाखवा",
"show_in_timeline": "टाइमलाइनमध्ये दाखवा",
"show_in_timeline_setting_description": "या वापरकर्त्याचे फोटो-व्हिडिओ तुमच्या टाइमलाइनमध्ये दाखवा",
"show_keyboard_shortcuts": "कीबोर्ड शॉर्टकट दाखवा",
"show_metadata": "मेटाडेटा दाखवा",
"show_or_hide_info": "माहिती दाखवा किंवा लपवा",
"show_password": "पासवर्ड दाखवा",
"show_person_options": "व्यक्तीचे पर्याय दाखवा",
"show_progress_bar": "प्रगती पट्टी दाखवा",
"show_search_options": "शोध पर्याय दाखवा",
"show_shared_links": "शेअर केलेले दुवे दाखवा",
"show_slideshow_transition": "स्लाइडशो ट्रांझिशन दाखवा",
"show_supporter_badge": "समर्थक बॅज",
"show_supporter_badge_description": "समर्थक बॅज दाखवा",
"shuffle": "शफल",
"sidebar": "साइडबार",
"sidebar_display_description": "साइडबारमध्ये दृश्याचा दुवा दाखवा",
"sign_out": "साइन आउट",
"sign_up": "साइन अप",
"size": "आकार",
"skip_to_content": "सामग्रीकडे जा",
"skip_to_folders": "फोल्डर्सकडे जा",
"skip_to_tags": "टॅग्सकडे जा",
"slideshow": "स्लाइडशो",
"slideshow_settings": "स्लाइडशो सेटिंग्ज",
"sort_albums_by": "अल्बम यानुसार क्रम लावा…",
"sort_created": "तयार केलेली तारीख",
"sort_items": "आयटमांची संख्या",
"sort_modified": "बदल केलेली तारीख",
"sort_newest": "अलीकडचा फोटो",
"sort_oldest": "सर्वात जुना फोटो",
"sort_people_by_similarity": "साम्यतेनुसार व्यक्तींचा क्रम लावा",
"sort_recent": "नुकताच घेतलेला फोटो",
"sort_title": "शीर्षक",
"source": "स्त्रोत",
"stack": "स्टॅक",
"stack_action_prompt": "{count} स्टॅक केले",
"stack_duplicates": "डुप्लिकेट्स स्टॅक करा",
"stack_select_one_photo": "स्टॅकसाठी एक मुख्य फोटो निवडा",
"stack_selected_photos": "निवडलेले फोटो स्टॅक करा",
"stacked_assets_count": "स्टॅक केलेले {count, plural, one {# आयटम} other {# आयटम}}",
"stacktrace": "स्टॅकट्रेस",
"start": "सुरू करा",
"start_date": "सुरुवातीची तारीख",
"state": "स्थिती",
"status": "स्टेटस",
"stop_casting": "कास्टिंग थांबवा",
"stop_motion_photo": "मोशन फोटो थांबवा",
"stop_photo_sharing": "तुमचे फोटो शेअर करणे थांबवायचे?",
"stop_photo_sharing_description": "{partner} यांना आता तुमचे फोटो पाहता येणार नाहीत.",
"stop_sharing_photos_with_user": "या वापरकर्त्यासोबत तुमचे फोटो शेअर करणे थांबवा",
"storage": "संचयन जागा",
"storage_label": "संचयन लेबल",
"storage_quota": "संचयन कोटा",
"storage_usage": "{available} पैकी {used} वापरले",
"submit": "सादर करा",
"success": "यशस्वी",
"suggestions": "सूचना",
"sunrise_on_the_beach": "समुद्रकिनाऱ्यावर सूर्योदय",
"support": "सहाय्य",
"support_and_feedback": "सहाय्य आणि अभिप्राय",
"support_third_party_description": "तुमची Immich स्थापना तृतीय-पक्ष पॅकेजद्वारे दिली आहे. तुम्हाला येणाऱ्या समस्या त्या पॅकेजमुळे असू शकतात; त्यामुळे खालील दुव्यांचा वापर करून सर्वप्रथम त्यांच्याकडे समस्या नोंदवा.",
"swap_merge_direction": "मर्ज दिशेची अदलाबदल करा",
"sync": "समक्रमण",
"sync_albums": "अल्बम समक्रमित करा",
"sync_albums_manual_subtitle": "अपलोड केलेले सर्व फोटो-व्हिडिओ निवडलेल्या बॅकअप अल्बममध्ये समक्रमित करा",
"sync_local": "स्थानिक समक्रमण",
"sync_remote": "दूरस्थ समक्रमण",
"sync_status": "समक्रमण स्थिती",
"sync_status_subtitle": "समक्रमण प्रणाली पाहा आणि व्यवस्थापित करा",
"sync_upload_album_setting_subtitle": "Immich वरील निवडलेल्या अल्बममध्ये तुमचे फोटो व व्हिडिओ तयार करा आणि अपलोड करा",
"tag": "टॅग",
"tag_assets": "आयटमना टॅग लावा",
"tag_created": "तयार केलेला टॅग: {tag}",
"tag_feature_description": "तार्किक टॅग विषयांनुसार गटबद्ध फोटो व व्हिडिओ ब्राउझ करा",
"tag_not_found_question": "टॅग सापडत नाही? <link>नवा टॅग तयार करा</link>",
"tag_people": "व्यक्तींना टॅग करा",
"tag_updated": "अद्ययावत टॅग: {tag}",
"tagged_assets": "टॅग केलेले {count, plural, one {# आयटम} other {# आयटम}}",
"tags": "टॅग्स",
"tap_to_run_job": "जॉब चालवण्यासाठी टॅप करा",
"template": "टेम्पलेट",
"theme": "थीम",
"theme_selection": "थीम निवड",
"theme_selection_description": "ब्राउझरच्या सिस्टम पसंतीनुसार थीम आपोआप लाइट/डार्क करा",
"theme_setting_asset_list_storage_indicator_title": "अॅसेट टाइल्सवर स्टोरेज निर्देशक दाखवा",
"theme_setting_asset_list_tiles_per_row_title": "प्रत्येक रांगेतील अॅसेट्सची संख्या ({count})",
"theme_setting_colorful_interface_subtitle": "बॅकग्राऊंड पृष्ठभागांवर प्राथमिक रंग लागू करा.",
"theme_setting_colorful_interface_title": "रंगीबेरंगी इंटरफेस",
"theme_setting_image_viewer_quality_subtitle": "डीटेल इमेज व्ह्यूअरची गुणवत्ता समायोजित करा",
"theme_setting_image_viewer_quality_title": "इमेज व्ह्यूअर गुणवत्ता",
"theme_setting_primary_color_subtitle": "प्राथमिक कृती व अॅक्सेंटसाठी रंग निवडा.",
"theme_setting_primary_color_title": "प्राथमिक रंग",
"theme_setting_system_primary_color_title": "सिस्टम रंग वापरा",
"theme_setting_system_theme_switch": "स्वयंचलित (सिस्टम सेटिंग्जनुसार)",
"theme_setting_theme_subtitle": "अॅपची थीम सेटिंग निवडा",
"theme_setting_three_stage_loading_subtitle": "थ्री-स्टेज लोडिंगमुळे गती वाढू शकते; परंतु नेटवर्क लोड लक्षणीय वाढतो",
"theme_setting_three_stage_loading_title": "थ्री-स्टेज लोडिंग सुरू करा",
"they_will_be_merged_together": "ते एकत्र विलीन केले जातील",
"third_party_resources": "तृतीय-पक्ष संसाधने",
"time_based_memories": "वेळ-आधारित मेमरीज",
"timeline": "टाइमलाइन",
"timezone": "वेळक्षेत्र",
"to_archive": "आर्काइव्ह करा",
"to_change_password": "परवलीचा शब्द बदला",
"to_favorite": "आवडीमध्ये जोडा",
"to_login": "लॉग इन करा",
"to_multi_select": "बहु-निवड करा",
"to_parent": "पालकाकडे जा",
"to_select": "निवडा",
"to_trash": "कचरापेटीत टाका",
"toggle_settings": "सेटिंग्ज टॉगल करा",
"total": "एकूण",
"total_usage": "एकूण वापर",
"trash": "कचरापेटी",
"trash_action_prompt": "{count} कचरापेटीत हलवले",
"trash_all": "सर्व कचरापेटीत टाका",
"trash_count": "कचरापेटी {count, number}",
"trash_delete_asset": "कचरापेटीत टाका/अॅसेट हटवा",
"trash_emptied": "कचरापेटी रिकामी केली",
"trash_no_results_message": "कचरापेटीत टाकलेले फोटो व व्हिडिओ येथे दिसतील.",
"trash_page_delete_all": "सर्व हटवा",
"trash_page_empty_trash_dialog_content": "कचरापेटी रिकामी करायची का? हे आयटम Immich मधून कायमचे हटवले जातील",
"trash_page_info": "कचरापेटीतील आयटम {days} दिवसांनंतर कायमचे हटवले जातील",
"trash_page_no_assets": "कचरापेटीत कोणतेही आयटम नाहीत",
"trash_page_restore_all": "सर्व परत आणा",
"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 कोड सेट करू शकत नाही",
"unarchive": "अनआर्काइव्ह करा",
"unarchive_action_prompt": "{count} आर्काइव्हमधून काढले",
"unarchived_count": "{count, plural, other {अनआर्काइव्ह #}}",
"undo": "पूर्ववत करा",
"unfavorite": "आवडीतून काढा",
"unfavorite_action_prompt": "{count} आवडीतून काढले",
"unhide_person": "व्यक्ती दर्शवा",
"unknown": "अज्ञात",
"unknown_country": "अज्ञात देश",
"unknown_year": "अज्ञात वर्ष",
"unlimited": "अमर्यादित",
"unlink_motion_video": "मोशन व्हिडिओ अनलिंक करा",
"unlink_oauth": "OAuth अनलिंक करा",
"unlinked_oauth_account": "OAuth खाते अनलिंक केले",
"unmute_memories": "मेमरीज अनम्यूट करा",
"unnamed_album": "नाव नसलेला अल्बम",
"unnamed_album_delete_confirmation": "तुम्हाला हा अल्बम खरंच हटवायचा आहे का?",
"unnamed_share": "नाव नसलेले शेअर",
"unsaved_change": "न साठवलेला बदल",
"unselect_all": "सर्व निवडी रद्द करा",
"unselect_all_duplicates": "सर्व डुप्लिकेट्सची निवड रद्द करा",
"unselect_all_in": "{group} मधील सर्व निवडी रद्द करा",
"unstack": "स्टॅक वेगळा करा",
"unstack_action_prompt": "{count} अनस्टॅक केले",
"unstacked_assets_count": "अनस्टॅक केलेले {count, plural, one {# आयटम} other {# आयटम}}",
"untagged": "टॅग नसलेले",
"up_next": "पुढे",
"update_location_action_prompt": "निवडलेल्या {count} आयटमचे स्थान याने अद्ययावत करा:",
"updated_at": "अद्ययावत केले",
"updated_password": "परवलीचा शब्द अद्ययावत केला",
"upload": "अपलोड",
"upload_action_prompt": "अपलोडसाठी {count} रांगेत",
"upload_concurrency": "अपलोड समांतरता",
"upload_details": "अपलोड तपशील",
"upload_dialog_info": "निवडलेले आयटम सर्व्हरवर बॅकअप करायचे का?",
"upload_dialog_title": "अॅसेट अपलोड करा",
"upload_errors": "अपलोड पूर्ण झाले; {count, plural, one {# त्रुटी} other {# त्रुटी}} आढळल्या. नवीन अपलोड आयटम पाहण्यासाठी पृष्ठ रीफ्रेश करा.",
"upload_finished": "अपलोड पूर्ण",
"upload_progress": "उर्वरित {remaining, number} — प्रक्रिया झालेले {processed, number}/{total, number}",
"upload_skipped_duplicates": "वगळले {count, plural, one {# डुप्लिकेट आयटम} other {# डुप्लिकेट आयटम}}",
"upload_status_duplicates": "डुप्लिकेट",
"upload_status_errors": "त्रुटी",
"upload_status_uploaded": "अपलोड झाले",
"upload_success": "अपलोड यशस्वी. नवीन अपलोड आयटम दिसण्यासाठी पृष्ठ रीफ्रेश करा.",
"upload_to_immich": "Immich वर अपलोड करा ({count})",
"uploading": "अपलोड होत आहे",
"uploading_media": "माध्यमे अपलोड होत आहेत",
"url": "URL",
"usage": "वापर",
"use_biometric": "बायोमेट्रिक वापरा",
"use_current_connection": "सध्याचे कनेक्शन वापरा",
"use_custom_date_range": "याऐवजी सानुकूल दिनांक श्रेणी वापरा",
"user": "वापरकर्ता",
"user_has_been_deleted": "हा वापरकर्ता हटविला गेला आहे.",
"user_id": "वापरकर्ता आयडी",
"user_liked": "{user} यांना {type, select, photo {हा फोटो} video {हा व्हिडिओ} asset {हा आयटम} other {हे}} आवडले",
"user_pin_code_settings": "PIN कोड",
"user_pin_code_settings_description": "तुमचा PIN कोड व्यवस्थापित करा",
"user_privacy": "वापरकर्ता गोपनीयता",
"user_purchase_settings": "खरेदी",
"user_purchase_settings_description": "तुमची खरेदी व्यवस्थापित करा",
"user_role_set": "{user} यांना {role} म्हणून सेट करा",
"user_usage_detail": "वापरकर्त्याच्या वापराचा तपशील",
"user_usage_stats": "खात्याच्या वापराच्या सांख्यिकी",
"user_usage_stats_description": "खात्याच्या वापराच्या सांख्यिकी पहा",
"username": "वापरकर्तानाव",
"users": "वापरकर्ते",
"users_added_to_album_count": "अल्बममध्ये {count, plural, one {# वापरकर्ता जोडला} other {# वापरकर्ते जोडले}}",
"utilities": "उपयुक्तता",
"validate": "तपासा",
"validate_endpoint_error": "कृपया वैध URL प्रविष्ट करा",
"variables": "चल",
"version": "आवृत्ती",
"version_announcement_closing": "तुमचा मित्र, अ‍ॅलेक्स",
"version_announcement_message": "नमस्कार! Immich ची नवी आवृत्ती उपलब्ध आहे. तुमची संरचना अद्ययावत आणि बिनचूक राहावी यासाठी कृपया काही वेळ काढून <link>रिलीज नोट्स</link> वाचा, विशेषतः तुम्ही WatchTower किंवा अद्ययावत प्रक्रिया स्वयंचलितपणे हाताळणारी कोणतीही व्यवस्था वापरत असाल तर.",
"version_history": "आवृत्ती इतिहास",
"version_history_item": "{date} रोजी {version} स्थापित केली",
"video": "व्हिडिओ",
"video_hover_setting": "हावर केल्यावर व्हिडिओ थंबनेल प्ले करा",
"video_hover_setting_description": "आयटमवर माऊस नेल्यावर व्हिडिओ थंबनेल प्ले होईल. पर्याय बंद असला तरी प्ले चिन्हावर हावर केल्यास प्लेबॅक सुरू करता येईल.",
"videos": "व्हिडिओ",
"videos_count": "{count, plural, one {# व्हिडिओ} other {# व्हिडिओ}}",
"view": "पहा",
"view_album": "अल्बम पहा",
"view_all": "सर्व पहा",
"view_all_users": "सर्व वापरकर्ते पहा",
"view_details": "तपशील पहा",
"view_in_timeline": "टाइमलाइनमध्ये पहा",
"view_link": "दुवा पहा",
"view_links": "दुवे पहा",
"view_name": "पहा",
"view_next_asset": "पुढील आयटम पहा",
"view_previous_asset": "मागील आयटम पहा",
"view_qr_code": "QR कोड पहा",
"view_similar_photos": "समान फोटो पहा",
"view_stack": "स्टॅक पहा",
"view_user": "वापरकर्ता पहा",
"viewer_remove_from_stack": "स्टॅकमधून काढा",
"viewer_stack_use_as_main_asset": "मुख्य आयटम म्हणून वापरा",
"viewer_unstack": "स्टॅक वेगळा करा",
"visibility_changed": "दृश्यता {count, plural, one {# व्यक्तीसाठी बदलली} other {# व्यक्तींसाठी बदलली}}",
"waiting": "प्रतीक्षेत", "waiting": "प्रतीक्षेत",
"warning": "चेतावणी", "warning": "चेतावणी",
"week": "आठवडा", "week": "आठवडा",

View File

@@ -1515,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Mobilapp er utdatert. Vennligst oppdater til nyeste versjon.", "profile_drawer_client_out_of_date_minor": "Mobilapp er utdatert. Vennligst oppdater til nyeste versjon.",
"profile_drawer_client_server_up_to_date": "Klient og server er oppdatert", "profile_drawer_client_server_up_to_date": "Klient og server er oppdatert",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Skrivebeskyttet modus er aktivert. Dobbelttrykk på brukerens avatarikon for å avslutte.", "profile_drawer_readonly_mode": "Skrivebeskyttet modus er aktivert. Langttrykk på brukerens avatarikon for å avslutte.",
"profile_drawer_server_out_of_date_major": "Server er utdatert. Vennligst oppdater til nyeste versjon.", "profile_drawer_server_out_of_date_major": "Server er utdatert. Vennligst oppdater til nyeste versjon.",
"profile_drawer_server_out_of_date_minor": "Server er utdatert. Vennligst oppdater til nyeste versjon.", "profile_drawer_server_out_of_date_minor": "Server er utdatert. Vennligst oppdater til nyeste versjon.",
"profile_image_of_user": "Profil bilde av {user}", "profile_image_of_user": "Profil bilde av {user}",
@@ -1917,6 +1917,8 @@
"sync_albums_manual_subtitle": "Synkroniser alle opplastede videoer og bilder til det valgte backupalbumet", "sync_albums_manual_subtitle": "Synkroniser alle opplastede videoer og bilder til det valgte backupalbumet",
"sync_local": "Synkroniser lokalt", "sync_local": "Synkroniser lokalt",
"sync_remote": "Synkroniser eksternt", "sync_remote": "Synkroniser eksternt",
"sync_status": "Synkroniseringsstatus",
"sync_status_subtitle": "Vis og håndter synkronisering",
"sync_upload_album_setting_subtitle": "Opprett og last opp dine bilder og videoer til det valgte albumet på Immich", "sync_upload_album_setting_subtitle": "Opprett og last opp dine bilder og videoer til det valgte albumet på Immich",
"tag": "Tagg", "tag": "Tagg",
"tag_assets": "Merk ressurser", "tag_assets": "Merk ressurser",
@@ -1976,6 +1978,7 @@
"trash_page_select_assets_btn": "Velg objekter", "trash_page_select_assets_btn": "Velg objekter",
"trash_page_title": "Søppelbøtte ({count})", "trash_page_title": "Søppelbøtte ({count})",
"trashed_items_will_be_permanently_deleted_after": "Elementer i papirkurven vil bli permanent slettet etter {days, plural, one {# dag} other {# dager}}.", "trashed_items_will_be_permanently_deleted_after": "Elementer i papirkurven vil bli permanent slettet etter {days, plural, one {# dag} other {# dager}}.",
"troubleshoot": "Feilsøk",
"type": "Type", "type": "Type",
"unable_to_change_pin_code": "Klarte ikke å endre PIN-kode", "unable_to_change_pin_code": "Klarte ikke å endre PIN-kode",
"unable_to_setup_pin_code": "Klarte ikke å sette opp PINkode", "unable_to_setup_pin_code": "Klarte ikke å sette opp PINkode",

View File

@@ -708,7 +708,7 @@
"control_bottom_app_bar_edit_time": "Datum & tijd bewerken", "control_bottom_app_bar_edit_time": "Datum & tijd bewerken",
"control_bottom_app_bar_share_link": "Link delen", "control_bottom_app_bar_share_link": "Link delen",
"control_bottom_app_bar_share_to": "Delen met", "control_bottom_app_bar_share_to": "Delen met",
"control_bottom_app_bar_trash_from_immich": "Verwijderen uit Immich", "control_bottom_app_bar_trash_from_immich": "Verwijderen van Immich",
"copied_image_to_clipboard": "Afbeelding gekopieerd naar klembord.", "copied_image_to_clipboard": "Afbeelding gekopieerd naar klembord.",
"copied_to_clipboard": "Gekopieerd naar klembord!", "copied_to_clipboard": "Gekopieerd naar klembord!",
"copy_error": "Fout bij kopiëren", "copy_error": "Fout bij kopiëren",
@@ -1515,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Mobiele app is verouderd. Werk bij naar de nieuwste subversie.", "profile_drawer_client_out_of_date_minor": "Mobiele app is verouderd. Werk bij naar de nieuwste subversie.",
"profile_drawer_client_server_up_to_date": "App en server zijn up-to-date", "profile_drawer_client_server_up_to_date": "App en server zijn up-to-date",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Alleen-lezen-modus ingeschakeld. Dubbeltik op het avatarpictogram van de gebruiker om te verlaten.", "profile_drawer_readonly_mode": "Alleen-lezen-modus ingeschakeld. Druk lang op je profielfoto om te verlaten.",
"profile_drawer_server_out_of_date_major": "Server is verouderd. Werk bij naar de nieuwste hoofdversie.", "profile_drawer_server_out_of_date_major": "Server is verouderd. Werk bij naar de nieuwste hoofdversie.",
"profile_drawer_server_out_of_date_minor": "Server is verouderd. Werk bij naar de nieuwste subversie.", "profile_drawer_server_out_of_date_minor": "Server is verouderd. Werk bij naar de nieuwste subversie.",
"profile_image_of_user": "Profielfoto van {user}", "profile_image_of_user": "Profielfoto van {user}",
@@ -1640,6 +1640,7 @@
"restore_user": "Gebruiker herstellen", "restore_user": "Gebruiker herstellen",
"restored_asset": "Item hersteld", "restored_asset": "Item hersteld",
"resume": "Hervatten", "resume": "Hervatten",
"resume_paused_jobs": "Hervat {count, plural, one {# gepauseerde taak} other {# gepauseerde taken}}",
"retry_upload": "Opnieuw uploaden", "retry_upload": "Opnieuw uploaden",
"review_duplicates": "Controleer duplicaten", "review_duplicates": "Controleer duplicaten",
"review_large_files": "Grote bestanden beoordelen", "review_large_files": "Grote bestanden beoordelen",
@@ -1916,6 +1917,8 @@
"sync_albums_manual_subtitle": "Synchroniseer alle geüploade videos en fotos naar de geselecteerde back-up albums", "sync_albums_manual_subtitle": "Synchroniseer alle geüploade videos en fotos naar de geselecteerde back-up albums",
"sync_local": "Lokaal synchroniseren", "sync_local": "Lokaal synchroniseren",
"sync_remote": "Op afstand synchroniseren", "sync_remote": "Op afstand synchroniseren",
"sync_status": "Sync Status",
"sync_status_subtitle": "Bekijk en beheer het synchronisatie systeem",
"sync_upload_album_setting_subtitle": "Maak en upload je foto's en video's naar de geselecteerde albums op Immich", "sync_upload_album_setting_subtitle": "Maak en upload je foto's en video's naar de geselecteerde albums op Immich",
"tag": "Tag", "tag": "Tag",
"tag_assets": "Items taggen", "tag_assets": "Items taggen",
@@ -1975,6 +1978,7 @@
"trash_page_select_assets_btn": "Selecteer items", "trash_page_select_assets_btn": "Selecteer items",
"trash_page_title": "Prullenbak ({count})", "trash_page_title": "Prullenbak ({count})",
"trashed_items_will_be_permanently_deleted_after": "Items in de prullenbak worden na {days, plural, one {# dag} other {# dagen}} permanent verwijderd.", "trashed_items_will_be_permanently_deleted_after": "Items in de prullenbak worden na {days, plural, one {# dag} other {# dagen}} permanent verwijderd.",
"troubleshoot": "Problemen oplossen",
"type": "Type", "type": "Type",
"unable_to_change_pin_code": "PIN code kan niet gewijzigd worden", "unable_to_change_pin_code": "PIN code kan niet gewijzigd worden",
"unable_to_setup_pin_code": "PIN code kan niet ingesteld worden", "unable_to_setup_pin_code": "PIN code kan niet ingesteld worden",

View File

@@ -443,7 +443,7 @@
"albums_default_sort_order": "Domyślna kolejność sortowania w albumach", "albums_default_sort_order": "Domyślna kolejność sortowania w albumach",
"albums_default_sort_order_description": "Początkowa kolejność sortowania zasobów przy tworzeniu nowych albumów.", "albums_default_sort_order_description": "Początkowa kolejność sortowania zasobów przy tworzeniu nowych albumów.",
"albums_feature_description": "Kolekcje zasobów, które można udostępniać innym użytkownikom.", "albums_feature_description": "Kolekcje zasobów, które można udostępniać innym użytkownikom.",
"albums_on_device_count": "Albumów na urzadzeniu ({count})", "albums_on_device_count": "Albumy na urządzeniu ({count})",
"all": "Wszystkie", "all": "Wszystkie",
"all_albums": "Wszystkie albumy", "all_albums": "Wszystkie albumy",
"all_people": "Wszystkie osoby", "all_people": "Wszystkie osoby",
@@ -504,7 +504,7 @@
"assets_added_count": "Dodano {count, plural, one {# zasób} few {# zasoby} other {# zasobów}}", "assets_added_count": "Dodano {count, plural, one {# zasób} few {# zasoby} other {# zasobów}}",
"assets_added_to_album_count": "Dodano {count, plural, one {# zasób} few {# zasoby} other {# zasobów}} do albumu", "assets_added_to_album_count": "Dodano {count, plural, one {# zasób} few {# zasoby} other {# zasobów}} do albumu",
"assets_added_to_albums_count": "Dodano {assetTotal, plural, one {# zasób} few {# zasoby} other {# zasobów}} do {albumTotal, plural, one {# albumu} other {# albumów}}", "assets_added_to_albums_count": "Dodano {assetTotal, plural, one {# zasób} few {# zasoby} other {# zasobów}} do {albumTotal, plural, one {# albumu} other {# albumów}}",
"assets_cannot_be_added_to_album_count": "{count, plural, one {sztuka Elementu} other {szt. Elementów}} nie może być dodana do albumu", "assets_cannot_be_added_to_album_count": "{count, plural, one {Zasób nie może zostać dodany} other {Zasoby nie mogą zostać dodane}} do albumu",
"assets_cannot_be_added_to_albums": "{count, plural, one {Zasób nie może być dodany} other {Zasoby nie mogą być dodane}} do żadnego z albumów", "assets_cannot_be_added_to_albums": "{count, plural, one {Zasób nie może być dodany} other {Zasoby nie mogą być dodane}} do żadnego z albumów",
"assets_count": "{count, plural, one {# zasób} few {# zasoby} other {# zasobów}}", "assets_count": "{count, plural, one {# zasób} few {# zasoby} other {# zasobów}}",
"assets_deleted_permanently": "{count} zostało trwale usuniętych", "assets_deleted_permanently": "{count} zostało trwale usuniętych",
@@ -521,7 +521,7 @@
"assets_trashed": "{count} szt. zostało wrzucone do kosza", "assets_trashed": "{count} szt. zostało wrzucone do kosza",
"assets_trashed_count": "Wrzucono do kosza {count, plural, one {# zasób} few {# zasoby} other {# zasobów}}", "assets_trashed_count": "Wrzucono do kosza {count, plural, one {# zasób} few {# zasoby} other {# zasobów}}",
"assets_trashed_from_server": "{count} szt. usuniętych z serwera Immich", "assets_trashed_from_server": "{count} szt. usuniętych z serwera Immich",
"assets_were_part_of_album_count": "{count, plural, one {Zasób był} few {Zasoby były} many {Zasobów było} other {Zasobów było}} już częścią albumu", "assets_were_part_of_album_count": "{count, plural, one {Zasób był} other {Zasoby były}} już częścią albumu",
"assets_were_part_of_albums_count": "{count, plural, one {Zasób był} other {Zasoby były}} już częścią albumów", "assets_were_part_of_albums_count": "{count, plural, one {Zasób był} other {Zasoby były}} już częścią albumów",
"authorized_devices": "Autoryzowane urządzenia", "authorized_devices": "Autoryzowane urządzenia",
"automatic_endpoint_switching_subtitle": "Połącz się lokalnie przez wyznaczoną sieć Wi-Fi, jeśli jest dostępna, i korzystaj z alternatywnych połączeń gdzie indziej", "automatic_endpoint_switching_subtitle": "Połącz się lokalnie przez wyznaczoną sieć Wi-Fi, jeśli jest dostępna, i korzystaj z alternatywnych połączeń gdzie indziej",
@@ -535,7 +535,7 @@
"backup_album_selection_page_albums_device": "Albumy na urządzeniu ({count})", "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ć", "backup_album_selection_page_albums_tap": "Stuknij, aby włączyć, stuknij dwukrotnie, aby wykluczyć",
"backup_album_selection_page_assets_scatter": "Pliki mogą być rozproszone w wielu albumach. Dzięki temu albumy mogą być włączane lub wyłączane podczas procesu tworzenia kopii zapasowej.", "backup_album_selection_page_assets_scatter": "Pliki mogą być rozproszone w wielu albumach. Dzięki temu albumy mogą być włączane lub wyłączane podczas procesu tworzenia kopii zapasowej.",
"backup_album_selection_page_select_albums": "Zaznacz albumy", "backup_album_selection_page_select_albums": "Wybierz albumy",
"backup_album_selection_page_selection_info": "Info o wyborze", "backup_album_selection_page_selection_info": "Info o wyborze",
"backup_album_selection_page_total_assets": "Łącznie unikalnych plików", "backup_album_selection_page_total_assets": "Łącznie unikalnych plików",
"backup_all": "Wszystkie", "backup_all": "Wszystkie",
@@ -564,7 +564,7 @@
"backup_controller_page_background_turn_on": "Włącz usługę w tle", "backup_controller_page_background_turn_on": "Włącz usługę w tle",
"backup_controller_page_background_wifi": "Tylko Wi-Fi", "backup_controller_page_background_wifi": "Tylko Wi-Fi",
"backup_controller_page_backup": "Kopia zapasowa", "backup_controller_page_backup": "Kopia zapasowa",
"backup_controller_page_backup_selected": "Zaznaczone: ", "backup_controller_page_backup_selected": "Wybrane: ",
"backup_controller_page_backup_sub": "Zdjęcia i filmy z utworzoną kopią zapasową", "backup_controller_page_backup_sub": "Zdjęcia i filmy z utworzoną kopią zapasową",
"backup_controller_page_created": "Utworzono dnia: {date}", "backup_controller_page_created": "Utworzono dnia: {date}",
"backup_controller_page_desc_backup": "Włącz kopię zapasową na pierwszym planie, aby automatycznie przesyłać nowe zasoby na serwer po otworzeniu aplikacji.", "backup_controller_page_desc_backup": "Włącz kopię zapasową na pierwszym planie, aby automatycznie przesyłać nowe zasoby na serwer po otworzeniu aplikacji.",
@@ -573,7 +573,7 @@
"backup_controller_page_filename": "Nazwa pliku: {filename} [{size}]", "backup_controller_page_filename": "Nazwa pliku: {filename} [{size}]",
"backup_controller_page_id": "ID: {id}", "backup_controller_page_id": "ID: {id}",
"backup_controller_page_info": "Informacje o kopii zapasowej", "backup_controller_page_info": "Informacje o kopii zapasowej",
"backup_controller_page_none_selected": "Brak wybranych", "backup_controller_page_none_selected": "Nic nie wybrano",
"backup_controller_page_remainder": "Pozostałe", "backup_controller_page_remainder": "Pozostałe",
"backup_controller_page_remainder_sub": "Pozostałe zdjęcia i filmy wybrane do wykonania kopii zapasowej", "backup_controller_page_remainder_sub": "Pozostałe zdjęcia i filmy wybrane do wykonania kopii zapasowej",
"backup_controller_page_server_storage": "Pamięć Serwera", "backup_controller_page_server_storage": "Pamięć Serwera",
@@ -638,7 +638,7 @@
"cast": "Odtwórz na telewizorze", "cast": "Odtwórz na telewizorze",
"cast_description": "Skonfiguruj dostępne cele do przesyłania", "cast_description": "Skonfiguruj dostępne cele do przesyłania",
"change_date": "Zmień datę", "change_date": "Zmień datę",
"change_description": "Zmiana opisu", "change_description": "Zmi opis",
"change_display_order": "Zmień kolejność wyświetlania", "change_display_order": "Zmień kolejność wyświetlania",
"change_expiration_time": "Zmień czas ważności", "change_expiration_time": "Zmień czas ważności",
"change_location": "Zmień lokalizację", "change_location": "Zmień lokalizację",
@@ -691,7 +691,7 @@
"confirm_admin_password": "Potwierdź Hasło Administratora", "confirm_admin_password": "Potwierdź Hasło Administratora",
"confirm_delete_face": "Czy na pewno chcesz usunąć twarz {name} z zasobów?", "confirm_delete_face": "Czy na pewno chcesz usunąć twarz {name} z zasobów?",
"confirm_delete_shared_link": "Czy na pewno chcesz usunąć ten udostępniony link?", "confirm_delete_shared_link": "Czy na pewno chcesz usunąć ten udostępniony link?",
"confirm_keep_this_delete_others": "Wszystkie inne zasoby zostaną usunięte poza tym zasobem. Czy jesteś pewien, że chcesz kontynuować?", "confirm_keep_this_delete_others": "Wszystkie inne zasoby w tym stosie, z wyjątkiem tego zasobu, zostaną usunięte. Czy jesteś pewien, że chcesz kontynuować?",
"confirm_new_pin_code": "Potwierdź nowy kod PIN", "confirm_new_pin_code": "Potwierdź nowy kod PIN",
"confirm_password": "Potwierdź hasło", "confirm_password": "Potwierdź hasło",
"confirm_tag_face": "Chcesz dodać do tej twarzy etykietę {name}?", "confirm_tag_face": "Chcesz dodać do tej twarzy etykietę {name}?",
@@ -708,7 +708,7 @@
"control_bottom_app_bar_edit_time": "Edytuj datę i godzinę", "control_bottom_app_bar_edit_time": "Edytuj datę i godzinę",
"control_bottom_app_bar_share_link": "Udostępnij link", "control_bottom_app_bar_share_link": "Udostępnij link",
"control_bottom_app_bar_share_to": "Wyślij", "control_bottom_app_bar_share_to": "Wyślij",
"control_bottom_app_bar_trash_from_immich": "Przenieść do kosza", "control_bottom_app_bar_trash_from_immich": "Przenieś do kosza",
"copied_image_to_clipboard": "Skopiowano obraz do schowka.", "copied_image_to_clipboard": "Skopiowano obraz do schowka.",
"copied_to_clipboard": "Skopiowano do schowka!", "copied_to_clipboard": "Skopiowano do schowka!",
"copy_error": "Błąd kopiowania", "copy_error": "Błąd kopiowania",
@@ -786,7 +786,7 @@
"delete_local_action_prompt": "{count} lokalnie usunięto", "delete_local_action_prompt": "{count} lokalnie usunięto",
"delete_local_dialog_ok_backed_up_only": "Usuń tylko kopię zapasową", "delete_local_dialog_ok_backed_up_only": "Usuń tylko kopię zapasową",
"delete_local_dialog_ok_force": "Usuń mimo to", "delete_local_dialog_ok_force": "Usuń mimo to",
"delete_others": "Usuń inne", "delete_others": "Usuń pozostałe",
"delete_permanently": "Usuń trwale", "delete_permanently": "Usuń trwale",
"delete_permanently_action_prompt": "{count} trwale usuniętych", "delete_permanently_action_prompt": "{count} trwale usuniętych",
"delete_shared_link": "Usuń udostępniony link", "delete_shared_link": "Usuń udostępniony link",
@@ -898,7 +898,7 @@
"cannot_navigate_previous_asset": "Nie można przejść do poprzedniego zasobu", "cannot_navigate_previous_asset": "Nie można przejść do poprzedniego zasobu",
"cant_apply_changes": "Nie można zastosować zmian", "cant_apply_changes": "Nie można zastosować zmian",
"cant_change_activity": "Nie można {enabled, select, true {wyłączyć} other {włączyć}} aktywności", "cant_change_activity": "Nie można {enabled, select, true {wyłączyć} other {włączyć}} aktywności",
"cant_change_asset_favorite": "Nie można zmienić ulubionego dla zasobu", "cant_change_asset_favorite": "Nie można zmienić statusu ulubionego dla zasobu",
"cant_change_metadata_assets_count": "Nie można zmienić metadanych {count, plural, one {# zasobu} other {# zasobów}}", "cant_change_metadata_assets_count": "Nie można zmienić metadanych {count, plural, one {# zasobu} other {# zasobów}}",
"cant_get_faces": "Nie można pozyskać twarzy", "cant_get_faces": "Nie można pozyskać twarzy",
"cant_get_number_of_comments": "Nie można uzyskać liczby komentarzy", "cant_get_number_of_comments": "Nie można uzyskać liczby komentarzy",
@@ -923,7 +923,7 @@
"failed_to_load_people": "Nie udało się pobrać ludzi", "failed_to_load_people": "Nie udało się pobrać ludzi",
"failed_to_remove_product_key": "Nie udało się usunąć klucza produktu", "failed_to_remove_product_key": "Nie udało się usunąć klucza produktu",
"failed_to_reset_pin_code": "Nie udało się zresetować kodu PIN", "failed_to_reset_pin_code": "Nie udało się zresetować kodu PIN",
"failed_to_stack_assets": "Nie udało się zestawić zasobów", "failed_to_stack_assets": "Nie udało się utworzyć stosu z zasobów",
"failed_to_unstack_assets": "Nie udało się rozdzielić zasobów", "failed_to_unstack_assets": "Nie udało się rozdzielić zasobów",
"failed_to_update_notification_status": "Nie udało się zaktualizować stanu powiadomienia", "failed_to_update_notification_status": "Nie udało się zaktualizować stanu powiadomienia",
"import_path_already_exists": "Ta ścieżka importu już istnieje.", "import_path_already_exists": "Ta ścieżka importu już istnieje.",
@@ -1151,7 +1151,7 @@
"immich_web_interface": "Interfejs internetowy Immich", "immich_web_interface": "Interfejs internetowy Immich",
"import_from_json": "Wczytaj z JSON", "import_from_json": "Wczytaj z JSON",
"import_path": "Ścieżka importu", "import_path": "Ścieżka importu",
"in_albums": "W {count, plural, one {# album} other {# albumy}}", "in_albums": "W {count, plural, one {# albumie} other {# albumach}}",
"in_archive": "W archiwum", "in_archive": "W archiwum",
"include_archived": "Uwzględnij zarchiwizowane", "include_archived": "Uwzględnij zarchiwizowane",
"include_shared_albums": "Uwzględnij udostępnione albumy", "include_shared_albums": "Uwzględnij udostępnione albumy",
@@ -1175,11 +1175,11 @@
"ios_debug_info_no_sync_yet": "Nie uruchomiono jeszcze żadnego zadania synchronizacji w tle", "ios_debug_info_no_sync_yet": "Nie uruchomiono jeszcze żadnego zadania synchronizacji w tle",
"ios_debug_info_processes_queued": "{count, plural, one {{count} proces w tle w kolejce} few {{count} procesy w tle w kolejce} other {{count} procesów w tle w kolejce}}", "ios_debug_info_processes_queued": "{count, plural, one {{count} proces w tle w kolejce} few {{count} procesy w tle w kolejce} other {{count} procesów w tle w kolejce}}",
"ios_debug_info_processing_ran_at": "Przetwarzanie przebiegło {dateTime}", "ios_debug_info_processing_ran_at": "Przetwarzanie przebiegło {dateTime}",
"items_count": "{count, plural, one {# element} other {# elementy}}", "items_count": "{count, plural, one {# element} few {# elementy} other {# elementów}}",
"jobs": "Zadania", "jobs": "Zadania",
"keep": "Zachowaj", "keep": "Zachowaj",
"keep_all": "Zachowaj wszystko", "keep_all": "Zachowaj wszystko",
"keep_this_delete_others": "Zachowaj to, usuń inne", "keep_this_delete_others": "Zachowaj to, usuń pozostałe",
"kept_this_deleted_others": "Zachowano ten zasób i usunięto {count, plural, one {#zasób} other {#zasoby}}", "kept_this_deleted_others": "Zachowano ten zasób i usunięto {count, plural, one {#zasób} other {#zasoby}}",
"keyboard_shortcuts": "Skróty klawiaturowe", "keyboard_shortcuts": "Skróty klawiaturowe",
"language": "Język", "language": "Język",
@@ -1459,7 +1459,7 @@
"permanent_deletion_warning_setting_description": "Pokaż ostrzeżenie przy trwałym usuwaniu zasobów", "permanent_deletion_warning_setting_description": "Pokaż ostrzeżenie przy trwałym usuwaniu zasobów",
"permanently_delete": "Usuń trwale", "permanently_delete": "Usuń trwale",
"permanently_delete_assets_count": "Trwale usuń {count, plural, one {zasób} few {zasoby} many {zasobów} other {zasobów}}", "permanently_delete_assets_count": "Trwale usuń {count, plural, one {zasób} few {zasoby} many {zasobów} other {zasobów}}",
"permanently_delete_assets_prompt": "Czy na pewno chcesz trwale usunąć {count, plural, one {ten zasób?} other {te <b>#</b> zasoby?}} Spowoduje to również usunięcie {count, plural, one {go z jego} other {ich z ich}} album(ów).", "permanently_delete_assets_prompt": "Czy na pewno chcesz trwale usunąć {count, plural, one {ten zasób?} few {te <b>#</b> zasoby?} other {te <b>#</b> zasobów?}} Spowoduje to również usunięcie {count, plural, one {go z jego} other {ich z ich}} album(ów).",
"permanently_deleted_asset": "Pomyślnie trwale usunięto zasób", "permanently_deleted_asset": "Pomyślnie trwale usunięto zasób",
"permanently_deleted_assets_count": "Trwale usunięto {count, plural, one {# zasób} other {# zasobów}}", "permanently_deleted_assets_count": "Trwale usunięto {count, plural, one {# zasób} other {# zasobów}}",
"permission": "Pozwolenie", "permission": "Pozwolenie",
@@ -1589,7 +1589,7 @@
"remote": "Zdalny", "remote": "Zdalny",
"remote_assets": "Zasoby zdalne", "remote_assets": "Zasoby zdalne",
"remove": "Usuń", "remove": "Usuń",
"remove_assets_album_confirmation": "Czy na pewno chcesz usunąć {count, plural, one {# zasób} other {# zasoby}} z albumu?", "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?", "remove_assets_shared_link_confirmation": "Czy na pewno chcesz usunąć {count, plural, one {# zasób} other {# zasoby}} z tego udostępnionego linku?",
"remove_assets_title": "Usunąć zasoby?", "remove_assets_title": "Usunąć zasoby?",
"remove_custom_date_range": "Usuń niestandardowy zakres dat", "remove_custom_date_range": "Usuń niestandardowy zakres dat",
@@ -1712,7 +1712,7 @@
"search_tags": "Wyszukaj etykiety...", "search_tags": "Wyszukaj etykiety...",
"search_timezone": "Wyszukaj strefę czasową...", "search_timezone": "Wyszukaj strefę czasową...",
"search_type": "Wyszukaj w", "search_type": "Wyszukaj w",
"search_your_photos": "Szukaj swoich zdjęć", "search_your_photos": "Przeszukaj swoje zdjęcia",
"searching_locales": "Wyszukaj region...", "searching_locales": "Wyszukaj region...",
"second": "Sekunda", "second": "Sekunda",
"see_all_people": "Zobacz wszystkie osoby", "see_all_people": "Zobacz wszystkie osoby",
@@ -1732,7 +1732,7 @@
"select_photos": "Wybierz zdjęcia", "select_photos": "Wybierz zdjęcia",
"select_trash_all": "Zaznacz wszystko do kosza", "select_trash_all": "Zaznacz wszystko do kosza",
"select_user_for_sharing_page_err_album": "Nie udało się utworzyć albumu", "select_user_for_sharing_page_err_album": "Nie udało się utworzyć albumu",
"selected": "Zaznaczone", "selected": "Wybrane",
"selected_count": "{count, plural, other {# wybrane}}", "selected_count": "{count, plural, other {# wybrane}}",
"selected_gps_coordinates": "Wybrane Współrzędne GPS", "selected_gps_coordinates": "Wybrane Współrzędne GPS",
"send_message": "Wyślij wiadomość", "send_message": "Wyślij wiadomość",
@@ -1887,9 +1887,9 @@
"stack": "Stos", "stack": "Stos",
"stack_action_prompt": "{count} zgrupowano", "stack_action_prompt": "{count} zgrupowano",
"stack_duplicates": "Stos duplikatów", "stack_duplicates": "Stos duplikatów",
"stack_select_one_photo": "Wybierz jedno główne zdjęcie do stosu", "stack_select_one_photo": "Wybierz jedno główne zdjęcie dla stosu",
"stack_selected_photos": "Układaj wybrane zdjęcia", "stack_selected_photos": "Utwórz stos z wybranych zdjęć",
"stacked_assets_count": "Ułożone {count, plural, one {# zasób} other{# zasoby}}", "stacked_assets_count": "Utworzono stos z {count, plural, one {# zasobu} other {# zasobów}}",
"stacktrace": "Ślad stosu", "stacktrace": "Ślad stosu",
"start": "Start", "start": "Start",
"start_date": "Od dnia", "start_date": "Od dnia",
@@ -1952,7 +1952,7 @@
"time_based_memories": "Wspomnienia oparte na czasie", "time_based_memories": "Wspomnienia oparte na czasie",
"timeline": "Oś czasu", "timeline": "Oś czasu",
"timezone": "Strefa czasowa", "timezone": "Strefa czasowa",
"to_archive": "Archiwum", "to_archive": "Zarchiwizuj",
"to_change_password": "Zmień hasło", "to_change_password": "Zmień hasło",
"to_favorite": "Dodaj do ulubionych", "to_favorite": "Dodaj do ulubionych",
"to_login": "Zaloguj się", "to_login": "Zaloguj się",
@@ -1966,7 +1966,7 @@
"trash": "Kosz", "trash": "Kosz",
"trash_action_prompt": "{count} przeniesione do kosza", "trash_action_prompt": "{count} przeniesione do kosza",
"trash_all": "Usuń wszystkie", "trash_all": "Usuń wszystkie",
"trash_count": "Kosz {count, number}", "trash_count": "Usuń {count, number}",
"trash_delete_asset": "Kosz/Usuń zasób", "trash_delete_asset": "Kosz/Usuń zasób",
"trash_emptied": "Opróżnione śmieci", "trash_emptied": "Opróżnione śmieci",
"trash_no_results_message": "Tu znajdziesz wyrzucone zdjęcia i filmy.", "trash_no_results_message": "Tu znajdziesz wyrzucone zdjęcia i filmy.",
@@ -1982,7 +1982,7 @@
"type": "Typ", "type": "Typ",
"unable_to_change_pin_code": "Nie można zmienić kodu PIN", "unable_to_change_pin_code": "Nie można zmienić kodu PIN",
"unable_to_setup_pin_code": "Nie można ustawić kodu PIN", "unable_to_setup_pin_code": "Nie można ustawić kodu PIN",
"unarchive": "Cofnij archiwizację", "unarchive": "Przywróć z archiwum",
"unarchive_action_prompt": "{count} usunięto z archiwum", "unarchive_action_prompt": "{count} usunięto z archiwum",
"unarchived_count": "{count, plural, one {# cofnięta archiwizacja} few {# cofnięte archiwizacje} other {# cofniętych archiwizacji}}", "unarchived_count": "{count, plural, one {# cofnięta archiwizacja} few {# cofnięte archiwizacje} other {# cofniętych archiwizacji}}",
"undo": "Cofnij", "undo": "Cofnij",
@@ -2004,9 +2004,9 @@
"unselect_all": "Odznacz wszystko", "unselect_all": "Odznacz wszystko",
"unselect_all_duplicates": "Odznacz wszystkie duplikaty", "unselect_all_duplicates": "Odznacz wszystkie duplikaty",
"unselect_all_in": "Odznacz wszystkie w {group}", "unselect_all_in": "Odznacz wszystkie w {group}",
"unstack": "Rozłóż stos", "unstack": "Rozdziel stos",
"unstack_action_prompt": "{count} odgrupowano", "unstack_action_prompt": "{count} rozdzielono",
"unstacked_assets_count": "{count, plural, one {Rozłożony # zasób} few {Rozłożone # zasoby} other {Rozłożonych # zasobów}}", "unstacked_assets_count": "Rozdzielono {count, plural, one {# zasób} few {# zasoby} other {# zasobów}}",
"untagged": "Nieoznaczone", "untagged": "Nieoznaczone",
"up_next": "Do następnego", "up_next": "Do następnego",
"update_location_action_prompt": "Zaktualizuj lokalizację {count} wybranych zasobów na:", "update_location_action_prompt": "Zaktualizuj lokalizację {count} wybranych zasobów na:",
@@ -2077,11 +2077,11 @@
"view_previous_asset": "Wyświetl poprzedni zasób", "view_previous_asset": "Wyświetl poprzedni zasób",
"view_qr_code": "Pokaż kod QR", "view_qr_code": "Pokaż kod QR",
"view_similar_photos": "Zobacz podobne zdjęcia", "view_similar_photos": "Zobacz podobne zdjęcia",
"view_stack": "Zobacz Ułożenie", "view_stack": "Zobacz stos",
"view_user": "Wyświetl użytkownika", "view_user": "Wyświetl użytkownika",
"viewer_remove_from_stack": "Usuń ze stosu", "viewer_remove_from_stack": "Usuń ze stosu",
"viewer_stack_use_as_main_asset": "Użyj jako głównego zasobu", "viewer_stack_use_as_main_asset": "Użyj jako głównego zasobu",
"viewer_unstack": "Rozłóż Stos", "viewer_unstack": "Rozdziel stos",
"visibility_changed": "Zmieniono widoczność dla {count, plural, one {# osoby} other {# osób}}", "visibility_changed": "Zmieniono widoczność dla {count, plural, one {# osoby} other {# osób}}",
"waiting": "Oczekujące", "waiting": "Oczekujące",
"warning": "Ostrzeżenie", "warning": "Ostrzeżenie",

View File

@@ -1412,6 +1412,8 @@
"open_the_search_filters": "Abrir os filtros de pesquisa", "open_the_search_filters": "Abrir os filtros de pesquisa",
"options": "Opções", "options": "Opções",
"or": "ou", "or": "ou",
"organize_into_albums": "Organizar em álbuns",
"organize_into_albums_description": "Colocar fotos existentes em álbuns utilizando as definições atuais de sincronização",
"organize_your_library": "Organizar a sua biblioteca", "organize_your_library": "Organizar a sua biblioteca",
"original": "original", "original": "original",
"other": "Outro", "other": "Outro",
@@ -1513,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "O aplicativo está desatualizado. Por favor, atualize para a versão mais recente.", "profile_drawer_client_out_of_date_minor": "O aplicativo está desatualizado. Por favor, atualize para a versão mais recente.",
"profile_drawer_client_server_up_to_date": "Cliente e Servidor atualizados", "profile_drawer_client_server_up_to_date": "Cliente e Servidor atualizados",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Modo somente leitura activado. Toque duas vezes no ícone do avatar do utilizador para sair.", "profile_drawer_readonly_mode": "Modo somente leitura ativado. Toque duas vezes no ícone do avatar do utilizador para sair.",
"profile_drawer_server_out_of_date_major": "O servidor está desatualizado. Atualize para a versão principal mais recente.", "profile_drawer_server_out_of_date_major": "O servidor está desatualizado. Atualize para a versão principal mais recente.",
"profile_drawer_server_out_of_date_minor": "O servidor está desatualizado. Atualize para a versão mais recente.", "profile_drawer_server_out_of_date_minor": "O servidor está desatualizado. Atualize para a versão mais recente.",
"profile_image_of_user": "Imagem de perfil de {user}", "profile_image_of_user": "Imagem de perfil de {user}",
@@ -1552,6 +1554,7 @@
"purchase_server_description_2": "Status de apoiante", "purchase_server_description_2": "Status de apoiante",
"purchase_server_title": "Servidor", "purchase_server_title": "Servidor",
"purchase_settings_server_activated": "A chave de produto do servidor é gerida pelo administrador", "purchase_settings_server_activated": "A chave de produto do servidor é gerida pelo administrador",
"query_asset_id": "Consultar ID do recurso",
"queue_status": "Em fila {count}/{total}", "queue_status": "Em fila {count}/{total}",
"rating": "Classificação por estrelas", "rating": "Classificação por estrelas",
"rating_clear": "Limpar classificação", "rating_clear": "Limpar classificação",
@@ -1637,6 +1640,7 @@
"restore_user": "Restaurar utilizador", "restore_user": "Restaurar utilizador",
"restored_asset": "Ficheiro restaurado", "restored_asset": "Ficheiro restaurado",
"resume": "Continuar", "resume": "Continuar",
"resume_paused_jobs": "Continuar {count, plural, one {# trabalho em pausa} other {# trabalhos pausados}}",
"retry_upload": "Tentar carregar novamente", "retry_upload": "Tentar carregar novamente",
"review_duplicates": "Rever itens duplicados", "review_duplicates": "Rever itens duplicados",
"review_large_files": "Rever arquivos grandes", "review_large_files": "Rever arquivos grandes",
@@ -1730,7 +1734,7 @@
"select_user_for_sharing_page_err_album": "Ocorreu um erro ao criar o álbum", "select_user_for_sharing_page_err_album": "Ocorreu um erro ao criar o álbum",
"selected": "Selecionados", "selected": "Selecionados",
"selected_count": "{count, plural, other {# selecionados}}", "selected_count": "{count, plural, other {# selecionados}}",
"selected_gps_coordinates": "coordenadas gps seleccionadas", "selected_gps_coordinates": "Coordenadas GPS selecionadas",
"send_message": "Enviar mensagem", "send_message": "Enviar mensagem",
"send_welcome_email": "Enviar E-mail de boas vindas", "send_welcome_email": "Enviar E-mail de boas vindas",
"server_endpoint": "URL do servidor", "server_endpoint": "URL do servidor",
@@ -1913,6 +1917,8 @@
"sync_albums_manual_subtitle": "Sincronizar todas as fotos e vídeos enviados para o álbum de backup selecionado", "sync_albums_manual_subtitle": "Sincronizar todas as fotos e vídeos enviados para o álbum de backup selecionado",
"sync_local": "Sincronização Local", "sync_local": "Sincronização Local",
"sync_remote": "Sincronização Remota", "sync_remote": "Sincronização Remota",
"sync_status": "Status da sincronização",
"sync_status_subtitle": "Ver e gerir o sistema de sincronização",
"sync_upload_album_setting_subtitle": "Crie e envie suas fotos e vídeos para o álbum selecionado no Immich", "sync_upload_album_setting_subtitle": "Crie e envie suas fotos e vídeos para o álbum selecionado no Immich",
"tag": "Etiqueta", "tag": "Etiqueta",
"tag_assets": "Etiquetar ficheiros", "tag_assets": "Etiquetar ficheiros",
@@ -1972,6 +1978,7 @@
"trash_page_select_assets_btn": "Selecionar arquivos", "trash_page_select_assets_btn": "Selecionar arquivos",
"trash_page_title": "Reciclagem ({count})", "trash_page_title": "Reciclagem ({count})",
"trashed_items_will_be_permanently_deleted_after": "Os itens da reciclagem são eliminados permanentemente após {days, plural, one {# dia} other {# dias}}.", "trashed_items_will_be_permanently_deleted_after": "Os itens da reciclagem são eliminados permanentemente após {days, plural, one {# dia} other {# dias}}.",
"troubleshoot": "Diagnosticar problemas",
"type": "Tipo", "type": "Tipo",
"unable_to_change_pin_code": "Não foi possível alterar o código PIN", "unable_to_change_pin_code": "Não foi possível alterar o código PIN",
"unable_to_setup_pin_code": "Não foi possível configurar o código PIN", "unable_to_setup_pin_code": "Não foi possível configurar o código PIN",
@@ -2069,6 +2076,7 @@
"view_next_asset": "Ver próximo ficheiro", "view_next_asset": "Ver próximo ficheiro",
"view_previous_asset": "Ver ficheiro anterior", "view_previous_asset": "Ver ficheiro anterior",
"view_qr_code": "Ver código QR", "view_qr_code": "Ver código QR",
"view_similar_photos": "Ver fotos similares",
"view_stack": "Ver pilha", "view_stack": "Ver pilha",
"view_user": "Ver utilizador", "view_user": "Ver utilizador",
"viewer_remove_from_stack": "Remover da pilha", "viewer_remove_from_stack": "Remover da pilha",

View File

@@ -1515,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "O aplicativo está desatualizado. Por favor, atualize para a versão mais recente.", "profile_drawer_client_out_of_date_minor": "O aplicativo está desatualizado. Por favor, atualize para a versão mais recente.",
"profile_drawer_client_server_up_to_date": "Cliente e Servidor estão atualizados", "profile_drawer_client_server_up_to_date": "Cliente e Servidor estão atualizados",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Modo apenas visualização ativado. Toque duas vezes na foto do usuário para sair deste modo.", "profile_drawer_readonly_mode": "Modo apenas leitura habilidato. Dê um toque prolongado na foto do usuário para sair deste modo.",
"profile_drawer_server_out_of_date_major": "O servidor está desatualizado. Atualize para a versão principal mais recente.", "profile_drawer_server_out_of_date_major": "O servidor está desatualizado. Atualize para a versão principal mais recente.",
"profile_drawer_server_out_of_date_minor": "O servidor está desatualizado. Atualize para a versão mais recente.", "profile_drawer_server_out_of_date_minor": "O servidor está desatualizado. Atualize para a versão mais recente.",
"profile_image_of_user": "Imagem do perfil de {user}", "profile_image_of_user": "Imagem do perfil de {user}",
@@ -1640,6 +1640,7 @@
"restore_user": "Restaurar usuário", "restore_user": "Restaurar usuário",
"restored_asset": "Arquivo restaurado", "restored_asset": "Arquivo restaurado",
"resume": "Continuar", "resume": "Continuar",
"resume_paused_jobs": "Retomar {count, plural, one {# paused job} other {# paused jobs}}",
"retry_upload": "Tentar enviar novamente", "retry_upload": "Tentar enviar novamente",
"review_duplicates": "Revisar duplicidade", "review_duplicates": "Revisar duplicidade",
"review_large_files": "Ver arquivos grandes", "review_large_files": "Ver arquivos grandes",
@@ -1916,6 +1917,8 @@
"sync_albums_manual_subtitle": "Sincronize todos as fotos e vídeos enviados para os álbuns de backup selecionados", "sync_albums_manual_subtitle": "Sincronize todos as fotos e vídeos enviados para os álbuns de backup selecionados",
"sync_local": "Sincronização Local", "sync_local": "Sincronização Local",
"sync_remote": "Sincronização Remota", "sync_remote": "Sincronização Remota",
"sync_status": "Status da Sincronização",
"sync_status_subtitle": "Ver e gerenciar o sistema de sincronização",
"sync_upload_album_setting_subtitle": "Crie e envie suas fotos e vídeos para o álbum selecionado no Immich", "sync_upload_album_setting_subtitle": "Crie e envie suas fotos e vídeos para o álbum selecionado no Immich",
"tag": "Marcador", "tag": "Marcador",
"tag_assets": "Marcar arquivos", "tag_assets": "Marcar arquivos",
@@ -1975,6 +1978,7 @@
"trash_page_select_assets_btn": "Selecionar arquivos", "trash_page_select_assets_btn": "Selecionar arquivos",
"trash_page_title": "Lixeira ({count})", "trash_page_title": "Lixeira ({count})",
"trashed_items_will_be_permanently_deleted_after": "Os itens da lixeira serão deletados permanentemente após {days, plural, one {# dia} other {# dias}}.", "trashed_items_will_be_permanently_deleted_after": "Os itens da lixeira serão deletados permanentemente após {days, plural, one {# dia} other {# dias}}.",
"troubleshoot": "Diagnosticar",
"type": "Tipo", "type": "Tipo",
"unable_to_change_pin_code": "Não foi possível alterar o código PIN", "unable_to_change_pin_code": "Não foi possível alterar o código PIN",
"unable_to_setup_pin_code": "Não foi possível criar o código PIN", "unable_to_setup_pin_code": "Não foi possível criar o código PIN",

View File

@@ -396,7 +396,7 @@
"advanced_settings_prefer_remote_title": "Предпочитать фото на сервере", "advanced_settings_prefer_remote_title": "Предпочитать фото на сервере",
"advanced_settings_proxy_headers_subtitle": "Определите заголовки прокси-сервера, которые Immich должен отправлять с каждым сетевым запросом", "advanced_settings_proxy_headers_subtitle": "Определите заголовки прокси-сервера, которые Immich должен отправлять с каждым сетевым запросом",
"advanced_settings_proxy_headers_title": "Заголовки прокси", "advanced_settings_proxy_headers_title": "Заголовки прокси",
"advanced_settings_readonly_mode_subtitle": "Включает режим «только просмотр», в котором можно только просматривать объекты. Функции выбора нескольких объектов, публикации, трансляции и удаления будут недоступны. Включить/отключить режим «только просмотр» можно с помощью значка аватара пользователя на главном экране.", "advanced_settings_readonly_mode_subtitle": "Включает режим, в котором можно только просматривать объекты. Функции выбора нескольких объектов, публикации, трансляции и удаления будут недоступны. Включить/отключить этот режим можно удерживая значок аватара пользователя на главном экране.",
"advanced_settings_readonly_mode_title": "Режим «только просмотр»", "advanced_settings_readonly_mode_title": "Режим «только просмотр»",
"advanced_settings_self_signed_ssl_subtitle": "Пропускать проверку SSL-сертификата сервера. Требуется для самоподписанных сертификатов.", "advanced_settings_self_signed_ssl_subtitle": "Пропускать проверку SSL-сертификата сервера. Требуется для самоподписанных сертификатов.",
"advanced_settings_self_signed_ssl_title": "Разрешить самоподписанные SSL-сертификаты", "advanced_settings_self_signed_ssl_title": "Разрешить самоподписанные SSL-сертификаты",
@@ -534,9 +534,9 @@
"backup": "Резервное копирование", "backup": "Резервное копирование",
"backup_album_selection_page_albums_device": "Альбомы на устройстве ({count})", "backup_album_selection_page_albums_device": "Альбомы на устройстве ({count})",
"backup_album_selection_page_albums_tap": "Нажмите, чтобы включить, дважды, чтобы исключить", "backup_album_selection_page_albums_tap": "Нажмите, чтобы включить, дважды, чтобы исключить",
"backup_album_selection_page_assets_scatter": "Ваши изображения и видео могут находиться в разных альбомах. Вы можете выбрать, какие альбомы включить, а какие исключить из резервного копирования.", "backup_album_selection_page_assets_scatter": "Ваши фото и видео могут находиться в разных альбомах/папках на устройстве. Вы можете выбрать, какие альбомы включить, а какие исключить из резервного копирования.",
"backup_album_selection_page_select_albums": "Выбор альбомов", "backup_album_selection_page_select_albums": "Выбор альбомов",
"backup_album_selection_page_selection_info": "Информация о выборе", "backup_album_selection_page_selection_info": "Выбранные альбомы",
"backup_album_selection_page_total_assets": "Всего уникальных объектов", "backup_album_selection_page_total_assets": "Всего уникальных объектов",
"backup_all": "Все", "backup_all": "Все",
"backup_background_service_backup_failed_message": "Не удалось выполнить резервное копирование. Повторная попытка…", "backup_background_service_backup_failed_message": "Не удалось выполнить резервное копирование. Повторная попытка…",
@@ -546,7 +546,7 @@
"backup_background_service_error_title": "Ошибка резервного копирования", "backup_background_service_error_title": "Ошибка резервного копирования",
"backup_background_service_in_progress_notification": "Резервное копирование объектов…", "backup_background_service_in_progress_notification": "Резервное копирование объектов…",
"backup_background_service_upload_failure_notification": "Ошибка загрузки {filename}", "backup_background_service_upload_failure_notification": "Ошибка загрузки {filename}",
"backup_controller_page_albums": "Резервное копирование альбомов", "backup_controller_page_albums": "Альбомы",
"backup_controller_page_background_app_refresh_disabled_content": "Включите фоновое обновление приложения в Настройки > Общие > Фоновое обновление приложений, чтобы использовать фоновое резервное копирование.", "backup_controller_page_background_app_refresh_disabled_content": "Включите фоновое обновление приложения в Настройки > Общие > Фоновое обновление приложений, чтобы использовать фоновое резервное копирование.",
"backup_controller_page_background_app_refresh_disabled_title": "Фоновое обновление отключено", "backup_controller_page_background_app_refresh_disabled_title": "Фоновое обновление отключено",
"backup_controller_page_background_app_refresh_enable_button_text": "Перейти в настройки", "backup_controller_page_background_app_refresh_enable_button_text": "Перейти в настройки",
@@ -563,8 +563,8 @@
"backup_controller_page_background_turn_off": "Выключить фоновую службу", "backup_controller_page_background_turn_off": "Выключить фоновую службу",
"backup_controller_page_background_turn_on": "Включить фоновую службу", "backup_controller_page_background_turn_on": "Включить фоновую службу",
"backup_controller_page_background_wifi": "Только через Wi-Fi", "backup_controller_page_background_wifi": "Только через Wi-Fi",
"backup_controller_page_backup": "Резервное копирование", "backup_controller_page_backup": "Загружено",
"backup_controller_page_backup_selected": "Выбрано: ", "backup_controller_page_backup_selected": "Выбраны: ",
"backup_controller_page_backup_sub": "Загруженные фото и видео", "backup_controller_page_backup_sub": "Загруженные фото и видео",
"backup_controller_page_created": "Создано: {date}", "backup_controller_page_created": "Создано: {date}",
"backup_controller_page_desc_backup": "Включите резервное копирование в активном режиме, чтобы автоматически загружать новые объекты при открытии приложения.", "backup_controller_page_desc_backup": "Включите резервное копирование в активном режиме, чтобы автоматически загружать новые объекты при открытии приложения.",
@@ -768,7 +768,7 @@
"default_locale": "Дата и время по умолчанию", "default_locale": "Дата и время по умолчанию",
"default_locale_description": "Использовать формат даты и времени в соответствии с языковым стандартом вашего браузера", "default_locale_description": "Использовать формат даты и времени в соответствии с языковым стандартом вашего браузера",
"delete": "Удалить", "delete": "Удалить",
"delete_action_confirmation_message": "Вы действительно хотите удалить этот объект? Это действие переместит объект в корзину сервера и предложит удалить его локально.", "delete_action_confirmation_message": "Вы действительно хотите удалить этот объект? Это действие переместит объект в корзину сервера и попробует удалить его локально.",
"delete_action_prompt": "Объекты удалены ({count} шт.)", "delete_action_prompt": "Объекты удалены ({count} шт.)",
"delete_album": "Удалить альбом", "delete_album": "Удалить альбом",
"delete_api_key_prompt": "Вы действительно хотите удалить этот API ключ?", "delete_api_key_prompt": "Вы действительно хотите удалить этот API ключ?",
@@ -1041,7 +1041,7 @@
"external": "Внешний", "external": "Внешний",
"external_libraries": "Внешние библиотеки", "external_libraries": "Внешние библиотеки",
"external_network": "Внешняя сеть", "external_network": "Внешняя сеть",
"external_network_sheet_info": "Когда устройство не подключено к выбранной Wi-Fi сети, приложение будет пытаться подключиться к серверу по адресам ниже, сверху вниз, до успешного подключения", "external_network_sheet_info": "Когда устройство не подключено к указанной Wi-Fi сети, приложение будет пытаться подключиться к серверу по адресам ниже, сверху вниз до успешного подключения",
"face_unassigned": "Не назначено", "face_unassigned": "Не назначено",
"failed": "Ошибка", "failed": "Ошибка",
"failed_to_authenticate": "Ошибка аутентификации", "failed_to_authenticate": "Ошибка аутентификации",
@@ -1093,8 +1093,8 @@
"haptic_feedback_switch": "Включить тактильную отдачу", "haptic_feedback_switch": "Включить тактильную отдачу",
"haptic_feedback_title": "Тактильная отдача", "haptic_feedback_title": "Тактильная отдача",
"has_quota": "Квота", "has_quota": "Квота",
"hash_asset": "Хешированный объект", "hash_asset": "Хеширование объектов",
"hashed_assets": "Хешированные объекты", "hashed_assets": "Хеши",
"hashing": "Хеширование", "hashing": "Хеширование",
"header_settings_add_header_tip": "Добавить заголовок", "header_settings_add_header_tip": "Добавить заголовок",
"header_settings_field_validator_msg": "Значение не может быть пустым", "header_settings_field_validator_msg": "Значение не может быть пустым",
@@ -1219,7 +1219,7 @@
"local_asset_cast_failed": "Невозможна трансляция объектов, которые ещё не загружены на сервер", "local_asset_cast_failed": "Невозможна трансляция объектов, которые ещё не загружены на сервер",
"local_assets": "Объекты на устройстве", "local_assets": "Объекты на устройстве",
"local_network": "Локальная сеть", "local_network": "Локальная сеть",
"local_network_sheet_info": "Приложение будет подключаться к серверу по этому адресу, когда устройство подключено к выбранной Wi-Fi сети", "local_network_sheet_info": "Приложение будет подключаться к серверу по этому адресу, когда устройство подключено к указанной Wi-Fi сети",
"location_permission": "Доступ к местоположению", "location_permission": "Доступ к местоположению",
"location_permission_content": "Чтобы использовать функцию автоматического переключения, Immich необходимо разрешение на точное определение местоположения, чтобы оно могло считывать название текущей Wi-Fi сети", "location_permission_content": "Чтобы использовать функцию автоматического переключения, Immich необходимо разрешение на точное определение местоположения, чтобы оно могло считывать название текущей Wi-Fi сети",
"location_picker_choose_on_map": "Выбрать на карте", "location_picker_choose_on_map": "Выбрать на карте",
@@ -1413,7 +1413,7 @@
"options": "Опции", "options": "Опции",
"or": "или", "or": "или",
"organize_into_albums": "Распределить по альбомам", "organize_into_albums": "Распределить по альбомам",
"organize_into_albums_description": "Добавить уже существующие фотографии в альбомы, используя текущие настройки синхронизации", "organize_into_albums_description": "Добавить уже существующие объекты в альбомы, используя текущие настройки синхронизации",
"organize_your_library": "Приведите в порядок свою библиотеку", "organize_your_library": "Приведите в порядок свою библиотеку",
"original": "оригинал", "original": "оригинал",
"other": "Другое", "other": "Другое",
@@ -1915,11 +1915,11 @@
"sync": "Синхр.", "sync": "Синхр.",
"sync_albums": "Синхронизировать альбомы", "sync_albums": "Синхронизировать альбомы",
"sync_albums_manual_subtitle": "Синхронизировать все загруженные фото и видео в выбранные альбомы для резервного копирования", "sync_albums_manual_subtitle": "Синхронизировать все загруженные фото и видео в выбранные альбомы для резервного копирования",
"sync_local": "Синхронизировать локально", "sync_local": "Локальная синхронизация",
"sync_remote": "Синхронизация с сервером", "sync_remote": "Синхронизация с сервером",
"sync_status": "Статус синхронизации", "sync_status": "Статус синхронизации",
"sync_status_subtitle": "Просмотр и управление системой синхронизации", "sync_status_subtitle": "Просмотр и управление системой синхронизации",
"sync_upload_album_setting_subtitle": "Создавайте и загружайте свои фотографии и видео в выбранные альбомы на сервер Immich", "sync_upload_album_setting_subtitle": "Создавать на сервере такие же альбомы, как выбранные на устройстве, и загружать в них фото и видео",
"tag": "Тег", "tag": "Тег",
"tag_assets": "Добавить теги", "tag_assets": "Добавить теги",
"tag_created": "Тег {tag} создан", "tag_created": "Тег {tag} создан",

View File

@@ -1515,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Mobilna aplikacija je zastarela. Posodobite na najnovejšo manjšo različico.", "profile_drawer_client_out_of_date_minor": "Mobilna aplikacija je zastarela. Posodobite na najnovejšo manjšo različico.",
"profile_drawer_client_server_up_to_date": "Odjemalec in strežnik sta posodobljena", "profile_drawer_client_server_up_to_date": "Odjemalec in strežnik sta posodobljena",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Način samo za branje je omogočen. Za izhod dvakrat tapnite ikono uporabniškega avatarja.", "profile_drawer_readonly_mode": "Način samo za branje je omogočen. Za izhod dolgo pritisnite ikono uporabniškega avatarja.",
"profile_drawer_server_out_of_date_major": "Strežnik je zastarel. Posodobite na najnovejšo glavno različico.", "profile_drawer_server_out_of_date_major": "Strežnik je zastarel. Posodobite na najnovejšo glavno različico.",
"profile_drawer_server_out_of_date_minor": "Strežnik je zastarel. Posodobite na najnovejšo manjšo različico.", "profile_drawer_server_out_of_date_minor": "Strežnik je zastarel. Posodobite na najnovejšo manjšo različico.",
"profile_image_of_user": "Profilna slika uporabnika {user}", "profile_image_of_user": "Profilna slika uporabnika {user}",
@@ -1917,6 +1917,8 @@
"sync_albums_manual_subtitle": "Sinhronizirajte vse naložene videoposnetke in fotografije v izbrane varnostne albume", "sync_albums_manual_subtitle": "Sinhronizirajte vse naložene videoposnetke in fotografije v izbrane varnostne albume",
"sync_local": "Sinhroniziraj lokalno", "sync_local": "Sinhroniziraj lokalno",
"sync_remote": "Sinhroniziraj oddaljeno", "sync_remote": "Sinhroniziraj oddaljeno",
"sync_status": "Stanje sinhronizacije",
"sync_status_subtitle": "Ogled in upravljanje sistema sinhronizacije",
"sync_upload_album_setting_subtitle": "Ustvarite in naložite svoje fotografije in videoposnetke v izbrane albume na Immich", "sync_upload_album_setting_subtitle": "Ustvarite in naložite svoje fotografije in videoposnetke v izbrane albume na Immich",
"tag": "Oznaka", "tag": "Oznaka",
"tag_assets": "Označi sredstva", "tag_assets": "Označi sredstva",
@@ -1976,6 +1978,7 @@
"trash_page_select_assets_btn": "Izberite sredstva", "trash_page_select_assets_btn": "Izberite sredstva",
"trash_page_title": "Smetnjak ({count})", "trash_page_title": "Smetnjak ({count})",
"trashed_items_will_be_permanently_deleted_after": "Elementi v smetnjaku bodo trajno izbrisani po {days, plural, one {# dnevu} two {# dnevih} few {# dnevih} other {# dneh}}.", "trashed_items_will_be_permanently_deleted_after": "Elementi v smetnjaku bodo trajno izbrisani po {days, plural, one {# dnevu} two {# dnevih} few {# dnevih} other {# dneh}}.",
"troubleshoot": "Odpravljanje težav",
"type": "Vrsta", "type": "Vrsta",
"unable_to_change_pin_code": "PIN kode ni mogoče spremeniti", "unable_to_change_pin_code": "PIN kode ni mogoče spremeniti",
"unable_to_setup_pin_code": "PIN kode ni mogoče nastaviti", "unable_to_setup_pin_code": "PIN kode ni mogoče nastaviti",

View File

@@ -4,6 +4,7 @@
"account_settings": "Podešavanja za Profil", "account_settings": "Podešavanja za Profil",
"acknowledge": "Potvrdi", "acknowledge": "Potvrdi",
"action": "Postupak", "action": "Postupak",
"action_common_update": "Ažuriraj",
"actions": "Postupci", "actions": "Postupci",
"active": "Aktivni", "active": "Aktivni",
"activity": "Aktivnost", "activity": "Aktivnost",
@@ -13,6 +14,7 @@
"add_a_location": "Dodaj Lokaciju", "add_a_location": "Dodaj Lokaciju",
"add_a_name": "Dodaj ime", "add_a_name": "Dodaj ime",
"add_a_title": "Dodaj naslov", "add_a_title": "Dodaj naslov",
"add_birthday": "Dodaj rođendan",
"add_endpoint": "Dodajte krajnju tačku", "add_endpoint": "Dodajte krajnju tačku",
"add_exclusion_pattern": "Dodajte obrazac izuzimanja", "add_exclusion_pattern": "Dodajte obrazac izuzimanja",
"add_import_path": "Dodaj putanju za preuzimanje", "add_import_path": "Dodaj putanju za preuzimanje",
@@ -21,10 +23,14 @@
"add_partner": "Dodaj partner", "add_partner": "Dodaj partner",
"add_path": "Dodaj putanju", "add_path": "Dodaj putanju",
"add_photos": "Dodaj fotografije", "add_photos": "Dodaj fotografije",
"add_tag": "Dodaj oznaku",
"add_to": "Dodaj u…", "add_to": "Dodaj u…",
"add_to_album": "Dodaj u album", "add_to_album": "Dodaj u album",
"add_to_album_bottom_sheet_added": "Dodato u {album}", "add_to_album_bottom_sheet_added": "Dodato u {album}",
"add_to_album_bottom_sheet_already_exists": "Već u {album}", "add_to_album_bottom_sheet_already_exists": "Već u {album}",
"add_to_album_toggle": "Uključi/isključi izbor za {album}",
"add_to_albums": "Dodaj u albume",
"add_to_albums_count": "Dodaj u albume ({count})",
"add_to_shared_album": "Dodaj u deljen album", "add_to_shared_album": "Dodaj u deljen album",
"add_url": "Dodaj URL", "add_url": "Dodaj URL",
"added_to_archive": "Dodato u arhivu", "added_to_archive": "Dodato u arhivu",
@@ -32,6 +38,7 @@
"added_to_favorites_count": "Dodato {count, number} u favorite", "added_to_favorites_count": "Dodato {count, number} u favorite",
"admin": { "admin": {
"add_exclusion_pattern_description": "Dodajte obrasce isključenja. Korištenje *, ** i ? je podržano. Da biste ignorisali sve datoteke u bilo kom direktorijumu pod nazivom „Rav“, koristite „**/Rav/**“. Da biste ignorisali sve datoteke koje se završavaju na „.tif“, koristite „**/*.tif“. Da biste ignorisali apsolutnu putanju, koristite „/path/to/ignore/**“.", "add_exclusion_pattern_description": "Dodajte obrasce isključenja. Korištenje *, ** i ? je podržano. Da biste ignorisali sve datoteke u bilo kom direktorijumu pod nazivom „Rav“, koristite „**/Rav/**“. Da biste ignorisali sve datoteke koje se završavaju na „.tif“, koristite „**/*.tif“. Da biste ignorisali apsolutnu putanju, koristite „/path/to/ignore/**“.",
"admin_user": "Administrator",
"asset_offline_description": "Ovo eksterno bibliotečko sredstvo se više ne nalazi na disku i premešteno je u smeće. Ako je datoteka premeštena unutar biblioteke, proverite svoju vremensku liniju za novo odgovarajuće sredstvo. Da biste vratili ovo sredstvo, uverite se da Immich može da pristupi dole navedenoj putanji datoteke i skenirajte biblioteku.", "asset_offline_description": "Ovo eksterno bibliotečko sredstvo se više ne nalazi na disku i premešteno je u smeće. Ako je datoteka premeštena unutar biblioteke, proverite svoju vremensku liniju za novo odgovarajuće sredstvo. Da biste vratili ovo sredstvo, uverite se da Immich može da pristupi dole navedenoj putanji datoteke i skenirajte biblioteku.",
"authentication_settings": "Podešavanja za autentifikaciju", "authentication_settings": "Podešavanja za autentifikaciju",
"authentication_settings_description": "Upravljajte lozinkom, OAuth-om i drugim podešavanjima autentifikacije", "authentication_settings_description": "Upravljajte lozinkom, OAuth-om i drugim podešavanjima autentifikacije",
@@ -41,8 +48,15 @@
"backup_database": "Kreirajte rezervnu kopiju baze podataka", "backup_database": "Kreirajte rezervnu kopiju baze podataka",
"backup_database_enable_description": "Omogući dampove baze podataka", "backup_database_enable_description": "Omogući dampove baze podataka",
"backup_keep_last_amount": "Količina prethodnih dampova koje treba zadržati", "backup_keep_last_amount": "Količina prethodnih dampova koje treba zadržati",
"backup_onboarding_1_description": "kopija na oblaku ili na drugoj fizičkoj lokaciji.",
"backup_onboarding_2_description": "lokalne kopije na različitim uređajima. Ovo uključuje glavne datoteke i rezervnu kopiju tih datoteka lokalno.",
"backup_onboarding_3_description": "ukupno kopija vaših podataka, uklučujući originalne datoteke. Ovo uključuje 1 udaljenu kopiju i 2 lokalne kopije.",
"backup_onboarding_description": "<backblaze-link>3-2-1 strategija rezervnih kopija</backblaze-link> je preporučena da zaštiti vaše podatke. Trebali biste čuvati kopije vaših otpremljenih slika/videa kao i Immich bazu podataka za sveobuhvatno rešenje za rezervne kopije.",
"backup_onboarding_footer": "Za više informacija o pravljenju rezervne kopije Immich-a, molimo vas pogledajte <link>dokumentaciju</link>.",
"backup_onboarding_parts_title": "3-2-1 rezervna kopija uključuje:",
"backup_onboarding_title": "Rezervne kopije",
"backup_settings": "Podešavanja dampa baze podataka", "backup_settings": "Podešavanja dampa baze podataka",
"backup_settings_description": "Upravljajte podešavanjima dampa baze podataka. Napomena: Ovi poslovi se ne prate i nećete biti obavešteni o neuspehu.", "backup_settings_description": "Upravljajte podešavanjima dampa baze podataka.",
"cleared_jobs": "Očišćeni poslovi za: {job}", "cleared_jobs": "Očišćeni poslovi za: {job}",
"config_set_by_file": "Konfiguraciju trenutno postavlja konfiguracioni fajl", "config_set_by_file": "Konfiguraciju trenutno postavlja konfiguracioni fajl",
"confirm_delete_library": "Da li stvarno želite da izbrišete biblioteku {library} ?", "confirm_delete_library": "Da li stvarno želite da izbrišete biblioteku {library} ?",
@@ -163,12 +177,23 @@
"metadata_settings_description": "Upravljajte podešavanjima metapodataka", "metadata_settings_description": "Upravljajte podešavanjima metapodataka",
"migration_job": "Migracije", "migration_job": "Migracije",
"migration_job_description": "Prenesite sličice datoteka i lica u najnoviju strukturu direktorijuma", "migration_job_description": "Prenesite sličice datoteka i lica u najnoviju strukturu direktorijuma",
"nightly_tasks_cluster_faces_setting_description": "Pokreni prepoznavanje lica na novodetektovanim licima",
"nightly_tasks_cluster_new_faces_setting": "Združi nova lica",
"nightly_tasks_database_cleanup_setting": "Zadaci čiščenja baze podataka",
"nightly_tasks_database_cleanup_setting_description": "Očisti stare, istekle podatke iz baze podataka",
"nightly_tasks_generate_memories_setting": "Generiši sjećanja",
"nightly_tasks_generate_memories_setting_description": "Kreiraj nova sjećanja",
"nightly_tasks_missing_thumbnails_setting": "Generiši nedostajuće sličice",
"nightly_tasks_missing_thumbnails_setting_description": "Dodajte elemente bez sličica u red za generisanje sličica",
"nightly_tasks_settings": "Podešavanja noćnih zadataka",
"nightly_tasks_settings_description": "Upravljaj noćnim zadacima",
"nightly_tasks_sync_quota_usage_setting_description": "Ažurirajte kvotu memorijskog prostora korisnika na osnovu trenutne upotrebe",
"no_paths_added": "Nema dodatih putanja", "no_paths_added": "Nema dodatih putanja",
"no_pattern_added": "Nije dodat obrazac", "no_pattern_added": "Nije dodat obrazac",
"note_apply_storage_label_previous_assets": "Napomena: Da biste primenili oznaku za skladištenje na prethodno otpremljena sredstva, pokrenite", "note_apply_storage_label_previous_assets": "Napomena: Da biste primenili oznaku za skladištenje na prethodno otpremljena sredstva, pokrenite",
"note_cannot_be_changed_later": "NAPOMENA: Ovo se kasnije ne može promeniti!", "note_cannot_be_changed_later": "NAPOMENA: Ovo se kasnije ne može promeniti!",
"notification_email_from_address": "Sa adrese", "notification_email_from_address": "Sa adrese",
"notification_email_from_address_description": "Adresa e-pošte pošiljaoca, na primer: \"Immich foto server <noreply@example.com>\"", "notification_email_from_address_description": "Adresa e-pošte pošiljaoca, na primer: \"Immich foto server <noreply@example.com>\". Pobrinite se da koristite adresu sa koje vam je dozovljeno slati e-poštu.",
"notification_email_host_description": "Host servera e-pošte (npr. smtp.immich.app)", "notification_email_host_description": "Host servera e-pošte (npr. smtp.immich.app)",
"notification_email_ignore_certificate_errors": "Zanemarite greške sertifikata", "notification_email_ignore_certificate_errors": "Zanemarite greške sertifikata",
"notification_email_ignore_certificate_errors_description": "Ignorišite greške u validaciji TLS sertifikata (ne preporučuje se)", "notification_email_ignore_certificate_errors_description": "Ignorišite greške u validaciji TLS sertifikata (ne preporučuje se)",
@@ -201,7 +226,7 @@
"oauth_storage_quota_claim": "Zahtev za kvotu skladištenja", "oauth_storage_quota_claim": "Zahtev za kvotu skladištenja",
"oauth_storage_quota_claim_description": "Automatski podesite kvotu memorijskog prostora korisnika na vrednost ovog zahteva.", "oauth_storage_quota_claim_description": "Automatski podesite kvotu memorijskog prostora korisnika na vrednost ovog zahteva.",
"oauth_storage_quota_default": "Podrazumevana kvota za skladištenje (GiB)", "oauth_storage_quota_default": "Podrazumevana kvota za skladištenje (GiB)",
"oauth_storage_quota_default_description": "Kvota u GiB koja se koristi kada nema potraživanja (unesite 0 za neograničenu kvotu).", "oauth_storage_quota_default_description": "Kvota u GiB koja se koristi kada nema potraživanja.",
"oauth_timeout": "Vremensko ograničenje zahteva", "oauth_timeout": "Vremensko ograničenje zahteva",
"oauth_timeout_description": "Vremensko ograničenje za zahteve u milisekundama", "oauth_timeout_description": "Vremensko ograničenje za zahteve u milisekundama",
"password_enable_description": "Prijavite se pomoću e-pošte i lozinke", "password_enable_description": "Prijavite se pomoću e-pošte i lozinke",
@@ -508,7 +533,7 @@
"backup_controller_page_background_turn_off": "Isključi pozadinski servis", "backup_controller_page_background_turn_off": "Isključi pozadinski servis",
"backup_controller_page_background_turn_on": "Uključi pozadinski servis", "backup_controller_page_background_turn_on": "Uključi pozadinski servis",
"backup_controller_page_background_wifi": "Samo na Wi-Fi", "backup_controller_page_background_wifi": "Samo na Wi-Fi",
"backup_controller_page_backup": "Napravi rezervnu kopiju", "backup_controller_page_backup": "Rezervne kopije",
"backup_controller_page_backup_selected": "Odabrano: ", "backup_controller_page_backup_selected": "Odabrano: ",
"backup_controller_page_backup_sub": "Završeno pravljenje rezervne kopije fotografija i videa", "backup_controller_page_backup_sub": "Završeno pravljenje rezervne kopije fotografija i videa",
"backup_controller_page_created": "Napravljeno:{date}", "backup_controller_page_created": "Napravljeno:{date}",
@@ -519,8 +544,8 @@
"backup_controller_page_id": "ID:{id}", "backup_controller_page_id": "ID:{id}",
"backup_controller_page_info": "Informacije", "backup_controller_page_info": "Informacije",
"backup_controller_page_none_selected": "Ništa odabrano", "backup_controller_page_none_selected": "Ništa odabrano",
"backup_controller_page_remainder": "Podsetnik", "backup_controller_page_remainder": "Ostatak",
"backup_controller_page_remainder_sub": "Ostalo fotografija i videa da se otpremi od selekcije", "backup_controller_page_remainder_sub": "Ostale fotografije i video snimci za otpremanje od selekcije",
"backup_controller_page_server_storage": "Prostor na serveru", "backup_controller_page_server_storage": "Prostor na serveru",
"backup_controller_page_start_backup": "Pokreni pravljenje rezervne kopije", "backup_controller_page_start_backup": "Pokreni pravljenje rezervne kopije",
"backup_controller_page_status_off": "Automatsko pravljenje rezervnih kopija u prvom planu je isključeno", "backup_controller_page_status_off": "Automatsko pravljenje rezervnih kopija u prvom planu je isključeno",

View File

@@ -1515,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Mobilappen är föråldrad. Uppdatera till senaste versionen.", "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_client_server_up_to_date": "Klient och server är uppdaterade",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Skrivskyddat läge aktiverat. Dubbeltryck på användaravatarikonen för att avsluta", "profile_drawer_readonly_mode": "Skrivskyddat läge aktiverat. Håll in 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_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_drawer_server_out_of_date_minor": "Servern har en föråldrad mjukvara. Uppdatera till senaste versionen.",
"profile_image_of_user": "{user} profilbild", "profile_image_of_user": "{user} profilbild",
@@ -1917,6 +1917,8 @@
"sync_albums_manual_subtitle": "Synka alla uppladdade videor och foton till valda backup-album", "sync_albums_manual_subtitle": "Synka alla uppladdade videor och foton till valda backup-album",
"sync_local": "Synkronisera lokalt", "sync_local": "Synkronisera lokalt",
"sync_remote": "Synkronisera fjärrserver", "sync_remote": "Synkronisera fjärrserver",
"sync_status": "Synk Status",
"sync_status_subtitle": "Visa och hantera synkroniseringssystemet",
"sync_upload_album_setting_subtitle": "Skapa och ladda upp dina foton och videor till de valda albumen på Immich", "sync_upload_album_setting_subtitle": "Skapa och ladda upp dina foton och videor till de valda albumen på Immich",
"tag": "Tagg", "tag": "Tagg",
"tag_assets": "Tagga tillgångar", "tag_assets": "Tagga tillgångar",
@@ -1976,6 +1978,7 @@
"trash_page_select_assets_btn": "Välj objekt", "trash_page_select_assets_btn": "Välj objekt",
"trash_page_title": "Papperskorg ({count})", "trash_page_title": "Papperskorg ({count})",
"trashed_items_will_be_permanently_deleted_after": "Objekt i papperskorgen raderas permanent efter {days, plural, one {# dag} other {# dagar}}.", "trashed_items_will_be_permanently_deleted_after": "Objekt i papperskorgen raderas permanent efter {days, plural, one {# dag} other {# dagar}}.",
"troubleshoot": "Felsök",
"type": "Typ", "type": "Typ",
"unable_to_change_pin_code": "Kunde inte ändra pinkod", "unable_to_change_pin_code": "Kunde inte ändra pinkod",
"unable_to_setup_pin_code": "Kunde inte konfigurera pinkod", "unable_to_setup_pin_code": "Kunde inte konfigurera pinkod",

File diff suppressed because it is too large Load Diff

View File

@@ -1640,7 +1640,7 @@
"restore_user": "Відновити користувача", "restore_user": "Відновити користувача",
"restored_asset": "Відновлений ресурс", "restored_asset": "Відновлений ресурс",
"resume": "Продовжити", "resume": "Продовжити",
"resume_paused_jobs": "Резюме {count, plural, one {# призупинене завдання} other {# призупинені завдання}}", "resume_paused_jobs": "Відновити {count, plural, one {# призупинене завдання} other {# призупинені завдання}}",
"retry_upload": "Повторити завантаження", "retry_upload": "Повторити завантаження",
"review_duplicates": "Переглянути дублікати", "review_duplicates": "Переглянути дублікати",
"review_large_files": "Перегляд великих файлів", "review_large_files": "Перегляд великих файлів",

View File

@@ -1510,7 +1510,7 @@
"profile_drawer_client_out_of_date_minor": "客戶端有小版本升級,請盡快升級至最新版。", "profile_drawer_client_out_of_date_minor": "客戶端有小版本升級,請盡快升級至最新版。",
"profile_drawer_client_server_up_to_date": "客戶端和服務端都是最新的", "profile_drawer_client_server_up_to_date": "客戶端和服務端都是最新的",
"profile_drawer_github": "GitHub", "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_major": "服務端有大版本升級,請盡快升級至最新版。",
"profile_drawer_server_out_of_date_minor": "服務端有小版本升級,請盡快升級至最新版。", "profile_drawer_server_out_of_date_minor": "服務端有小版本升級,請盡快升級至最新版。",
"profile_image_of_user": "{user} 的個人資料圖片", "profile_image_of_user": "{user} 的個人資料圖片",
@@ -1549,6 +1549,7 @@
"purchase_server_description_2": "擁護者狀態", "purchase_server_description_2": "擁護者狀態",
"purchase_server_title": "伺服器", "purchase_server_title": "伺服器",
"purchase_settings_server_activated": "伺服器產品金鑰是由管理者管理的", "purchase_settings_server_activated": "伺服器產品金鑰是由管理者管理的",
"query_asset_id": "査詢資產ID",
"queue_status": "處理中 {count}/{total}", "queue_status": "處理中 {count}/{total}",
"rating": "評星", "rating": "評星",
"rating_clear": "清除評等", "rating_clear": "清除評等",
@@ -1634,6 +1635,7 @@
"restore_user": "還原使用者", "restore_user": "還原使用者",
"restored_asset": "已還原檔案", "restored_asset": "已還原檔案",
"resume": "繼續", "resume": "繼續",
"resume_paused_jobs": "恢復 {count, plural, one {# 暫停的任務} other {# 暫停的任務}}",
"retry_upload": "重新上傳", "retry_upload": "重新上傳",
"review_duplicates": "檢視重複項目", "review_duplicates": "檢視重複項目",
"review_large_files": "檢視大型文件", "review_large_files": "檢視大型文件",
@@ -1910,6 +1912,8 @@
"sync_albums_manual_subtitle": "將所有上傳的短片和照片同步到選定的備份相簿", "sync_albums_manual_subtitle": "將所有上傳的短片和照片同步到選定的備份相簿",
"sync_local": "同步本機", "sync_local": "同步本機",
"sync_remote": "同步遠端", "sync_remote": "同步遠端",
"sync_status": "同步状态",
"sync_status_subtitle": "查看和管理同步系統",
"sync_upload_album_setting_subtitle": "新增照片和短片並上傳到 Immich 上的選定相簿中", "sync_upload_album_setting_subtitle": "新增照片和短片並上傳到 Immich 上的選定相簿中",
"tag": "標籤", "tag": "標籤",
"tag_assets": "標記檔案", "tag_assets": "標記檔案",
@@ -1947,7 +1951,9 @@
"to_change_password": "變更密碼", "to_change_password": "變更密碼",
"to_favorite": "收藏", "to_favorite": "收藏",
"to_login": "登入", "to_login": "登入",
"to_multi_select": "進行多選",
"to_parent": "到上一級", "to_parent": "到上一級",
"to_select": "选择",
"to_trash": "垃圾桶", "to_trash": "垃圾桶",
"toggle_settings": "切換設定", "toggle_settings": "切換設定",
"total": "統計", "total": "統計",
@@ -1967,6 +1973,7 @@
"trash_page_select_assets_btn": "選擇項目", "trash_page_select_assets_btn": "選擇項目",
"trash_page_title": "垃圾桶 ({count})", "trash_page_title": "垃圾桶 ({count})",
"trashed_items_will_be_permanently_deleted_after": "垃圾桶中的項目會在 {days, plural, other {# 天}}後永久刪除。", "trashed_items_will_be_permanently_deleted_after": "垃圾桶中的項目會在 {days, plural, other {# 天}}後永久刪除。",
"troubleshoot": "疑难解答",
"type": "類型", "type": "類型",
"unable_to_change_pin_code": "無法變更 PIN 碼", "unable_to_change_pin_code": "無法變更 PIN 碼",
"unable_to_setup_pin_code": "無法設定 PIN 碼", "unable_to_setup_pin_code": "無法設定 PIN 碼",
@@ -1997,6 +2004,7 @@
"unstacked_assets_count": "已解除堆疊 {count, plural, other {# 個檔案}}", "unstacked_assets_count": "已解除堆疊 {count, plural, other {# 個檔案}}",
"untagged": "無標籤", "untagged": "無標籤",
"up_next": "下一個", "up_next": "下一個",
"update_location_action_prompt": "使用以下命令更新{count}個所選資產的位置:",
"updated_at": "更新於", "updated_at": "更新於",
"updated_password": "已更新密碼", "updated_password": "已更新密碼",
"upload": "上傳", "upload": "上傳",
@@ -2063,6 +2071,7 @@
"view_next_asset": "查看下一項", "view_next_asset": "查看下一項",
"view_previous_asset": "查看上一項", "view_previous_asset": "查看上一項",
"view_qr_code": "查看 QR code", "view_qr_code": "查看 QR code",
"view_similar_photos": "查看相似照片",
"view_stack": "查看堆疊", "view_stack": "查看堆疊",
"view_user": "顯示使用者", "view_user": "顯示使用者",
"viewer_remove_from_stack": "從堆疊中移除", "viewer_remove_from_stack": "從堆疊中移除",

View File

@@ -26,8 +26,8 @@
"add_tag": "添加标签", "add_tag": "添加标签",
"add_to": "添加到…", "add_to": "添加到…",
"add_to_album": "添加到相册", "add_to_album": "添加到相册",
"add_to_album_bottom_sheet_added": "添加到 {album}", "add_to_album_bottom_sheet_added": "添加到相册 “{album}",
"add_to_album_bottom_sheet_already_exists": "已在 {album} 中", "add_to_album_bottom_sheet_already_exists": "已在相册“ {album} 中",
"add_to_album_toggle": "选择相册 {album}", "add_to_album_toggle": "选择相册 {album}",
"add_to_albums": "添加到相册", "add_to_albums": "添加到相册",
"add_to_albums_count": "添加到相册({count}个)", "add_to_albums_count": "添加到相册({count}个)",
@@ -100,7 +100,7 @@
"image_thumbnail_description": "剥离元数据的小缩略图,用于浏览主时间线等照片组", "image_thumbnail_description": "剥离元数据的小缩略图,用于浏览主时间线等照片组",
"image_thumbnail_quality_description": "缩略图质量从 1 到 100。越高越好但会产生更大的文件并且会降低系统的响应能力。", "image_thumbnail_quality_description": "缩略图质量从 1 到 100。越高越好但会产生更大的文件并且会降低系统的响应能力。",
"image_thumbnail_title": "缩略图设置", "image_thumbnail_title": "缩略图设置",
"job_concurrency": "{job}并发", "job_concurrency": "{job}任务并发",
"job_created": "任务已创建", "job_created": "任务已创建",
"job_not_concurrency_safe": "此任务并发并不安全。", "job_not_concurrency_safe": "此任务并发并不安全。",
"job_settings": "任务设置", "job_settings": "任务设置",
@@ -121,13 +121,13 @@
"library_watching_settings": "监控图库(实验性)", "library_watching_settings": "监控图库(实验性)",
"library_watching_settings_description": "自动监控文件变化", "library_watching_settings_description": "自动监控文件变化",
"logging_enable_description": "启用日志记录", "logging_enable_description": "启用日志记录",
"logging_level_description": "启用的日志级别。", "logging_level_description": "启用时,要使用的日志级别。",
"logging_settings": "日志", "logging_settings": "日志",
"machine_learning_clip_model": "CLIP 模型", "machine_learning_clip_model": "CLIP 模型",
"machine_learning_clip_model_description": "请于 <link>此处</link>查看支持的 CLIP 模型名称。注意,更换模型后需要对所有图片重新运行“智能搜索”任务。", "machine_learning_clip_model_description": "请于 <link>此处</link>查看支持的 CLIP 模型名称。注意,更换模型后需要对所有图片重新运行“智能搜索”任务。",
"machine_learning_duplicate_detection": "重复项检测", "machine_learning_duplicate_detection": "重复项检测",
"machine_learning_duplicate_detection_enabled": "启用重复检测", "machine_learning_duplicate_detection_enabled": "启用重复检测",
"machine_learning_duplicate_detection_enabled_description": "如果禁用此功能,完全相同的项目仍将被去重。", "machine_learning_duplicate_detection_enabled_description": "如果禁用,完全相同的项目仍将被去重。",
"machine_learning_duplicate_detection_setting_description": "使用 CLIP 向量匹配(关键词相似度)来查找可能的重复项", "machine_learning_duplicate_detection_setting_description": "使用 CLIP 向量匹配(关键词相似度)来查找可能的重复项",
"machine_learning_enabled": "启用机器学习", "machine_learning_enabled": "启用机器学习",
"machine_learning_enabled_description": "如果禁用,无论以下如何设置,所有机器学习功能将被禁用。", "machine_learning_enabled_description": "如果禁用,无论以下如何设置,所有机器学习功能将被禁用。",
@@ -158,7 +158,7 @@
"map_enable_description": "启用地图功能", "map_enable_description": "启用地图功能",
"map_gps_settings": "地图与 GPS 设置", "map_gps_settings": "地图与 GPS 设置",
"map_gps_settings_description": "管理地图与 GPS反向地理编码设置", "map_gps_settings_description": "管理地图与 GPS反向地理编码设置",
"map_implications": "地图功能依赖于外部地形贴图服务tiles.immich.cloud", "map_implications": "地图功能依赖于外部地图瓦片服务tiles.immich.cloud",
"map_light_style": "浅色模式", "map_light_style": "浅色模式",
"map_manage_reverse_geocoding_settings": "管理<link>反向地理编码</link>设置", "map_manage_reverse_geocoding_settings": "管理<link>反向地理编码</link>设置",
"map_reverse_geocoding": "反向地理编码", "map_reverse_geocoding": "反向地理编码",
@@ -220,7 +220,7 @@
"oauth_enable_description": "使用 OAuth 登录", "oauth_enable_description": "使用 OAuth 登录",
"oauth_mobile_redirect_uri": "移动端重定向 URI", "oauth_mobile_redirect_uri": "移动端重定向 URI",
"oauth_mobile_redirect_uri_override": "移动端重定向 URI 覆盖", "oauth_mobile_redirect_uri_override": "移动端重定向 URI 覆盖",
"oauth_mobile_redirect_uri_override_description": "当 OAuth 提供商不允许使用移动 URI 时启用,如“''{callback}''”", "oauth_mobile_redirect_uri_override_description": "当 OAuth 提供商不允许使用移动 URI 时启用,如“{callback}”",
"oauth_role_claim": "角色声明", "oauth_role_claim": "角色声明",
"oauth_role_claim_description": "根据此声明的存在自动授予管理员访问权限。声明可以是“user”用户或“admin”管理员。", "oauth_role_claim_description": "根据此声明的存在自动授予管理员访问权限。声明可以是“user”用户或“admin”管理员。",
"oauth_settings": "OAuth", "oauth_settings": "OAuth",
@@ -364,7 +364,7 @@
"user_cleanup_job": "清理用户", "user_cleanup_job": "清理用户",
"user_delete_delay": "<b>{user}</b>的账户及项目将在{delay, plural, one {#天} other {#天}}后自动永久删除。", "user_delete_delay": "<b>{user}</b>的账户及项目将在{delay, plural, one {#天} other {#天}}后自动永久删除。",
"user_delete_delay_settings": "延期删除", "user_delete_delay_settings": "延期删除",
"user_delete_delay_settings_description": "永久删除账户及其所有项目之前所保留的天数。用户删除作业会在午夜检查是否有用户可以删除。对该设置的更改将在下次执行时生效。", "user_delete_delay_settings_description": "删除后永久删除用户帐户和资产的天数。用户删除作业会在午夜检查是否有用户可以删除。对该设置的更改将在下次执行时生效。",
"user_delete_immediately": "<b>{user}</b>的账户及项目将<b>立即</b>永久删除。", "user_delete_immediately": "<b>{user}</b>的账户及项目将<b>立即</b>永久删除。",
"user_delete_immediately_checkbox": "立即删除检索到的用户及项目", "user_delete_immediately_checkbox": "立即删除检索到的用户及项目",
"user_details": "用户详情", "user_details": "用户详情",
@@ -1640,7 +1640,7 @@
"restore_user": "恢复用户", "restore_user": "恢复用户",
"restored_asset": "已恢复项目", "restored_asset": "已恢复项目",
"resume": "继续", "resume": "继续",
"resume_paused_jobs": "继续 {count, plural, one {# 已暂停的作业} other {# 已暂停的作业}}", "resume_paused_jobs": "继续 {count, plural, one {# 已暂停的任务} other {# 已暂停的任务}}",
"retry_upload": "重新上传", "retry_upload": "重新上传",
"review_duplicates": "检查重复项", "review_duplicates": "检查重复项",
"review_large_files": "查看大文件", "review_large_files": "查看大文件",
@@ -1929,7 +1929,7 @@
"tag_updated": "已更新标签:{tag}", "tag_updated": "已更新标签:{tag}",
"tagged_assets": "{count, plural, one {# 个项目} other {# 个项目}}被加上标签", "tagged_assets": "{count, plural, one {# 个项目} other {# 个项目}}被加上标签",
"tags": "标签", "tags": "标签",
"tap_to_run_job": "点击运行作业", "tap_to_run_job": "点击运行任务",
"template": "模版", "template": "模版",
"theme": "主题", "theme": "主题",
"theme_selection": "主题选项", "theme_selection": "主题选项",

View File

@@ -22,7 +22,7 @@ FROM builder-cpu AS builder-rknn
# Warning: 25GiB+ disk space required to pull this image # Warning: 25GiB+ disk space required to pull this image
# TODO: find a way to reduce the image size # TODO: find a way to reduce the image size
FROM rocm/dev-ubuntu-22.04:6.3.4-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS builder-rocm FROM rocm/dev-ubuntu-22.04:6.4.3-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS builder-rocm
# renovate: datasource=github-releases depName=Microsoft/onnxruntime # renovate: datasource=github-releases depName=Microsoft/onnxruntime
ARG ONNXRUNTIME_VERSION="v1.20.1" ARG ONNXRUNTIME_VERSION="v1.20.1"
@@ -99,7 +99,7 @@ COPY --from=builder-cuda /usr/local/bin/python3 /usr/local/bin/python3
COPY --from=builder-cuda /usr/local/lib/python3.11 /usr/local/lib/python3.11 COPY --from=builder-cuda /usr/local/lib/python3.11 /usr/local/lib/python3.11
COPY --from=builder-cuda /usr/local/lib/libpython3.11.so /usr/local/lib/libpython3.11.so COPY --from=builder-cuda /usr/local/lib/libpython3.11.so /usr/local/lib/libpython3.11.so
FROM rocm/dev-ubuntu-22.04:6.3.4-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS prod-rocm FROM rocm/dev-ubuntu-22.04:6.4.3-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS prod-rocm
FROM prod-cpu AS prod-armnn FROM prod-cpu AS prod-armnn

View File

@@ -134,6 +134,13 @@ custom_lint:
dart_code_metrics: dart_code_metrics:
rules: rules:
- banned-usage:
entries:
- name: debugPrint
description: Use dPrint instead of debugPrint for proper tree-shaking in release builds.
exclude-paths:
- 'lib/utils/debug_print.dart'
severity: perf
# All rules from "recommended" preset # All rules from "recommended" preset
# Show potential errors # Show potential errors
# - avoid-cascade-after-if-null # - avoid-cascade-after-if-null

View File

@@ -54,12 +54,6 @@ class BackgroundWorker(context: Context, params: WorkerParameters) :
private var foregroundFuture: ListenableFuture<Void>? = null private var foregroundFuture: ListenableFuture<Void>? = null
init {
if (!loader.initialized()) {
loader.startInitialization(ctx)
}
}
companion object { companion object {
private const val NOTIFICATION_CHANNEL_ID = "immich::background_worker::notif" private const val NOTIFICATION_CHANNEL_ID = "immich::background_worker::notif"
private const val NOTIFICATION_ID = 100 private const val NOTIFICATION_ID = 100
@@ -68,6 +62,10 @@ class BackgroundWorker(context: Context, params: WorkerParameters) :
override fun startWork(): ListenableFuture<Result> { override fun startWork(): ListenableFuture<Result> {
Log.i(TAG, "Starting background upload worker") Log.i(TAG, "Starting background upload worker")
if (!loader.initialized()) {
loader.startInitialization(ctx)
}
val notificationChannel = NotificationChannel( val notificationChannel = NotificationChannel(
NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_ID,
NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_ID,

View File

@@ -35,8 +35,8 @@ platform :android do
task: 'bundle', task: 'bundle',
build_type: 'Release', build_type: 'Release',
properties: { properties: {
"android.injected.version.code" => 3014, "android.injected.version.code" => 3015,
"android.injected.version.name" => "1.142.0", "android.injected.version.name" => "1.142.1",
} }
) )
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') 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')

View File

@@ -705,7 +705,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 223; CURRENT_PROJECT_VERSION = 224;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
@@ -849,7 +849,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 223; CURRENT_PROJECT_VERSION = 224;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
@@ -879,7 +879,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 223; CURRENT_PROJECT_VERSION = 224;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
@@ -913,7 +913,7 @@
CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 223; CURRENT_PROJECT_VERSION = 224;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17; GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -956,7 +956,7 @@
CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 223; CURRENT_PROJECT_VERSION = 224;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17; GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -996,7 +996,7 @@
CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 223; CURRENT_PROJECT_VERSION = 224;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17; GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -1035,7 +1035,7 @@
CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 223; CURRENT_PROJECT_VERSION = 224;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -1079,7 +1079,7 @@
CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 223; CURRENT_PROJECT_VERSION = 224;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -1120,7 +1120,7 @@
CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 223; CURRENT_PROJECT_VERSION = 224;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;

View File

@@ -133,7 +133,6 @@ class BackgroundWorker: BackgroundWorkerBgHostApi {
return return
} }
isComplete = true
flutterApi?.cancel { result in flutterApi?.cancel { result in
self.complete(success: false) self.complete(success: false)
} }
@@ -174,6 +173,7 @@ class BackgroundWorker: BackgroundWorkerBgHostApi {
isComplete = true isComplete = true
engine.destroyContext() engine.destroyContext()
flutterApi = nil
completionHandler(success) completionHandler(success)
} }
} }

View File

@@ -80,7 +80,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.142.0</string> <string>1.142.1</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleURLTypes</key> <key>CFBundleURLTypes</key>
@@ -107,7 +107,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>223</string> <string>224</string>
<key>FLTEnableImpeller</key> <key>FLTEnableImpeller</key>
<true/> <true/>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>

View File

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

View File

@@ -45,3 +45,5 @@ const List<(String, String)> kWidgetNames = [
const double kUploadStatusFailed = -1.0; const double kUploadStatusFailed = -1.0;
const double kUploadStatusCanceled = -2.0; const double kUploadStatusCanceled = -2.0;
const int kMinMonthsToEnableScrubberSnap = 12;

View File

@@ -77,7 +77,9 @@ enum StoreKey<T> {
enableBackup<bool>._(1003), enableBackup<bool>._(1003),
useWifiForUploadVideos<bool>._(1004), useWifiForUploadVideos<bool>._(1004),
useWifiForUploadPhotos<bool>._(1005), useWifiForUploadPhotos<bool>._(1005),
needBetaMigration<bool>._(1006); needBetaMigration<bool>._(1006),
// TODO: Remove this after patching open-api
shouldResetSync<bool>._(1007);
const StoreKey._(this.id); const StoreKey._(this.id);
final int id; final int id;

View File

@@ -1,22 +1,20 @@
import 'package:immich_mobile/domain/models/album/local_album.model.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/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/exif.model.dart'; import 'package:immich_mobile/domain/models/exif.model.dart';
import 'package:immich_mobile/extensions/platform_extensions.dart';
import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/remote_asset.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/remote_asset.repository.dart';
import 'package:immich_mobile/infrastructure/utils/exif.converter.dart'; import 'package:immich_mobile/infrastructure/utils/exif.converter.dart';
import 'package:platform/platform.dart';
class AssetService { class AssetService {
final RemoteAssetRepository _remoteAssetRepository; final RemoteAssetRepository _remoteAssetRepository;
final DriftLocalAssetRepository _localAssetRepository; final DriftLocalAssetRepository _localAssetRepository;
final Platform _platform;
const AssetService({ const AssetService({
required RemoteAssetRepository remoteAssetRepository, required RemoteAssetRepository remoteAssetRepository,
required DriftLocalAssetRepository localAssetRepository, required DriftLocalAssetRepository localAssetRepository,
}) : _remoteAssetRepository = remoteAssetRepository, }) : _remoteAssetRepository = remoteAssetRepository,
_localAssetRepository = localAssetRepository, _localAssetRepository = localAssetRepository;
_platform = const LocalPlatform();
Future<BaseAsset?> getAsset(BaseAsset asset) { Future<BaseAsset?> getAsset(BaseAsset asset) {
final id = asset is LocalAsset ? asset.id : (asset as RemoteAsset).id; final id = asset is LocalAsset ? asset.id : (asset as RemoteAsset).id;
@@ -71,7 +69,7 @@ class AssetService {
width = exif?.width ?? asset.width?.toDouble(); width = exif?.width ?? asset.width?.toDouble();
height = exif?.height ?? asset.height?.toDouble(); height = exif?.height ?? asset.height?.toDouble();
} else if (asset is LocalAsset) { } else if (asset is LocalAsset) {
isFlipped = _platform.isAndroid && (asset.orientation == 90 || asset.orientation == 270); isFlipped = CurrentPlatform.isAndroid && (asset.orientation == 90 || asset.orientation == 270);
width = asset.width?.toDouble(); width = asset.width?.toDouble();
height = asset.height?.toDouble(); height = asset.height?.toDouble();
} else { } else {

View File

@@ -7,6 +7,8 @@ import 'package:cancellation_token_http/http.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart'; 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/network_capability_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/intl_keys.g.dart'; import 'package:immich_mobile/generated/intl_keys.g.dart';
@@ -27,6 +29,7 @@ import 'package:immich_mobile/services/localization.service.dart';
import 'package:immich_mobile/services/server_info.service.dart'; import 'package:immich_mobile/services/server_info.service.dart';
import 'package:immich_mobile/services/upload.service.dart'; import 'package:immich_mobile/services/upload.service.dart';
import 'package:immich_mobile/utils/bootstrap.dart'; import 'package:immich_mobile/utils/bootstrap.dart';
import 'package:immich_mobile/utils/debug_print.dart';
import 'package:immich_mobile/utils/http_ssl_options.dart'; import 'package:immich_mobile/utils/http_ssl_options.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
@@ -159,7 +162,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
try { try {
await _cleanup(); await _cleanup();
} catch (error, stack) { } catch (error, stack) {
debugPrint('Failed to cleanup background worker: $error with stack: $stack'); dPrint(() => 'Failed to cleanup background worker: $error with stack: $stack');
} }
} }
@@ -180,6 +183,8 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
// Discard any errors on the dispose call // Discard any errors on the dispose call
return; return;
}), }),
LogService.I.dispose(),
Store.dispose(),
_drift.close(), _drift.close(),
_driftLogger.close(), _driftLogger.close(),
backgroundSyncManager.cancel(), backgroundSyncManager.cancel(),
@@ -192,7 +197,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
await Future.wait(cleanupFutures); await Future.wait(cleanupFutures);
_logger.info("Background worker resources cleaned up"); _logger.info("Background worker resources cleaned up");
} catch (error, stack) { } catch (error, stack) {
debugPrint('Failed to cleanup background worker: $error with stack: $stack'); dPrint(() => 'Failed to cleanup background worker: $error with stack: $stack');
} }
} }
@@ -230,7 +235,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
.startBackupWithHttpClient(currentUser.id, networkCapabilities.hasWifi, _cancellationToken); .startBackupWithHttpClient(currentUser.id, networkCapabilities.hasWifi, _cancellationToken);
}, },
(error, stack) { (error, stack) {
debugPrint("Error in backup zone $error, $stack"); dPrint(() => "Error in backup zone $error, $stack");
}, },
); );
} }
@@ -268,6 +273,6 @@ Future<void> backgroundSyncNativeEntrypoint() async {
DartPluginRegistrant.ensureInitialized(); DartPluginRegistrant.ensureInitialized();
final (isar, drift, logDB) = await Bootstrap.initDB(); final (isar, drift, logDB) = await Bootstrap.initDB();
await Bootstrap.initDomain(isar, drift, logDB, shouldBufferLogs: false); await Bootstrap.initDomain(isar, drift, logDB, shouldBufferLogs: false, listenStoreUpdates: false);
await BackgroundWorkerBgService(isar: isar, drift: drift, driftLogger: logDB).init(); await BackgroundWorkerBgService(isar: isar, drift: drift, driftLogger: logDB).init();
} }

View File

@@ -1,29 +1,24 @@
import 'dart:async'; import 'dart:async';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/foundation.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.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/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/extensions/platform_extensions.dart';
import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart';
import 'package:immich_mobile/platform/native_sync_api.g.dart'; import 'package:immich_mobile/platform/native_sync_api.g.dart';
import 'package:immich_mobile/utils/datetime_helpers.dart'; import 'package:immich_mobile/utils/datetime_helpers.dart';
import 'package:immich_mobile/utils/diff.dart'; import 'package:immich_mobile/utils/diff.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:platform/platform.dart';
class LocalSyncService { class LocalSyncService {
final DriftLocalAlbumRepository _localAlbumRepository; final DriftLocalAlbumRepository _localAlbumRepository;
final NativeSyncApi _nativeSyncApi; final NativeSyncApi _nativeSyncApi;
final Platform _platform;
final Logger _log = Logger("DeviceSyncService"); final Logger _log = Logger("DeviceSyncService");
LocalSyncService({ LocalSyncService({required DriftLocalAlbumRepository localAlbumRepository, required NativeSyncApi nativeSyncApi})
required DriftLocalAlbumRepository localAlbumRepository, : _localAlbumRepository = localAlbumRepository,
required NativeSyncApi nativeSyncApi, _nativeSyncApi = nativeSyncApi;
Platform? platform,
}) : _localAlbumRepository = localAlbumRepository,
_nativeSyncApi = nativeSyncApi,
_platform = platform ?? const LocalPlatform();
Future<void> sync({bool full = false}) async { Future<void> sync({bool full = false}) async {
final Stopwatch stopwatch = Stopwatch()..start(); final Stopwatch stopwatch = Stopwatch()..start();
@@ -53,14 +48,14 @@ class LocalSyncService {
final dbAlbums = await _localAlbumRepository.getAll(); final dbAlbums = await _localAlbumRepository.getAll();
// On Android, we need to sync all albums since it is not possible to // On Android, we need to sync all albums since it is not possible to
// detect album deletions from the native side // detect album deletions from the native side
if (_platform.isAndroid) { if (CurrentPlatform.isAndroid) {
for (final album in dbAlbums) { for (final album in dbAlbums) {
final deviceIds = await _nativeSyncApi.getAssetIdsForAlbum(album.id); final deviceIds = await _nativeSyncApi.getAssetIdsForAlbum(album.id);
await _localAlbumRepository.syncDeletes(album.id, deviceIds); await _localAlbumRepository.syncDeletes(album.id, deviceIds);
} }
} }
if (_platform.isIOS) { if (CurrentPlatform.isIOS) {
// On iOS, we need to full sync albums that are marked as cloud as the delta sync // On iOS, we need to full sync albums that are marked as cloud as the delta sync
// does not include changes for cloud albums. If ignoreIcloudAssets is enabled, // does not include changes for cloud albums. If ignoreIcloudAssets is enabled,
// remove the albums from the local database from the previous sync // remove the albums from the local database from the previous sync

View File

@@ -1,11 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/log.model.dart'; import 'package:immich_mobile/domain/models/log.model.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/infrastructure/repositories/log.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/log.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/store.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/store.repository.dart';
import 'package:immich_mobile/utils/debug_print.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
/// Service responsible for handling application logging. /// Service responsible for handling application logging.
@@ -66,13 +66,12 @@ class LogService {
} }
void _handleLogRecord(LogRecord r) { void _handleLogRecord(LogRecord r) {
if (kDebugMode) { dPrint(
debugPrint( () =>
'[${r.level.name}] [${r.time}] [${r.loggerName}] ${r.message}' '[${r.level.name}] [${r.time}] [${r.loggerName}] ${r.message}'
'${r.error == null ? '' : '\nError: ${r.error}'}' '${r.error == null ? '' : '\nError: ${r.error}'}'
'${r.stackTrace == null ? '' : '\nStack: ${r.stackTrace}'}', '${r.stackTrace == null ? '' : '\nStack: ${r.stackTrace}'}',
); );
}
final record = LogMessage( final record = LogMessage(
message: r.message, message: r.message,

View File

@@ -1,7 +1,7 @@
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/infrastructure/repositories/partner.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/partner.repository.dart';
import 'package:immich_mobile/repositories/partner_api.repository.dart'; import 'package:immich_mobile/repositories/partner_api.repository.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class DriftPartnerService { class DriftPartnerService {
final DriftPartnerRepository _driftPartnerRepository; final DriftPartnerRepository _driftPartnerRepository;
@@ -30,7 +30,7 @@ class DriftPartnerService {
Future<void> toggleShowInTimeline(String partnerId, String userId) async { Future<void> toggleShowInTimeline(String partnerId, String userId) async {
final partner = await _driftPartnerRepository.getPartner(partnerId, userId); final partner = await _driftPartnerRepository.getPartner(partnerId, userId);
if (partner == null) { if (partner == null) {
debugPrint("Partner not found: $partnerId for user: $userId"); dPrint(() => "Partner not found: $partnerId for user: $userId");
return; return;
} }

View File

@@ -10,7 +10,7 @@ class StoreService {
/// In-memory cache. Keys are [StoreKey.id] /// In-memory cache. Keys are [StoreKey.id]
final Map<int, Object?> _cache = {}; final Map<int, Object?> _cache = {};
late final StreamSubscription<List<StoreDto>> _storeUpdateSubscription; StreamSubscription<List<StoreDto>>? _storeUpdateSubscription;
StoreService._({required IStoreRepository isarStoreRepository}) : _storeRepository = isarStoreRepository; StoreService._({required IStoreRepository isarStoreRepository}) : _storeRepository = isarStoreRepository;
@@ -24,15 +24,17 @@ class StoreService {
} }
// TODO: Replace the implementation with the one from create after removing the typedef // TODO: Replace the implementation with the one from create after removing the typedef
static Future<StoreService> init({required IStoreRepository storeRepository}) async { static Future<StoreService> init({required IStoreRepository storeRepository, bool listenUpdates = true}) async {
_instance ??= await create(storeRepository: storeRepository); _instance ??= await create(storeRepository: storeRepository, listenUpdates: listenUpdates);
return _instance!; return _instance!;
} }
static Future<StoreService> create({required IStoreRepository storeRepository}) async { static Future<StoreService> create({required IStoreRepository storeRepository, bool listenUpdates = true}) async {
final instance = StoreService._(isarStoreRepository: storeRepository); final instance = StoreService._(isarStoreRepository: storeRepository);
await instance.populateCache(); await instance.populateCache();
instance._storeUpdateSubscription = instance._listenForChange(); if (listenUpdates) {
instance._storeUpdateSubscription = instance._listenForChange();
}
return instance; return instance;
} }
@@ -50,8 +52,8 @@ class StoreService {
}); });
/// Disposes the store and cancels the subscription. To reuse the store call init() again /// Disposes the store and cancels the subscription. To reuse the store call init() again
void dispose() async { Future<void> dispose() async {
await _storeUpdateSubscription.cancel(); await _storeUpdateSubscription?.cancel();
_cache.clear(); _cache.clear();
} }

View File

@@ -1,4 +1,3 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.dart'; import 'package:immich_mobile/domain/models/album/local_album.model.dart';
import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart';
@@ -6,6 +5,7 @@ import 'package:immich_mobile/infrastructure/repositories/remote_album.repositor
import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
import 'package:immich_mobile/repositories/drift_album_api_repository.dart'; import 'package:immich_mobile/repositories/drift_album_api_repository.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final syncLinkedAlbumServiceProvider = Provider( final syncLinkedAlbumServiceProvider = Provider(
(ref) => SyncLinkedAlbumService( (ref) => SyncLinkedAlbumService(
@@ -100,7 +100,7 @@ class SyncLinkedAlbumService {
/// Creates a new remote album and links it to the local album /// Creates a new remote album and links it to the local album
Future<void> _createAndLinkNewRemoteAlbum(LocalAlbum localAlbum) async { Future<void> _createAndLinkNewRemoteAlbum(LocalAlbum localAlbum) async {
debugPrint("Creating new remote album for local album: ${localAlbum.name}"); dPrint(() => "Creating new remote album for local album: ${localAlbum.name}");
final newRemoteAlbum = await _albumApiRepository.createDriftAlbum(localAlbum.name, assetIds: []); final newRemoteAlbum = await _albumApiRepository.createDriftAlbum(localAlbum.name, assetIds: []);
await _remoteAlbumRepository.create(newRemoteAlbum, []); await _remoteAlbumRepository.create(newRemoteAlbum, []);
return _localAlbumRepository.linkRemoteAlbum(localAlbum.id, newRemoteAlbum.id); return _localAlbumRepository.linkRemoteAlbum(localAlbum.id, newRemoteAlbum.id);

View File

@@ -29,6 +29,7 @@ class SyncStreamService {
bool shouldReset = false; bool shouldReset = false;
await _syncApiRepository.streamChanges(_handleEvents, onReset: () => shouldReset = true); await _syncApiRepository.streamChanges(_handleEvents, onReset: () => shouldReset = true);
if (shouldReset) { if (shouldReset) {
_logger.info("Resetting sync state as requested by server");
await _syncApiRepository.streamChanges(_handleEvents); await _syncApiRepository.streamChanges(_handleEvents);
} }
} }

View File

@@ -100,8 +100,14 @@ class BackgroundSyncManager {
// We use a ternary operator to avoid [_deviceAlbumSyncTask] from being // We use a ternary operator to avoid [_deviceAlbumSyncTask] from being
// captured by the closure passed to [runInIsolateGentle]. // captured by the closure passed to [runInIsolateGentle].
_deviceAlbumSyncTask = full _deviceAlbumSyncTask = full
? runInIsolateGentle(computation: (ref) => ref.read(localSyncServiceProvider).sync(full: true)) ? runInIsolateGentle(
: runInIsolateGentle(computation: (ref) => ref.read(localSyncServiceProvider).sync(full: false)); computation: (ref) => ref.read(localSyncServiceProvider).sync(full: true),
debugLabel: 'local-sync-full-true',
)
: runInIsolateGentle(
computation: (ref) => ref.read(localSyncServiceProvider).sync(full: false),
debugLabel: 'local-sync-full-false',
);
return _deviceAlbumSyncTask! return _deviceAlbumSyncTask!
.whenComplete(() { .whenComplete(() {
@@ -122,7 +128,10 @@ class BackgroundSyncManager {
onHashingStart?.call(); onHashingStart?.call();
_hashTask = runInIsolateGentle(computation: (ref) => ref.read(hashServiceProvider).hashAssets()); _hashTask = runInIsolateGentle(
computation: (ref) => ref.read(hashServiceProvider).hashAssets(),
debugLabel: 'hash-assets',
);
return _hashTask! return _hashTask!
.whenComplete(() { .whenComplete(() {
@@ -142,7 +151,10 @@ class BackgroundSyncManager {
onRemoteSyncStart?.call(); onRemoteSyncStart?.call();
_syncTask = runInIsolateGentle(computation: (ref) => ref.read(syncStreamServiceProvider).sync()); _syncTask = runInIsolateGentle(
computation: (ref) => ref.read(syncStreamServiceProvider).sync(),
debugLabel: 'remote-sync',
);
return _syncTask! return _syncTask!
.whenComplete(() { .whenComplete(() {
onRemoteSyncComplete?.call(); onRemoteSyncComplete?.call();
@@ -169,7 +181,7 @@ class BackgroundSyncManager {
return _linkedAlbumSyncTask!.future; return _linkedAlbumSyncTask!.future;
} }
_linkedAlbumSyncTask = runInIsolateGentle(computation: syncLinkedAlbumsIsolated); _linkedAlbumSyncTask = runInIsolateGentle(computation: syncLinkedAlbumsIsolated, debugLabel: 'linked-album-sync');
return _linkedAlbumSyncTask!.whenComplete(() { return _linkedAlbumSyncTask!.whenComplete(() {
_linkedAlbumSyncTask = null; _linkedAlbumSyncTask = null;
}); });
@@ -178,4 +190,5 @@ class BackgroundSyncManager {
Cancelable<void> _handleWsAssetUploadReadyV1Batch(List<dynamic> batchData) => runInIsolateGentle( Cancelable<void> _handleWsAssetUploadReadyV1Batch(List<dynamic> batchData) => runInIsolateGentle(
computation: (ref) => ref.read(syncStreamServiceProvider).handleWsAssetUploadReadyV1Batch(batchData), computation: (ref) => ref.read(syncStreamServiceProvider).handleWsAssetUploadReadyV1Batch(batchData),
debugLabel: 'websocket-batch',
); );

View File

@@ -0,0 +1,9 @@
import 'package:flutter/foundation.dart';
extension CurrentPlatform on TargetPlatform {
@pragma('vm:prefer-inline')
static bool get isIOS => defaultTargetPlatform == TargetPlatform.iOS;
@pragma('vm:prefer-inline')
static bool get isAndroid => defaultTargetPlatform == TargetPlatform.android;
}

View File

@@ -1,6 +1,7 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:intl/message_format.dart'; import 'package:intl/message_format.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:immich_mobile/utils/debug_print.dart';
extension StringTranslateExtension on String { extension StringTranslateExtension on String {
String t({BuildContext? context, Map<String, Object>? args}) { String t({BuildContext? context, Map<String, Object>? args}) {
@@ -39,7 +40,7 @@ String _translateHelper(BuildContext? context, String key, [Map<String, Object>?
? MessageFormat(translatedMessage, locale: Intl.defaultLocale ?? 'en').format(args) ? MessageFormat(translatedMessage, locale: Intl.defaultLocale ?? 'en').format(args)
: translatedMessage; : translatedMessage;
} catch (e) { } catch (e) {
debugPrint('Translation failed for key "$key". Error: $e'); dPrint(() => 'Translation failed for key "$key". Error: $e');
return key; return key;
} }
} }

View File

@@ -69,6 +69,29 @@ class Drift extends $Drift implements IDatabaseRepository {
Drift([QueryExecutor? executor]) Drift([QueryExecutor? executor])
: super(executor ?? driftDatabase(name: 'immich', native: const DriftNativeOptions(shareAcrossIsolates: true))); : super(executor ?? driftDatabase(name: 'immich', native: const DriftNativeOptions(shareAcrossIsolates: true)));
Future<void> reset() async {
// https://github.com/simolus3/drift/commit/bd80a46264b6dd833ef4fd87fffc03f5a832ab41#diff-3f879e03b4a35779344ef16170b9353608dd9c42385f5402ec6035aac4dd8a04R76-R94
await exclusively(() async {
// https://stackoverflow.com/a/65743498/25690041
await customStatement('PRAGMA writable_schema = 1;');
await customStatement('DELETE FROM sqlite_master;');
await customStatement('VACUUM;');
await customStatement('PRAGMA writable_schema = 0;');
await customStatement('PRAGMA integrity_check');
await customStatement('PRAGMA user_version = 0');
await beforeOpen(
// ignore: invalid_use_of_internal_member
resolvedEngine.executor,
OpeningDetails(null, schemaVersion),
);
await customStatement('PRAGMA user_version = $schemaVersion');
// Refresh all stream queries
notifyUpdates({for (final table in allTables) TableUpdate.onTable(table)});
});
}
@override @override
int get schemaVersion => 10; int get schemaVersion => 10;

View File

@@ -1,22 +1,20 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.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/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/extensions/platform_extensions.dart';
import 'package:immich_mobile/infrastructure/entities/local_album.entity.dart'; import 'package:immich_mobile/infrastructure/entities/local_album.entity.dart';
import 'package:immich_mobile/infrastructure/entities/local_album.entity.drift.dart'; import 'package:immich_mobile/infrastructure/entities/local_album.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/local_album_asset.entity.drift.dart'; import 'package:immich_mobile/infrastructure/entities/local_album_asset.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.dart'; import 'package:immich_mobile/infrastructure/entities/local_asset.entity.dart';
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.drift.dart'; import 'package:immich_mobile/infrastructure/entities/local_asset.entity.drift.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
import 'package:platform/platform.dart';
enum SortLocalAlbumsBy { id, backupSelection, isIosSharedAlbum, name, assetCount, newestAsset } enum SortLocalAlbumsBy { id, backupSelection, isIosSharedAlbum, name, assetCount, newestAsset }
class DriftLocalAlbumRepository extends DriftDatabaseRepository { class DriftLocalAlbumRepository extends DriftDatabaseRepository {
final Drift _db; final Drift _db;
final Platform _platform;
const DriftLocalAlbumRepository(this._db, {Platform? platform}) const DriftLocalAlbumRepository(this._db) : super(_db);
: _platform = platform ?? const LocalPlatform(),
super(_db);
Future<List<LocalAlbum>> getAll({Set<SortLocalAlbumsBy> sortBy = const {}}) { Future<List<LocalAlbum>> getAll({Set<SortLocalAlbumsBy> sortBy = const {}}) {
final assetCount = _db.localAlbumAssetEntity.assetId.count(); final assetCount = _db.localAlbumAssetEntity.assetId.count();
@@ -61,7 +59,7 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository {
// Remove all assets that are only in this particular album // Remove all assets that are only in this particular album
// We cannot remove all assets in the album because they might be in other albums in iOS // We cannot remove all assets in the album because they might be in other albums in iOS
// That is not the case on Android since asset <-> album has one:one mapping // That is not the case on Android since asset <-> album has one:one mapping
final assetsToDelete = _platform.isIOS ? await _getUniqueAssetsInAlbum(albumId) : await getAssetIds(albumId); final assetsToDelete = CurrentPlatform.isIOS ? await _getUniqueAssetsInAlbum(albumId) : await getAssetIds(albumId);
await _deleteAssets(assetsToDelete); await _deleteAssets(assetsToDelete);
await _db.managers.localAlbumEntity await _db.managers.localAlbumEntity
@@ -144,7 +142,7 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository {
} }
}); });
if (_platform.isAndroid) { if (CurrentPlatform.isAndroid) {
// On Android, an asset can only be in one album // On Android, an asset can only be in one album
// So, get the albums that are marked for deletion // So, get the albums that are marked for deletion
// and delete all the assets that are in those albums // and delete all the assets that are in those albums
@@ -265,7 +263,7 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository {
return Future.value(); return Future.value();
} }
if (_platform.isAndroid) { if (CurrentPlatform.isAndroid) {
return _deleteAssets(assetIds); return _deleteAssets(assetIds);
} }

View File

@@ -3,7 +3,9 @@ import 'dart:convert';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/domain/models/sync_event.model.dart'; import 'package:immich_mobile/domain/models/sync_event.model.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/services/api.service.dart'; import 'package:immich_mobile/services/api.service.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
@@ -33,6 +35,7 @@ class SyncApiRepository {
await _api.applyToParams([], headerParams); await _api.applyToParams([], headerParams);
headers.addAll(headerParams); headers.addAll(headerParams);
final shouldReset = Store.get(StoreKey.shouldResetSync, false);
final request = http.Request('POST', Uri.parse(endpoint)); final request = http.Request('POST', Uri.parse(endpoint));
request.headers.addAll(headers); request.headers.addAll(headers);
request.body = jsonEncode( request.body = jsonEncode(
@@ -58,6 +61,7 @@ class SyncApiRepository {
SyncRequestType.peopleV1, SyncRequestType.peopleV1,
SyncRequestType.assetFacesV1, SyncRequestType.assetFacesV1,
], ],
reset: shouldReset,
).toJson(), ).toJson(),
); );
@@ -81,6 +85,9 @@ class SyncApiRepository {
throw ApiException(response.statusCode, 'Failed to get sync stream: $errorBody'); throw ApiException(response.statusCode, 'Failed to get sync stream: $errorBody');
} }
// Reset after successful stream start
await Store.put(StoreKey.shouldResetSync, false);
await for (final chunk in response.stream.transform(utf8.decoder)) { await for (final chunk in response.stream.transform(utf8.decoder)) {
if (shouldAbort) { if (shouldAbort) {
break; break;

View File

@@ -42,14 +42,10 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
throw UnsupportedError("GroupAssetsBy.none is not supported for watchMainBucket"); throw UnsupportedError("GroupAssetsBy.none is not supported for watchMainBucket");
} }
return _db.mergedAssetDrift return _db.mergedAssetDrift.mergedBucket(userIds: userIds, groupBy: groupBy.index).map((row) {
.mergedBucket(userIds: userIds, groupBy: groupBy.index) final date = row.bucketDate.dateFmt(groupBy);
.map((row) { return TimeBucket(date: date, assetCount: row.assetCount);
final date = row.bucketDate.dateFmt(groupBy); }).watch();
return TimeBucket(date: date, assetCount: row.assetCount);
})
.watch()
.throttle(const Duration(seconds: 3), trailing: true);
} }
Future<List<BaseAsset>> _getMainBucketAssets(List<String> userIds, {required int offset, required int count}) { Future<List<BaseAsset>> _getMainBucketAssets(List<String> userIds, {required int offset, required int count}) {

View File

@@ -39,6 +39,7 @@ import 'package:intl/date_symbol_data_local.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:timezone/data/latest.dart'; import 'package:timezone/data/latest.dart';
import 'package:worker_manager/worker_manager.dart'; import 'package:worker_manager/worker_manager.dart';
import 'package:immich_mobile/utils/debug_print.dart';
void main() async { void main() async {
ImmichWidgetsBinding(); ImmichWidgetsBinding();
@@ -69,9 +70,9 @@ Future<void> initApp() async {
if (kReleaseMode && Platform.isAndroid) { if (kReleaseMode && Platform.isAndroid) {
try { try {
await FlutterDisplayMode.setHighRefreshRate(); await FlutterDisplayMode.setHighRefreshRate();
debugPrint("Enabled high refresh mode"); dPrint(() => "Enabled high refresh mode");
} catch (e) { } catch (e) {
debugPrint("Error setting high refresh rate: $e"); dPrint(() => "Error setting high refresh rate: $e");
} }
} }
@@ -126,23 +127,23 @@ class ImmichAppState extends ConsumerState<ImmichApp> with WidgetsBindingObserve
void didChangeAppLifecycleState(AppLifecycleState state) { void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) { switch (state) {
case AppLifecycleState.resumed: case AppLifecycleState.resumed:
debugPrint("[APP STATE] resumed"); dPrint(() => "[APP STATE] resumed");
ref.read(appStateProvider.notifier).handleAppResume(); ref.read(appStateProvider.notifier).handleAppResume();
break; break;
case AppLifecycleState.inactive: case AppLifecycleState.inactive:
debugPrint("[APP STATE] inactive"); dPrint(() => "[APP STATE] inactive");
ref.read(appStateProvider.notifier).handleAppInactivity(); ref.read(appStateProvider.notifier).handleAppInactivity();
break; break;
case AppLifecycleState.paused: case AppLifecycleState.paused:
debugPrint("[APP STATE] paused"); dPrint(() => "[APP STATE] paused");
ref.read(appStateProvider.notifier).handleAppPause(); ref.read(appStateProvider.notifier).handleAppPause();
break; break;
case AppLifecycleState.detached: case AppLifecycleState.detached:
debugPrint("[APP STATE] detached"); dPrint(() => "[APP STATE] detached");
ref.read(appStateProvider.notifier).handleAppDetached(); ref.read(appStateProvider.notifier).handleAppDetached();
break; break;
case AppLifecycleState.hidden: case AppLifecycleState.hidden:
debugPrint("[APP STATE] hidden"); dPrint(() => "[APP STATE] hidden");
ref.read(appStateProvider.notifier).handleAppHidden(); ref.read(appStateProvider.notifier).handleAppHidden();
break; break;
} }
@@ -200,7 +201,7 @@ class ImmichAppState extends ConsumerState<ImmichApp> with WidgetsBindingObserve
@override @override
initState() { initState() {
super.initState(); super.initState();
initApp().then((_) => debugPrint("App Init Completed")); initApp().then((_) => dPrint(() => "App Init Completed"));
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
// needs to be delayed so that EasyLocalization is working // needs to be delayed so that EasyLocalization is working
if (Store.isBetaTimelineEnabled) { if (Store.isBetaTimelineEnabled) {
@@ -239,7 +240,7 @@ class ImmichAppState extends ConsumerState<ImmichApp> with WidgetsBindingObserve
theme: getThemeData(colorScheme: immichTheme.light, locale: context.locale), theme: getThemeData(colorScheme: immichTheme.light, locale: context.locale),
routerConfig: router.config( routerConfig: router.config(
deepLinkBuilder: _deepLinkBuilder, deepLinkBuilder: _deepLinkBuilder,
navigatorObservers: () => [AppNavigationObserver(ref: ref), HeroController()], navigatorObservers: () => [AppNavigationObserver(ref: ref)],
), ),
), ),
); );

View File

@@ -3,6 +3,8 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.dart'; import 'package:immich_mobile/domain/models/album/local_album.model.dart';
import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/theme_extensions.dart'; import 'package:immich_mobile/extensions/theme_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart';
@@ -34,21 +36,6 @@ class _DriftBackupPageState extends ConsumerState<DriftBackupPage> {
ref.read(driftBackupProvider.notifier).getBackupStatus(currentUser.id); ref.read(driftBackupProvider.notifier).getBackupStatus(currentUser.id);
} }
Future<void> startBackup() async {
final currentUser = ref.read(currentUserProvider);
if (currentUser == null) {
return;
}
await ref.read(backgroundSyncProvider).syncRemote();
await ref.read(driftBackupProvider.notifier).getBackupStatus(currentUser.id);
await ref.read(driftBackupProvider.notifier).startBackup(currentUser.id);
}
Future<void> stopBackup() async {
await ref.read(driftBackupProvider.notifier).cancel();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final selectedAlbum = ref final selectedAlbum = ref
@@ -56,6 +43,24 @@ class _DriftBackupPageState extends ConsumerState<DriftBackupPage> {
.where((album) => album.backupSelection == BackupSelection.selected) .where((album) => album.backupSelection == BackupSelection.selected)
.toList(); .toList();
final backupNotifier = ref.read(driftBackupProvider.notifier);
final backgroundManager = ref.read(backgroundSyncProvider);
Future<void> startBackup() async {
final currentUser = Store.tryGet(StoreKey.currentUser);
if (currentUser == null) {
return;
}
await backgroundManager.syncRemote();
await backupNotifier.getBackupStatus(currentUser.id);
await backupNotifier.startBackup(currentUser.id);
}
Future<void> stopBackup() async {
await backupNotifier.cancel();
}
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
elevation: 0, elevation: 0,

View File

@@ -91,6 +91,8 @@ class _ChangeExperiencePageState extends ConsumerState<ChangeExperiencePage> {
ref.read(websocketProvider.notifier).stopListenToOldEvents(); ref.read(websocketProvider.notifier).stopListenToOldEvents();
ref.read(websocketProvider.notifier).startListeningToBetaEvents(); ref.read(websocketProvider.notifier).startListeningToBetaEvents();
await ref.read(driftProvider).reset();
await Store.put(StoreKey.shouldResetSync, true);
final permission = await ref.read(galleryPermissionNotifier.notifier).requestGalleryPermission(); final permission = await ref.read(galleryPermissionNotifier.notifier).requestGalleryPermission();
if (permission.isGranted) { if (permission.isGranted) {

View File

@@ -12,7 +12,6 @@ import 'package:immich_mobile/widgets/settings/asset_viewer_settings/asset_viewe
import 'package:immich_mobile/widgets/settings/backup_settings/backup_settings.dart'; import 'package:immich_mobile/widgets/settings/backup_settings/backup_settings.dart';
import 'package:immich_mobile/widgets/settings/backup_settings/drift_backup_settings.dart'; import 'package:immich_mobile/widgets/settings/backup_settings/drift_backup_settings.dart';
import 'package:immich_mobile/widgets/settings/beta_sync_settings/sync_status_and_actions.dart'; import 'package:immich_mobile/widgets/settings/beta_sync_settings/sync_status_and_actions.dart';
import 'package:immich_mobile/widgets/settings/beta_timeline_list_tile.dart';
import 'package:immich_mobile/widgets/settings/language_settings.dart'; import 'package:immich_mobile/widgets/settings/language_settings.dart';
import 'package:immich_mobile/widgets/settings/networking_settings/networking_settings.dart'; import 'package:immich_mobile/widgets/settings/networking_settings/networking_settings.dart';
import 'package:immich_mobile/widgets/settings/notification_setting.dart'; import 'package:immich_mobile/widgets/settings/notification_setting.dart';
@@ -20,7 +19,6 @@ import 'package:immich_mobile/widgets/settings/preference_settings/preference_se
import 'package:immich_mobile/widgets/settings/settings_card.dart'; import 'package:immich_mobile/widgets/settings/settings_card.dart';
enum SettingSection { enum SettingSection {
beta('sync_status', Icons.sync_outlined, "sync_status_subtitle"),
advanced('advanced', Icons.build_outlined, "advanced_settings_tile_subtitle"), advanced('advanced', Icons.build_outlined, "advanced_settings_tile_subtitle"),
assetViewer('asset_viewer_settings_title', Icons.image_outlined, "asset_viewer_settings_subtitle"), assetViewer('asset_viewer_settings_title', Icons.image_outlined, "asset_viewer_settings_subtitle"),
backup('backup', Icons.cloud_upload_outlined, "backup_settings_subtitle"), backup('backup', Icons.cloud_upload_outlined, "backup_settings_subtitle"),
@@ -28,14 +26,14 @@ enum SettingSection {
networking('networking_settings', Icons.wifi, "networking_subtitle"), networking('networking_settings', Icons.wifi, "networking_subtitle"),
notifications('notifications', Icons.notifications_none_rounded, "setting_notifications_subtitle"), notifications('notifications', Icons.notifications_none_rounded, "setting_notifications_subtitle"),
preferences('preferences_settings_title', Icons.interests_outlined, "preferences_settings_subtitle"), preferences('preferences_settings_title', Icons.interests_outlined, "preferences_settings_subtitle"),
timeline('asset_list_settings_title', Icons.auto_awesome_mosaic_outlined, "asset_list_settings_subtitle"); timeline('asset_list_settings_title', Icons.auto_awesome_mosaic_outlined, "asset_list_settings_subtitle"),
beta('sync_status', Icons.sync_outlined, "sync_status_subtitle");
final String title; final String title;
final String subtitle; final String subtitle;
final IconData icon; final IconData icon;
Widget get widget => switch (this) { Widget get widget => switch (this) {
SettingSection.beta => const _BetaLandscapeToggle(),
SettingSection.advanced => const AdvancedSettings(), SettingSection.advanced => const AdvancedSettings(),
SettingSection.assetViewer => const AssetViewerSettings(), SettingSection.assetViewer => const AssetViewerSettings(),
SettingSection.backup => SettingSection.backup =>
@@ -45,6 +43,7 @@ enum SettingSection {
SettingSection.notifications => const NotificationSetting(), SettingSection.notifications => const NotificationSetting(),
SettingSection.preferences => const PreferenceSetting(), SettingSection.preferences => const PreferenceSetting(),
SettingSection.timeline => const AssetListSettings(), SettingSection.timeline => const AssetListSettings(),
SettingSection.beta => const SyncStatusAndActions(),
}; };
const SettingSection(this.title, this.icon, this.subtitle); const SettingSection(this.title, this.icon, this.subtitle);
@@ -59,7 +58,7 @@ class SettingsPage extends StatelessWidget {
context.locale; context.locale;
return Scaffold( return Scaffold(
appBar: AppBar(centerTitle: false, title: const Text('settings').tr()), appBar: AppBar(centerTitle: false, title: const Text('settings').tr()),
body: context.isMobile ? const _MobileLayout() : const _TabletLayout(), body: context.isMobile ? const SafeArea(child: _MobileLayout()) : const SafeArea(child: _TabletLayout()),
); );
} }
} }
@@ -72,7 +71,6 @@ class _MobileLayout extends StatelessWidget {
.expand( .expand(
(setting) => setting == SettingSection.beta (setting) => setting == SettingSection.beta
? [ ? [
const BetaTimelineListTile(),
if (Store.isBetaTimelineEnabled) if (Store.isBetaTimelineEnabled)
SettingsCard( SettingsCard(
icon: Icons.sync_outlined, icon: Icons.sync_outlined,
@@ -93,7 +91,7 @@ class _MobileLayout extends StatelessWidget {
.toList(); .toList();
return ListView( return ListView(
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
padding: const EdgeInsets.only(top: 10.0, bottom: 56), padding: const EdgeInsets.only(top: 10.0, bottom: 16),
children: [...settings], children: [...settings],
); );
} }
@@ -134,21 +132,6 @@ class _TabletLayout extends HookWidget {
} }
} }
class _BetaLandscapeToggle extends HookWidget {
const _BetaLandscapeToggle();
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
const SizedBox(height: 100, child: BetaTimelineListTile()),
if (Store.isBetaTimelineEnabled) const Expanded(child: SyncStatusAndActions()),
],
);
}
}
@RoutePage() @RoutePage()
class SettingsSubPage extends StatelessWidget { class SettingsSubPage extends StatelessWidget {
const SettingsSubPage(this.section, {super.key}); const SettingsSubPage(this.section, {super.key});
@@ -158,9 +141,14 @@ class SettingsSubPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
context.locale; context.locale;
return Scaffold( return SafeArea(
appBar: AppBar(centerTitle: false, title: Text(section.title).tr()), bottom: true,
body: section.widget, top: false,
right: true,
child: Scaffold(
appBar: AppBar(centerTitle: false, title: Text(section.title).tr()),
body: section.widget,
),
); );
} }
} }

View File

@@ -6,6 +6,7 @@ import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/providers/auth.provider.dart'; import 'package:immich_mobile/providers/auth.provider.dart';
import 'package:immich_mobile/providers/background_sync.provider.dart'; import 'package:immich_mobile/providers/background_sync.provider.dart';
import 'package:immich_mobile/providers/backup/backup.provider.dart'; import 'package:immich_mobile/providers/backup/backup.provider.dart';
import 'package:immich_mobile/providers/backup/drift_backup.provider.dart';
import 'package:immich_mobile/providers/gallery_permission.provider.dart'; import 'package:immich_mobile/providers/gallery_permission.provider.dart';
import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/server_info.provider.dart';
import 'package:immich_mobile/providers/websocket.provider.dart'; import 'package:immich_mobile/providers/websocket.provider.dart';
@@ -22,6 +23,7 @@ class SplashScreenPage extends StatefulHookConsumerWidget {
class SplashScreenPageState extends ConsumerState<SplashScreenPage> { class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
final log = Logger("SplashScreenPage"); final log = Logger("SplashScreenPage");
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@@ -49,6 +51,7 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
final infoProvider = ref.read(serverInfoProvider.notifier); final infoProvider = ref.read(serverInfoProvider.notifier);
final wsProvider = ref.read(websocketProvider.notifier); final wsProvider = ref.read(websocketProvider.notifier);
final backgroundManager = ref.read(backgroundSyncProvider); final backgroundManager = ref.read(backgroundSyncProvider);
final backupProvider = ref.read(driftBackupProvider.notifier);
ref.read(authProvider.notifier).saveAuthInfo(accessToken: accessToken).then( ref.read(authProvider.notifier).saveAuthInfo(accessToken: accessToken).then(
(_) async { (_) async {
@@ -57,13 +60,17 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
infoProvider.getServerInfo(); infoProvider.getServerInfo();
if (Store.isBetaTimelineEnabled) { if (Store.isBetaTimelineEnabled) {
await backgroundManager.syncLocal(); await Future.wait([backgroundManager.syncLocal(), backgroundManager.syncRemote()]);
await backgroundManager.syncRemote(); await Future.wait([
await backgroundManager.hashAssets(); backgroundManager.hashAssets().then((_) {
} _resumeBackup(backupProvider);
}),
_resumeBackup(backupProvider),
]);
if (Store.get(StoreKey.syncAlbums, false)) { if (Store.get(StoreKey.syncAlbums, false)) {
await backgroundManager.syncLinkedAlbum(); await backgroundManager.syncLinkedAlbum();
}
} }
} catch (e) { } catch (e) {
log.severe('Failed establishing connection to the server: $e'); log.severe('Failed establishing connection to the server: $e');
@@ -106,6 +113,17 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
} }
} }
Future<void> _resumeBackup(DriftBackupNotifier notifier) async {
final isEnableBackup = Store.get(StoreKey.enableBackup, false);
if (isEnableBackup) {
final currentUser = Store.tryGet(StoreKey.currentUser);
if (currentUser != null) {
notifier.handleBackupResume(currentUser.id);
}
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return const Scaffold( return const Scaffold(

View File

@@ -10,6 +10,7 @@ import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart'; import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
import 'package:immich_mobile/utils/debug_print.dart';
@RoutePage() @RoutePage()
class DriftPartnerDetailPage extends StatelessWidget { class DriftPartnerDetailPage extends StatelessWidget {
@@ -68,7 +69,7 @@ class _InfoBoxState extends ConsumerState<_InfoBox> {
_inTimeline = !_inTimeline; _inTimeline = !_inTimeline;
}); });
} catch (error, stack) { } catch (error, stack) {
debugPrint("Failed to toggle in timeline: $error $stack"); dPrint(() => "Failed to toggle in timeline: $error $stack");
ImmichToast.show( ImmichToast.show(
context: context, context: context,
toastType: ToastType.error, toastType: ToastType.error,

View File

@@ -40,6 +40,7 @@ class AlbumSelector extends ConsumerStatefulWidget {
class _AlbumSelectorState extends ConsumerState<AlbumSelector> { class _AlbumSelectorState extends ConsumerState<AlbumSelector> {
bool isGrid = false; bool isGrid = false;
final searchController = TextEditingController(); final searchController = TextEditingController();
final menuController = MenuController();
final searchFocusNode = FocusNode(); final searchFocusNode = FocusNode();
List<RemoteAlbum> sortedAlbums = []; List<RemoteAlbum> sortedAlbums = [];
List<RemoteAlbum> shownAlbums = []; List<RemoteAlbum> shownAlbums = [];
@@ -157,34 +158,45 @@ class _AlbumSelectorState extends ConsumerState<AlbumSelector> {
await sortAlbums(); await sortAlbums();
}); });
return MultiSliver( return PopScope(
children: [ onPopInvokedWithResult: (didPop, _) {
_SearchBar( menuController.close();
searchController: searchController, },
searchFocusNode: searchFocusNode, child: MultiSliver(
onSearch: onSearch, children: [
filterMode: filter.mode, _SearchBar(
onClearSearch: clearSearch, searchController: searchController,
), searchFocusNode: searchFocusNode,
_QuickFilterButtonRow( onSearch: onSearch,
filterMode: filter.mode, filterMode: filter.mode,
onChangeFilter: changeFilter, onClearSearch: clearSearch,
onSearch: onSearch, ),
searchController: searchController, _QuickFilterButtonRow(
), filterMode: filter.mode,
_QuickSortAndViewMode(isGrid: isGrid, onToggleViewMode: toggleViewMode, onSortChanged: changeSort), onChangeFilter: changeFilter,
isGrid onSearch: onSearch,
? _AlbumGrid(albums: shownAlbums, userId: userId, onAlbumSelected: widget.onAlbumSelected) searchController: searchController,
: _AlbumList(albums: shownAlbums, userId: userId, onAlbumSelected: widget.onAlbumSelected), ),
], _QuickSortAndViewMode(
isGrid: isGrid,
onToggleViewMode: toggleViewMode,
onSortChanged: changeSort,
controller: menuController,
),
isGrid
? _AlbumGrid(albums: shownAlbums, userId: userId, onAlbumSelected: widget.onAlbumSelected)
: _AlbumList(albums: shownAlbums, userId: userId, onAlbumSelected: widget.onAlbumSelected),
],
),
); );
} }
} }
class _SortButton extends ConsumerStatefulWidget { class _SortButton extends ConsumerStatefulWidget {
const _SortButton(this.onSortChanged); const _SortButton(this.onSortChanged, {this.controller});
final Future<void> Function(AlbumSort) onSortChanged; final Future<void> Function(AlbumSort) onSortChanged;
final MenuController? controller;
@override @override
ConsumerState<_SortButton> createState() => _SortButtonState(); ConsumerState<_SortButton> createState() => _SortButtonState();
@@ -220,6 +232,7 @@ class _SortButtonState extends ConsumerState<_SortButton> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MenuAnchor( return MenuAnchor(
controller: widget.controller,
style: MenuStyle( style: MenuStyle(
elevation: const WidgetStatePropertyAll(1), elevation: const WidgetStatePropertyAll(1),
shape: WidgetStateProperty.all( shape: WidgetStateProperty.all(
@@ -449,10 +462,16 @@ class _QuickFilterButton extends StatelessWidget {
} }
class _QuickSortAndViewMode extends StatelessWidget { class _QuickSortAndViewMode extends StatelessWidget {
const _QuickSortAndViewMode({required this.isGrid, required this.onToggleViewMode, required this.onSortChanged}); const _QuickSortAndViewMode({
required this.isGrid,
required this.onToggleViewMode,
required this.onSortChanged,
this.controller,
});
final bool isGrid; final bool isGrid;
final VoidCallback onToggleViewMode; final VoidCallback onToggleViewMode;
final MenuController? controller;
final Future<void> Function(AlbumSort) onSortChanged; final Future<void> Function(AlbumSort) onSortChanged;
@override @override
@@ -463,7 +482,7 @@ class _QuickSortAndViewMode extends StatelessWidget {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
_SortButton(onSortChanged), _SortButton(onSortChanged, controller: controller),
IconButton( IconButton(
icon: Icon(isGrid ? Icons.view_list_outlined : Icons.grid_view_outlined, size: 24), icon: Icon(isGrid ? Icons.view_list_outlined : Icons.grid_view_outlined, size: 24),
onPressed: onToggleViewMode, onPressed: onToggleViewMode,

View File

@@ -10,6 +10,7 @@ import 'package:immich_mobile/domain/models/timeline.model.dart';
import 'package:immich_mobile/domain/services/timeline.service.dart'; import 'package:immich_mobile/domain/services/timeline.service.dart';
import 'package:immich_mobile/domain/utils/event_stream.dart'; import 'package:immich_mobile/domain/utils/event_stream.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/platform_extensions.dart';
import 'package:immich_mobile/extensions/scroll_extensions.dart'; import 'package:immich_mobile/extensions/scroll_extensions.dart';
import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_stack.provider.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_stack.provider.dart';
import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_stack.widget.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_stack.widget.dart';
@@ -30,7 +31,6 @@ import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/widgets/common/immich_loading_indicator.dart'; import 'package:immich_mobile/widgets/common/immich_loading_indicator.dart';
import 'package:immich_mobile/widgets/photo_view/photo_view.dart'; import 'package:immich_mobile/widgets/photo_view/photo_view.dart';
import 'package:immich_mobile/widgets/photo_view/photo_view_gallery.dart'; import 'package:immich_mobile/widgets/photo_view/photo_view_gallery.dart';
import 'package:platform/platform.dart';
@RoutePage() @RoutePage()
class AssetViewerPage extends StatelessWidget { class AssetViewerPage extends StatelessWidget {
@@ -53,10 +53,9 @@ class AssetViewerPage extends StatelessWidget {
class AssetViewer extends ConsumerStatefulWidget { class AssetViewer extends ConsumerStatefulWidget {
final int initialIndex; final int initialIndex;
final Platform? platform;
final int? heroOffset; final int? heroOffset;
const AssetViewer({super.key, required this.initialIndex, this.platform, this.heroOffset}); const AssetViewer({super.key, required this.initialIndex, this.heroOffset});
@override @override
ConsumerState createState() => _AssetViewerState(); ConsumerState createState() => _AssetViewerState();
@@ -86,7 +85,6 @@ class _AssetViewerState extends ConsumerState<AssetViewer> {
PhotoViewControllerBase? viewController; PhotoViewControllerBase? viewController;
StreamSubscription? reloadSubscription; StreamSubscription? reloadSubscription;
late Platform platform;
late final int heroOffset; late final int heroOffset;
late PhotoViewControllerValue initialPhotoViewState; late PhotoViewControllerValue initialPhotoViewState;
bool? hasDraggedDown; bool? hasDraggedDown;
@@ -114,7 +112,6 @@ class _AssetViewerState extends ConsumerState<AssetViewer> {
super.initState(); super.initState();
assert(ref.read(currentAssetNotifier) != null, "Current asset should not be null when opening the AssetViewer"); assert(ref.read(currentAssetNotifier) != null, "Current asset should not be null when opening the AssetViewer");
pageController = PageController(initialPage: widget.initialIndex); pageController = PageController(initialPage: widget.initialIndex);
platform = widget.platform ?? const LocalPlatform();
totalAssets = ref.read(timelineServiceProvider).totalAssets; totalAssets = ref.read(timelineServiceProvider).totalAssets;
bottomSheetController = DraggableScrollableController(); bottomSheetController = DraggableScrollableController();
WidgetsBinding.instance.addPostFrameCallback(_onAssetInit); WidgetsBinding.instance.addPostFrameCallback(_onAssetInit);
@@ -638,7 +635,7 @@ class _AssetViewerState extends ConsumerState<AssetViewer> {
gaplessPlayback: true, gaplessPlayback: true,
loadingBuilder: _placeholderBuilder, loadingBuilder: _placeholderBuilder,
pageController: pageController, pageController: pageController,
scrollPhysics: platform.isIOS scrollPhysics: CurrentPlatform.isIOS
? const FastScrollPhysics() // Use bouncing physics for iOS ? const FastScrollPhysics() // Use bouncing physics for iOS
: const FastClampingScrollPhysics(), // Use heavy physics for Android : const FastClampingScrollPhysics(), // Use heavy physics for Android
itemCount: totalAssets, itemCount: totalAssets,

View File

@@ -14,9 +14,10 @@ import 'package:immich_mobile/presentation/widgets/action_buttons/unfavorite_act
import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart';
import 'package:immich_mobile/providers/cast.provider.dart'; import 'package:immich_mobile/providers/cast.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart';
import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart';
import 'package:immich_mobile/providers/routes.provider.dart'; import 'package:immich_mobile/providers/routes.provider.dart';
import 'package:immich_mobile/providers/tab.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/routing/router.dart';
@@ -38,8 +39,9 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
final isReadonlyModeEnabled = ref.watch(readonlyModeProvider); final isReadonlyModeEnabled = ref.watch(readonlyModeProvider);
final previousRouteName = ref.watch(previousRouteNameProvider); final previousRouteName = ref.watch(previousRouteNameProvider);
final tabRoute = ref.watch(tabProvider);
final showViewInTimelineButton = final showViewInTimelineButton =
previousRouteName != TabShellRoute.name && (previousRouteName != TabShellRoute.name || tabRoute == TabEnum.search) &&
previousRouteName != AssetViewerRoute.name && previousRouteName != AssetViewerRoute.name &&
previousRouteName != null; previousRouteName != null;

View File

@@ -43,7 +43,7 @@ class ArchiveBottomSheet extends ConsumerWidget {
const EditDateTimeActionButton(source: ActionSource.timeline), const EditDateTimeActionButton(source: ActionSource.timeline),
const EditLocationActionButton(source: ActionSource.timeline), const EditLocationActionButton(source: ActionSource.timeline),
const MoveToLockFolderActionButton(source: ActionSource.timeline), const MoveToLockFolderActionButton(source: ActionSource.timeline),
const StackActionButton(source: ActionSource.timeline), if (multiselect.selectedAssets.length > 1) const StackActionButton(source: ActionSource.timeline),
], ],
if (multiselect.hasLocal) ...[ if (multiselect.hasLocal) ...[
const DeleteLocalActionButton(source: ActionSource.timeline), const DeleteLocalActionButton(source: ActionSource.timeline),

View File

@@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_local_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/delete_local_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/download_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/download_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/edit_date_time_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/edit_date_time_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/edit_location_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/edit_location_action_button.widget.dart';
@@ -43,7 +43,7 @@ class FavoriteBottomSheet extends ConsumerWidget {
const EditDateTimeActionButton(source: ActionSource.timeline), const EditDateTimeActionButton(source: ActionSource.timeline),
const EditLocationActionButton(source: ActionSource.timeline), const EditLocationActionButton(source: ActionSource.timeline),
const MoveToLockFolderActionButton(source: ActionSource.timeline), const MoveToLockFolderActionButton(source: ActionSource.timeline),
const StackActionButton(source: ActionSource.timeline), if (multiselect.selectedAssets.length > 1) const StackActionButton(source: ActionSource.timeline),
], ],
if (multiselect.hasLocal) ...[ if (multiselect.hasLocal) ...[
const DeleteLocalActionButton(source: ActionSource.timeline), const DeleteLocalActionButton(source: ActionSource.timeline),

View File

@@ -98,16 +98,16 @@ class _GeneralBottomSheetState extends ConsumerState<GeneralBottomSheet> {
const ShareActionButton(source: ActionSource.timeline), const ShareActionButton(source: ActionSource.timeline),
if (multiselect.hasRemote) ...[ if (multiselect.hasRemote) ...[
const ShareLinkActionButton(source: ActionSource.timeline), const ShareLinkActionButton(source: ActionSource.timeline),
const ArchiveActionButton(source: ActionSource.timeline),
const FavoriteActionButton(source: ActionSource.timeline),
const DownloadActionButton(source: ActionSource.timeline), const DownloadActionButton(source: ActionSource.timeline),
const EditDateTimeActionButton(source: ActionSource.timeline),
const EditLocationActionButton(source: ActionSource.timeline),
const MoveToLockFolderActionButton(source: ActionSource.timeline),
const StackActionButton(source: ActionSource.timeline),
isTrashEnable isTrashEnable
? const TrashActionButton(source: ActionSource.timeline) ? const TrashActionButton(source: ActionSource.timeline)
: const DeletePermanentActionButton(source: ActionSource.timeline), : const DeletePermanentActionButton(source: ActionSource.timeline),
const FavoriteActionButton(source: ActionSource.timeline),
const ArchiveActionButton(source: ActionSource.timeline),
const EditDateTimeActionButton(source: ActionSource.timeline),
const EditLocationActionButton(source: ActionSource.timeline),
const MoveToLockFolderActionButton(source: ActionSource.timeline),
if (multiselect.selectedAssets.length > 1) const StackActionButton(source: ActionSource.timeline),
const DeleteActionButton(source: ActionSource.timeline), const DeleteActionButton(source: ActionSource.timeline),
], ],
if (multiselect.hasLocal || multiselect.hasMerged) const DeleteLocalActionButton(source: ActionSource.timeline), if (multiselect.hasLocal || multiselect.hasMerged) const DeleteLocalActionButton(source: ActionSource.timeline),

View File

@@ -1,12 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_local_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/delete_local_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/download_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/download_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/edit_date_time_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/edit_date_time_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/edit_location_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/edit_location_action_button.widget.dart';
@@ -100,7 +100,7 @@ class _RemoteAlbumBottomSheetState extends ConsumerState<RemoteAlbumBottomSheet>
const EditDateTimeActionButton(source: ActionSource.timeline), const EditDateTimeActionButton(source: ActionSource.timeline),
const EditLocationActionButton(source: ActionSource.timeline), const EditLocationActionButton(source: ActionSource.timeline),
const MoveToLockFolderActionButton(source: ActionSource.timeline), const MoveToLockFolderActionButton(source: ActionSource.timeline),
const StackActionButton(source: ActionSource.timeline), if (multiselect.selectedAssets.length > 1) const StackActionButton(source: ActionSource.timeline),
], ],
if (multiselect.hasLocal) ...[ if (multiselect.hasLocal) ...[
const DeleteLocalActionButton(source: ActionSource.timeline), const DeleteLocalActionButton(source: ActionSource.timeline),

View File

@@ -8,6 +8,7 @@ import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/providers/infrastructure/people.provider.dart'; import 'package:immich_mobile/providers/infrastructure/people.provider.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:scroll_date_picker/scroll_date_picker.dart'; import 'package:scroll_date_picker/scroll_date_picker.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class DriftPersonBirthdayEditForm extends ConsumerStatefulWidget { class DriftPersonBirthdayEditForm extends ConsumerStatefulWidget {
final DriftPerson person; final DriftPerson person;
@@ -36,7 +37,7 @@ class _DriftPersonNameEditFormState extends ConsumerState<DriftPersonBirthdayEdi
context.pop<DateTime>(_selectedDate); context.pop<DateTime>(_selectedDate);
} }
} catch (error) { } catch (error) {
debugPrint('Error updating birthday: $error'); dPrint(() => 'Error updating birthday: $error');
if (!context.mounted) { if (!context.mounted) {
return; return;

View File

@@ -7,6 +7,7 @@ import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/providers/infrastructure/people.provider.dart'; import 'package:immich_mobile/providers/infrastructure/people.provider.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class DriftPersonNameEditForm extends ConsumerStatefulWidget { class DriftPersonNameEditForm extends ConsumerStatefulWidget {
final DriftPerson person; final DriftPerson person;
@@ -34,7 +35,7 @@ class _DriftPersonNameEditFormState extends ConsumerState<DriftPersonNameEditFor
context.pop<String>(newName); context.pop<String>(newName);
} }
} catch (error) { } catch (error) {
debugPrint('Error updating name: $error'); dPrint(() => 'Error updating name: $error');
if (!context.mounted) { if (!context.mounted) {
return; return;

View File

@@ -3,14 +3,15 @@ import 'dart:async';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/timeline.model.dart'; import 'package:immich_mobile/domain/models/timeline.model.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/theme_extensions.dart'; import 'package:immich_mobile/extensions/theme_extensions.dart';
import 'package:immich_mobile/presentation/widgets/timeline/constants.dart'; import 'package:immich_mobile/presentation/widgets/timeline/constants.dart';
import 'package:immich_mobile/presentation/widgets/timeline/segment.model.dart'; import 'package:immich_mobile/presentation/widgets/timeline/segment.model.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.state.dart'; import 'package:immich_mobile/presentation/widgets/timeline/timeline.state.dart';
import 'package:intl/intl.dart' hide TextDirection;
import 'package:immich_mobile/providers/haptic_feedback.provider.dart'; import 'package:immich_mobile/providers/haptic_feedback.provider.dart';
import 'package:intl/intl.dart' hide TextDirection;
/// A widget that will display a BoxScrollView with a ScrollThumb that can be dragged /// A widget that will display a BoxScrollView with a ScrollThumb that can be dragged
/// for quick navigation of the BoxScrollView. /// for quick navigation of the BoxScrollView.
@@ -45,7 +46,7 @@ class Scrubber extends ConsumerStatefulWidget {
} }
List<_Segment> _buildSegments({required List<Segment> layoutSegments, required double timelineHeight}) { List<_Segment> _buildSegments({required List<Segment> layoutSegments, required double timelineHeight}) {
const double offsetThreshold = 20.0; const double offsetThreshold = 40.0;
final segments = <_Segment>[]; final segments = <_Segment>[];
if (layoutSegments.isEmpty || layoutSegments.first.bucket is! TimeBucket) { if (layoutSegments.isEmpty || layoutSegments.first.bucket is! TimeBucket) {
@@ -79,6 +80,7 @@ class ScrubberState extends ConsumerState<Scrubber> with TickerProviderStateMixi
double _thumbTopOffset = 0.0; double _thumbTopOffset = 0.0;
bool _isDragging = false; bool _isDragging = false;
List<_Segment> _segments = []; List<_Segment> _segments = [];
int _monthCount = 0;
late AnimationController _thumbAnimationController; late AnimationController _thumbAnimationController;
Timer? _fadeOutTimer; Timer? _fadeOutTimer;
@@ -105,6 +107,7 @@ class ScrubberState extends ConsumerState<Scrubber> with TickerProviderStateMixi
_thumbAnimationController = AnimationController(vsync: this, duration: kTimelineScrubberFadeInDuration); _thumbAnimationController = AnimationController(vsync: this, duration: kTimelineScrubberFadeInDuration);
_thumbAnimation = CurvedAnimation(parent: _thumbAnimationController, curve: Curves.fastEaseInToSlowEaseOut); _thumbAnimation = CurvedAnimation(parent: _thumbAnimationController, curve: Curves.fastEaseInToSlowEaseOut);
_labelAnimationController = AnimationController(vsync: this, duration: kTimelineScrubberFadeInDuration); _labelAnimationController = AnimationController(vsync: this, duration: kTimelineScrubberFadeInDuration);
_monthCount = getMonthCount();
_labelAnimation = CurvedAnimation(parent: _labelAnimationController, curve: Curves.fastOutSlowIn); _labelAnimation = CurvedAnimation(parent: _labelAnimationController, curve: Curves.fastOutSlowIn);
} }
@@ -121,6 +124,7 @@ class ScrubberState extends ConsumerState<Scrubber> with TickerProviderStateMixi
if (oldWidget.layoutSegments.lastOrNull?.endOffset != widget.layoutSegments.lastOrNull?.endOffset) { if (oldWidget.layoutSegments.lastOrNull?.endOffset != widget.layoutSegments.lastOrNull?.endOffset) {
_segments = _buildSegments(layoutSegments: widget.layoutSegments, timelineHeight: _scrubberHeight); _segments = _buildSegments(layoutSegments: widget.layoutSegments, timelineHeight: _scrubberHeight);
_monthCount = getMonthCount();
} }
} }
@@ -140,6 +144,10 @@ class ScrubberState extends ConsumerState<Scrubber> with TickerProviderStateMixi
}); });
} }
int getMonthCount() {
return _segments.map((e) => "${e.date.month}_${e.date.year}").toSet().length;
}
bool _onScrollNotification(ScrollNotification notification) { bool _onScrollNotification(ScrollNotification notification) {
if (_isDragging) { if (_isDragging) {
// If the user is dragging the thumb, we don't want to update the position // If the user is dragging the thumb, we don't want to update the position
@@ -169,7 +177,10 @@ class ScrubberState extends ConsumerState<Scrubber> with TickerProviderStateMixi
} }
void _onDragStart(DragStartDetails _) { void _onDragStart(DragStartDetails _) {
ref.read(timelineStateProvider.notifier).setScrubbing(true); if (_monthCount >= kMinMonthsToEnableScrubberSnap) {
ref.read(timelineStateProvider.notifier).setScrubbing(true);
}
setState(() { setState(() {
_isDragging = true; _isDragging = true;
_labelAnimationController.forward(); _labelAnimationController.forward();
@@ -191,13 +202,22 @@ class ScrubberState extends ConsumerState<Scrubber> with TickerProviderStateMixi
final nearestMonthSegment = _findNearestMonthSegment(dragPosition); final nearestMonthSegment = _findNearestMonthSegment(dragPosition);
if (nearestMonthSegment != null) { if (nearestMonthSegment != null) {
_snapToSegment(nearestMonthSegment);
final label = nearestMonthSegment.scrollLabel; final label = nearestMonthSegment.scrollLabel;
if (_lastLabel != label) { if (_lastLabel != label) {
ref.read(hapticFeedbackProvider.notifier).selectionClick(); ref.read(hapticFeedbackProvider.notifier).selectionClick();
_lastLabel = label; _lastLabel = label;
} }
} }
if (_monthCount < kMinMonthsToEnableScrubberSnap) {
// If there are less than kMinMonthsToEnableScrubberSnap months, we don't need to snap to segments
setState(() {
_thumbTopOffset = dragPosition;
_scrollController.jumpTo((dragPosition / _scrubberHeight) * _scrollController.position.maxScrollExtent);
});
} else if (nearestMonthSegment != null) {
_snapToSegment(nearestMonthSegment);
}
} }
/// Calculate the drag position relative to the scrubber area /// Calculate the drag position relative to the scrubber area
@@ -370,7 +390,7 @@ class _SegmentWidget extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return IgnorePointer( return IgnorePointer(
child: Container( child: Container(
margin: const EdgeInsets.only(right: 12.0), margin: const EdgeInsets.only(right: 36.0),
child: Material( child: Material(
color: context.colorScheme.surface, color: context.colorScheme.surface,
borderRadius: const BorderRadius.all(Radius.circular(16.0)), borderRadius: const BorderRadius.all(Radius.circular(16.0)),

View File

@@ -35,7 +35,7 @@ class Timeline extends StatelessWidget {
this.showStorageIndicator, this.showStorageIndicator,
this.withStack = false, this.withStack = false,
this.appBar = const ImmichSliverAppBar(floating: true, pinned: false, snap: false), this.appBar = const ImmichSliverAppBar(floating: true, pinned: false, snap: false),
this.bottomSheet = const GeneralBottomSheet(), this.bottomSheet = const GeneralBottomSheet(minChildSize: 0.18),
this.groupBy, this.groupBy,
this.withScrubber = true, this.withScrubber = true,
}); });

View File

@@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/domain/services/log.service.dart'; import 'package:immich_mobile/domain/services/log.service.dart';
import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/models/backup/backup_state.model.dart'; import 'package:immich_mobile/models/backup/backup_state.model.dart';
@@ -18,7 +19,6 @@ import 'package:immich_mobile/providers/memory.provider.dart';
import 'package:immich_mobile/providers/notification_permission.provider.dart'; import 'package:immich_mobile/providers/notification_permission.provider.dart';
import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/server_info.provider.dart';
import 'package:immich_mobile/providers/tab.provider.dart'; import 'package:immich_mobile/providers/tab.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/providers/websocket.provider.dart'; import 'package:immich_mobile/providers/websocket.provider.dart';
import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:immich_mobile/services/background.service.dart'; import 'package:immich_mobile/services/background.service.dart';
@@ -144,32 +144,42 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
final backgroundManager = _ref.read(backgroundSyncProvider); final backgroundManager = _ref.read(backgroundSyncProvider);
final isAlbumLinkedSyncEnable = _ref.read(appSettingsServiceProvider).getSetting(AppSettingsEnum.syncAlbums); final isAlbumLinkedSyncEnable = _ref.read(appSettingsServiceProvider).getSetting(AppSettingsEnum.syncAlbums);
final isEnableBackup = _ref.read(appSettingsServiceProvider).getSetting(AppSettingsEnum.enableBackup);
try { try {
// Run operations sequentially with state checks and error handling for each await Future.wait([
await _safeRun(backgroundManager.syncLocal(), "syncLocal"); _safeRun(backgroundManager.syncLocal(), "syncLocal"),
await _safeRun(backgroundManager.syncRemote(), "syncRemote"); _safeRun(backgroundManager.syncRemote(), "syncRemote"),
await _safeRun(backgroundManager.hashAssets(), "hashAssets"); ]);
await Future.wait([
_safeRun(backgroundManager.hashAssets(), "hashAssets").then((_) {
_resumeBackup();
}),
_resumeBackup(),
]);
if (isAlbumLinkedSyncEnable) { if (isAlbumLinkedSyncEnable) {
await _safeRun(backgroundManager.syncLinkedAlbum(), "syncLinkedAlbum"); await _safeRun(backgroundManager.syncLinkedAlbum(), "syncLinkedAlbum");
} }
// Handle backup resume only if still active
if (isEnableBackup) {
final currentUser = _ref.read(currentUserProvider);
if (currentUser != null) {
await _safeRun(
_ref.read(driftBackupProvider.notifier).handleBackupResume(currentUser.id),
"handleBackupResume",
);
}
}
} catch (e, stackTrace) { } catch (e, stackTrace) {
_log.severe("Error during background sync", e, stackTrace); _log.severe("Error during background sync", e, stackTrace);
} }
} }
Future<void> _resumeBackup() async {
final isEnableBackup = _ref.read(appSettingsServiceProvider).getSetting(AppSettingsEnum.enableBackup);
if (isEnableBackup) {
final currentUser = Store.tryGet(StoreKey.currentUser);
if (currentUser != null) {
await _safeRun(
_ref.read(driftBackupProvider.notifier).handleBackupResume(currentUser.id),
"handleBackupResume",
);
}
}
}
// Helper method to check if operations should continue // Helper method to check if operations should continue
bool _shouldContinueOperation() { bool _shouldContinueOperation() {
return [AppLifeCycleEnum.resumed, AppLifeCycleEnum.active].contains(state) && return [AppLifeCycleEnum.resumed, AppLifeCycleEnum.active].contains(state) &&

View File

@@ -1,4 +1,3 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
@@ -13,6 +12,7 @@ import 'package:immich_mobile/services/etag.service.dart';
import 'package:immich_mobile/services/exif.service.dart'; import 'package:immich_mobile/services/exif.service.dart';
import 'package:immich_mobile/services/sync.service.dart'; import 'package:immich_mobile/services/sync.service.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final assetProvider = StateNotifierProvider<AssetNotifier, bool>((ref) { final assetProvider = StateNotifierProvider<AssetNotifier, bool>((ref) {
return AssetNotifier( return AssetNotifier(
@@ -68,7 +68,7 @@ class AssetNotifier extends StateNotifier<bool> {
} }
final bool newRemote = await _assetService.refreshRemoteAssets(); final bool newRemote = await _assetService.refreshRemoteAssets();
final bool newLocal = await _albumService.refreshDeviceAlbums(); final bool newLocal = await _albumService.refreshDeviceAlbums();
debugPrint("changedUsers: $changedUsers, newRemote: $newRemote, newLocal: $newLocal"); dPrint(() => "changedUsers: $changedUsers, newRemote: $newRemote, newLocal: $newLocal");
if (newRemote) { if (newRemote) {
_ref.invalidate(memoryFutureProvider); _ref.invalidate(memoryFutureProvider);
} }

View File

@@ -1,4 +1,3 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_udid/flutter_udid.dart'; import 'package:flutter_udid/flutter_udid.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
@@ -18,6 +17,7 @@ import 'package:immich_mobile/services/widget.service.dart';
import 'package:immich_mobile/utils/hash.dart'; import 'package:immich_mobile/utils/hash.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final authProvider = StateNotifierProvider<AuthNotifier, AuthState>((ref) { final authProvider = StateNotifierProvider<AuthNotifier, AuthState>((ref) {
return AuthNotifier( return AuthNotifier(
@@ -150,10 +150,7 @@ class AuthNotifier extends StateNotifier<AuthState> {
_log.severe("Error getting user information from the server [API EXCEPTION]", stackTrace); _log.severe("Error getting user information from the server [API EXCEPTION]", stackTrace);
} catch (error, stackTrace) { } catch (error, stackTrace) {
_log.severe("Error getting user information from the server [CATCH ALL]", error, stackTrace); _log.severe("Error getting user information from the server [CATCH ALL]", error, stackTrace);
dPrint(() => "Error getting user information from the server [CATCH ALL] $error $stackTrace");
if (kDebugMode) {
debugPrint("Error getting user information from the server [CATCH ALL] $error $stackTrace");
}
} }
// If the user is null, the login was not successful // If the user is null, the login was not successful

View File

@@ -2,8 +2,6 @@ import 'dart:io';
import 'package:cancellation_token_http/http.dart'; import 'package:cancellation_token_http/http.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/album.entity.dart'; import 'package:immich_mobile/entities/album.entity.dart';
@@ -33,6 +31,7 @@ import 'package:immich_mobile/utils/diff.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:photo_manager/photo_manager.dart' show PMProgressHandler; import 'package:photo_manager/photo_manager.dart' show PMProgressHandler;
import 'package:immich_mobile/utils/debug_print.dart';
final backupProvider = StateNotifierProvider<BackupNotifier, BackUpState>((ref) { final backupProvider = StateNotifierProvider<BackupNotifier, BackUpState>((ref) {
return BackupNotifier( return BackupNotifier(
@@ -286,7 +285,7 @@ class BackupNotifier extends StateNotifier<BackUpState> {
state = state.copyWith(selectedBackupAlbums: selectedAlbums, excludedBackupAlbums: excludedAlbums); state = state.copyWith(selectedBackupAlbums: selectedAlbums, excludedBackupAlbums: excludedAlbums);
log.info("_getBackupAlbumsInfo: Found ${availableAlbums.length} available albums"); log.info("_getBackupAlbumsInfo: Found ${availableAlbums.length} available albums");
debugPrint("_getBackupAlbumsInfo takes ${stopwatch.elapsedMilliseconds}ms"); dPrint(() => "_getBackupAlbumsInfo takes ${stopwatch.elapsedMilliseconds}ms");
} }
/// ///
@@ -428,7 +427,7 @@ class BackupNotifier extends StateNotifier<BackUpState> {
/// Invoke backup process /// Invoke backup process
Future<void> startBackupProcess() async { Future<void> startBackupProcess() async {
debugPrint("Start backup process"); dPrint(() => "Start backup process");
assert(state.backupProgress == BackUpProgressEnum.idle); assert(state.backupProgress == BackUpProgressEnum.idle);
state = state.copyWith(backupProgress: BackUpProgressEnum.inProgress); state = state.copyWith(backupProgress: BackUpProgressEnum.inProgress);

View File

@@ -4,7 +4,6 @@ import 'dart:convert';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.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/album/local_album.model.dart';
@@ -14,6 +13,7 @@ import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/services/upload.service.dart'; import 'package:immich_mobile/services/upload.service.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class EnqueueStatus { class EnqueueStatus {
final int enqueueCount; final int enqueueCount;
@@ -329,16 +329,16 @@ class DriftBackupNotifier extends StateNotifier<DriftBackupState> {
} }
Future<void> cancel() async { Future<void> cancel() async {
debugPrint("Canceling backup tasks..."); dPrint(() => "Canceling backup tasks...");
state = state.copyWith(enqueueCount: 0, enqueueTotalCount: 0, isCanceling: true); state = state.copyWith(enqueueCount: 0, enqueueTotalCount: 0, isCanceling: true);
final activeTaskCount = await _uploadService.cancelBackup(); final activeTaskCount = await _uploadService.cancelBackup();
if (activeTaskCount > 0) { if (activeTaskCount > 0) {
debugPrint("$activeTaskCount tasks left, continuing to cancel..."); dPrint(() => "$activeTaskCount tasks left, continuing to cancel...");
await cancel(); await cancel();
} else { } else {
debugPrint("All tasks canceled successfully."); dPrint(() => "All tasks canceled successfully.");
// Clear all upload items when cancellation is complete // Clear all upload items when cancellation is complete
state = state.copyWith(isCanceling: false, uploadItems: {}); state = state.copyWith(isCanceling: false, uploadItems: {});
} }

View File

@@ -30,6 +30,7 @@ import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:photo_manager/photo_manager.dart' show PMProgressHandler; import 'package:photo_manager/photo_manager.dart' show PMProgressHandler;
import 'package:immich_mobile/utils/debug_print.dart';
final manualUploadProvider = StateNotifierProvider<ManualUploadNotifier, ManualUploadState>((ref) { final manualUploadProvider = StateNotifierProvider<ManualUploadNotifier, ManualUploadState>((ref) {
return ManualUploadNotifier( return ManualUploadNotifier(
@@ -216,7 +217,7 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
); );
if (uploadAssets.isEmpty) { if (uploadAssets.isEmpty) {
debugPrint("[_startUpload] No Assets to upload - Abort Process"); dPrint(() => "[_startUpload] No Assets to upload - Abort Process");
_backupProvider.updateBackupProgress(BackUpProgressEnum.idle); _backupProvider.updateBackupProgress(BackUpProgressEnum.idle);
return false; return false;
} }
@@ -294,10 +295,10 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
} }
} else { } else {
openAppSettings(); openAppSettings();
debugPrint("[_startUpload] Do not have permission to the gallery"); dPrint(() => "[_startUpload] Do not have permission to the gallery");
} }
} catch (e) { } catch (e) {
debugPrint("ERROR _startUpload: ${e.toString()}"); dPrint(() => "ERROR _startUpload: ${e.toString()}");
hasErrors = true; hasErrors = true;
} finally { } finally {
_backupProvider.updateBackupProgress(BackUpProgressEnum.idle); _backupProvider.updateBackupProgress(BackUpProgressEnum.idle);
@@ -340,7 +341,7 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
// waits until it has stopped to start the backup. // waits until it has stopped to start the backup.
final bool hasLock = await ref.read(backgroundServiceProvider).acquireLock(); final bool hasLock = await ref.read(backgroundServiceProvider).acquireLock();
if (!hasLock) { if (!hasLock) {
debugPrint("[uploadAssets] could not acquire lock, exiting"); dPrint(() => "[uploadAssets] could not acquire lock, exiting");
ImmichToast.show( ImmichToast.show(
context: context, context: context,
msg: "failed".tr(), msg: "failed".tr(),
@@ -355,18 +356,18 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
// check if backup is already in process - then return // check if backup is already in process - then return
if (_backupProvider.backupProgress == BackUpProgressEnum.manualInProgress) { if (_backupProvider.backupProgress == BackUpProgressEnum.manualInProgress) {
debugPrint("[uploadAssets] Manual upload is already running - abort"); dPrint(() => "[uploadAssets] Manual upload is already running - abort");
showInProgress = true; showInProgress = true;
} }
if (_backupProvider.backupProgress == BackUpProgressEnum.inProgress) { if (_backupProvider.backupProgress == BackUpProgressEnum.inProgress) {
debugPrint("[uploadAssets] Auto Backup is already in progress - abort"); dPrint(() => "[uploadAssets] Auto Backup is already in progress - abort");
showInProgress = true; showInProgress = true;
return false; return false;
} }
if (_backupProvider.backupProgress == BackUpProgressEnum.inBackground) { if (_backupProvider.backupProgress == BackUpProgressEnum.inBackground) {
debugPrint("[uploadAssets] Background backup is running - abort"); dPrint(() => "[uploadAssets] Background backup is running - abort");
showInProgress = true; showInProgress = true;
} }

View File

@@ -7,11 +7,12 @@ import 'package:immich_mobile/theme/theme_data.dart';
import 'package:immich_mobile/theme/dynamic_theme.dart'; import 'package:immich_mobile/theme/dynamic_theme.dart';
import 'package:immich_mobile/providers/app_settings.provider.dart'; import 'package:immich_mobile/providers/app_settings.provider.dart';
import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final immichThemeModeProvider = StateProvider<ThemeMode>((ref) { final immichThemeModeProvider = StateProvider<ThemeMode>((ref) {
final themeMode = ref.watch(appSettingsServiceProvider).getSetting(AppSettingsEnum.themeMode); final themeMode = ref.watch(appSettingsServiceProvider).getSetting(AppSettingsEnum.themeMode);
debugPrint("Current themeMode $themeMode"); dPrint(() => "Current themeMode $themeMode");
if (themeMode == ThemeMode.light.name) { if (themeMode == ThemeMode.light.name) {
return ThemeMode.light; return ThemeMode.light;
@@ -26,12 +27,12 @@ final immichThemePresetProvider = StateProvider<ImmichColorPreset>((ref) {
final appSettingsProvider = ref.watch(appSettingsServiceProvider); final appSettingsProvider = ref.watch(appSettingsServiceProvider);
final primaryColorPreset = appSettingsProvider.getSetting(AppSettingsEnum.primaryColor); final primaryColorPreset = appSettingsProvider.getSetting(AppSettingsEnum.primaryColor);
debugPrint("Current theme preset $primaryColorPreset"); dPrint(() => "Current theme preset $primaryColorPreset");
try { try {
return ImmichColorPreset.values.firstWhere((e) => e.name == primaryColorPreset); return ImmichColorPreset.values.firstWhere((e) => e.name == primaryColorPreset);
} catch (e) { } catch (e) {
debugPrint("Theme preset $primaryColorPreset not found. Applying default preset."); dPrint(() => "Theme preset $primaryColorPreset not found. Applying default preset.");
appSettingsProvider.setSetting(AppSettingsEnum.primaryColor, defaultColorPresetName); appSettingsProvider.setSetting(AppSettingsEnum.primaryColor, defaultColorPresetName);
return defaultColorPreset; return defaultColorPreset;
} }

View File

@@ -1,10 +1,10 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:immich_mobile/domain/services/user.service.dart'; import 'package:immich_mobile/domain/services/user.service.dart';
import 'package:immich_mobile/providers/infrastructure/user.provider.dart'; import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
import 'package:immich_mobile/utils/debug_print.dart';
enum UploadProfileStatus { idle, loading, success, failure } enum UploadProfileStatus { idle, loading, success, failure }
@@ -67,7 +67,7 @@ class UploadProfileImageNotifier extends StateNotifier<UploadProfileImageState>
var profileImagePath = await _userService.createProfileImage(file.name, await file.readAsBytes()); var profileImagePath = await _userService.createProfileImage(file.name, await file.readAsBytes());
if (profileImagePath != null) { if (profileImagePath != null) {
debugPrint("Successfully upload profile image"); dPrint(() => "Successfully upload profile image");
state = state.copyWith(status: UploadProfileStatus.success, profileImagePath: profileImagePath); state = state.copyWith(status: UploadProfileStatus.success, profileImagePath: profileImagePath);
return true; return true;
} }

View File

@@ -2,8 +2,6 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/entities/asset.entity.dart';
@@ -20,6 +18,7 @@ import 'package:immich_mobile/utils/debounce.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
import 'package:socket_io_client/socket_io_client.dart'; import 'package:socket_io_client/socket_io_client.dart';
import 'package:immich_mobile/utils/debug_print.dart';
enum PendingAction { assetDelete, assetUploaded, assetHidden, assetTrash } enum PendingAction { assetDelete, assetUploaded, assetHidden, assetTrash }
@@ -105,7 +104,7 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
headers["Authorization"] = "Basic ${base64.encode(utf8.encode(endpoint.userInfo))}"; headers["Authorization"] = "Basic ${base64.encode(utf8.encode(endpoint.userInfo))}";
} }
debugPrint("Attempting to connect to websocket"); dPrint(() => "Attempting to connect to websocket");
// Configure socket transports must be specified // Configure socket transports must be specified
Socket socket = io( Socket socket = io(
endpoint.origin, endpoint.origin,
@@ -121,12 +120,12 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
); );
socket.onConnect((_) { socket.onConnect((_) {
debugPrint("Established Websocket Connection"); dPrint(() => "Established Websocket Connection");
state = WebsocketState(isConnected: true, socket: socket, pendingChanges: state.pendingChanges); state = WebsocketState(isConnected: true, socket: socket, pendingChanges: state.pendingChanges);
}); });
socket.onDisconnect((_) { socket.onDisconnect((_) {
debugPrint("Disconnect to Websocket Connection"); dPrint(() => "Disconnect to Websocket Connection");
state = WebsocketState(isConnected: false, socket: null, pendingChanges: state.pendingChanges); state = WebsocketState(isConnected: false, socket: null, pendingChanges: state.pendingChanges);
}); });
@@ -150,13 +149,13 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
socket.on('on_config_update', _handleOnConfigUpdate); socket.on('on_config_update', _handleOnConfigUpdate);
socket.on('on_new_release', _handleReleaseUpdates); socket.on('on_new_release', _handleReleaseUpdates);
} catch (e) { } catch (e) {
debugPrint("[WEBSOCKET] Catch Websocket Error - ${e.toString()}"); dPrint(() => "[WEBSOCKET] Catch Websocket Error - ${e.toString()}");
} }
} }
} }
void disconnect() { void disconnect() {
debugPrint("Attempting to disconnect from websocket"); dPrint(() => "Attempting to disconnect from websocket");
_batchedAssetUploadReady.clear(); _batchedAssetUploadReady.clear();
@@ -200,7 +199,7 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
} }
void listenUploadEvent() { void listenUploadEvent() {
debugPrint("Start listening to event on_upload_success"); dPrint(() => "Start listening to event on_upload_success");
state.socket?.on('on_upload_success', _handleOnUploadSuccess); state.socket?.on('on_upload_success', _handleOnUploadSuccess);
} }
@@ -321,10 +320,13 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
return; return;
} }
final isSyncAlbumEnabled = Store.get(StoreKey.syncAlbums, false);
try { try {
unawaited( unawaited(
_ref.read(backgroundSyncProvider).syncWebsocketBatch(_batchedAssetUploadReady.toList()).then((_) { _ref.read(backgroundSyncProvider).syncWebsocketBatch(_batchedAssetUploadReady.toList()).then((_) {
return _ref.read(backgroundSyncProvider).syncLinkedAlbum(); if (isSyncAlbumEnabled) {
_ref.read(backgroundSyncProvider).syncLinkedAlbum();
}
}), }),
); );
} catch (error) { } catch (error) {

View File

@@ -3,12 +3,12 @@ import 'dart:io';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:cancellation_token_http/http.dart'; import 'package:cancellation_token_http/http.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/entities/store.entity.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class UploadTaskWithFile { class UploadTaskWithFile {
final File file; final File file;
@@ -79,14 +79,17 @@ class UploadRepository {
FileDownloader().database.allRecordsWithStatus(TaskStatus.paused, group: kBackupGroup), FileDownloader().database.allRecordsWithStatus(TaskStatus.paused, group: kBackupGroup),
]); ]);
debugPrint(""" dPrint(
() =>
"""
Upload Info: Upload Info:
Enqueued: ${enqueuedTasks.length} Enqueued: ${enqueuedTasks.length}
Running: ${runningTasks.length} Running: ${runningTasks.length}
Canceled: ${canceledTasks.length} Canceled: ${canceledTasks.length}
Waiting: ${waitingTasks.length} Waiting: ${waitingTasks.length}
Paused: ${pausedTasks.length} Paused: ${pausedTasks.length}
"""); """,
);
} }
Future<void> backupWithDartClient(Iterable<UploadTaskWithFile> tasks, CancellationToken cancelToken) async { Future<void> backupWithDartClient(Iterable<UploadTaskWithFile> tasks, CancellationToken cancelToken) async {

View File

@@ -1,5 +1,5 @@
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:flutter/foundation.dart'; import 'package:immich_mobile/utils/debug_print.dart';
/// Guards against duplicate navigation to this route /// Guards against duplicate navigation to this route
class DuplicateGuard extends AutoRouteGuard { class DuplicateGuard extends AutoRouteGuard {
@@ -8,7 +8,7 @@ class DuplicateGuard extends AutoRouteGuard {
void onNavigation(NavigationResolver resolver, StackRouter router) async { void onNavigation(NavigationResolver resolver, StackRouter router) async {
// Duplicate navigation // Duplicate navigation
if (resolver.route.name == router.current.name) { if (resolver.route.name == router.current.name) {
debugPrint('DuplicateGuard: Preventing duplicate route navigation for ${resolver.route.name}'); dPrint(() => 'DuplicateGuard: Preventing duplicate route navigation for ${resolver.route.name}');
resolver.next(false); resolver.next(false);
} else { } else {
resolver.next(true); resolver.next(true);

View File

@@ -3,7 +3,6 @@ import 'dart:collection';
import 'dart:io'; import 'dart:io';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/domain/models/user.model.dart';
@@ -24,6 +23,7 @@ import 'package:immich_mobile/services/entity.service.dart';
import 'package:immich_mobile/services/sync.service.dart'; import 'package:immich_mobile/services/sync.service.dart';
import 'package:immich_mobile/utils/hash.dart'; import 'package:immich_mobile/utils/hash.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final albumServiceProvider = Provider( final albumServiceProvider = Provider(
(ref) => AlbumService( (ref) => AlbumService(
@@ -124,7 +124,7 @@ class AlbumService {
} finally { } finally {
_localCompleter.complete(changes); _localCompleter.complete(changes);
} }
debugPrint("refreshDeviceAlbums took ${sw.elapsedMilliseconds}ms"); dPrint(() => "refreshDeviceAlbums took ${sw.elapsedMilliseconds}ms");
return changes; return changes;
} }
@@ -172,7 +172,7 @@ class AlbumService {
} finally { } finally {
_remoteCompleter.complete(changes); _remoteCompleter.complete(changes);
} }
debugPrint("refreshRemoteAlbums took ${sw.elapsedMilliseconds}ms"); dPrint(() => "refreshRemoteAlbums took ${sw.elapsedMilliseconds}ms");
return changes; return changes;
} }
@@ -220,7 +220,7 @@ class AlbumService {
return AlbumAddAssetsResponse(alreadyInAlbum: result.duplicates, successfullyAdded: addedAssets.length); return AlbumAddAssetsResponse(alreadyInAlbum: result.duplicates, successfullyAdded: addedAssets.length);
} catch (e) { } catch (e) {
debugPrint("Error addAssets ${e.toString()}"); dPrint(() => "Error addAssets ${e.toString()}");
} }
return null; return null;
} }
@@ -242,7 +242,7 @@ class AlbumService {
await _albumRepository.update(album); await _albumRepository.update(album);
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error setActivityEnabled ${e.toString()}"); dPrint(() => "Error setActivityEnabled ${e.toString()}");
} }
return false; return false;
} }
@@ -271,7 +271,7 @@ class AlbumService {
} }
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error deleteAlbum ${e.toString()}"); dPrint(() => "Error deleteAlbum ${e.toString()}");
} }
return false; return false;
} }
@@ -281,7 +281,7 @@ class AlbumService {
await _albumApiRepository.removeUser(album.remoteId!, userId: "me"); await _albumApiRepository.removeUser(album.remoteId!, userId: "me");
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error leaveAlbum ${e.toString()}"); dPrint(() => "Error leaveAlbum ${e.toString()}");
return false; return false;
} }
} }
@@ -293,7 +293,7 @@ class AlbumService {
await _updateAssets(album.id, remove: toRemove.toList()); await _updateAssets(album.id, remove: toRemove.toList());
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error removeAssetFromAlbum ${e.toString()}"); dPrint(() => "Error removeAssetFromAlbum ${e.toString()}");
} }
return false; return false;
} }
@@ -310,7 +310,7 @@ class AlbumService {
return true; return true;
} catch (error) { } catch (error) {
debugPrint("Error removeUser ${error.toString()}"); dPrint(() => "Error removeUser ${error.toString()}");
return false; return false;
} }
} }
@@ -327,7 +327,7 @@ class AlbumService {
return true; return true;
} catch (error) { } catch (error) {
debugPrint("Error addUsers ${error.toString()}"); dPrint(() => "Error addUsers ${error.toString()}");
} }
return false; return false;
} }
@@ -340,7 +340,7 @@ class AlbumService {
await _albumRepository.update(album); await _albumRepository.update(album);
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error changeTitleAlbum ${e.toString()}"); dPrint(() => "Error changeTitleAlbum ${e.toString()}");
return false; return false;
} }
} }
@@ -353,7 +353,7 @@ class AlbumService {
await _albumRepository.update(album); await _albumRepository.update(album);
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error changeDescriptionAlbum ${e.toString()}"); dPrint(() => "Error changeDescriptionAlbum ${e.toString()}");
return false; return false;
} }
} }

View File

@@ -3,7 +3,6 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/entities/store.entity.dart';
@@ -11,6 +10,7 @@ import 'package:immich_mobile/utils/url_helper.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
import 'package:immich_mobile/utils/user_agent.dart'; import 'package:immich_mobile/utils/user_agent.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class ApiService implements Authentication { class ApiService implements Authentication {
late ApiClient _apiClient; late ApiClient _apiClient;
@@ -155,7 +155,7 @@ class ApiService implements Authentication {
return endpoint; return endpoint;
} }
} catch (e) { } catch (e) {
debugPrint("Could not locate /.well-known/immich at $baseUrl"); dPrint(() => "Could not locate /.well-known/immich at $baseUrl");
} }
return ""; return "";

View File

@@ -1,7 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/domain/models/user.model.dart';
@@ -26,6 +25,7 @@ import 'package:immich_mobile/services/sync.service.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:maplibre_gl/maplibre_gl.dart'; import 'package:maplibre_gl/maplibre_gl.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final assetServiceProvider = Provider( final assetServiceProvider = Provider(
(ref) => AssetService( (ref) => AssetService(
@@ -87,7 +87,7 @@ class AssetService {
getChangedAssets: _getRemoteAssetChanges, getChangedAssets: _getRemoteAssetChanges,
loadAssets: _getRemoteAssets, loadAssets: _getRemoteAssets,
); );
debugPrint("refreshRemoteAssets full took ${sw.elapsedMilliseconds}ms"); dPrint(() => "refreshRemoteAssets full took ${sw.elapsedMilliseconds}ms");
return changes; return changes;
} }
@@ -156,7 +156,7 @@ class AssetService {
if (a.isInDb) { if (a.isInDb) {
await _assetRepository.transaction(() => _assetRepository.update(a)); await _assetRepository.transaction(() => _assetRepository.update(a));
} else { } else {
debugPrint("[loadExif] parameter Asset is not from DB!"); dPrint(() => "[loadExif] parameter Asset is not from DB!");
} }
} }
} }

View File

@@ -7,7 +7,6 @@ import 'dart:ui' show DartPluginRegistrant, IsolateNameServer, PluginUtilities;
import 'package:cancellation_token_http/http.dart'; import 'package:cancellation_token_http/http.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
@@ -29,6 +28,7 @@ import 'package:immich_mobile/services/backup.service.dart';
import 'package:immich_mobile/services/localization.service.dart'; import 'package:immich_mobile/services/localization.service.dart';
import 'package:immich_mobile/utils/backup_progress.dart'; import 'package:immich_mobile/utils/backup_progress.dart';
import 'package:immich_mobile/utils/bootstrap.dart'; import 'package:immich_mobile/utils/bootstrap.dart';
import 'package:immich_mobile/utils/debug_print.dart';
import 'package:immich_mobile/utils/diff.dart'; import 'package:immich_mobile/utils/diff.dart';
import 'package:immich_mobile/utils/http_ssl_options.dart'; import 'package:immich_mobile/utils/http_ssl_options.dart';
import 'package:path_provider_foundation/path_provider_foundation.dart'; import 'package:path_provider_foundation/path_provider_foundation.dart';
@@ -165,7 +165,7 @@ class BackgroundService {
]); ]);
} }
} catch (error) { } catch (error) {
debugPrint("[_updateNotification] failed to communicate with plugin"); dPrint(() => "[_updateNotification] failed to communicate with plugin");
} }
return false; return false;
} }
@@ -177,7 +177,7 @@ class BackgroundService {
return await _backgroundChannel.invokeMethod('showError', [title, content, individualTag]); return await _backgroundChannel.invokeMethod('showError', [title, content, individualTag]);
} }
} catch (error) { } catch (error) {
debugPrint("[_showErrorNotification] failed to communicate with plugin"); dPrint(() => "[_showErrorNotification] failed to communicate with plugin");
} }
return false; return false;
} }
@@ -188,7 +188,7 @@ class BackgroundService {
return await _backgroundChannel.invokeMethod('clearErrorNotifications'); return await _backgroundChannel.invokeMethod('clearErrorNotifications');
} }
} catch (error) { } catch (error) {
debugPrint("[_clearErrorNotifications] failed to communicate with plugin"); dPrint(() => "[_clearErrorNotifications] failed to communicate with plugin");
} }
return false; return false;
} }
@@ -196,7 +196,7 @@ class BackgroundService {
/// await to ensure this thread (foreground or background) has exclusive access /// await to ensure this thread (foreground or background) has exclusive access
Future<bool> acquireLock() async { Future<bool> acquireLock() async {
if (_hasLock) { if (_hasLock) {
debugPrint("WARNING: [acquireLock] called more than once"); dPrint(() => "WARNING: [acquireLock] called more than once");
return true; return true;
} }
final int lockTime = Timeline.now; final int lockTime = Timeline.now;
@@ -302,19 +302,19 @@ class BackgroundService {
final bool hasAccess = await waitForLock; final bool hasAccess = await waitForLock;
if (!hasAccess) { if (!hasAccess) {
debugPrint("[_callHandler] could not acquire lock, exiting"); dPrint(() => "[_callHandler] could not acquire lock, exiting");
return false; return false;
} }
final translationsOk = await loadTranslations(); final translationsOk = await loadTranslations();
if (!translationsOk) { if (!translationsOk) {
debugPrint("[_callHandler] could not load translations"); dPrint(() => "[_callHandler] could not load translations");
} }
final bool ok = await _onAssetsChanged(); final bool ok = await _onAssetsChanged();
return ok; return ok;
} catch (error) { } catch (error) {
debugPrint(error.toString()); dPrint(() => error.toString());
return false; return false;
} finally { } finally {
releaseLock(); releaseLock();
@@ -324,14 +324,14 @@ class BackgroundService {
_cancellationToken?.cancel(); _cancellationToken?.cancel();
return true; return true;
default: default:
debugPrint("Unknown method ${call.method}"); dPrint(() => "Unknown method ${call.method}");
return false; return false;
} }
} }
Future<bool> _onAssetsChanged() async { Future<bool> _onAssetsChanged() async {
final (isar, drift, logDb) = await Bootstrap.initDB(); final (isar, drift, logDb) = await Bootstrap.initDB();
await Bootstrap.initDomain(isar, drift, logDb); await Bootstrap.initDomain(isar, drift, logDb, shouldBufferLogs: false, listenStoreUpdates: false);
final ref = ProviderContainer( final ref = ProviderContainer(
overrides: [ overrides: [
@@ -344,9 +344,7 @@ class BackgroundService {
HttpSSLOptions.apply(); HttpSSLOptions.apply();
ref.read(apiServiceProvider).setAccessToken(Store.get(StoreKey.accessToken)); ref.read(apiServiceProvider).setAccessToken(Store.get(StoreKey.accessToken));
await ref.read(authServiceProvider).setOpenApiServiceEndpoint(); await ref.read(authServiceProvider).setOpenApiServiceEndpoint();
if (kDebugMode) { dPrint(() => "[BG UPLOAD] Using endpoint: ${ref.read(apiServiceProvider).apiClient.basePath}");
debugPrint("[BG UPLOAD] Using endpoint: ${ref.read(apiServiceProvider).apiClient.basePath}");
}
final selectedAlbums = await ref.read(backupAlbumRepositoryProvider).getAllBySelection(BackupSelection.select); final selectedAlbums = await ref.read(backupAlbumRepositoryProvider).getAllBySelection(BackupSelection.select);
final excludedAlbums = await ref.read(backupAlbumRepositoryProvider).getAllBySelection(BackupSelection.exclude); final excludedAlbums = await ref.read(backupAlbumRepositoryProvider).getAllBySelection(BackupSelection.exclude);

View File

@@ -4,7 +4,6 @@ import 'dart:io';
import 'package:cancellation_token_http/http.dart' as http; import 'package:cancellation_token_http/http.dart' as http;
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/album.entity.dart'; import 'package:immich_mobile/entities/album.entity.dart';
@@ -29,6 +28,7 @@ import 'package:openapi/api.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import 'package:permission_handler/permission_handler.dart' as pm; import 'package:permission_handler/permission_handler.dart' as pm;
import 'package:photo_manager/photo_manager.dart' show PMProgressHandler; import 'package:photo_manager/photo_manager.dart' show PMProgressHandler;
import 'package:immich_mobile/utils/debug_print.dart';
final backupServiceProvider = Provider( final backupServiceProvider = Provider(
(ref) => BackupService( (ref) => BackupService(
@@ -69,7 +69,7 @@ class BackupService {
try { try {
return await _apiService.assetsApi.getAllUserAssetsByDeviceId(deviceId); return await _apiService.assetsApi.getAllUserAssetsByDeviceId(deviceId);
} catch (e) { } catch (e) {
debugPrint('Error [getDeviceBackupAsset] ${e.toString()}'); dPrint(() => 'Error [getDeviceBackupAsset] ${e.toString()}');
return null; return null;
} }
} }
@@ -356,8 +356,9 @@ class BackupService {
final error = responseBody; final error = responseBody;
final errorMessage = error['message'] ?? error['error']; final errorMessage = error['message'] ?? error['error'];
debugPrint( dPrint(
"Error(${error['statusCode']}) uploading ${asset.localId} | $originalFileName | Created on ${asset.fileCreatedAt} | ${error['error']}", () =>
"Error(${error['statusCode']}) uploading ${asset.localId} | $originalFileName | Created on ${asset.fileCreatedAt} | ${error['error']}",
); );
onError( onError(
@@ -398,11 +399,11 @@ class BackupService {
} }
} }
} on http.CancelledException { } on http.CancelledException {
debugPrint("Backup was cancelled by the user"); dPrint(() => "Backup was cancelled by the user");
anyErrors = true; anyErrors = true;
break; break;
} catch (error, stackTrace) { } catch (error, stackTrace) {
debugPrint("Error backup asset: ${error.toString()}: $stackTrace"); dPrint(() => "Error backup asset: ${error.toString()}: $stackTrace");
anyErrors = true; anyErrors = true;
continue; continue;
} finally { } finally {
@@ -411,7 +412,7 @@ class BackupService {
await file?.delete(); await file?.delete();
await livePhotoFile?.delete(); await livePhotoFile?.delete();
} catch (e) { } catch (e) {
debugPrint("ERROR deleting file: ${e.toString()}"); dPrint(() => "ERROR deleting file: ${e.toString()}");
} }
} }
} }
@@ -454,7 +455,9 @@ class BackupService {
if (![200, 201].contains(response.statusCode)) { if (![200, 201].contains(response.statusCode)) {
var error = responseBody; var error = responseBody;
debugPrint("Error(${error['statusCode']}) uploading livePhoto for assetId | $livePhotoTitle | ${error['error']}"); dPrint(
() => "Error(${error['statusCode']}) uploading livePhoto for assetId | $livePhotoTitle | ${error['error']}",
);
} }
return responseBody.containsKey('id') ? responseBody['id'] : null; return responseBody.containsKey('id') ? responseBody['id'] : null;

View File

@@ -1,9 +1,9 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/providers/backup/manual_upload.provider.dart'; import 'package:immich_mobile/providers/backup/manual_upload.provider.dart';
import 'package:immich_mobile/providers/notification_permission.provider.dart'; import 'package:immich_mobile/providers/notification_permission.provider.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final localNotificationService = Provider( final localNotificationService = Provider(
(ref) => LocalNotificationService(ref.watch(notificationPermissionProvider), ref), (ref) => LocalNotificationService(ref.watch(notificationPermissionProvider), ref),
@@ -110,7 +110,7 @@ class LocalNotificationService {
switch (notificationResponse.actionId) { switch (notificationResponse.actionId) {
case cancelUploadActionID: case cancelUploadActionID:
{ {
debugPrint("User cancelled manual upload operation"); dPrint(() => "User cancelled manual upload operation");
ref.read(manualUploadProvider.notifier).cancelBackup(); ref.read(manualUploadProvider.notifier).cancelBackup();
} }
} }

View File

@@ -2,9 +2,9 @@
import 'package:easy_localization/src/easy_localization_controller.dart'; import 'package:easy_localization/src/easy_localization_controller.dart';
import 'package:easy_localization/src/localization.dart'; import 'package:easy_localization/src/localization.dart';
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/constants/locales.dart'; import 'package:immich_mobile/constants/locales.dart';
import 'package:immich_mobile/generated/codegen_loader.g.dart'; import 'package:immich_mobile/generated/codegen_loader.g.dart';
import 'package:immich_mobile/utils/debug_print.dart';
/// Workaround to manually load translations in another Isolate /// Workaround to manually load translations in another Isolate
Future<bool> loadTranslations() async { Future<bool> loadTranslations() async {
@@ -17,7 +17,7 @@ Future<bool> loadTranslations() async {
assetLoader: const CodegenLoader(), assetLoader: const CodegenLoader(),
path: translationsPath, path: translationsPath,
useOnlyLangCode: false, useOnlyLangCode: false,
onLoadError: (e) => debugPrint(e.toString()), onLoadError: (e) => dPrint(() => e.toString()),
fallbackLocale: locales.values.first, fallbackLocale: locales.values.first,
); );

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