Compare commits

...

189 Commits

Author SHA1 Message Date
idubnori e5088440be Merge branch 'feature/bottom-buttons-order' into feature/show-activity-count 2025-12-18 01:51:18 +09:00
idubnori ebed026d5a Merge branch 'main' into feature/bottom-buttons-order 2025-12-18 01:38:03 +09:00
idubnori d63a1bcd07 feat(mobile): add the number of activities to the activity button label 2025-12-18 01:31:45 +09:00
idubnori 3e8635431e Merge remote-tracking branch 'origin/main' into feature/show-activity-count 2025-12-18 00:44:12 +09:00
Daniel Dietzler c15998e805 fix: asset update race condition (#24384)
* fix: asset update race condition

* fix: asset update race condition

* single statement

* update sql

* missed one

* fix `none` handling

* fix: tests

* chore: simplify update all assets

* fix: updating lockable properties

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-12-17 09:23:13 -06:00
idubnori e966ee5544 refactor: replace copyWith method with withButtonPosition for ActionButtonContext 2025-12-17 23:37:36 +09:00
idubnori de36f9a215 refactor: update bottom bar button type assertions for consistency and clarity 2025-12-17 21:52:28 +09:00
idubnori 8ceb68e240 test: verify kebab menu does not contain bottom bar buttons in action button types 2025-12-17 21:52:28 +09:00
idubnori 75734b45a0 fix: pass iconOnly and menuItem parameters to EditImageActionButton for enhanced customization 2025-12-17 21:52:28 +09:00
idubnori a9bee498c4 fix: add copyWith method to ActionButtonContext for improved context management 2025-12-17 21:52:28 +09:00
idubnori 6b4cc4e65e fix: adjust action button layout for better alignment 2025-12-17 21:52:28 +09:00
idubnori e49239e7e9 refactor: clean up 2025-12-17 21:52:28 +09:00
idubnori 939c222728 feat(mobile): add ButtonPosition enum and update action button context 2025-12-17 21:52:28 +09:00
idubnori c38ecab1a6 refactor: action button visibility logic and kebab menu handling 2025-12-17 21:52:28 +09:00
idubnori 76fd68957c feat(mobile): improve action button order 2025-12-17 21:52:28 +09:00
Alex f0b069adb9 fix: shared link expiration and small styling (#24566)
* fix: shared link expiration and small styling

* Use text color of enable/disable shared link properties
2025-12-16 16:41:12 +00:00
Hai Sullivan 276d02e12b fix(mobile): better UI for metadata panel (#24428)
* change drag bar and animation position

* ensure bottom bar is below the metadata panel - move the bottom bar from bottomNavigationBar into the Stack

* change some parameters

* add background color for night mode

* background color

* change default position

* minor changes

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-12-16 16:25:01 +00:00
Yaros ded9535434 fix(mobile): local delete missing from sheet on some routes (#24505)
* fix(mobile): local delete missing from album sheet

* chore: remove hasLocal
2025-12-16 09:54:53 -06:00
idubnori 997aec2441 feat: replace heart icons to thumbs-up across activity (#24590)
* feat: replace heart icons to thumbs-up across activity

* fix: update thumb_up icon color to use primaryColor in activity components

* chore: web colors

* chore: modify colors

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-12-16 15:27:09 +00:00
Ben cb2bd47816 fix(web): immich logo in shared links (#24618)
* fix(web): immich logo in shared links

* chore: apply changes for individual shared link as well

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-12-16 14:59:17 +00:00
renovate[bot] f1c8377ca0 chore(deps): update dependency @types/node to ^24.10.3 (#24605)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-16 12:23:52 +01:00
idubnori 7d4de5f2e2 feat(mobile): move activity button to action button menu 2025-12-16 16:58:06 +09:00
Alex 8416397589 chore: revert Svelte 5.43.3 (#24509) 2025-12-16 04:03:53 +00:00
Yaros dc29635b67 chore(mobile): changed default album sort to match with web (#24526)
chore(mobile): matched default album sort with web
2025-12-15 21:18:45 -06:00
Min Idzelis 00290e1e71 feat: make OCR store reentrant-safe (#24419) 2025-12-15 21:06:04 -06:00
Yaros 3ef4c4f315 feat(web): slideshow feature on shared albums (#24598) 2025-12-15 20:49:50 -06:00
idubnori b10a8baf53 feat(mobile): move buttons in the bottom sheet to the kebabu menu (#24175)
* refactor: remove bottom sheet buttons

* feat: add iconOnly and menuItem parameters to action buttons

* feat: enhance action button context and kebab menu integration

* feat: use ActionButtonContext

* fix: add missing options in some cases

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-12-15 16:44:27 -06:00
Mees Frensel 77926383db fix(server): only extract image's duration if format supports animation (#24587) 2025-12-15 12:36:46 -05:00
Yaros 35eda735c8 fix(web): recent search doesn't use search type (#24578)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-12-15 12:44:00 +01:00
Diogo Correia 8f7a71d1cf fix(web): download panel being hidden by admin sidebar (#24583) 2025-12-15 12:29:18 +01:00
Yaros 33cdea88aa fix(mobile): birthday off by one day on remote (#24527) 2025-12-11 21:23:11 -06:00
Alex 4b345e02ff fix: refresh appear in list after asset is added to a current or new album (#24523) 2025-12-11 11:06:53 -06:00
Yaros 8cf900bafa fix(mobile): local videos with '#' don't play on android (#24373)
* fix(mobile): videos with '#' don't play on android

* refactor: one line

Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>

* fix: depend on platform

---------

Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
2025-12-11 10:57:37 -06:00
Yaros 59a3f0f455 feat(mobile): create new album from add to modal (#24431)
* feat(mobile): create new album from add to modal

* refactor: use statefulwidget instead of hook

* chore: rename createalbumbutton
2025-12-11 09:47:31 -06:00
Sergey Katsubo c5d99711f7 fix(web): show inferred timezone in date editor (#24513)
fix(web): show inferred timezone of asset in date editor
2025-12-11 09:20:51 -06:00
Yaros 4c0a41723f feat(web): asset selection bar in tags view (#24522)
* feat(web): asset selection tab in tags view

* chore: remove unused imports
2025-12-11 15:20:29 +00:00
Bart van Velden f73511a754 fix(docs): typo in maintenance mode command (#24518) 2025-12-11 09:19:33 -06:00
hubert-taieb e637387082 fix(server): prevent metadata extraction failures on large video files (#24094)
* prevent  metadata extraction failures on large video files

Increases ExifTool timeout from 20s to 120s to prevent GPS metadata
extraction failures on large video files (>2GB, 10+ minutes).

Issue: Large videos timeout during metadata extraction, causing GPS
coordinates to be lost even though ExifTool can extract them given
enough time.

Testing: 2.6GB, 10:52min video that previously timed out now
successfully extracts GPS metadata.

* redundant comment

Increased task timeout for processing large videos.

* chore: lint

---------

Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-12-11 15:18:19 +00:00
renovate[bot] baad38f0e6 fix(deps): update typescript-projects (#24476)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-12-11 00:13:06 +00:00
Min Idzelis 161147af51 feat: timeline-manager improvement to use AssetResponseDto efficiently (#24421) 2025-12-11 01:07:31 +01:00
renovate[bot] cbdf5011f9 chore(deps): update docker.io/valkey/valkey:9 docker digest to fb8d272 (#24474)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-11 00:59:39 +01:00
renovate[bot] f0f1d279c4 chore(deps): update prom/prometheus docker digest to d936808 (#24475)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-11 00:59:20 +01:00
renovate[bot] 5821f2fe61 chore(deps): update github-actions (#24477)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-11 00:59:03 +01:00
Noel S 4cbce072be fix(docs): slow upload speed with example nginx reverse proxy config (#24490)
* increase buffer size

* increase further

* increase buffer further
2025-12-10 22:29:36 +00:00
idubnori 5e5bb7e87d fix(mobile): versionStatus.message text overflow (#24504) 2025-12-10 16:18:55 -06:00
shenlong b052893a1e feat(mobile): immich-ui icon button (#24502)
* feat(mobile): immich-ui icon button

* fix lint

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-12-10 16:18:01 -06:00
Kurt McKee 15e58595fd fix(mobile): iOS local permission dialog extra whitespace (#24491)
Fix a iOS rendering issue caused by extra whitespace
2025-12-10 16:17:08 -06:00
Alex 6d499c782a chore: update ui lib (#24483) 2025-12-09 17:27:01 -06:00
idubnori 7af99b8606 feat(mobile): move top bar buttons into kebabu menu in AssetViewer (#24461)
* chore(mobile):  i18n: "open_asset_info" in viewer kebab menu

* feat(mobile): move some top buttons into kebabu menu

* refactor(mobile): viewer kebab menu to use context-based button generation

* feat(mobile): refactor action button and kebab menu to use ConsumerWidget for improved state management

* feat(mobile): pass original theme to ViewerKebabMenu for consistent styling

* chore: styling

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-12-09 18:26:28 +00:00
Arnau Mora 01e39277e0 feat(mobile): Localized backup upload details page (#21136)
* Localized backup details page

# Conflicts:
#	i18n/en.json

* Format

* format fix

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-12-09 11:23:01 -06:00
Yaros 06e79703da fix(mobile): timeline bottom padding on selection (#24480) 2025-12-09 09:19:41 -06:00
Yaros c360781565 fix(mobile): fix overflow text in backup card (#24448)
* fix(mobile): fix overflow text in backup card

* refactor: use intrinsicheight

* chore: fix spelling of entitycounttile
2025-12-09 09:03:29 -06:00
idubnori 287f6d5c94 fix(mobile): buttons inside AddActionButton color is the same as background color (#24460)
* fix: icon & text color in AddActionButton

* fix: use Divider
2025-12-08 14:29:31 -06:00
Simon Kubiak fe9125a3d1 fix(web): [album table view] long album title overflows table row (#24450)
fix(web): long album title overflows vertically on album page in table view
2025-12-08 15:35:58 +00:00
Yaros 8b31936bb6 fix(mobile): cannot create album while name field is focused (#24449)
fix(mobile): create album disabled when focused
2025-12-08 09:33:01 -06:00
Sergey Katsubo 19958dfd83 fix(server): building docker image for different platforms on the same host (#24459)
Fix building docker image for different platforms on the same host

Use per-platform mise cache to avoid 'sh: 1: extism-js: not found'
This happens due to re-using cached installed binary for another platform
2025-12-08 09:15:43 -06:00
Alex 1e1cf0d1fe fix: build iOS fastlane installation (#24408) 2025-12-06 14:55:53 -06:00
Min Idzelis 879e0ea131 fix: thumbnail doesnt send mouseLeave events properly (#24423) 2025-12-06 21:52:06 +01:00
Sergey Katsubo 42136f9091 fix(server): update exiftool-vendored to v34 for more robust metadata extraction (#24424) 2025-12-06 14:45:59 -06:00
Harrison 1109c32891 fix(docs): websockets in nginx example (#24411)
Co-authored-by: Harrison <frith.harry@gmail.com>
2025-12-06 16:28:12 +00:00
idubnori 3c80049192 chore(mobile): add kebabu menu in asset viewer (#24387)
* feat(mobile): implement viewer kebab menu with about option

* feat: revert exisitng buttons, adjust label name

* unify MenuAnchor usage

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-12-05 19:51:59 +00:00
Hai Sullivan 8f1669efbe chore(mobile): smoother UI experience for iOS devices (#24397)
allows the tab pages to use the standard Material page transition during push/pop navigation
2025-12-05 11:02:04 -06:00
Robert Schäfer 146bf65d02 refactor(dev): remove ulimits for rootless docker (#24393)
Description
-----------

When I follow the [developer setup](https://docs.immich.app/developer/setup) I run into a permission error using rootless docker. A while ago I asked on Discord in [#contributing](https://discord.com/channels/979116623879368755/1071165397228855327/1442974448776122592) about these ulimits.

I suggest to remove the `ulimits` altogether. It seems that @ItalyPaleAle has left the setting just hoping that it could help somebody in the future. See the [PR description](https://github.com/immich-app/immich/pull/4556).

How Has This Been Tested?
-------------------------

Using rootless docker:

```
$ docker context ls
NAME         DESCRIPTION                               DOCKER ENDPOINT                     ERROR
default                                                unix:///var/run/docker.sock
rootless *                                             unix:///run/user/1000/docker.sock
```

Running `make` will fail because of permission errors:
```
$  docker compose -f ./docker/docker-compose.dev.yml up --remove-orphans
...
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error setting rlimits for ready process: error setting rlimit type 7: operation not permitted
```

On my machine I have the following hard limit for "Maximum number of open file descriptors":
```
$ ulimit -nH
524288
```

I can confirm that the permission error is caused by the security restrictions of the operating system mentioned above:

Changing `docker/docker-compose.dev.yml` like ..

```
    ulimits:
      nofile:
        soft: 524289
        hard: 524289
```

.. will lead to a permission error whereas this ..

```
    ulimits:
      nofile:
        soft: 524288
        hard: 524288
```

.. starts fine.

Apparently the defaults for these limits are coming from [systemd](https://github.com/systemd/systemd/blob/26b2085d54ebbfca8637362eafcb4a8e3faf832f/man/systemd.exec.xml#L1122) which is used on nearly every linux distribution. So my assumption is that almost any linux user who uses rootless docker will run into a permission error when starting the development setup.

Checklist:
----------

- [x] I have performed a self-review of my own code
- [x] I have made corresponding changes to the documentation if applicable
- [x] I have no unrelated changes in the PR.
- [ ] I have confirmed that any new dependencies are strictly necessary.
- [ ] I have written tests for new code (if applicable)
- [ ] I have followed naming conventions/patterns in the surrounding code
- [ ] All code in `src/services/` uses repositories implementations for database calls, filesystem operations, etc.
- [ ] All code in `src/repositories/` is pretty basic/simple and does not have any immich specific logic (that belongs in `src/services/`)
2025-12-05 09:26:20 -05:00
Daniel Dietzler 75a7c9c06c feat: sql tools array as default value (#24389) 2025-12-04 12:54:20 -05:00
Daniel Dietzler ae8f5a6673 fix: prettier (#24386) 2025-12-04 16:10:42 +00:00
Jason Rasmussen 31f2c7b505 feat: header context menu (#24374) 2025-12-04 11:09:38 -05:00
Yaros ba6687dde9 feat(web): search type selection dropdown (#24091)
* feat(web): search type selection dropdown

* chore: implement suggestions

* lint

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-12-04 04:10:12 +00:00
shenlong bbba1bfe8c fix: use adjustment time in iOS for hash reset (#24047)
* use adjustment time in iOS for hash reset

* migration

* fix equals check

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-12-03 21:15:58 -06:00
Robert Schäfer 4be9a5ebf8 fix(docs): obsolete docs about rootless docker (#24376)
Description
-----------

The documentation lies about comments in `docker/docker-compose.dev.yml`.

Reason: in 689c6aa276 these docs were added
but the comments in this file are removed in
b9e2590752 and the docs weren't updated.

How Has This Been Tested?
-------------------------
```
$ git log -S rootless

commit b9e2590752
Author: Jason Rasmussen <jason@rasm.me>
Date:   Tue Sep 16 12:48:44 2025 -0400

    chore: simplify (#22082)

commit 689c6aa276
Author: Rudolf Horváth <R-Rudolf@users.noreply.github.com>
Date:   Thu Nov 21 13:25:45 2024 +0100

    docs: add developer notes about rootless docker setup (#13250)
```

Checklist:
----------

- [x] I have performed a self-review of my own code
- [x] I have made corresponding changes to the documentation if applicable
- [x] I have no unrelated changes in the PR.
- [ ] I have confirmed that any new dependencies are strictly necessary.
- [ ] I have written tests for new code (if applicable)
- [ ] I have followed naming conventions/patterns in the surrounding code
- [ ] All code in `src/services/` uses repositories implementations for database calls, filesystem operations, etc.
- [ ] All code in `src/repositories/` is pretty basic/simple and does not have any immich specific logic (that belongs in `src/services/`)
2025-12-03 18:34:08 -06:00
Omar I d41921247b fix(web): Add minimum content size to logo for consistent visual on small screens (#24372) 2025-12-03 21:35:48 +00:00
Nicholas 853a024f0f fix: prevent OOM on nginx reverse proxy servers (#24351)
Prevent OOM on reverse proxy servers

Added configuration to disable buffering for uploads.
2025-12-03 14:30:28 -06:00
Alex 4fe494776e fix: local full sync on Android on resume (#24348) 2025-12-03 20:22:07 +00:00
Justin Forseth 76b4adf276 fix: Adjust the zoom level (#24353)
Adjust the zoom level
2025-12-03 14:19:57 -06:00
Alex 75dde0d076 fix: exposure info and better readability (#24344)
fix: exposure info and better readabilit
2025-12-03 20:19:45 +00:00
Mert cffb68d1c4 fix(server): do not delete offline assets (#24355)
* do not delete isOffline assets

* update sql

* add medium test

* add normal delete test

* formatting
2025-12-03 14:19:26 -06:00
Jason Rasmussen 45f68f73a9 feat: queue detail page (#24352) 2025-12-03 13:39:32 -05:00
renovate[bot] 4f93eda8d8 fix(deps): update typescript-projects (#24329)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-12-02 23:28:12 +01:00
Alex f5df5fa98d chore: change workflow column name (#24349)
chore-change-workflow-column-name
2025-12-02 14:40:17 -06:00
renovate[bot] f07d1441ea chore(deps): update github-actions (#24331)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-02 20:13:02 +01:00
Jonathan Jogenfors 1bcf28c062 chore(server): sidecars in asset_files (#21199)
* fix: sidecar check job

* feat: move sidecars to asset_files

* feat: combine with handleSidecarCheck

* fix(server): improved method signatures for stack and sidecar copying

* fix(server): improved method signatures for stack and sidecar copying

* chore: clean up

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-12-02 13:31:43 -05:00
Jonathan Jogenfors 62628dfcfa fix(web): folder view sort oder (#24337)
fix: folder view sort oder
2025-12-02 11:48:12 -06:00
Hai Sullivan b11aecd184 fix(mobile): use correct timezone displayed in the info sheet (#24310)
* fixed the timezone issue in the Immich mobile app's metadata sheet to match the web app's behavior

* format dart

* now uses the shared applyTimezoneOffset() utility function from mobile/lib/utils/timezone.dart

* add tests

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-12-02 16:37:19 +00:00
Jason Rasmussen 116012f6f8 feat: less asset-metadata validation (#24342) 2025-12-02 10:56:31 -05:00
renovate[bot] 7594136050 chore(deps): update dependency express to v5.2.0 [security] (#24323)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-02 09:27:12 -05:00
renovate[bot] bb341cc774 chore(deps): update docker.io/valkey/valkey docker tag to v9 (#24336)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-02 09:26:39 -05:00
Dionysius af1d4afb95 fix(docs): server and machine-learning use IMMICH_HOST and IMMICH_PORT (#24335) 2025-12-02 09:25:39 -05:00
renovate[bot] 75b1ef2c57 chore(deps): update machine-learning (#24334)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-02 01:01:17 -05:00
renovate[bot] 1e37f7c8c8 chore(deps): update dependency nodemailer to v7.0.11 [security] (#24330)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-01 23:16:59 -05:00
Yaros a32f450059 feat(mobile): persist album sorting & layout in settings (#22133)
* fix(mobile): persist album sorting in settings

* fix(mobile): persist album layout

* fix: fixed store model id

* fix: corrupted AppSettingsEnum

* chore: refactor to remove RemoteAlbumSortMode

* refactor: use t instead of tr
2025-12-01 20:51:35 -06:00
carbonemys b452ab463b fix(web): open onboarding documentation link in new tab (#24289)
* fix(web): open onboarding documentation link in new tab

* Update web/src/lib/components/onboarding-page/onboarding-storage-template.svelte

---------

Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
2025-12-01 20:49:31 -06:00
Sergey Katsubo 79bed80226 feat(server): log all thumbnail generation attempts at verbose level (#24324)
Log thumbnail generation at verbose level
2025-12-01 20:26:13 -06:00
Mert 6249996cdb fix(ml): do not upscale preview (#24322)
do not upscale
2025-12-01 20:26:01 -06:00
Jonathan Jogenfors a3f281caa3 docs(faq): add more info on archiving (#24326)
docs: add more info on archive to faq
2025-12-01 20:25:31 -06:00
Mert 7c19b0591f fix(server): cjk migration (#24320)
* join string

* use pagination instead
2025-12-01 15:41:19 -06:00
Mert 95c29a8aea fix(server): use bigrams for cjk (#24285)
* use bigrams for cjk

* update sql

* linting

* actually migrate ocr

* fix backwards test

* use array

* tweaks
2025-12-01 17:24:37 +00:00
idubnori d8ca210641 chore(web): minor UX improvements of "view asset owners" feature (#24319)
* feat: toggle in options modal

* feat(i18n): add labels to display who uploaded each asset and show asset owners

* feat: migrate asset owner settings to TimelineManager and update AlbumOptionsModal

* Revert "feat(i18n): add labels to display who uploaded each asset and show asset owners"

This reverts commit cf8f4eb135.

* fix: simplify AlbumOptionsModal invocation and update aria-label for asset owners

* feat(i18n): add label for viewing asset owners in the interface

* feat: add tests for showAssetOwners functionality in TimelineManager

* chore: move asset owner visibility toggle to kebabu menu
2025-12-01 10:25:12 -06:00
Min Idzelis ab35afd3b1 refactor(web): reimplement operation-support as part of timeline-manager (#24056)
* refactor(web): reimplement operation-support as part of timeline-manager

Improve clarity of methods. 
Add inline method documentation.  
Make return type of AssetOperation optional.

* Review comments - self document code. remove optional return from callback
2025-12-01 09:04:39 -06:00
idubnori 65e4fdf98d refactor(web): i18n-ize "view asset owners" (#24317) 2025-12-01 15:01:57 +00:00
Matthew Momjian fa43fae2a5 fix(mobile): docs link (#24277)
update docs link
2025-11-30 13:01:33 -06:00
Alex 46afd6a101 fix: only generate memory based on users assets (#24151) 2025-11-30 13:01:12 -06:00
Hai Sullivan 46e1967760 chore: optimisation of several UI components of the mobile app (#24098)
* fix(mobile): normalize scrolling behavior in networking settings

Remove ClampingScrollPhysics from networking settings page to match
the scrolling behavior of other settings pages. This restores the
standard iOS bounce/elastic scrolling effect.

* fix(mobile): use consistent native transitions for Library pages

Change Trash, Shared Links, and Folders routes from CustomRoute to AutoRoute to enable native iOS transitions with swipe-back gesture support.

* fix(mobile): remove SafeArea wrapper and ClampingScrollPhysics from Settings

Remove SafeArea wrapper (Scaffold handles safe areas automatically) and ClampingScrollPhysics to enable native iOS bounce scrolling.

* fix(mobile): remove bottom white space in Sync Status page

Replace Padding wrapper with ListView padding to match other Settings pages and eliminate bottom white space.

* chore: fix Dart formatting

Run dart format to fix formatting issues in settings.page.dart and sync_status_and_actions.dart

* Format Dart files

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: kao-byte <benjaminliu@MacBook-Air.local>
2025-11-30 13:01:01 -06:00
Chris Peckover 922282b2b4 feat(web): Shared album owner labels (#21171)
* - pass available album users along to the thumbnail through the asset-date-group
- show a small user-avatar in bottom right of thumbnail

* - change owner to their name in white text instead of the avatar

* cleanup

* - cleanup albumUsers creation
- use font-light for the user's name

* fix lint

* format

* - add toggle to show/hide asset owner names

* update new Timeline with albumUsers

* add @idubnori suggestion for the name font

* Don't show 'view owners' button if the album doesn't have editors

* add missing import

* format

* fix(web): #21171 (#24298)

fix: Bind timelineManager to Timeline component

---------

Co-authored-by: idubnori <i.dub.nori@gmail.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-11-30 18:56:03 +00:00
Alex e3ab16a5bd chore: refactor mobile events (#24263)
chore: refactor mobile evets
2025-11-30 12:43:33 -06:00
Niklas von Moers 08f320c801 fix(web): use full tag path when creating nested subtags (#24249) 2025-11-29 12:09:32 +00:00
Mees Frensel e36261b552 fix(web): integrate zoom toggle button into panorama photo viewer (#24189) 2025-11-28 18:50:16 +01:00
Daniel Dietzler c0a3b58bba fix: rare cases of assets not loading in when scrolling backwards (#24245) 2025-11-28 10:18:49 -06:00
Yaros f12f609038 fix(mobile): enable backup text overflows (#24227) 2025-11-28 10:18:44 -06:00
renovate[bot] 1f6eb662e5 chore(deps): update dependency opentofu to v1.10.7 (#23964)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-28 14:41:23 +00:00
renovate[bot] 0c1fe35f2f chore(deps): update dependency terragrunt to v0.93.10 (#24149)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-28 15:17:25 +01:00
Robert Schäfer e98a33cf9d fix(docs): build cli for e2e tests (#24184) 2025-11-28 15:11:17 +01:00
Dionysius d38305360c docs: DB_STORAGE_TYPE is only used by the database container (#24215)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-11-28 12:43:48 +00:00
Tijs 3e3ca4c104 feat(server): exclude syncthing folders from external libraries (#24240)
* Add SyncThing folders to External library exclusion

SyncThing is a popular library for syncing files (like pictures) between systems. It can really mess up your library if an external library, which is also used by SyncThing, is added and these folders are not excluded.

* Plural

* fix formatting

---------

Co-authored-by: Jonathan Jogenfors <jonathan@jogenfors.se>
2025-11-28 11:40:33 +00:00
Jacob Bundgaard 81edf0749f fix: label 'for' attributes in user-api-key-grid (#24232) 2025-11-27 23:28:38 +00:00
renovate[bot] 01f83ae964 fix(deps): update dependency exiftool-vendored to v33 (#24172)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-11-27 21:45:35 +00:00
renovate[bot] 5eec0dc981 chore(deps): update github-actions (#24038)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-27 21:41:41 +00:00
renovate[bot] ca4fd07656 chore(deps): update dependency eslint-plugin-unicorn to v62 (#24167)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-11-27 21:31:16 +00:00
renovate[bot] 7ce43b3824 chore(deps): update dependency node-gyp to v12 (#24168)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-27 16:13:57 +01:00
Daniel Dietzler ce00119926 chore: update sharp to 0.34.5 (#24170) 2025-11-27 15:13:16 +00:00
Daniel Dietzler fffee80e2f feat: command palette (#23693) 2025-11-26 22:18:50 +01:00
Jason Rasmussen 64cd4e96e3 fix: theme switcher (#24209) 2025-11-26 21:17:26 +00:00
renovate[bot] 955a3bfaa6 chore(deps): update base-image to v202511261514 (major) (#24165)
chore(deps): update base-image to v202511261514

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-26 15:10:48 -05:00
renovate[bot] e699d8f170 chore(deps): update machine-learning (#23352) 2025-11-26 19:09:39 +00:00
Jason Rasmussen 13104d49cd feat(web): shared link card tweaks (#24192) 2025-11-25 19:35:21 -06:00
Jason Rasmussen 2d5ec528d5 fix(web): user admin pages (#24185)
fix: user admin pages
2025-11-25 16:35:37 -05:00
Min Idzelis 5226898184 fix: update timeline-manager after archive actions (#24010)
* fix: update timeline-manager after archive actions

* Add locators to thumb icons
2025-11-25 15:06:29 -05:00
Luka Prebil Grintal dd4169876c fix(ml): Upgrade ONNX Runtime to v1.22.1 to fix ROCm build failures (#24045)
* fix: update ONNX runtime version to 1.21.0 to fix the failing checksum of 1.20.1

* update patch

* update to 1.22.1

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-11-25 13:27:21 -05:00
renovate[bot] 8321c275b8 chore(deps): update dependency body-parser to v2.2.1 [security] (#24179)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-25 18:29:13 +01:00
renovate[bot] 3d6c26350a fix(deps): update typescript-projects (#24163)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-11-25 17:26:36 +00:00
Jason Rasmussen db15e5e423 fix: duration extraction (#24178) 2025-11-25 10:26:25 -05:00
renovate[bot] 35d18da14a chore(deps): update node to v24 (major) (#24169)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-25 15:40:48 +01:00
renovate[bot] cb56a11f0b chore(deps): update dependency @types/archiver to v7 (#24166)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-25 15:40:12 +01:00
Jason Rasmussen 104fa09f69 feat: queues (#24142) 2025-11-25 08:19:40 -05:00
Alex 66ae07ee39 fix: don't get OCR data in shared link (#24152) 2025-11-25 07:58:27 -05:00
Daniel Dietzler 939d2c8b27 chore: minor admin pages refactorings (#24160) 2025-11-25 07:57:30 -05:00
renovate[bot] 2801a6e672 chore(deps): update actions/download-artifact action to v6 (#24164)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-25 13:46:34 +01:00
renovate[bot] 4742360469 chore(deps): update grafana/grafana docker tag to v12.3.0 (#24162)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-25 13:45:50 +01:00
Daniel Dietzler b56fa62b32 fix: revert "chore(deps): update dependency sharp to v0.34.5" (#24173) 2025-11-25 12:37:08 +00:00
renovate[bot] ddbe485074 chore(deps): update dependency sharp to v0.34.5 (#24146)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-25 11:56:11 +01:00
renovate[bot] 01310c6d86 chore(deps): update node.js to v24.11.1 (#24147)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-25 11:55:36 +01:00
Brandon Wees 512327ef69 feat: java in mise (#24154) 2025-11-24 23:18:44 -06:00
Daniel Dietzler 8755cd59fd chore: refactor svelte reactivity (#24072) 2025-11-24 18:57:46 -05:00
Min Idzelis 7694b342ed refactor(web): Extract asset grid layout component from TimelineDateGroup and split into AssetLayout and Month components (#23338)
* refactor(web): Extract asset grid layout component from TimelineDateGroup and split into AssetLayout and Month components

* chore: cleanup

---------

Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
2025-11-24 23:09:46 +00:00
fabianbees 78553a0258 feat: separate camera and lens info in detail panel (#23670)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-11-24 16:30:15 +00:00
renovate[bot] c1198b99b7 chore(deps): update dependency js-yaml to v4.1.1 [security] (#23901)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-24 17:28:18 +01:00
renovate[bot] 8b7b9ee394 chore(deps): update dependency esbuild to ^0.25.0 [security] (#23903)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-24 17:27:46 +01:00
Min Idzelis d6b39a464d feat: improve performance: don't sort timeline buckets from server (#24032) 2025-11-24 17:26:52 +01:00
Snowknight26 75d23fe135 fix(web): fix support & feedback modal wrapping (#24018)
* fix(web): fix support & feedback modal wrapping

* Fix reference
2025-11-24 10:24:02 -06:00
shenlong c860809aa1 fix: getAspectRatio fallback to db width and height (#24131)
fix: getExif fallback to db width and height

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-11-24 10:23:17 -06:00
Daniel Dietzler 0498f6cb9d fix: albums page reactivity loops (#24046) 2025-11-24 17:14:24 +01:00
shenlong 24e5dabb51 fix: use proper updatedAt value in local assets (#24137)
* fix: incorrect updatedAt value in local assets

* add test

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-11-24 09:49:27 -06:00
Greg Lutostanski aecf064ec9 fix(server): sanitize DB_URL for pg_dumpall to remove unknown query params (#23333)
Co-authored-by: Greg Lutostanski <greg.lutostanski@mobilityhouse.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-11-24 16:34:21 +01:00
Daniel Dietzler 57be3ff8c7 fix: add users to album (#24133) 2025-11-24 07:52:36 -05:00
Ujjwal Goel 99505f987e fix: use npm instead of pnpm and fix check:all (#24101)
* fix: use npm instead of pnpm and fix `check:all`

* fix: remove `--` from pnpm commands

* Remove `check:all` from the documentation section
2025-11-23 21:04:43 -06:00
Lukas 1e1c4ac9d2 feat(web): allow navigating the map with arrow keys (#24080) 2025-11-21 23:46:30 +01:00
Mees Frensel d952b62053 feat(web): show detected faces in spherical photos (#23974) 2025-11-21 09:11:47 -06:00
Yaros 9f3eeed091 fix(mobile): first video memory on page doesn't play (#23906)
* fix(mobile): first video memory doesn't play

* refactor: moved logic to static method

* refactor: fix haptic feedback & empty check

* refactor: use DriftMemory on setMemory

* refactor: move video reset into if block
2025-11-21 09:11:30 -06:00
Brandon Wees 1dbc20fd77 fix: show archived assets in favorite page (#24052) 2025-11-21 09:09:16 -06:00
Joren Guillaume ba8df712c4 fix: Use correct app store link (#24062) 2025-11-21 13:54:09 +01:00
renovate[bot] 741d838f56 chore(deps): update base-image to v202511181104 (major) (#24050)
chore(deps): update base-image to v202511181104

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-20 15:40:40 -06:00
Brandon Wees ec2fa6e308 fix: disable animation "add to" action menu (#24040) 2025-11-20 11:54:15 -06:00
shenlong b974ed5735 fix: do not clear hash on updated_at change (#24039)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-11-20 11:31:17 -06:00
Daniel Dietzler 78457d9b89 chore: add new language requests (#23991) 2025-11-20 08:58:18 -05:00
bo0tzz 5d043b435e fix: hardcoded build-cache pull for e2e tests (#24002) 2025-11-20 14:22:45 +01:00
Jason Rasmussen 9a403d5886 refactor(web): user delete websocket event (#24015) 2025-11-20 07:54:29 -05:00
Jason Rasmussen 1a31faf1a2 fix: effect loop (#24014) 2025-11-20 07:52:37 -05:00
github-actions edbdc14178 chore: version v2.3.1 2025-11-20 02:20:16 +00:00
Alex e7261a04e1 fix: new update notification cause rendering loop (#24013) 2025-11-19 20:14:30 -06:00
Jason Rasmussen acded69adf fix: supporter badge (#24012) 2025-11-19 20:14:15 -06:00
github-actions 45a0315606 chore: version v2.3.0 2025-11-19 17:46:53 +00:00
Weblate (bot) 3856d4053c chore(web): update translations (#23449)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/be/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/bg/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/bi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/da/
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/et/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fa/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fi/
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/hi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/id/
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/ko/
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/ro/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ta/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/te/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/th/
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/vi/
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: 100daysummer <bobbydochev@gmail.com>
Co-authored-by: Abhijeet Bonde <abhijeetbonde19@gmail.com>
Co-authored-by: AbuKareem Tuffaha <abukareem.tuffaha@gmail.com>
Co-authored-by: Adam Uchmanowicz <auchmanowicz@gmail.com>
Co-authored-by: Adrian Jost <github@adrianjost.dev>
Co-authored-by: Aitor-RM <Aitor.Rufian@alu.uclm.es>
Co-authored-by: Alexander Lohnes <alex.lohnes@googlemail.com>
Co-authored-by: Alexis-Loskoutoff <alexis@pctraining.fr>
Co-authored-by: Alma Hassan <almahassan9988@gmail.com>
Co-authored-by: AndreiP28 <andreiprica28@gmail.com>
Co-authored-by: Artur Koziara <arturkoziara@gmail.com>
Co-authored-by: Bryan Saputra <bryananta@icloud.com>
Co-authored-by: Carlo_Mava <carlomavaracchio@gmail.com>
Co-authored-by: Cristian Florin Tănase <crissssty@gmail.com>
Co-authored-by: Cristiano Fagundes <fagundescristianof@gmail.com>
Co-authored-by: Daniel Rieiro <daniel@danielrieiro.com>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fred <freddyfunk@users.noreply.hosted.weblate.org>
Co-authored-by: Hossein Fani <linr@users.noreply.hosted.weblate.org>
Co-authored-by: Hurricane-32 <rodrigorimo@hotmail.com>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Ivan Dimitrov <idimitrov08@gmail.com>
Co-authored-by: Jeppe Nellemann <jepnel@proton.me>
Co-authored-by: Jesús Jiménez <jesjimenez@gmail.com>
Co-authored-by: Johannes Dorn <johannes@dorn.email>
Co-authored-by: Jordy H <jordy@hoebergen.net>
Co-authored-by: Jorge Tristan <trisjor1998@gmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Juanma Sanchez <juxmix@gmail.com>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: Kai Heine <kai-heine@users.noreply.hosted.weblate.org>
Co-authored-by: Knight Hat <knightchanelgaming@gmail.com>
Co-authored-by: Krissada Singhakachain <46844213+OmsinKrissada@users.noreply.github.com>
Co-authored-by: Leigh van der merwe <palitu822@gmail.com>
Co-authored-by: Leo Bottaro <github@leobottaro.com>
Co-authored-by: Luca Segato <luspy89@hotmail.it>
Co-authored-by: Lucas Jaksys <lucas3033@gmail.com>
Co-authored-by: Luís Nunes <lmcnunes@gmail.com>
Co-authored-by: Macgyver <macgyver@users.noreply.hosted.weblate.org>
Co-authored-by: Marc Casillas <mcasillassu@gmail.com>
Co-authored-by: Marco Perrotta <leondaval18@gmail.com>
Co-authored-by: MatijaThe245th <matija245matakovic@gmail.com>
Co-authored-by: Matjaž T. <matjaz@moj-svet.si>
Co-authored-by: Matteo D. <alex3025game@gmail.com>
Co-authored-by: Matteo De Carli <matteo.de.carli01@gmail.com>
Co-authored-by: Mees Frensel <meesfrensel@gmail.com>
Co-authored-by: Melvin Snijders <mail@melvinsnijders.nl>
Co-authored-by: Mārtiņš Bruņenieks <martinsb@gmail.com>
Co-authored-by: Parms <shoppingpar+weblate@simplelogin.com>
Co-authored-by: Paul <paul.kunad@kabelmail.de>
Co-authored-by: Petri Hämäläinen <petri.hamalainen@mailbox.org>
Co-authored-by: Philip Goto <philip.goto@gmail.com>
Co-authored-by: Pitoune <p.dhebrail@proton.me>
Co-authored-by: Ponas <le.slab124@aleeas.com>
Co-authored-by: PontusÖsterlindh <pontus@osterlindh.com>
Co-authored-by: Rasmus Sehlin <rasmus@sehl.in>
Co-authored-by: Richard Gráčik <r.gracik@gmail.com>
Co-authored-by: Roi Gabay <roigby@gmail.com>
Co-authored-by: Runskrift <anders@rimfrost.nu>
Co-authored-by: Ryan Gleeson <gleeson.ryanj@gmail.com>
Co-authored-by: S M, Aravinth (A.) <asm1@ford.com>
Co-authored-by: Sai Athulith Neela <saiathulithn@gmail.com>
Co-authored-by: Sebastiano <sebastiano.romi@gmail.com>
Co-authored-by: Sergey Katsubo <skatsubo@gmail.com>
Co-authored-by: Shawn <xiaxinx@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: TV Box <realceday.tvbox@gmail.com>
Co-authored-by: Tanishq <weblate.impure434@passinbox.com>
Co-authored-by: Tatsuhiko Kono <kono@takenoko.io>
Co-authored-by: Tedy25879 <tedy25879@gmail.com>
Co-authored-by: Thanh Tùng Nguyễn <tung.nguyent03@gmail.com>
Co-authored-by: Toine Rademacher <hi@toine.zip>
Co-authored-by: Tomi Pöyskö <tomi.poysko@gmail.com>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: anton garcias <isaga.percompartir@gmail.com>
Co-authored-by: eav5jhl0 <eav5jhl0@users.noreply.hosted.weblate.org>
Co-authored-by: gablilli <gabriele.lilli0511@gmail.com>
Co-authored-by: kiwinho <kiwicaja@gmail.com>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: r64 <me@ruka64.dev>
Co-authored-by: ruka-64 <202770393+ruka-64@users.noreply.github.com>
Co-authored-by: sam ng <andy.sam@gmail.com>
Co-authored-by: sh4tteredd <llor22658@gmail.com>
Co-authored-by: shiuh67 <shiuh.cheng@gmail.com>
Co-authored-by: swever <swever@users.noreply.hosted.weblate.org>
Co-authored-by: thehijacker <thehijacker@gmail.com>
Co-authored-by: ti-guru <anders.egeland@outlook.com>
Co-authored-by: ume <bungoume@gmail.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
2025-11-19 17:44:39 +00:00
bo0tzz 8175b3b75b fix: allow adding new translations files (#23998) 2025-11-19 16:00:01 +00:00
Alex 56e431226f feat: show OCR bounding box (#23717)
* feat: ocr bounding box

* bounding boxes

* pr feedback

* pr feedback

* allow copy across text boxes

* pr feedback
2025-11-19 15:52:40 +00:00
Daniel Dietzler f59417cc77 chore(web): refactor replace asset (#23972) 2025-11-19 08:49:15 -06:00
Min Idzelis 11cec56e80 refactor(web): consolidate timeline API - merge addAssets/updateAssets into upsertAssets (#23985) 2025-11-19 08:48:16 -06:00
bo0tzz 810f22057c fix: create release as draft (#23996) 2025-11-19 14:46:14 +00:00
Min Idzelis 2152f20b6c fix: unarchive action doesn't update archive page (#23987) 2025-11-19 12:29:02 +01:00
Matthew Momjian a6c76e78d6 fix(docs): update Readme links (#23959)
* fix(docs): Update star history links and image sources

* Update star history link in README.md
2025-11-18 21:32:11 -06:00
renovate[bot] 644a3bf090 chore(deps): update github-actions (#23962)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-18 21:32:00 -06:00
Min Idzelis 42dd3315f8 refactor(web): fix TimelineManager import - use value import instead of type-only (#23983) 2025-11-18 21:26:15 -06:00
Kevin Puertas 3a694219bf feat: add originalPath for external library assets in dedupe (#23710)
* Add original path info row to duplicate asset component

View path of images, useful when using external Library

* Make if for not show path in internal images

* Update web/src/lib/components/utilities-page/duplicates/duplicate-asset.svelte

Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>

* Refactor original path display logic in duplicate-asset

* Update duplicate-asset.svelte

* Add full path localization string

* Change translated data

* format: fix

---------

Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-11-19 03:24:17 +00:00
Min Idzelis d9fd52ea18 feat: timeline e2e tests (#23895)
* feat: timeline e2e tests

* Fix flakiness, mock all apis, allow parallel tests

* Upload playwright reports

* wrong report path

* Add CI=true, disable flaky/failing tests

* Re-enable tests, fix worker thread config

* fix maintance e2e test

* increase retries
2025-11-18 21:08:55 -06:00
Brandon Wees 2a281e7906 feat(mobile): location edit from asset viewer (#23925)
* chore: break sheet tile into own file

* feat: set location from bottom sheet

* refactor: location picker

There was a lot of confusing controls here, simplified to 1 mode

* fix: local asset check

* chore: refactoring of location details widget

* fix: update currentAssetExifProvider when changing location

* chore: use SheetTile for location header

* chore: remove coordinate change check

* chore: remove comment
2025-11-18 21:06:51 -06:00
Daniel Dietzler 5f987a95f5 fix: feature flags manager race condition (#23973)
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-11-19 03:05:53 +00:00
bo0tzz edf577d7f7 feat: publish on release pr merge (#23867) 2025-11-18 21:03:49 -06:00
Sergey Katsubo 5e482dabc6 feat(server): support running medium tests in devcontainer (#23882)
* Support running medium tests in devcontainer

* Add "pnpm run test:medium" to the devcontainer doc

* Fix indentation for inline comments in the doc

* Fix a couple of words in the doc
2025-11-18 21:03:21 -06:00
Mees Frensel 76c73549ae feat(web): always view original of animated images (#23842) 2025-11-18 21:02:52 -06:00
Mees Frensel 271a42ac7f fix(server): copy relevant panorama tags to preview image (#23953) 2025-11-19 03:02:12 +00:00
bo0tzz 4462952564 fix: proper docker caching for plugin mise deps (#23967)
* fix: proper docker caching for plugin mise deps

* fix: mount mise cache for build too
2025-11-19 03:00:03 +00:00
shenlong 38d4d1a573 chore: reset remote sync on app update (#23969)
reset remote sync on update

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-11-19 02:55:01 +00:00
534 changed files with 29951 additions and 10040 deletions
+6
View File
@@ -29,6 +29,12 @@
] ]
} }
}, },
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {
// https://github.com/devcontainers/features/issues/1466
"moby": false
}
},
"forwardPorts": [3000, 9231, 9230, 2283], "forwardPorts": [3000, 9231, 9230, 2283],
"portsAttributes": { "portsAttributes": {
"3000": { "3000": {
+1 -1
View File
@@ -1 +1 @@
24.11.0 24.11.1
+1 -1
View File
@@ -4,6 +4,6 @@
"format:fix": "prettier --write ." "format:fix": "prettier --write ."
}, },
"devDependencies": { "devDependencies": {
"prettier": "^3.5.3" "prettier": "^3.7.4"
} }
} }
+4 -10
View File
@@ -96,7 +96,7 @@ jobs:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
ref: ${{ inputs.ref || github.sha }} ref: ${{ inputs.ref || github.sha }}
persist-credentials: false persist-credentials: false
@@ -108,7 +108,7 @@ jobs:
working-directory: ./mobile working-directory: ./mobile
run: printf "%s" $KEY_JKS | base64 -d > android/key.jks run: printf "%s" $KEY_JKS | base64 -d > android/key.jks
- uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 - uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e # v5.1.0
with: with:
distribution: 'zulu' distribution: 'zulu'
java-version: '17' java-version: '17'
@@ -194,7 +194,7 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with: with:
ref: ${{ inputs.ref || github.sha }} ref: ${{ inputs.ref || github.sha }}
persist-credentials: false persist-credentials: false
@@ -222,6 +222,7 @@ jobs:
uses: ruby/setup-ruby@v1 uses: ruby/setup-ruby@v1
with: with:
ruby-version: '3.3' ruby-version: '3.3'
bundler-cache: true
working-directory: ./mobile/ios working-directory: ./mobile/ios
- name: Install CocoaPods dependencies - name: Install CocoaPods dependencies
@@ -229,13 +230,6 @@ jobs:
run: | run: |
pod install pod install
- name: Install Fastlane
working-directory: ./mobile/ios
run: |
gem install bundler
bundle config set --local path 'vendor/bundle'
bundle install
- name: Create API Key - name: Create API Key
env: env:
API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }} API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Check out code - name: Check out code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
+4 -4
View File
@@ -35,7 +35,7 @@ jobs:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
@@ -44,7 +44,7 @@ jobs:
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './cli/.nvmrc' node-version-file: './cli/.nvmrc'
registry-url: 'https://registry.npmjs.org' registry-url: 'https://registry.npmjs.org'
@@ -78,7 +78,7 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout - name: Checkout
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
@@ -105,7 +105,7 @@ jobs:
- name: Generate docker image tags - name: Generate docker image tags
id: metadata id: metadata
uses: docker/metadata-action@318604b99e75e41977312d83839a89be02ca4893 # v5.9.0 uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0
with: with:
flavor: | flavor: |
latest=false latest=false
+1 -1
View File
@@ -35,7 +35,7 @@ jobs:
needs: [get_body, should_run] needs: [get_body, should_run]
if: ${{ needs.should_run.outputs.should_run == 'true' }} if: ${{ needs.should_run.outputs.should_run == 'true' }}
container: container:
image: ghcr.io/immich-app/mdq:main@sha256:9c905a4ff69f00c4b2f98b40b6090ab3ab18d1a15ed1379733b8691aa1fcb271 image: ghcr.io/immich-app/mdq:main@sha256:237cdae7783609c96f18037a513d38088713cf4a2e493a3aa136d0c45490749a
outputs: outputs:
checked: ${{ steps.get_checkbox.outputs.checked }} checked: ${{ steps.get_checkbox.outputs.checked }}
steps: steps:
+4 -4
View File
@@ -50,14 +50,14 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 uses: github/codeql-action/init@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file. # If you wish to specify custom queries, you can do so here or in a config file.
@@ -70,7 +70,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below) # If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild - name: Autobuild
uses: github/codeql-action/autobuild@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 uses: github/codeql-action/autobuild@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7
# ️ Command-line programs to run using the OS shell. # ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -83,6 +83,6 @@ jobs:
# ./location_of_script_within_repo/buildscript.sh # ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 uses: github/codeql-action/analyze@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7
with: with:
category: '/language:${{matrix.language}}' category: '/language:${{matrix.language}}'
+2 -2
View File
@@ -132,7 +132,7 @@ jobs:
suffixes: '-rocm' suffixes: '-rocm'
platforms: linux/amd64 platforms: linux/amd64
runner-mapping: '{"linux/amd64": "mich"}' runner-mapping: '{"linux/amd64": "mich"}'
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@47a2ee86898ccff51592d6572391fb1abcd7f782 # multi-runner-build-workflow-v2.0.1 uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@0477486d82313fba68f7c82c034120a4b8981297 # multi-runner-build-workflow-v2.1.0
permissions: permissions:
contents: read contents: read
actions: read actions: read
@@ -155,7 +155,7 @@ jobs:
name: Build and Push Server name: Build and Push Server
needs: pre-job needs: pre-job
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }} if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }}
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@47a2ee86898ccff51592d6572391fb1abcd7f782 # multi-runner-build-workflow-v2.0.1 uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@0477486d82313fba68f7c82c034120a4b8981297 # multi-runner-build-workflow-v2.1.0
permissions: permissions:
contents: read contents: read
actions: read actions: read
+2 -2
View File
@@ -60,7 +60,7 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
@@ -69,7 +69,7 @@ jobs:
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './docs/.nvmrc' node-version-file: './docs/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
+1 -1
View File
@@ -125,7 +125,7 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
+1 -1
View File
@@ -23,7 +23,7 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
+3 -3
View File
@@ -16,13 +16,13 @@ jobs:
steps: steps:
- name: Generate a token - name: Generate a token
id: generate-token id: generate-token
uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4 uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with: with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: 'Checkout' - name: 'Checkout'
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
ref: ${{ github.event.pull_request.head.ref }} ref: ${{ github.event.pull_request.head.ref }}
token: ${{ steps.generate-token.outputs.token }} token: ${{ steps.generate-token.outputs.token }}
@@ -32,7 +32,7 @@ jobs:
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
+1 -1
View File
@@ -31,7 +31,7 @@ jobs:
- name: Generate a token - name: Generate a token
id: generate_token id: generate_token
if: ${{ inputs.skip != true }} if: ${{ inputs.skip != true }}
uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4 uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with: with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
+7 -7
View File
@@ -49,26 +49,26 @@ jobs:
steps: steps:
- name: Generate a token - name: Generate a token
id: generate-token id: generate-token
uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4 uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with: with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout - name: Checkout
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
token: ${{ steps.generate-token.outputs.token }} token: ${{ steps.generate-token.outputs.token }}
persist-credentials: true persist-credentials: true
ref: main ref: main
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41 # v7.1.2 uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -126,13 +126,13 @@ jobs:
steps: steps:
- name: Generate a token - name: Generate a token
id: generate-token id: generate-token
uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4 uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with: with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout - name: Checkout
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
token: ${{ steps.generate-token.outputs.token }} token: ${{ steps.generate-token.outputs.token }}
persist-credentials: false persist-credentials: false
@@ -144,7 +144,7 @@ jobs:
github-token: ${{ steps.generate-token.outputs.token }} github-token: ${{ steps.generate-token.outputs.token }}
- name: Create draft release - name: Create draft release
uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1 uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
with: with:
draft: true draft: true
tag_name: ${{ env.IMMICH_VERSION }} tag_name: ${{ env.IMMICH_VERSION }}
+5 -5
View File
@@ -17,26 +17,26 @@ jobs:
steps: steps:
- name: Generate a token - name: Generate a token
id: generate-token id: generate-token
uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4 uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with: with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout - name: Checkout
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
token: ${{ steps.generate-token.outputs.token }} token: ${{ steps.generate-token.outputs.token }}
persist-credentials: true persist-credentials: true
ref: main ref: main
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41 # v7.1.2 uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -159,7 +159,7 @@ jobs:
- name: Create PR - name: Create PR
id: create-pr id: create-pr
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11
with: with:
token: ${{ steps.generate-token.outputs.token }} token: ${{ steps.generate-token.outputs.token }}
commit-message: 'chore: release ${{ steps.bump-type.outputs.next }}' commit-message: 'chore: release ${{ steps.bump-type.outputs.next }}'
+148
View File
@@ -0,0 +1,148 @@
name: release.yml
on:
pull_request:
types: [closed]
paths:
- CHANGELOG.md
jobs:
# Maybe double check PR source branch?
merge_translations:
uses: ./.github/workflows/merge-translations.yml
permissions:
pull-requests: write
secrets:
PUSH_O_MATIC_APP_ID: ${{ secrets.PUSH_O_MATIC_APP_ID }}
PUSH_O_MATIC_APP_KEY: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }}
build_mobile:
uses: ./.github/workflows/build-mobile.yml
needs: merge_translations
permissions:
contents: read
secrets:
KEY_JKS: ${{ secrets.KEY_JKS }}
ALIAS: ${{ secrets.ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
ANDROID_STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }}
# iOS secrets
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}
APP_STORE_CONNECT_API_KEY_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }}
APP_STORE_CONNECT_API_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY }}
IOS_CERTIFICATE_P12: ${{ secrets.IOS_CERTIFICATE_P12 }}
IOS_CERTIFICATE_PASSWORD: ${{ secrets.IOS_CERTIFICATE_PASSWORD }}
IOS_PROVISIONING_PROFILE: ${{ secrets.IOS_PROVISIONING_PROFILE }}
IOS_PROVISIONING_PROFILE_SHARE_EXTENSION: ${{ secrets.IOS_PROVISIONING_PROFILE_SHARE_EXTENSION }}misc/release/notes.tmpl
IOS_PROVISIONING_PROFILE_WIDGET_EXTENSION: ${{ secrets.IOS_PROVISIONING_PROFILE_WIDGET_EXTENSION }}
IOS_DEVELOPMENT_PROVISIONING_PROFILE: ${{ secrets.IOS_DEVELOPMENT_PROVISIONING_PROFILE }}
IOS_DEVELOPMENT_PROVISIONING_PROFILE_SHARE_EXTENSION: ${{ secrets.IOS_DEVELOPMENT_PROVISIONING_PROFILE_SHARE_EXTENSION }}
IOS_DEVELOPMENT_PROVISIONING_PROFILE_WIDGET_EXTENSION: ${{ secrets.IOS_DEVELOPMENT_PROVISIONING_PROFILE_WIDGET_EXTENSION }}
FASTLANE_TEAM_ID: ${{ secrets.FASTLANE_TEAM_ID }}
with:
ref: main
environment: production
prepare_release:
runs-on: ubuntu-latest
needs: build_mobile
permissions:
actions: read # To download the app artifact
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with:
token: ${{ steps.generate-token.outputs.token }}
persist-credentials: false
ref: main
- name: Extract changelog
id: changelog
run: |
CHANGELOG_PATH=$RUNNER_TEMP/changelog.md
sed -n '1,/^---$/p' CHANGELOG.md | head -n -1 > $CHANGELOG_PATH
echo "path=$CHANGELOG_PATH" >> $GITHUB_OUTPUT
VERSION=$(sed -n 's/^# //p' $CHANGELOG_PATH)
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Download APK
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
with:
name: release-apk-signed
github-token: ${{ steps.generate-token.outputs.token }}
- name: Create draft release
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
with:
tag_name: ${{ steps.version.outputs.result }}
token: ${{ steps.generate-token.outputs.token }}
body_path: ${{ steps.changelog.outputs.path }}
draft: true
files: |
docker/docker-compose.yml
docker/example.env
docker/hwaccel.ml.yml
docker/hwaccel.transcoding.yml
docker/prometheus.yml
*.apk
- name: Rename Outline document
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
continue-on-error: true
env:
OUTLINE_API_KEY: ${{ secrets.OUTLINE_API_KEY }}
VERSION: ${{ steps.changelog.outputs.version }}
with:
github-token: ${{ steps.generate-token.outputs.token }}
script: |
const outlineKey = process.env.OUTLINE_API_KEY;
const version = process.env.VERSION;
const parentDocumentId = 'da856355-0844-43df-bd71-f8edce5382d9';
const baseUrl = 'https://outline.immich.cloud';
const listResponse = await fetch(`${baseUrl}/api/documents.list`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${outlineKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ parentDocumentId })
});
if (!listResponse.ok) {
throw new Error(`Outline list failed: ${listResponse.statusText}`);
}
const listData = await listResponse.json();
const allDocuments = listData.data || [];
const document = allDocuments.find(doc => doc.title === 'next');
if (document) {
console.log(`Found document 'next', renaming to '${version}'...`);
const updateResponse = await fetch(`${baseUrl}/api/documents.update`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${outlineKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
id: document.id,
title: version
})
});
if (!updateResponse.ok) {
throw new Error(`Failed to rename document: ${updateResponse.statusText}`);
}
} else {
console.log('No document titled "next" found to rename');
}
+2 -2
View File
@@ -22,7 +22,7 @@ jobs:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
@@ -31,7 +31,7 @@ jobs:
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
# Setup .npmrc file to publish to npm # Setup .npmrc file to publish to npm
- uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './open-api/typescript-sdk/.nvmrc' node-version-file: './open-api/typescript-sdk/.nvmrc'
registry-url: 'https://registry.npmjs.org' registry-url: 'https://registry.npmjs.org'
+1 -1
View File
@@ -55,7 +55,7 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
+39 -31
View File
@@ -69,7 +69,7 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
@@ -77,7 +77,7 @@ jobs:
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -114,14 +114,14 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './cli/.nvmrc' node-version-file: './cli/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -161,14 +161,14 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './cli/.nvmrc' node-version-file: './cli/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -203,14 +203,14 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './web/.nvmrc' node-version-file: './web/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -247,14 +247,14 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './web/.nvmrc' node-version-file: './web/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -285,14 +285,14 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './web/.nvmrc' node-version-file: './web/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -333,14 +333,14 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './e2e/.nvmrc' node-version-file: './e2e/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -379,7 +379,7 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
submodules: 'recursive' submodules: 'recursive'
@@ -387,7 +387,7 @@ jobs:
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -418,7 +418,7 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
submodules: 'recursive' submodules: 'recursive'
@@ -426,7 +426,7 @@ jobs:
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './e2e/.nvmrc' node-version-file: './e2e/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -473,7 +473,7 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
submodules: 'recursive' submodules: 'recursive'
@@ -481,7 +481,7 @@ jobs:
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './e2e/.nvmrc' node-version-file: './e2e/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -500,8 +500,16 @@ jobs:
run: docker compose build run: docker compose build
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run e2e tests (web) - name: Run e2e tests (web)
env:
CI: true
run: npx playwright test run: npx playwright test
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Archive test results
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
if: success() || failure()
with:
name: e2e-web-test-results-${{ matrix.runner }}
path: e2e/playwright-report/
success-check-e2e: success-check-e2e:
name: End-to-End Tests Success name: End-to-End Tests Success
needs: [e2e-tests-server-cli, e2e-tests-web] needs: [e2e-tests-server-cli, e2e-tests-web]
@@ -526,7 +534,7 @@ jobs:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
@@ -558,13 +566,13 @@ jobs:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41 # v7.1.2 uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
- uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
# TODO: add caching when supported (https://github.com/actions/setup-python/pull/818) # TODO: add caching when supported (https://github.com/actions/setup-python/pull/818)
# with: # with:
# python-version: 3.11 # python-version: 3.11
@@ -602,14 +610,14 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './.github/.nvmrc' node-version-file: './.github/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -631,7 +639,7 @@ jobs:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
@@ -653,14 +661,14 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
@@ -715,14 +723,14 @@ jobs:
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with: with:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'pnpm' cache: 'pnpm'
+1 -2
View File
@@ -36,8 +36,7 @@ jobs:
github-token: ${{ steps.token.outputs.token }} github-token: ${{ steps.token.outputs.token }}
filters: | filters: |
i18n: i18n:
- 'i18n/!(en)**\.json' - modified: 'i18n/!(en)**\.json'
exclude-branches: 'chore/translations'
skip-force-logic: 'true' skip-force-logic: 'true'
enforce-lock: enforce-lock:
+1 -1
View File
@@ -52,7 +52,7 @@
}, },
"cSpell.words": ["immich"], "cSpell.words": ["immich"],
"editor.formatOnSave": true, "editor.formatOnSave": true,
"eslint.validate": ["javascript", "svelte"], "eslint.validate": ["javascript", "typescript", "svelte"],
"explorer.fileNesting.enabled": true, "explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": { "explorer.fileNesting.patterns": {
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart", "*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
+5 -5
View File
@@ -118,16 +118,16 @@ Read more about translations [here](https://docs.immich.app/developer/translatio
## Star history ## Star history
<a href="https://star-history.com/#immich-app/immich&Date"> <a href="https://star-history.com/#immich-app/immich&type=date&legend=top-left">
<picture> <picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=immich-app/immich&type=Date&theme=dark" /> <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=immich-app/immich&type=date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=immich-app/immich&type=Date" /> <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=immich-app/immich&type=date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=immich-app/immich&type=Date" width="100%" /> <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=immich-app/immich&type=date" width="100%" />
</picture> </picture>
</a> </a>
## Contributors ## Contributors
<a href="https://github.com/alextran1502/immich/graphs/contributors"> <a href="https://github.com/immich-app/immich/graphs/contributors">
<img src="https://contrib.rocks/image?repo=immich-app/immich" width="100%"/> <img src="https://contrib.rocks/image?repo=immich-app/immich" width="100%"/>
</a> </a>
+1 -1
View File
@@ -1 +1 @@
24.11.0 24.11.1
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:22.16.0-alpine3.20@sha256:2289fb1fba0f4633b08ec47b94a89c7e20b829fc5679f9b7b298eaa2f1ed8b7e AS core FROM node:24.1.0-alpine3.20@sha256:8fe019e0d57dbdce5f5c27c0b63d2775cf34b00e3755a7dea969802d7e0c2b25 AS core
WORKDIR /usr/src/app WORKDIR /usr/src/app
COPY package* pnpm* .pnpmfile.cjs ./ COPY package* pnpm* .pnpmfile.cjs ./
+5 -5
View File
@@ -1,6 +1,6 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.101", "version": "2.2.103",
"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.19.1", "@types/node": "^24.10.3",
"@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",
@@ -28,10 +28,10 @@
"eslint": "^9.14.0", "eslint": "^9.14.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^60.0.0", "eslint-plugin-unicorn": "^62.0.0",
"globals": "^16.0.0", "globals": "^16.0.0",
"mock-fs": "^5.2.0", "mock-fs": "^5.2.0",
"prettier": "^3.2.5", "prettier": "^3.7.4",
"prettier-plugin-organize-imports": "^4.0.0", "prettier-plugin-organize-imports": "^4.0.0",
"typescript": "^5.3.3", "typescript": "^5.3.3",
"typescript-eslint": "^8.28.0", "typescript-eslint": "^8.28.0",
@@ -69,6 +69,6 @@
"micromatch": "^4.0.8" "micromatch": "^4.0.8"
}, },
"volta": { "volta": {
"node": "24.11.0" "node": "24.11.1"
} }
} }
+1 -1
View File
@@ -299,7 +299,7 @@ describe('crawl', () => {
.map(([file]) => file); .map(([file]) => file);
// Compare file's content instead of path since a file can be represent in multiple ways. // Compare file's content instead of path since a file can be represent in multiple ways.
expect(actual.map((path) => readContent(path)).sort()).toEqual(expected.sort()); expect(actual.map((path) => readContent(path)).toSorted()).toEqual(expected.toSorted());
}); });
} }
}); });
+1 -1
View File
@@ -160,7 +160,7 @@ export const crawl = async (options: CrawlOptions): Promise<string[]> => {
ignore: [`**/${exclusionPattern}`], ignore: [`**/${exclusionPattern}`],
}); });
globbedFiles.push(...crawledFiles); globbedFiles.push(...crawledFiles);
return globbedFiles.sort(); return globbedFiles.toSorted();
}; };
export const sha1 = (filepath: string) => { export const sha1 = (filepath: string) => {
+1 -1
View File
@@ -9,7 +9,7 @@
"experimentalDecorators": true, "experimentalDecorators": true,
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"target": "es2022", "target": "es2023",
"sourceMap": true, "sourceMap": true,
"outDir": "./dist", "outDir": "./dist",
"incremental": true, "incremental": true,
+2 -2
View File
@@ -1,6 +1,6 @@
[tools] [tools]
terragrunt = "0.91.2" terragrunt = "0.93.10"
opentofu = "1.10.6" opentofu = "1.10.7"
[tasks."tg:fmt"] [tasks."tg:fmt"]
run = "terragrunt hclfmt" run = "terragrunt hclfmt"
+1 -9
View File
@@ -58,10 +58,6 @@ services:
IMMICH_THIRD_PARTY_BUG_FEATURE_URL: https://github.com/immich-app/immich/issues IMMICH_THIRD_PARTY_BUG_FEATURE_URL: https://github.com/immich-app/immich/issues
IMMICH_THIRD_PARTY_DOCUMENTATION_URL: https://docs.immich.app IMMICH_THIRD_PARTY_DOCUMENTATION_URL: https://docs.immich.app
IMMICH_THIRD_PARTY_SUPPORT_URL: https://docs.immich.app/community-guides IMMICH_THIRD_PARTY_SUPPORT_URL: https://docs.immich.app/community-guides
ulimits:
nofile:
soft: 1048576
hard: 1048576
ports: ports:
- 9230:9230 - 9230:9230
- 9231:9231 - 9231:9231
@@ -100,10 +96,6 @@ services:
- app-node_modules:/usr/src/app/node_modules - app-node_modules:/usr/src/app/node_modules
- sveltekit:/usr/src/app/web/.svelte-kit - sveltekit:/usr/src/app/web/.svelte-kit
- coverage:/usr/src/app/web/coverage - coverage:/usr/src/app/web/coverage
ulimits:
nofile:
soft: 1048576
hard: 1048576
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
immich-server: immich-server:
@@ -135,7 +127,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: docker.io/valkey/valkey:8@sha256:81db6d39e1bba3b3ff32bd3a1b19a6d69690f94a3954ec131277b9a26b95b3aa image: docker.io/valkey/valkey:9@sha256:fb8d272e529ea567b9bf1302245796f21a2672b8368ca3fcb938ac334e613c8f
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1
+3 -3
View File
@@ -56,7 +56,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: docker.io/valkey/valkey:8@sha256:81db6d39e1bba3b3ff32bd3a1b19a6d69690f94a3954ec131277b9a26b95b3aa image: docker.io/valkey/valkey:9@sha256:fb8d272e529ea567b9bf1302245796f21a2672b8368ca3fcb938ac334e613c8f
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1
restart: always restart: always
@@ -83,7 +83,7 @@ services:
container_name: immich_prometheus container_name: immich_prometheus
ports: ports:
- 9090:9090 - 9090:9090
image: prom/prometheus@sha256:49214755b6153f90a597adcbff0252cc61069f8ab69ce8411285cd4a560e8038 image: prom/prometheus@sha256:d936808bdea528155c0154a922cd42fd75716b8bb7ba302641350f9f3eaeba09
volumes: volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml - ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus - prometheus-data:/prometheus
@@ -95,7 +95,7 @@ services:
command: ['./run.sh', '-disable-reporting'] command: ['./run.sh', '-disable-reporting']
ports: ports:
- 3000:3000 - 3000:3000
image: grafana/grafana:12.2.1-ubuntu@sha256:797530c642f7b41ba7848c44cfda5e361ef1f3391a98bed1e5d448c472b6826a image: grafana/grafana:12.3.0-ubuntu@sha256:cee936306135e1925ab21dffa16f8a411535d16ab086bef2309339a8e74d62df
volumes: volumes:
- grafana-data:/var/lib/grafana - grafana-data:/var/lib/grafana
+1 -1
View File
@@ -49,7 +49,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: docker.io/valkey/valkey:8@sha256:81db6d39e1bba3b3ff32bd3a1b19a6d69690f94a3954ec131277b9a26b95b3aa image: docker.io/valkey/valkey:9@sha256:fb8d272e529ea567b9bf1302245796f21a2672b8368ca3fcb938ac334e613c8f
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1
restart: always restart: always
+1 -1
View File
@@ -1 +1 @@
24.11.0 24.11.1
+2 -2
View File
@@ -133,9 +133,9 @@ There are a few different scenarios that can lead to this situation. The solutio
The job is only automatically run once per asset after upload. If metadata extraction originally failed, the jobs were cleared/canceled, etc., The job is only automatically run once per asset after upload. If metadata extraction originally failed, the jobs were cleared/canceled, etc.,
the job may not have run automatically the first time. the job may not have run automatically the first time.
### How can I hide photos from the timeline? ### How can I hide a photo or video from the timeline?
You can _archive_ them. You can _archive_ them. This will hide the asset from the main timeline and folder view, but it will still show up in searches. All archived assets can be found in the _Archive_ view
### How can I backup data from Immich? ### How can I backup data from Immich?
@@ -41,7 +41,7 @@ By default, Immich will keep the last 14 database dumps and create a new dump ev
#### Trigger Dump #### Trigger Dump
You are able to trigger a database dump in the [admin job status page](http://my.immich.app/admin/jobs-status). You are able to trigger a database dump in the [admin job status page](http://my.immich.app/admin/queues).
Visit the page, open the "Create job" modal from the top right, select "Create Database Dump" and click "Confirm". Visit the page, open the "Create job" modal from the top right, select "Create Database Dump" and click "Confirm".
A job will run and trigger a dump, you can verify this worked correctly by checking the logs or the `backups/` folder. A job will run and trigger a dump, you can verify this worked correctly by checking the logs or the `backups/` folder.
This dumps will count towards the last `X` dumps that will be kept based on your settings. This dumps will count towards the last `X` dumps that will be kept based on your settings.
+8 -2
View File
@@ -21,6 +21,12 @@ server {
# allow large file uploads # allow large file uploads
client_max_body_size 50000M; client_max_body_size 50000M;
# disable buffering uploads to prevent OOM on reverse proxy server and make uploads twice as fast (no pause)
proxy_request_buffering off;
# increase body buffer to avoid limiting upload speed
client_body_buffer_size 1024k;
# Set headers # Set headers
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
@@ -29,8 +35,6 @@ server {
# enable websockets: http://nginx.org/en/docs/http/websocket.html # enable websockets: http://nginx.org/en/docs/http/websocket.html
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off; proxy_redirect off;
# set timeout # set timeout
@@ -40,6 +44,8 @@ server {
location / { location / {
proxy_pass http://<backend_url>:2283; proxy_pass http://<backend_url>:2283;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
} }
# useful when using Let's Encrypt http-01 challenge # useful when using Let's Encrypt http-01 challenge
+1 -1
View File
@@ -52,7 +52,7 @@ Password login has been enabled.
Disable Maintenance Mode Disable Maintenance Mode
``` ```
immich-admin disable-maintenace-mode immich-admin disable-maintenance-mode
Maintenance mode has been disabled. Maintenance mode has been disabled.
``` ```
+19 -18
View File
@@ -256,7 +256,7 @@ The Dev Container supports multiple ways to run tests:
```bash ```bash
# Run tests for specific components # Run tests for specific components
make test-server # Server unit tests make test-server # Server unit tests
make test-web # Web unit tests make test-web # Web unit tests
make test-e2e # End-to-end tests make test-e2e # End-to-end tests
make test-cli # CLI tests make test-cli # CLI tests
@@ -268,12 +268,13 @@ make test-all # Runs tests for all components
make test-medium-dev # End-to-end tests make test-medium-dev # End-to-end tests
``` ```
#### Using NPM Directly #### Using PNPM Directly
```bash ```bash
# Server tests # Server tests
cd /workspaces/immich/server cd /workspaces/immich/server
pnpm test # Run all tests pnpm test # Run all tests
pnpm run test:medium # Medium tests (integration tests)
pnpm run test:watch # Watch mode pnpm run test:watch # Watch mode
pnpm run test:cov # Coverage report pnpm run test:cov # Coverage report
@@ -293,21 +294,21 @@ pnpm run test:web # Run web UI tests
```bash ```bash
# Linting # Linting
make lint-server # Lint server code make lint-server # Lint server code
make lint-web # Lint web code make lint-web # Lint web code
make lint-all # Lint all components make lint-all # Lint all components
# Formatting # Formatting
make format-server # Format server code make format-server # Format server code
make format-web # Format web code make format-web # Format web code
make format-all # Format all code make format-all # Format all code
# Type checking # Type checking
make check-server # Type check server make check-server # Type check server
make check-web # Type check web make check-web # Type check web
make check-all # Check all components make check-all # Check all components
# Complete hygiene check # Complete hygiene check
make hygiene-all # Runs lint, format, check, SQL sync, and audit make hygiene-all # Run lint, format, check, SQL sync, and audit
``` ```
### Additional Make Commands ### Additional Make Commands
@@ -315,21 +316,21 @@ make hygiene-all # Runs lint, format, check, SQL sync, and audit
```bash ```bash
# Build commands # Build commands
make build-server # Build server make build-server # Build server
make build-web # Build web app make build-web # Build web app
make build-all # Build everything make build-all # Build everything
# API generation # API generation
make open-api # Generate OpenAPI specs make open-api # Generate OpenAPI specs
make open-api-typescript # Generate TypeScript SDK make open-api-typescript # Generate TypeScript SDK
make open-api-dart # Generate Dart SDK make open-api-dart # Generate Dart SDK
# Database # Database
make sql # Sync database schema make sql # Sync database schema
# Dependencies # Dependencies
make install-server # Install server dependencies make install-server # Install server dependencies
make install-web # Install web dependencies make install-web # Install web dependencies
make install-all # Install all dependencies make install-all # Install all dependencies
``` ```
### Debugging ### Debugging
+4 -4
View File
@@ -14,15 +14,15 @@ When contributing code through a pull request, please check the following:
- [ ] `pnpm run check:typescript` (check typescript) - [ ] `pnpm run check:typescript` (check typescript)
- [ ] `pnpm test` (unit tests) - [ ] `pnpm test` (unit tests)
:::tip AIO
Run all web checks with `pnpm run check:all`
:::
## Documentation ## Documentation
- [ ] `pnpm run format` (formatting via Prettier) - [ ] `pnpm run format` (formatting via Prettier)
- [ ] Update the `_redirects` file if you have renamed a page or removed it from the documentation. - [ ] Update the `_redirects` file if you have renamed a page or removed it from the documentation.
:::tip AIO
Run all web checks with `pnpm run check:all`
:::
## Server Checks ## Server Checks
- [ ] `pnpm run lint` (linting via ESLint) - [ ] `pnpm run lint` (linting via ESLint)
-1
View File
@@ -48,7 +48,6 @@ You can access the web from `http://your-machine-ip:3000` or `http://localhost:3
**Notes:** **Notes:**
- The "web" development container runs with uid 1000. If that uid does not have read/write permissions on the mounted volumes, you may encounter errors - The "web" development container runs with uid 1000. If that uid does not have read/write permissions on the mounted volumes, you may encounter errors
- In case of rootless docker setup, you need to use root within the container, otherwise you will encounter read/write permission related errors, see comments in `docker/docker-compose.dev.yml`.
#### Connect web to a remote backend #### Connect web to a remote backend
+1
View File
@@ -18,6 +18,7 @@ make e2e
Before you can run the tests, you need to run the following commands _once_: Before you can run the tests, you need to run the following commands _once_:
- `pnpm install` (in `e2e/`) - `pnpm install` (in `e2e/`)
- `pnpm run build` (in `cli/`)
- `make open-api` (in the project root `/`) - `make open-api` (in the project root `/`)
Once the test environment is running, the e2e tests can be run via: Once the test environment is running, the e2e tests can be run via:
+1 -1
View File
@@ -1222,4 +1222,4 @@ Feel free to make a feature request if there's a model you want to use that we d
[huggingface-clip]: https://huggingface.co/collections/immich-app/clip-654eaefb077425890874cd07 [huggingface-clip]: https://huggingface.co/collections/immich-app/clip-654eaefb077425890874cd07
[huggingface-multilingual-clip]: https://huggingface.co/collections/immich-app/multilingual-clip-654eb08c2382f591eeb8c2a7 [huggingface-multilingual-clip]: https://huggingface.co/collections/immich-app/multilingual-clip-654eb08c2382f591eeb8c2a7
[smart-search-settings]: https://my.immich.app/admin/system-settings?isOpen=machine-learning+smart-search [smart-search-settings]: https://my.immich.app/admin/system-settings?isOpen=machine-learning+smart-search
[job-status-page]: https://my.immich.app/admin/jobs-status [job-status-page]: https://my.immich.app/admin/queues
+1 -1
View File
@@ -53,7 +53,7 @@ Version mismatches between both hosts may cause bugs and instability, so remembe
Adding a new URL to the settings is recommended over replacing the existing URL. This is because it will allow machine learning tasks to be processed successfully when the remote server is down by falling back to the local machine learning container. If you do not want machine learning tasks to be processed locally when the remote server is not available, you can instead replace the existing URL and only provide the remote container's URL. If doing this, you can remove the `immich-machine-learning` section of the local `docker-compose.yml` file to save resources, as this service will never be used. Adding a new URL to the settings is recommended over replacing the existing URL. This is because it will allow machine learning tasks to be processed successfully when the remote server is down by falling back to the local machine learning container. If you do not want machine learning tasks to be processed locally when the remote server is not available, you can instead replace the existing URL and only provide the remote container's URL. If doing this, you can remove the `immich-machine-learning` section of the local `docker-compose.yml` file to save resources, as this service will never be used.
Do note that this will mean that Smart Search and Face Detection jobs will fail to be processed when the remote instance is not available. This in turn means that tasks dependent on these features—Duplicate Detection and Facial Recognition—will not run for affected assets. If this occurs, you must manually click the _Missing_ button next to Smart Search and Face Detection in the [Job Status](http://my.immich.app/admin/jobs-status) page for the jobs to be retried. Do note that this will mean that Smart Search and Face Detection jobs will fail to be processed when the remote instance is not available. This in turn means that tasks dependent on these features—Duplicate Detection and Facial Recognition—will not run for affected assets. If this occurs, you must manually click the _Missing_ button next to Smart Search and Face Detection in the [Job Status](http://my.immich.app/admin/queues) page for the jobs to be retried.
## Load balancing ## Load balancing
+6 -6
View File
@@ -62,10 +62,10 @@ Information on the current workers can be found [here](/administration/jobs-work
## Ports ## Ports
| Variable | Description | Default | | Variable | Description | Default | Containers |
| :------------ | :------------- | :----------------------------------------: | | :------------ | :------------- | :----------------------------------------: | :----------------------- |
| `IMMICH_HOST` | Listening host | `0.0.0.0` | | `IMMICH_HOST` | Listening host | `0.0.0.0` | server, machine learning |
| `IMMICH_PORT` | Listening port | `2283` (server), `3003` (machine learning) | | `IMMICH_PORT` | Listening port | `2283` (server), `3003` (machine learning) | server, machine learning |
## Database ## Database
@@ -80,7 +80,7 @@ Information on the current workers can be found [here](/administration/jobs-work
| `DB_SSL_MODE` | Database SSL mode | | server | | `DB_SSL_MODE` | Database SSL mode | | server |
| `DB_VECTOR_EXTENSION`<sup>\*2</sup> | Database vector extension (one of [`vectorchord`, `pgvector`, `pgvecto.rs`]) | | server | | `DB_VECTOR_EXTENSION`<sup>\*2</sup> | Database vector extension (one of [`vectorchord`, `pgvector`, `pgvecto.rs`]) | | server |
| `DB_SKIP_MIGRATIONS` | Whether to skip running migrations on startup (one of [`true`, `false`]) | `false` | server | | `DB_SKIP_MIGRATIONS` | Whether to skip running migrations on startup (one of [`true`, `false`]) | `false` | server |
| `DB_STORAGE_TYPE` | Optimize concurrent IO on SSDs or sequential IO on HDDs ([`SSD`, `HDD`])<sup>\*3</sup> | `SSD` | server | | `DB_STORAGE_TYPE` | Optimize concurrent IO on SSDs or sequential IO on HDDs ([`SSD`, `HDD`])<sup>\*3</sup> | `SSD` | database |
\*1: The values of `DB_USERNAME`, `DB_PASSWORD`, and `DB_DATABASE_NAME` are passed to the Postgres container as the variables `POSTGRES_USER`, `POSTGRES_PASSWORD`, and `POSTGRES_DB` in `docker-compose.yml`. \*1: The values of `DB_USERNAME`, `DB_PASSWORD`, and `DB_DATABASE_NAME` are passed to the Postgres container as the variables `POSTGRES_USER`, `POSTGRES_PASSWORD`, and `POSTGRES_DB` in `docker-compose.yml`.
@@ -93,7 +93,7 @@ Information on the current workers can be found [here](/administration/jobs-work
All `DB_` variables must be provided to all Immich workers, including `api` and `microservices`. All `DB_` variables must be provided to all Immich workers, including `api` and `microservices`.
`DB_URL` must be in the format `postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename`. `DB_URL` must be in the format `postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename`.
You can require SSL by adding `?sslmode=require` to the end of the `DB_URL` string, or require SSL and skip certificate verification by adding `?sslmode=require&sslmode=no-verify`. You can require SSL by adding `?sslmode=require` to the end of the `DB_URL` string, or require SSL and skip certificate verification by adding `?sslmode=require&uselibpqcompat=true`. This allows both immich and `pg_dumpall` (the utility used for database backups) to [properly connect](https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string#tcp-connections) to your database.
When `DB_URL` is defined, the `DB_HOSTNAME`, `DB_PORT`, `DB_USERNAME`, `DB_PASSWORD` and `DB_DATABASE_NAME` database variables are ignored. When `DB_URL` is defined, the `DB_HOSTNAME`, `DB_PORT`, `DB_USERNAME`, `DB_PASSWORD` and `DB_DATABASE_NAME` database variables are ignored.
+2 -2
View File
@@ -38,7 +38,7 @@
"@docusaurus/module-type-aliases": "~3.9.0", "@docusaurus/module-type-aliases": "~3.9.0",
"@docusaurus/tsconfig": "^3.7.0", "@docusaurus/tsconfig": "^3.7.0",
"@docusaurus/types": "^3.7.0", "@docusaurus/types": "^3.7.0",
"prettier": "^3.2.4", "prettier": "^3.7.4",
"typescript": "^5.1.6" "typescript": "^5.1.6"
}, },
"browserslist": { "browserslist": {
@@ -57,6 +57,6 @@
"node": ">=20" "node": ">=20"
}, },
"volta": { "volta": {
"node": "24.11.0" "node": "24.11.1"
} }
} }
+8
View File
@@ -1,4 +1,12 @@
[ [
{
"label": "v2.3.1",
"url": "https://docs.v2.3.1.archive.immich.app"
},
{
"label": "v2.3.0",
"url": "https://docs.v2.3.0.archive.immich.app"
},
{ {
"label": "v2.2.3", "label": "v2.2.3",
"url": "https://docs.v2.2.3.archive.immich.app" "url": "https://docs.v2.2.3.archive.immich.app"
+1
View File
@@ -4,3 +4,4 @@ node_modules/
/blob-report/ /blob-report/
/playwright/.cache/ /playwright/.cache/
/dist /dist
.env
+1 -1
View File
@@ -1 +1 @@
24.11.0 24.11.1
+3
View File
@@ -7,6 +7,9 @@ services:
build: build:
context: ../ context: ../
dockerfile: server/Dockerfile dockerfile: server/Dockerfile
cache_from:
- type=registry,ref=ghcr.io/immich-app/immich-server-build-cache:linux-amd64-cc099f297acd18c924b35ece3245215b53d106eb2518e3af6415931d055746cd-main
- type=registry,ref=ghcr.io/immich-app/immich-server-build-cache:linux-arm64-cc099f297acd18c924b35ece3245215b53d106eb2518e3af6415931d055746cd-main
args: args:
- BUILD_ID=1234567890 - BUILD_ID=1234567890
- BUILD_IMAGE=e2e - BUILD_IMAGE=e2e
+9 -7
View File
@@ -1,6 +1,6 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "2.2.3", "version": "2.3.1",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",
@@ -20,30 +20,32 @@
"license": "GNU Affero General Public License version 3", "license": "GNU Affero General Public License version 3",
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.8.0", "@eslint/js": "^9.8.0",
"@faker-js/faker": "^10.1.0",
"@immich/cli": "file:../cli", "@immich/cli": "file:../cli",
"@immich/sdk": "file:../open-api/typescript-sdk", "@immich/sdk": "file:../open-api/typescript-sdk",
"@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.19.1", "@types/node": "^24.10.3",
"@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",
"@types/supertest": "^6.0.2", "@types/supertest": "^6.0.2",
"dotenv": "^17.2.3",
"eslint": "^9.14.0", "eslint": "^9.14.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^60.0.0", "eslint-plugin-unicorn": "^62.0.0",
"exiftool-vendored": "^31.1.0", "exiftool-vendored": "^34.0.0",
"globals": "^16.0.0", "globals": "^16.0.0",
"jose": "^5.6.3", "jose": "^5.6.3",
"luxon": "^3.4.4", "luxon": "^3.4.4",
"oidc-provider": "^9.0.0", "oidc-provider": "^9.0.0",
"pg": "^8.11.3", "pg": "^8.11.3",
"pngjs": "^7.0.0", "pngjs": "^7.0.0",
"prettier": "^3.2.5", "prettier": "^3.7.4",
"prettier-plugin-organize-imports": "^4.0.0", "prettier-plugin-organize-imports": "^4.0.0",
"sharp": "^0.34.4", "sharp": "^0.34.5",
"socket.io-client": "^4.7.4", "socket.io-client": "^4.7.4",
"supertest": "^7.0.0", "supertest": "^7.0.0",
"typescript": "^5.3.3", "typescript": "^5.3.3",
@@ -52,6 +54,6 @@
"vitest": "^3.0.0" "vitest": "^3.0.0"
}, },
"volta": { "volta": {
"node": "24.11.0" "node": "24.11.1"
} }
} }
+37 -6
View File
@@ -1,23 +1,50 @@
import { defineConfig, devices } from '@playwright/test'; import { defineConfig, devices, PlaywrightTestConfig } from '@playwright/test';
import dotenv from 'dotenv';
import { cpus } from 'node:os';
import { resolve } from 'node:path';
export default defineConfig({ dotenv.config({ path: resolve(import.meta.dirname, '.env') });
export const playwrightHost = process.env.PLAYWRIGHT_HOST ?? '127.0.0.1';
export const playwrightDbHost = process.env.PLAYWRIGHT_DB_HOST ?? '127.0.0.1';
export const playwriteBaseUrl = process.env.PLAYWRIGHT_BASE_URL ?? `http://${playwrightHost}:2285`;
export const playwriteSlowMo = parseInt(process.env.PLAYWRIGHT_SLOW_MO ?? '0');
export const playwrightDisableWebserver = process.env.PLAYWRIGHT_DISABLE_WEBSERVER;
process.env.PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS = '1';
const config: PlaywrightTestConfig = {
testDir: './src/web/specs', testDir: './src/web/specs',
fullyParallel: false, fullyParallel: false,
forbidOnly: !!process.env.CI, forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0, retries: process.env.CI ? 4 : 0,
workers: 1,
reporter: 'html', reporter: 'html',
use: { use: {
baseURL: 'http://127.0.0.1:2285', baseURL: playwriteBaseUrl,
trace: 'on-first-retry', trace: 'on-first-retry',
screenshot: 'only-on-failure',
launchOptions: {
slowMo: playwriteSlowMo,
},
}, },
testMatch: /.*\.e2e-spec\.ts/, testMatch: /.*\.e2e-spec\.ts/,
workers: process.env.CI ? 4 : Math.round(cpus().length * 0.75),
projects: [ projects: [
{ {
name: 'chromium', name: 'chromium',
use: { ...devices['Desktop Chrome'] }, use: { ...devices['Desktop Chrome'] },
testMatch: /.*\.e2e-spec\.ts/,
workers: 1,
},
{
name: 'parallel tests',
use: { ...devices['Desktop Chrome'] },
testMatch: /.*\.parallel-e2e-spec\.ts/,
fullyParallel: true,
workers: process.env.CI ? 3 : Math.max(1, Math.round(cpus().length * 0.75) - 1),
}, },
// { // {
@@ -59,4 +86,8 @@ export default defineConfig({
stderr: 'pipe', stderr: 'pipe',
reuseExistingServer: true, reuseExistingServer: true,
}, },
}); };
if (playwrightDisableWebserver) {
delete config.webServer;
}
export default defineConfig(config);
+1 -1
View File
@@ -1006,7 +1006,7 @@ describe('/libraries', () => {
rmSync(`${testAssetDir}/temp/xmp`, { recursive: true, force: true }); rmSync(`${testAssetDir}/temp/xmp`, { recursive: true, force: true });
}); });
it('should switch from using file metadata to file.xmp metadata when asset refreshes', async () => { it('should switch from using file metadata to file.ext.xmp metadata when asset refreshes', async () => {
const library = await utils.createLibrary(admin.accessToken, { const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId, ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp/xmp`], importPaths: [`${testAssetDirInternal}/temp/xmp`],
+37
View File
@@ -0,0 +1,37 @@
export { generateTimelineData } from './timeline/model-objects';
export { createDefaultTimelineConfig, validateTimelineConfig } from './timeline/timeline-config';
export type {
MockAlbum,
MonthSpec,
SerializedTimelineData,
MockTimelineAsset as TimelineAssetConfig,
TimelineConfig,
MockTimelineData as TimelineData,
} from './timeline/timeline-config';
export {
getAlbum,
getAsset,
getTimeBucket,
getTimeBuckets,
toAssetResponseDto,
toColumnarFormat,
} from './timeline/rest-response';
export type { Changes } from './timeline/rest-response';
export { randomImage, randomImageFromString, randomPreview, randomThumbnail } from './timeline/images';
export {
SeededRandom,
getMockAsset,
parseTimeBucketKey,
selectRandom,
selectRandomDays,
selectRandomMultiple,
} from './timeline/utils';
export { ASSET_DISTRIBUTION, DAY_DISTRIBUTION } from './timeline/distribution-patterns';
export type { DayPattern, MonthDistribution } from './timeline/distribution-patterns';
@@ -0,0 +1,183 @@
import { generateConsecutiveDays, generateDayAssets } from 'src/generators/timeline/model-objects';
import { SeededRandom, selectRandomDays } from 'src/generators/timeline/utils';
import type { MockTimelineAsset } from './timeline-config';
import { GENERATION_CONSTANTS } from './timeline-config';
type AssetDistributionStrategy = (rng: SeededRandom) => number;
type DayDistributionStrategy = (
year: number,
month: number,
daysInMonth: number,
totalAssets: number,
ownerId: string,
rng: SeededRandom,
) => MockTimelineAsset[];
/**
* Strategies for determining total asset count per month
*/
export const ASSET_DISTRIBUTION: Record<MonthDistribution, AssetDistributionStrategy | null> = {
empty: null, // Special case - handled separately
sparse: (rng) => rng.nextInt(3, 9), // 3-8 assets
medium: (rng) => rng.nextInt(15, 31), // 15-30 assets
dense: (rng) => rng.nextInt(50, 81), // 50-80 assets
'very-dense': (rng) => rng.nextInt(80, 151), // 80-150 assets
};
/**
* Strategies for distributing assets across days within a month
*/
export const DAY_DISTRIBUTION: Record<DayPattern, DayDistributionStrategy> = {
'single-day': (year, month, daysInMonth, totalAssets, ownerId, rng) => {
// All assets on one day in the middle of the month
const day = Math.floor(daysInMonth / 2);
return generateDayAssets(year, month, day, totalAssets, ownerId, rng);
},
'consecutive-large': (year, month, daysInMonth, totalAssets, ownerId, rng) => {
// 3-5 consecutive days with evenly distributed assets
const numDays = Math.min(5, Math.floor(totalAssets / 15));
const startDay = rng.nextInt(1, daysInMonth - numDays + 2);
return generateConsecutiveDays(year, month, startDay, numDays, totalAssets, ownerId, rng);
},
'consecutive-small': (year, month, daysInMonth, totalAssets, ownerId, rng) => {
// Multiple consecutive days with 1-3 assets each (side-by-side layout)
const assets: MockTimelineAsset[] = [];
const numDays = Math.min(totalAssets, Math.floor(daysInMonth / 2));
const startDay = rng.nextInt(1, daysInMonth - numDays + 2);
let assetIndex = 0;
for (let i = 0; i < numDays && assetIndex < totalAssets; i++) {
const dayAssets = Math.min(3, rng.nextInt(1, 4));
const actualAssets = Math.min(dayAssets, totalAssets - assetIndex);
// Create a new RNG for this day
const dayRng = new SeededRandom(rng.nextInt(0, 1_000_000));
assets.push(...generateDayAssets(year, month, startDay + i, actualAssets, ownerId, dayRng));
assetIndex += actualAssets;
}
return assets;
},
alternating: (year, month, daysInMonth, totalAssets, ownerId, rng) => {
// Alternate between large (15-25) and small (1-3) days
const assets: MockTimelineAsset[] = [];
let day = 1;
let isLarge = true;
let assetIndex = 0;
while (assetIndex < totalAssets && day <= daysInMonth) {
const dayAssets = isLarge ? Math.min(25, rng.nextInt(15, 26)) : rng.nextInt(1, 4);
const actualAssets = Math.min(dayAssets, totalAssets - assetIndex);
// Create a new RNG for this day
const dayRng = new SeededRandom(rng.nextInt(0, 1_000_000));
assets.push(...generateDayAssets(year, month, day, actualAssets, ownerId, dayRng));
assetIndex += actualAssets;
day += isLarge ? 1 : 1; // Could add gaps here
isLarge = !isLarge;
}
return assets;
},
'sparse-scattered': (year, month, daysInMonth, totalAssets, ownerId, rng) => {
// Spread assets across random days with gaps
const assets: MockTimelineAsset[] = [];
const numDays = Math.min(totalAssets, Math.floor(daysInMonth * GENERATION_CONSTANTS.SPARSE_DAY_COVERAGE));
const daysWithPhotos = selectRandomDays(daysInMonth, numDays, rng);
let assetIndex = 0;
for (let i = 0; i < daysWithPhotos.length && assetIndex < totalAssets; i++) {
const dayAssets =
Math.floor(totalAssets / numDays) + (i === daysWithPhotos.length - 1 ? totalAssets % numDays : 0);
// Create a new RNG for this day
const dayRng = new SeededRandom(rng.nextInt(0, 1_000_000));
assets.push(...generateDayAssets(year, month, daysWithPhotos[i], dayAssets, ownerId, dayRng));
assetIndex += dayAssets;
}
return assets;
},
'start-heavy': (year, month, daysInMonth, totalAssets, ownerId, rng) => {
// Most assets in first week
const assets: MockTimelineAsset[] = [];
const firstWeekAssets = Math.floor(totalAssets * 0.7);
const remainingAssets = totalAssets - firstWeekAssets;
// First 7 days
assets.push(...generateConsecutiveDays(year, month, 1, 7, firstWeekAssets, ownerId, rng));
// Remaining scattered
if (remainingAssets > 0) {
const midDay = Math.floor(daysInMonth / 2);
// Create a new RNG for the remaining assets
const remainingRng = new SeededRandom(rng.nextInt(0, 1_000_000));
assets.push(...generateDayAssets(year, month, midDay, remainingAssets, ownerId, remainingRng));
}
return assets;
},
'end-heavy': (year, month, daysInMonth, totalAssets, ownerId, rng) => {
// Most assets in last week
const assets: MockTimelineAsset[] = [];
const lastWeekAssets = Math.floor(totalAssets * 0.7);
const remainingAssets = totalAssets - lastWeekAssets;
// Remaining at start
if (remainingAssets > 0) {
// Create a new RNG for the start assets
const startRng = new SeededRandom(rng.nextInt(0, 1_000_000));
assets.push(...generateDayAssets(year, month, 2, remainingAssets, ownerId, startRng));
}
// Last 7 days
const startDay = daysInMonth - 6;
assets.push(...generateConsecutiveDays(year, month, startDay, 7, lastWeekAssets, ownerId, rng));
return assets;
},
'mid-heavy': (year, month, daysInMonth, totalAssets, ownerId, rng) => {
// Most assets in middle of month
const assets: MockTimelineAsset[] = [];
const midAssets = Math.floor(totalAssets * 0.7);
const sideAssets = Math.floor((totalAssets - midAssets) / 2);
// Start
if (sideAssets > 0) {
// Create a new RNG for the start assets
const startRng = new SeededRandom(rng.nextInt(0, 1_000_000));
assets.push(...generateDayAssets(year, month, 2, sideAssets, ownerId, startRng));
}
// Middle
const midStart = Math.floor(daysInMonth / 2) - 3;
assets.push(...generateConsecutiveDays(year, month, midStart, 7, midAssets, ownerId, rng));
// End
const endAssets = totalAssets - midAssets - sideAssets;
if (endAssets > 0) {
// Create a new RNG for the end assets
const endRng = new SeededRandom(rng.nextInt(0, 1_000_000));
assets.push(...generateDayAssets(year, month, daysInMonth - 1, endAssets, ownerId, endRng));
}
return assets;
},
};
export type MonthDistribution =
| 'empty' // 0 assets
| 'sparse' // 3-8 assets
| 'medium' // 15-30 assets
| 'dense' // 50-80 assets
| 'very-dense'; // 80-150 assets
export type DayPattern =
| 'single-day' // All images in one day
| 'consecutive-large' // Multiple days with 15-25 images each
| 'consecutive-small' // Multiple days with 1-3 images each (side-by-side)
| 'alternating' // Alternating large/small days
| 'sparse-scattered' // Few images scattered across month
| 'start-heavy' // Most images at start of month
| 'end-heavy' // Most images at end of month
| 'mid-heavy'; // Most images in middle of month
+111
View File
@@ -0,0 +1,111 @@
import sharp from 'sharp';
import { SeededRandom } from 'src/generators/timeline/utils';
export const randomThumbnail = async (seed: string, ratio: number) => {
const height = 235;
const width = Math.round(height * ratio);
return randomImageFromString(seed, { width, height });
};
export const randomPreview = async (seed: string, ratio: number) => {
const height = 500;
const width = Math.round(height * ratio);
return randomImageFromString(seed, { width, height });
};
export const randomImageFromString = async (
seed: string = '',
{ width = 100, height = 100 }: { width: number; height: number },
) => {
// Convert string to number for seeding
let seedNumber = 0;
for (let i = 0; i < seed.length; i++) {
seedNumber = (seedNumber << 5) - seedNumber + (seed.codePointAt(i) ?? 0);
seedNumber = seedNumber & seedNumber; // Convert to 32bit integer
}
return randomImage(new SeededRandom(Math.abs(seedNumber)), { width, height });
};
export const randomImage = async (rng: SeededRandom, { width, height }: { width: number; height: number }) => {
const r1 = rng.nextInt(0, 256);
const g1 = rng.nextInt(0, 256);
const b1 = rng.nextInt(0, 256);
const r2 = rng.nextInt(0, 256);
const g2 = rng.nextInt(0, 256);
const b2 = rng.nextInt(0, 256);
const patternType = rng.nextInt(0, 5);
let svgPattern = '';
switch (patternType) {
case 0: {
// Solid color
svgPattern = `<svg width="${width}" height="${height}">
<rect x="0" y="0" width="${width}" height="${height}" fill="rgb(${r1},${g1},${b1})"/>
</svg>`;
break;
}
case 1: {
// Horizontal stripes
const stripeHeight = 10;
svgPattern = `<svg width="${width}" height="${height}">
${Array.from(
{ length: height / stripeHeight },
(_, i) =>
`<rect x="0" y="${i * stripeHeight}" width="${width}" height="${stripeHeight}"
fill="rgb(${i % 2 ? r1 : r2},${i % 2 ? g1 : g2},${i % 2 ? b1 : b2})"/>`,
).join('')}
</svg>`;
break;
}
case 2: {
// Vertical stripes
const stripeWidth = 10;
svgPattern = `<svg width="${width}" height="${height}">
${Array.from(
{ length: width / stripeWidth },
(_, i) =>
`<rect x="${i * stripeWidth}" y="0" width="${stripeWidth}" height="${height}"
fill="rgb(${i % 2 ? r1 : r2},${i % 2 ? g1 : g2},${i % 2 ? b1 : b2})"/>`,
).join('')}
</svg>`;
break;
}
case 3: {
// Checkerboard
const squareSize = 10;
svgPattern = `<svg width="${width}" height="${height}">
${Array.from({ length: height / squareSize }, (_, row) =>
Array.from({ length: width / squareSize }, (_, col) => {
const isEven = (row + col) % 2 === 0;
return `<rect x="${col * squareSize}" y="${row * squareSize}"
width="${squareSize}" height="${squareSize}"
fill="rgb(${isEven ? r1 : r2},${isEven ? g1 : g2},${isEven ? b1 : b2})"/>`;
}).join(''),
).join('')}
</svg>`;
break;
}
case 4: {
// Diagonal stripes
svgPattern = `<svg width="${width}" height="${height}">
<defs>
<pattern id="diagonal" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse">
<rect x="0" y="0" width="10" height="20" fill="rgb(${r1},${g1},${b1})"/>
<rect x="10" y="0" width="10" height="20" fill="rgb(${r2},${g2},${b2})"/>
</pattern>
</defs>
<rect x="0" y="0" width="${width}" height="${height}" fill="url(#diagonal)" transform="rotate(45 50 50)"/>
</svg>`;
break;
}
}
const svgBuffer = Buffer.from(svgPattern);
const jpegData = await sharp(svgBuffer).jpeg({ quality: 50 }).toBuffer();
return jpegData;
};
@@ -0,0 +1,265 @@
/**
* Generator functions for timeline model objects
*/
import { faker } from '@faker-js/faker';
import { AssetVisibility } from '@immich/sdk';
import { DateTime } from 'luxon';
import { writeFileSync } from 'node:fs';
import { SeededRandom } from 'src/generators/timeline/utils';
import type { DayPattern, MonthDistribution } from './distribution-patterns';
import { ASSET_DISTRIBUTION, DAY_DISTRIBUTION } from './distribution-patterns';
import type { MockTimelineAsset, MockTimelineData, SerializedTimelineData, TimelineConfig } from './timeline-config';
import { ASPECT_RATIO_WEIGHTS, GENERATION_CONSTANTS, validateTimelineConfig } from './timeline-config';
/**
* Generate a random aspect ratio based on weighted probabilities
*/
export function generateAspectRatio(rng: SeededRandom): string {
const random = rng.next();
let cumulative = 0;
for (const [ratio, weight] of Object.entries(ASPECT_RATIO_WEIGHTS)) {
cumulative += weight;
if (random < cumulative) {
return ratio;
}
}
return '16:9'; // Default fallback
}
export function generateThumbhash(rng: SeededRandom): string {
return Array.from({ length: 10 }, () => rng.nextInt(0, 256).toString(16).padStart(2, '0')).join('');
}
export function generateDuration(rng: SeededRandom): string {
return `${rng.nextInt(GENERATION_CONSTANTS.MIN_VIDEO_DURATION_SECONDS, GENERATION_CONSTANTS.MAX_VIDEO_DURATION_SECONDS)}.${rng.nextInt(0, 1000).toString().padStart(3, '0')}`;
}
export function generateUUID(): string {
return faker.string.uuid();
}
export function generateAsset(
year: number,
month: number,
day: number,
ownerId: string,
rng: SeededRandom,
): MockTimelineAsset {
const from = DateTime.fromObject({ year, month, day }).setZone('UTC');
const to = from.endOf('day');
const date = faker.date.between({ from: from.toJSDate(), to: to.toJSDate() });
const isVideo = rng.next() < GENERATION_CONSTANTS.VIDEO_PROBABILITY;
const assetId = generateUUID();
const hasGPS = rng.next() < GENERATION_CONSTANTS.GPS_PERCENTAGE;
const ratio = generateAspectRatio(rng);
const asset: MockTimelineAsset = {
id: assetId,
ownerId,
ratio: Number.parseFloat(ratio.split(':')[0]) / Number.parseFloat(ratio.split(':')[1]),
thumbhash: generateThumbhash(rng),
localDateTime: date.toISOString(),
fileCreatedAt: date.toISOString(),
isFavorite: rng.next() < GENERATION_CONSTANTS.FAVORITE_PROBABILITY,
isTrashed: false,
isVideo,
isImage: !isVideo,
duration: isVideo ? generateDuration(rng) : null,
projectionType: null,
livePhotoVideoId: null,
city: hasGPS ? faker.location.city() : null,
country: hasGPS ? faker.location.country() : null,
people: null,
latitude: hasGPS ? faker.location.latitude() : null,
longitude: hasGPS ? faker.location.longitude() : null,
visibility: AssetVisibility.Timeline,
stack: null,
fileSizeInByte: faker.number.int({ min: 510, max: 5_000_000 }),
checksum: faker.string.alphanumeric({ length: 5 }),
};
return asset;
}
/**
* Generate assets for a specific day
*/
export function generateDayAssets(
year: number,
month: number,
day: number,
assetCount: number,
ownerId: string,
rng: SeededRandom,
): MockTimelineAsset[] {
return Array.from({ length: assetCount }, () => generateAsset(year, month, day, ownerId, rng));
}
/**
* Distribute assets evenly across consecutive days
*
* @returns Array of generated timeline assets
*/
export function generateConsecutiveDays(
year: number,
month: number,
startDay: number,
numDays: number,
totalAssets: number,
ownerId: string,
rng: SeededRandom,
): MockTimelineAsset[] {
const assets: MockTimelineAsset[] = [];
const assetsPerDay = Math.floor(totalAssets / numDays);
for (let i = 0; i < numDays; i++) {
const dayAssets =
i === numDays - 1
? totalAssets - assetsPerDay * (numDays - 1) // Remainder on last day
: assetsPerDay;
// Create a new RNG with a different seed for each day
const dayRng = new SeededRandom(rng.nextInt(0, 1_000_000) + i * 100);
assets.push(...generateDayAssets(year, month, startDay + i, dayAssets, ownerId, dayRng));
}
return assets;
}
/**
* Generate assets for a month with specified distribution pattern
*/
export function generateMonthAssets(
year: number,
month: number,
ownerId: string,
distribution: MonthDistribution = 'medium',
pattern: DayPattern = 'consecutive-large',
rng: SeededRandom,
): MockTimelineAsset[] {
const daysInMonth = new Date(year, month, 0).getDate();
if (distribution === 'empty') {
return [];
}
const distributionStrategy = ASSET_DISTRIBUTION[distribution];
if (!distributionStrategy) {
console.warn(`Unknown distribution: ${distribution}, defaulting to medium`);
return [];
}
const totalAssets = distributionStrategy(rng);
const dayStrategy = DAY_DISTRIBUTION[pattern];
if (!dayStrategy) {
console.warn(`Unknown pattern: ${pattern}, defaulting to consecutive-large`);
// Fallback to consecutive-large pattern
const numDays = Math.min(5, Math.floor(totalAssets / 15));
const startDay = rng.nextInt(1, daysInMonth - numDays + 2);
const assets = generateConsecutiveDays(year, month, startDay, numDays, totalAssets, ownerId, rng);
assets.sort((a, b) => DateTime.fromISO(b.localDateTime).diff(DateTime.fromISO(a.localDateTime)).milliseconds);
return assets;
}
const assets = dayStrategy(year, month, daysInMonth, totalAssets, ownerId, rng);
assets.sort((a, b) => DateTime.fromISO(b.localDateTime).diff(DateTime.fromISO(a.localDateTime)).milliseconds);
return assets;
}
/**
* Main generator function for timeline data
*/
export function generateTimelineData(config: TimelineConfig): MockTimelineData {
validateTimelineConfig(config);
const buckets = new Map<string, MockTimelineAsset[]>();
const monthStats: Record<string, { count: number; distribution: MonthDistribution; pattern: DayPattern }> = {};
const globalRng = new SeededRandom(config.seed || GENERATION_CONSTANTS.DEFAULT_SEED);
faker.seed(globalRng.nextInt(0, 1_000_000));
for (const monthConfig of config.months) {
const { year, month, distribution, pattern } = monthConfig;
const monthSeed = globalRng.nextInt(0, 1_000_000);
const monthRng = new SeededRandom(monthSeed);
const monthAssets = generateMonthAssets(
year,
month,
config.ownerId || generateUUID(),
distribution,
pattern,
monthRng,
);
if (monthAssets.length > 0) {
const monthKey = `${year}-${month.toString().padStart(2, '0')}`;
monthStats[monthKey] = {
count: monthAssets.length,
distribution,
pattern,
};
// Create bucket key (YYYY-MM-01)
const bucketKey = `${year}-${month.toString().padStart(2, '0')}-01`;
buckets.set(bucketKey, monthAssets);
}
}
// Create a mock album from random assets
const allAssets = [...buckets.values()].flat();
// Select 10-30 random assets for the album (or all assets if less than 10)
const albumSize = Math.min(allAssets.length, globalRng.nextInt(10, 31));
const selectedAssetConfigs: MockTimelineAsset[] = [];
const usedIndices = new Set<number>();
while (selectedAssetConfigs.length < albumSize && usedIndices.size < allAssets.length) {
const randomIndex = globalRng.nextInt(0, allAssets.length);
if (!usedIndices.has(randomIndex)) {
usedIndices.add(randomIndex);
selectedAssetConfigs.push(allAssets[randomIndex]);
}
}
// Sort selected assets by date (newest first)
selectedAssetConfigs.sort(
(a, b) => DateTime.fromISO(b.localDateTime).diff(DateTime.fromISO(a.localDateTime)).milliseconds,
);
const selectedAssets = selectedAssetConfigs.map((asset) => asset.id);
const now = new Date().toISOString();
const album = {
id: generateUUID(),
albumName: 'Test Album',
description: 'A mock album for testing',
assetIds: selectedAssets,
thumbnailAssetId: selectedAssets.length > 0 ? selectedAssets[0] : null,
createdAt: now,
updatedAt: now,
};
// Write to file if configured
if (config.writeToFile) {
const outputPath = config.outputPath || '/tmp/timeline-data.json';
// Convert Map to object for serialization
const serializedData: SerializedTimelineData = {
buckets: Object.fromEntries(buckets),
album,
};
try {
writeFileSync(outputPath, JSON.stringify(serializedData, null, 2));
console.log(`Timeline data written to ${outputPath}`);
} catch (error) {
console.error(`Failed to write timeline data to ${outputPath}:`, error);
}
}
return { buckets, album };
}
@@ -0,0 +1,436 @@
/**
* REST API output functions for converting timeline data to API response formats
*/
import {
AssetTypeEnum,
AssetVisibility,
UserAvatarColor,
type AlbumResponseDto,
type AssetResponseDto,
type ExifResponseDto,
type TimeBucketAssetResponseDto,
type TimeBucketsResponseDto,
type UserResponseDto,
} from '@immich/sdk';
import { DateTime } from 'luxon';
import { signupDto } from 'src/fixtures';
import { parseTimeBucketKey } from 'src/generators/timeline/utils';
import type { MockTimelineAsset, MockTimelineData } from './timeline-config';
/**
* Convert timeline/asset models to columnar format (parallel arrays)
*/
export function toColumnarFormat(assets: MockTimelineAsset[]): TimeBucketAssetResponseDto {
const result: TimeBucketAssetResponseDto = {
id: [],
ownerId: [],
ratio: [],
thumbhash: [],
fileCreatedAt: [],
localOffsetHours: [],
isFavorite: [],
isTrashed: [],
isImage: [],
duration: [],
projectionType: [],
livePhotoVideoId: [],
city: [],
country: [],
visibility: [],
};
for (const asset of assets) {
result.id.push(asset.id);
result.ownerId.push(asset.ownerId);
result.ratio.push(asset.ratio);
result.thumbhash.push(asset.thumbhash);
result.fileCreatedAt.push(asset.fileCreatedAt);
result.localOffsetHours.push(0); // Assuming UTC for mocks
result.isFavorite.push(asset.isFavorite);
result.isTrashed.push(asset.isTrashed);
result.isImage.push(asset.isImage);
result.duration.push(asset.duration);
result.projectionType.push(asset.projectionType);
result.livePhotoVideoId.push(asset.livePhotoVideoId);
result.city.push(asset.city);
result.country.push(asset.country);
result.visibility.push(asset.visibility);
}
if (assets.some((a) => a.latitude !== null || a.longitude !== null)) {
result.latitude = assets.map((a) => a.latitude);
result.longitude = assets.map((a) => a.longitude);
}
result.stack = assets.map(() => null);
return result;
}
/**
* Extract a single bucket from timeline data (mimics getTimeBucket API)
* Automatically handles both ISO timestamp and simple month formats
* Returns data in columnar format matching the actual API
* When albumId is provided, only returns assets from that album
*/
export function getTimeBucket(
timelineData: MockTimelineData,
timeBucket: string,
isTrashed: boolean | undefined,
isArchived: boolean | undefined,
isFavorite: boolean | undefined,
albumId: string | undefined,
changes: Changes,
): TimeBucketAssetResponseDto {
const bucketKey = parseTimeBucketKey(timeBucket);
let assets = timelineData.buckets.get(bucketKey);
if (!assets) {
return toColumnarFormat([]);
}
// Create sets for quick lookups
const deletedAssetIds = new Set(changes.assetDeletions);
const archivedAssetIds = new Set(changes.assetArchivals);
const favoritedAssetIds = new Set(changes.assetFavorites);
// Filter assets based on trashed/archived status
assets = assets.filter((asset) =>
shouldIncludeAsset(asset, isTrashed, isArchived, isFavorite, deletedAssetIds, archivedAssetIds, favoritedAssetIds),
);
// Filter to only include assets from the specified album
if (albumId) {
const album = timelineData.album;
if (!album || album.id !== albumId) {
return toColumnarFormat([]);
}
// Create a Set for faster lookup
const albumAssetIds = new Set([...album.assetIds, ...changes.albumAdditions]);
assets = assets.filter((asset) => albumAssetIds.has(asset.id));
}
// Override properties for assets in changes arrays
const assetsWithOverrides = assets.map((asset) => {
if (deletedAssetIds.has(asset.id) || archivedAssetIds.has(asset.id) || favoritedAssetIds.has(asset.id)) {
return {
...asset,
isFavorite: favoritedAssetIds.has(asset.id) ? true : asset.isFavorite,
isTrashed: deletedAssetIds.has(asset.id) ? true : asset.isTrashed,
visibility: archivedAssetIds.has(asset.id) ? AssetVisibility.Archive : asset.visibility,
};
}
return asset;
});
return toColumnarFormat(assetsWithOverrides);
}
export type Changes = {
// ids of assets that are newly added to the album
albumAdditions: string[];
// ids of assets that are newly deleted
assetDeletions: string[];
// ids of assets that are newly archived
assetArchivals: string[];
// ids of assets that are newly favorited
assetFavorites: string[];
};
/**
* Helper function to determine if an asset should be included based on filter criteria
* @param asset - The asset to check
* @param isTrashed - Filter for trashed status (undefined means no filter)
* @param isArchived - Filter for archived status (undefined means no filter)
* @param isFavorite - Filter for favorite status (undefined means no filter)
* @param deletedAssetIds - Set of IDs for assets that have been deleted
* @param archivedAssetIds - Set of IDs for assets that have been archived
* @param favoritedAssetIds - Set of IDs for assets that have been favorited
* @returns true if the asset matches all filter criteria
*/
function shouldIncludeAsset(
asset: MockTimelineAsset,
isTrashed: boolean | undefined,
isArchived: boolean | undefined,
isFavorite: boolean | undefined,
deletedAssetIds: Set<string>,
archivedAssetIds: Set<string>,
favoritedAssetIds: Set<string>,
): boolean {
// Determine actual status (property or in changes)
const actuallyTrashed = asset.isTrashed || deletedAssetIds.has(asset.id);
const actuallyArchived = asset.visibility === 'archive' || archivedAssetIds.has(asset.id);
const actuallyFavorited = asset.isFavorite || favoritedAssetIds.has(asset.id);
// Apply filters
if (isTrashed !== undefined && actuallyTrashed !== isTrashed) {
return false;
}
if (isArchived !== undefined && actuallyArchived !== isArchived) {
return false;
}
if (isFavorite !== undefined && actuallyFavorited !== isFavorite) {
return false;
}
return true;
}
/**
* Get summary for all buckets (mimics getTimeBuckets API)
* When albumId is provided, only includes buckets that contain assets from that album
*/
export function getTimeBuckets(
timelineData: MockTimelineData,
isTrashed: boolean | undefined,
isArchived: boolean | undefined,
isFavorite: boolean | undefined,
albumId: string | undefined,
changes: Changes,
): TimeBucketsResponseDto[] {
const summary: TimeBucketsResponseDto[] = [];
// Create sets for quick lookups
const deletedAssetIds = new Set(changes.assetDeletions);
const archivedAssetIds = new Set(changes.assetArchivals);
const favoritedAssetIds = new Set(changes.assetFavorites);
// If no albumId is specified, return summary for all assets
if (albumId) {
// Filter to only include buckets with assets from the specified album
const album = timelineData.album;
if (!album || album.id !== albumId) {
return [];
}
// Create a Set for faster lookup
const albumAssetIds = new Set([...album.assetIds, ...changes.albumAdditions]);
for (const removed of changes.assetDeletions) {
albumAssetIds.delete(removed);
}
for (const [bucketKey, assets] of timelineData.buckets) {
// Count how many assets in this bucket are in the album and match trashed/archived filters
const albumAssetsInBucket = assets.filter((asset) => {
// Must be in the album
if (!albumAssetIds.has(asset.id)) {
return false;
}
return shouldIncludeAsset(
asset,
isTrashed,
isArchived,
isFavorite,
deletedAssetIds,
archivedAssetIds,
favoritedAssetIds,
);
});
if (albumAssetsInBucket.length > 0) {
summary.push({
timeBucket: bucketKey,
count: albumAssetsInBucket.length,
});
}
}
} else {
for (const [bucketKey, assets] of timelineData.buckets) {
// Filter assets based on trashed/archived status
const filteredAssets = assets.filter((asset) =>
shouldIncludeAsset(
asset,
isTrashed,
isArchived,
isFavorite,
deletedAssetIds,
archivedAssetIds,
favoritedAssetIds,
),
);
if (filteredAssets.length > 0) {
summary.push({
timeBucket: bucketKey,
count: filteredAssets.length,
});
}
}
}
// Sort summary by date (newest first) using luxon
summary.sort((a, b) => {
const dateA = DateTime.fromISO(a.timeBucket);
const dateB = DateTime.fromISO(b.timeBucket);
return dateB.diff(dateA).milliseconds;
});
return summary;
}
const createDefaultOwner = (ownerId: string) => {
const defaultOwner: UserResponseDto = {
id: ownerId,
email: signupDto.admin.email,
name: signupDto.admin.name,
profileImagePath: '',
profileChangedAt: new Date().toISOString(),
avatarColor: UserAvatarColor.Blue,
};
return defaultOwner;
};
/**
* Convert a TimelineAssetConfig to a full AssetResponseDto
* This matches the response from GET /api/assets/:id
*/
export function toAssetResponseDto(asset: MockTimelineAsset, owner?: UserResponseDto): AssetResponseDto {
const now = new Date().toISOString();
// Default owner if not provided
const defaultOwner = createDefaultOwner(asset.ownerId);
const exifInfo: ExifResponseDto = {
make: null,
model: null,
exifImageWidth: asset.ratio > 1 ? 4000 : 3000,
exifImageHeight: asset.ratio > 1 ? Math.round(4000 / asset.ratio) : Math.round(3000 * asset.ratio),
fileSizeInByte: asset.fileSizeInByte,
orientation: '1',
dateTimeOriginal: asset.fileCreatedAt,
modifyDate: asset.fileCreatedAt,
timeZone: asset.latitude === null ? null : 'UTC',
lensModel: null,
fNumber: null,
focalLength: null,
iso: null,
exposureTime: null,
latitude: asset.latitude,
longitude: asset.longitude,
city: asset.city,
country: asset.country,
state: null,
description: null,
};
return {
id: asset.id,
deviceAssetId: `device-${asset.id}`,
ownerId: asset.ownerId,
owner: owner || defaultOwner,
libraryId: `library-${asset.ownerId}`,
deviceId: `device-${asset.ownerId}`,
type: asset.isVideo ? AssetTypeEnum.Video : AssetTypeEnum.Image,
originalPath: `/original/${asset.id}.${asset.isVideo ? 'mp4' : 'jpg'}`,
originalFileName: `${asset.id}.${asset.isVideo ? 'mp4' : 'jpg'}`,
originalMimeType: asset.isVideo ? 'video/mp4' : 'image/jpeg',
thumbhash: asset.thumbhash,
fileCreatedAt: asset.fileCreatedAt,
fileModifiedAt: asset.fileCreatedAt,
localDateTime: asset.localDateTime,
updatedAt: now,
createdAt: asset.fileCreatedAt,
isFavorite: asset.isFavorite,
isArchived: false,
isTrashed: asset.isTrashed,
visibility: asset.visibility,
duration: asset.duration || '0:00:00.00000',
exifInfo,
livePhotoVideoId: asset.livePhotoVideoId,
tags: [],
people: [],
unassignedFaces: [],
stack: asset.stack,
isOffline: false,
hasMetadata: true,
duplicateId: null,
resized: true,
checksum: asset.checksum,
};
}
/**
* Get a single asset by ID from timeline data
* This matches the response from GET /api/assets/:id
*/
export function getAsset(
timelineData: MockTimelineData,
assetId: string,
owner?: UserResponseDto,
): AssetResponseDto | undefined {
// Search through all buckets for the asset
const buckets = [...timelineData.buckets.values()];
for (const assets of buckets) {
const asset = assets.find((a) => a.id === assetId);
if (asset) {
return toAssetResponseDto(asset, owner);
}
}
return undefined;
}
/**
* Get a mock album from timeline data
* This matches the response from GET /api/albums/:id
*/
export function getAlbum(
timelineData: MockTimelineData,
ownerId: string,
albumId: string | undefined,
changes: Changes,
): AlbumResponseDto | undefined {
if (!timelineData.album) {
return undefined;
}
// If albumId is provided and doesn't match, return undefined
if (albumId && albumId !== timelineData.album.id) {
return undefined;
}
const album = timelineData.album;
const albumOwner = createDefaultOwner(ownerId);
// Get the actual asset objects from the timeline data
const albumAssets: AssetResponseDto[] = [];
const allAssets = [...timelineData.buckets.values()].flat();
for (const assetId of album.assetIds) {
const assetConfig = allAssets.find((a) => a.id === assetId);
if (assetConfig) {
albumAssets.push(toAssetResponseDto(assetConfig, albumOwner));
}
}
for (const assetId of changes.albumAdditions ?? []) {
const assetConfig = allAssets.find((a) => a.id === assetId);
if (assetConfig) {
albumAssets.push(toAssetResponseDto(assetConfig, albumOwner));
}
}
albumAssets.sort((a, b) => DateTime.fromISO(b.localDateTime).diff(DateTime.fromISO(a.localDateTime)).milliseconds);
// For a basic mock album, we don't include any albumUsers (shared users)
// The owner is represented by the owner field, not in albumUsers
const response: AlbumResponseDto = {
id: album.id,
albumName: album.albumName,
description: album.description,
albumThumbnailAssetId: album.thumbnailAssetId,
createdAt: album.createdAt,
updatedAt: album.updatedAt,
ownerId: albumOwner.id,
owner: albumOwner,
albumUsers: [], // Empty array for non-shared album
shared: false,
hasSharedLink: false,
isActivityEnabled: true,
assetCount: albumAssets.length,
assets: albumAssets,
startDate: albumAssets.length > 0 ? albumAssets.at(-1)?.fileCreatedAt : undefined,
endDate: albumAssets.length > 0 ? albumAssets[0].fileCreatedAt : undefined,
lastModifiedAssetTimestamp: albumAssets.length > 0 ? albumAssets[0].fileCreatedAt : undefined,
};
return response;
}
@@ -0,0 +1,200 @@
import type { AssetVisibility } from '@immich/sdk';
import { DayPattern, MonthDistribution } from 'src/generators/timeline/distribution-patterns';
// Constants for generation parameters
export const GENERATION_CONSTANTS = {
VIDEO_PROBABILITY: 0.15, // 15% of assets are videos
GPS_PERCENTAGE: 0.7, // 70% of assets have GPS data
FAVORITE_PROBABILITY: 0.1, // 10% of assets are favorited
MIN_VIDEO_DURATION_SECONDS: 5,
MAX_VIDEO_DURATION_SECONDS: 300,
DEFAULT_SEED: 12_345,
DEFAULT_OWNER_ID: 'user-1',
MAX_SELECT_ATTEMPTS: 10,
SPARSE_DAY_COVERAGE: 0.4, // 40% of days have photos in sparse pattern
} as const;
// Aspect ratio distribution weights (must sum to 1)
export const ASPECT_RATIO_WEIGHTS = {
'4:3': 0.35, // 35% 4:3 landscape
'3:2': 0.25, // 25% 3:2 landscape
'16:9': 0.2, // 20% 16:9 landscape
'2:3': 0.1, // 10% 2:3 portrait
'1:1': 0.09, // 9% 1:1 square
'3:1': 0.01, // 1% 3:1 panorama
} as const;
export type AspectRatio = {
width: number;
height: number;
ratio: number;
name: string;
};
// Mock configuration for asset generation - will be transformed to API response formats
export type MockTimelineAsset = {
id: string;
ownerId: string;
ratio: number;
thumbhash: string | null;
localDateTime: string;
fileCreatedAt: string;
isFavorite: boolean;
isTrashed: boolean;
isVideo: boolean;
isImage: boolean;
duration: string | null;
projectionType: string | null;
livePhotoVideoId: string | null;
city: string | null;
country: string | null;
people: string[] | null;
latitude: number | null;
longitude: number | null;
visibility: AssetVisibility;
stack: null;
checksum: string;
fileSizeInByte: number;
};
export type MonthSpec = {
year: number;
month: number; // 1-12
distribution: MonthDistribution;
pattern: DayPattern;
};
/**
* Configuration for timeline data generation
*/
export type TimelineConfig = {
ownerId?: string;
months: MonthSpec[];
seed?: number;
writeToFile?: boolean;
outputPath?: string;
};
export type MockAlbum = {
id: string;
albumName: string;
description: string;
assetIds: string[]; // IDs of assets in the album
thumbnailAssetId: string | null;
createdAt: string;
updatedAt: string;
};
export type MockTimelineData = {
buckets: Map<string, MockTimelineAsset[]>;
album: MockAlbum; // Mock album created from random assets
};
export type SerializedTimelineData = {
buckets: Record<string, MockTimelineAsset[]>;
album: MockAlbum;
};
/**
* Validates a TimelineConfig object to ensure all values are within expected ranges
*/
export function validateTimelineConfig(config: TimelineConfig): void {
if (!config.months || config.months.length === 0) {
throw new Error('TimelineConfig must contain at least one month');
}
const seenMonths = new Set<string>();
for (const month of config.months) {
if (month.month < 1 || month.month > 12) {
throw new Error(`Invalid month: ${month.month}. Must be between 1 and 12`);
}
if (month.year < 1900 || month.year > 2100) {
throw new Error(`Invalid year: ${month.year}. Must be between 1900 and 2100`);
}
const monthKey = `${month.year}-${month.month}`;
if (seenMonths.has(monthKey)) {
throw new Error(`Duplicate month found: ${monthKey}`);
}
seenMonths.add(monthKey);
// Validate distribution if provided
if (month.distribution && !['empty', 'sparse', 'medium', 'dense', 'very-dense'].includes(month.distribution)) {
throw new Error(
`Invalid distribution: ${month.distribution}. Must be one of: empty, sparse, medium, dense, very-dense`,
);
}
const validPatterns = [
'single-day',
'consecutive-large',
'consecutive-small',
'alternating',
'sparse-scattered',
'start-heavy',
'end-heavy',
'mid-heavy',
];
if (month.pattern && !validPatterns.includes(month.pattern)) {
throw new Error(`Invalid pattern: ${month.pattern}. Must be one of: ${validPatterns.join(', ')}`);
}
}
// Validate seed if provided
if (config.seed !== undefined && (config.seed < 0 || !Number.isInteger(config.seed))) {
throw new Error('Seed must be a non-negative integer');
}
// Validate ownerId if provided
if (config.ownerId !== undefined && config.ownerId.trim() === '') {
throw new Error('Owner ID cannot be an empty string');
}
}
/**
* Create a default timeline configuration
*/
export function createDefaultTimelineConfig(): TimelineConfig {
const months: MonthSpec[] = [
// 2024 - Mix of patterns
{ year: 2024, month: 12, distribution: 'very-dense', pattern: 'alternating' },
{ year: 2024, month: 11, distribution: 'dense', pattern: 'consecutive-large' },
{ year: 2024, month: 10, distribution: 'medium', pattern: 'mid-heavy' },
{ year: 2024, month: 9, distribution: 'sparse', pattern: 'consecutive-small' },
{ year: 2024, month: 8, distribution: 'empty', pattern: 'single-day' },
{ year: 2024, month: 7, distribution: 'dense', pattern: 'start-heavy' },
{ year: 2024, month: 6, distribution: 'medium', pattern: 'sparse-scattered' },
{ year: 2024, month: 5, distribution: 'sparse', pattern: 'single-day' },
{ year: 2024, month: 4, distribution: 'very-dense', pattern: 'consecutive-large' },
{ year: 2024, month: 3, distribution: 'empty', pattern: 'single-day' },
{ year: 2024, month: 2, distribution: 'medium', pattern: 'end-heavy' },
{ year: 2024, month: 1, distribution: 'dense', pattern: 'alternating' },
// 2023 - Testing year boundaries and more patterns
{ year: 2023, month: 12, distribution: 'very-dense', pattern: 'end-heavy' },
{ year: 2023, month: 11, distribution: 'sparse', pattern: 'consecutive-small' },
{ year: 2023, month: 10, distribution: 'empty', pattern: 'single-day' },
{ year: 2023, month: 9, distribution: 'medium', pattern: 'alternating' },
{ year: 2023, month: 8, distribution: 'dense', pattern: 'mid-heavy' },
{ year: 2023, month: 7, distribution: 'sparse', pattern: 'sparse-scattered' },
{ year: 2023, month: 6, distribution: 'medium', pattern: 'consecutive-large' },
{ year: 2023, month: 5, distribution: 'empty', pattern: 'single-day' },
{ year: 2023, month: 4, distribution: 'sparse', pattern: 'single-day' },
{ year: 2023, month: 3, distribution: 'dense', pattern: 'start-heavy' },
{ year: 2023, month: 2, distribution: 'medium', pattern: 'alternating' },
{ year: 2023, month: 1, distribution: 'very-dense', pattern: 'consecutive-large' },
];
for (let year = 2022; year >= 2000; year--) {
for (let month = 12; month >= 1; month--) {
months.push({ year, month, distribution: 'medium', pattern: 'sparse-scattered' });
}
}
return {
months,
seed: 42,
};
}
+186
View File
@@ -0,0 +1,186 @@
import { DateTime } from 'luxon';
import { GENERATION_CONSTANTS, MockTimelineAsset } from 'src/generators/timeline/timeline-config';
/**
* Linear Congruential Generator for deterministic pseudo-random numbers
*/
export class SeededRandom {
private seed: number;
constructor(seed: number) {
this.seed = seed;
}
/**
* Generate next random number in range [0, 1)
*/
next(): number {
// LCG parameters from Numerical Recipes
this.seed = (this.seed * 1_664_525 + 1_013_904_223) % 2_147_483_647;
return this.seed / 2_147_483_647;
}
/**
* Generate random integer in range [min, max)
*/
nextInt(min: number, max: number): number {
return Math.floor(this.next() * (max - min)) + min;
}
/**
* Generate random boolean with given probability
*/
nextBoolean(probability = 0.5): boolean {
return this.next() < probability;
}
}
/**
* Select random days using seed variation to avoid collisions.
*
* @param daysInMonth - Total number of days in the month
* @param numDays - Number of days to select
* @param rng - Random number generator instance
* @returns Array of selected day numbers, sorted in descending order
*/
export function selectRandomDays(daysInMonth: number, numDays: number, rng: SeededRandom): number[] {
const selectedDays = new Set<number>();
const maxAttempts = numDays * GENERATION_CONSTANTS.MAX_SELECT_ATTEMPTS; // Safety limit
let attempts = 0;
while (selectedDays.size < numDays && attempts < maxAttempts) {
const day = rng.nextInt(1, daysInMonth + 1);
selectedDays.add(day);
attempts++;
}
// Fallback: if we couldn't select enough random days, fill with sequential days
if (selectedDays.size < numDays) {
for (let day = 1; day <= daysInMonth && selectedDays.size < numDays; day++) {
selectedDays.add(day);
}
}
return [...selectedDays].toSorted((a, b) => b - a);
}
/**
* Select item from array using seeded random
*/
export function selectRandom<T>(arr: T[], rng: SeededRandom): T {
if (arr.length === 0) {
throw new Error('Cannot select from empty array');
}
const index = rng.nextInt(0, arr.length);
return arr[index];
}
/**
* Select multiple random items from array using seeded random without duplicates
*/
export function selectRandomMultiple<T>(arr: T[], count: number, rng: SeededRandom): T[] {
if (arr.length === 0) {
throw new Error('Cannot select from empty array');
}
if (count < 0) {
throw new Error('Count must be non-negative');
}
if (count > arr.length) {
throw new Error('Count cannot exceed array length');
}
const result: T[] = [];
const selectedIndices = new Set<number>();
while (result.length < count) {
const index = rng.nextInt(0, arr.length);
if (!selectedIndices.has(index)) {
selectedIndices.add(index);
result.push(arr[index]);
}
}
return result;
}
/**
* Parse timeBucket parameter to extract year-month key
* Handles both formats:
* - ISO timestamp: "2024-12-01T00:00:00.000Z" -> "2024-12-01"
* - Simple format: "2024-12-01" -> "2024-12-01"
*/
export function parseTimeBucketKey(timeBucket: string): string {
if (!timeBucket) {
throw new Error('timeBucket parameter cannot be empty');
}
const dt = DateTime.fromISO(timeBucket, { zone: 'utc' });
if (!dt.isValid) {
// Fallback to regex if not a valid ISO string
const match = timeBucket.match(/^(\d{4}-\d{2}-\d{2})/);
return match ? match[1] : timeBucket;
}
// Format as YYYY-MM-01 (first day of month)
return `${dt.year}-${String(dt.month).padStart(2, '0')}-01`;
}
export function getMockAsset(
asset: MockTimelineAsset,
sortedDescendingAssets: MockTimelineAsset[],
direction: 'next' | 'previous',
unit: 'day' | 'month' | 'year' = 'day',
): MockTimelineAsset | null {
const currentDateTime = DateTime.fromISO(asset.localDateTime, { zone: 'utc' });
const currentIndex = sortedDescendingAssets.findIndex((a) => a.id === asset.id);
if (currentIndex === -1) {
return null;
}
const step = direction === 'next' ? 1 : -1;
const startIndex = currentIndex + step;
if (direction === 'next' && currentIndex >= sortedDescendingAssets.length - 1) {
return null;
}
if (direction === 'previous' && currentIndex <= 0) {
return null;
}
const isInDifferentPeriod = (date1: DateTime, date2: DateTime): boolean => {
if (unit === 'day') {
return !date1.startOf('day').equals(date2.startOf('day'));
} else if (unit === 'month') {
return date1.year !== date2.year || date1.month !== date2.month;
} else {
return date1.year !== date2.year;
}
};
if (direction === 'next') {
// Search forward in array (backwards in time)
for (let i = startIndex; i < sortedDescendingAssets.length; i++) {
const nextAsset = sortedDescendingAssets[i];
const nextDate = DateTime.fromISO(nextAsset.localDateTime, { zone: 'utc' });
if (isInDifferentPeriod(nextDate, currentDateTime)) {
return nextAsset;
}
}
} else {
// Search backward in array (forwards in time)
for (let i = startIndex; i >= 0; i--) {
const prevAsset = sortedDescendingAssets[i];
const prevDate = DateTime.fromISO(prevAsset.localDateTime, { zone: 'utc' });
if (isInDifferentPeriod(prevDate, currentDateTime)) {
return prevAsset;
}
}
}
return null;
}
+285
View File
@@ -0,0 +1,285 @@
import { BrowserContext } from '@playwright/test';
import { playwrightHost } from 'playwright.config';
export const setupBaseMockApiRoutes = async (context: BrowserContext, adminUserId: string) => {
await context.addCookies([
{
name: 'immich_is_authenticated',
value: 'true',
domain: playwrightHost,
path: '/',
},
]);
await context.route('**/api/users/me', async (route) => {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: {
id: adminUserId,
email: 'admin@immich.cloud',
name: 'Immich Admin',
profileImagePath: '',
avatarColor: 'orange',
profileChangedAt: '2025-01-22T21:31:23.996Z',
storageLabel: 'admin',
shouldChangePassword: true,
isAdmin: true,
createdAt: '2025-01-22T21:31:23.996Z',
deletedAt: null,
updatedAt: '2025-11-14T00:00:00.369Z',
oauthId: '',
quotaSizeInBytes: null,
quotaUsageInBytes: 20_849_000_159,
status: 'active',
license: null,
},
});
});
await context.route('**/users/me/preferences', async (route) => {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: {
albums: {
defaultAssetOrder: 'desc',
},
folders: {
enabled: false,
sidebarWeb: false,
},
memories: {
enabled: true,
duration: 5,
},
people: {
enabled: true,
sidebarWeb: false,
},
sharedLinks: {
enabled: true,
sidebarWeb: false,
},
ratings: {
enabled: false,
},
tags: {
enabled: false,
sidebarWeb: false,
},
emailNotifications: {
enabled: true,
albumInvite: true,
albumUpdate: true,
},
download: {
archiveSize: 4_294_967_296,
includeEmbeddedVideos: false,
},
purchase: {
showSupportBadge: true,
hideBuyButtonUntil: '2100-02-12T00:00:00.000Z',
},
cast: {
gCastEnabled: false,
},
},
});
});
await context.route('**/server/about', async (route) => {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: {
version: 'v2.2.3',
versionUrl: 'https://github.com/immich-app/immich/releases/tag/v2.2.3',
licensed: false,
build: '1234567890',
buildUrl: 'https://github.com/immich-app/immich/actions/runs/1234567890',
buildImage: 'e2e',
buildImageUrl: 'https://github.com/immich-app/immich/pkgs/container/immich-server',
repository: 'immich-app/immich',
repositoryUrl: 'https://github.com/immich-app/immich',
sourceRef: 'e2e',
sourceCommit: 'e2eeeeeeeeeeeeeeeeee',
sourceUrl: 'https://github.com/immich-app/immich/commit/e2eeeeeeeeeeeeeeeeee',
nodejs: 'v22.18.0',
exiftool: '13.41',
ffmpeg: '7.1.1-6',
libvips: '8.17.2',
imagemagick: '7.1.2-2',
},
});
});
await context.route('**/api/server/features', async (route) => {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: {
smartSearch: false,
facialRecognition: false,
duplicateDetection: false,
map: true,
reverseGeocoding: true,
importFaces: false,
sidecar: true,
search: true,
trash: true,
oauth: false,
oauthAutoLaunch: false,
ocr: false,
passwordLogin: true,
configFile: false,
email: false,
},
});
});
await context.route('**/api/server/config', async (route) => {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: {
loginPageMessage: '',
trashDays: 30,
userDeleteDelay: 7,
oauthButtonText: 'Login with OAuth',
isInitialized: true,
isOnboarded: true,
externalDomain: '',
publicUsers: true,
mapDarkStyleUrl: 'https://tiles.immich.cloud/v1/style/dark.json',
mapLightStyleUrl: 'https://tiles.immich.cloud/v1/style/light.json',
maintenanceMode: false,
},
});
});
await context.route('**/api/server/media-types', async (route) => {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: {
video: [
'.3gp',
'.3gpp',
'.avi',
'.flv',
'.insv',
'.m2t',
'.m2ts',
'.m4v',
'.mkv',
'.mov',
'.mp4',
'.mpe',
'.mpeg',
'.mpg',
'.mts',
'.vob',
'.webm',
'.wmv',
],
image: [
'.3fr',
'.ari',
'.arw',
'.cap',
'.cin',
'.cr2',
'.cr3',
'.crw',
'.dcr',
'.dng',
'.erf',
'.fff',
'.iiq',
'.k25',
'.kdc',
'.mrw',
'.nef',
'.nrw',
'.orf',
'.ori',
'.pef',
'.psd',
'.raf',
'.raw',
'.rw2',
'.rwl',
'.sr2',
'.srf',
'.srw',
'.x3f',
'.avif',
'.gif',
'.jpeg',
'.jpg',
'.png',
'.webp',
'.bmp',
'.heic',
'.heif',
'.hif',
'.insp',
'.jp2',
'.jpe',
'.jxl',
'.svg',
'.tif',
'.tiff',
],
sidecar: ['.xmp'],
},
});
});
await context.route('**/api/notifications*', async (route) => {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: [],
});
});
await context.route('**/api/albums*', async (route, request) => {
if (request.url().endsWith('albums?shared=true') || request.url().endsWith('albums')) {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: [],
});
}
await route.fallback();
});
await context.route('**/api/memories*', async (route) => {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: [],
});
});
await context.route('**/api/server/storage', async (route) => {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: {
diskSize: '100.0 GiB',
diskUse: '74.4 GiB',
diskAvailable: '25.6 GiB',
diskSizeRaw: 107_374_182_400,
diskUseRaw: 79_891_660_800,
diskAvailableRaw: 27_482_521_600,
diskUsagePercentage: 74.4,
},
});
});
await context.route('**/api/server/version-history', async (route) => {
return route.fulfill({
status: 200,
contentType: 'application/json',
json: [
{
id: 'd1fbeadc-cb4f-4db3-8d19-8c6a921d5d8e',
createdAt: '2025-11-15T20:14:01.935Z',
version: '2.2.3',
},
],
});
});
};
+149
View File
@@ -0,0 +1,149 @@
import { BrowserContext, Page, Request, Route } from '@playwright/test';
import { basename } from 'node:path';
import {
Changes,
getAlbum,
getAsset,
getTimeBucket,
getTimeBuckets,
randomPreview,
randomThumbnail,
TimelineData,
} from 'src/generators/timeline';
import { sleep } from 'src/web/specs/timeline/utils';
export class TimelineTestContext {
slowBucket = false;
adminId = '';
}
export const setupTimelineMockApiRoutes = async (
context: BrowserContext,
timelineRestData: TimelineData,
changes: Changes,
testContext: TimelineTestContext,
) => {
await context.route('**/api/timeline**', async (route, request) => {
const url = new URL(request.url());
const pathname = url.pathname;
if (pathname === '/api/timeline/buckets') {
const albumId = url.searchParams.get('albumId') || undefined;
const isTrashed = url.searchParams.get('isTrashed') ? url.searchParams.get('isTrashed') === 'true' : undefined;
const isFavorite = url.searchParams.get('isFavorite') ? url.searchParams.get('isFavorite') === 'true' : undefined;
const isArchived = url.searchParams.get('visibility')
? url.searchParams.get('visibility') === 'archive'
: undefined;
return route.fulfill({
status: 200,
contentType: 'application/json',
json: getTimeBuckets(timelineRestData, isTrashed, isArchived, isFavorite, albumId, changes),
});
} else if (pathname === '/api/timeline/bucket') {
const timeBucket = url.searchParams.get('timeBucket');
if (!timeBucket) {
return route.continue();
}
const isTrashed = url.searchParams.get('isTrashed') ? url.searchParams.get('isTrashed') === 'true' : undefined;
const isArchived = url.searchParams.get('visibility')
? url.searchParams.get('visibility') === 'archive'
: undefined;
const isFavorite = url.searchParams.get('isFavorite') ? url.searchParams.get('isFavorite') === 'true' : undefined;
const albumId = url.searchParams.get('albumId') || undefined;
const assets = getTimeBucket(timelineRestData, timeBucket, isTrashed, isArchived, isFavorite, albumId, changes);
if (testContext.slowBucket) {
await sleep(5000);
}
return route.fulfill({
status: 200,
contentType: 'application/json',
json: assets,
});
}
return route.continue();
});
await context.route('**/api/assets/*', async (route, request) => {
const url = new URL(request.url());
const pathname = url.pathname;
const assetId = basename(pathname);
const asset = getAsset(timelineRestData, assetId);
return route.fulfill({
status: 200,
contentType: 'application/json',
json: asset,
});
});
await context.route('**/api/assets/*/ocr', async (route) => {
return route.fulfill({ status: 200, contentType: 'application/json', json: [] });
});
await context.route('**/api/assets/*/thumbnail?size=*', async (route, request) => {
const pattern = /\/api\/assets\/(?<assetId>[^/]+)\/thumbnail\?size=(?<size>preview|thumbnail)/;
const match = request.url().match(pattern);
if (!match?.groups) {
throw new Error(`Invalid URL for thumbnail endpoint: ${request.url()}`);
}
if (match.groups.size === 'preview') {
if (!route.request().serviceWorker()) {
return route.continue();
}
const asset = getAsset(timelineRestData, match.groups.assetId);
return route.fulfill({
status: 200,
headers: { 'content-type': 'image/jpeg', ETag: 'abc123', 'Cache-Control': 'public, max-age=3600' },
body: await randomPreview(
match.groups.assetId,
(asset?.exifInfo?.exifImageWidth ?? 0) / (asset?.exifInfo?.exifImageHeight ?? 1),
),
});
}
if (match.groups.size === 'thumbnail') {
if (!route.request().serviceWorker()) {
return route.continue();
}
const asset = getAsset(timelineRestData, match.groups.assetId);
return route.fulfill({
status: 200,
headers: { 'content-type': 'image/jpeg' },
body: await randomThumbnail(
match.groups.assetId,
(asset?.exifInfo?.exifImageWidth ?? 0) / (asset?.exifInfo?.exifImageHeight ?? 1),
),
});
}
return route.continue();
});
await context.route('**/api/albums/**', async (route, request) => {
const pattern = /\/api\/albums\/(?<albumId>[^/?]+)/;
const match = request.url().match(pattern);
if (!match) {
return route.continue();
}
const album = getAlbum(timelineRestData, testContext.adminId, match.groups?.albumId, changes);
return route.fulfill({
status: 200,
contentType: 'application/json',
json: album,
});
});
};
export const pageRoutePromise = async (
page: Page,
route: string,
callback: (route: Route, request: Request) => Promise<void>,
) => {
let resolveRequest: ((value: unknown | PromiseLike<unknown>) => void) | undefined;
const deleteRequest = new Promise((resolve) => {
resolveRequest = resolve;
});
await page.route(route, async (route, request) => {
await callback(route, request);
const requestJson = request.postDataJSON();
resolveRequest?.(requestJson);
});
return deleteRequest;
};
+10 -8
View File
@@ -12,7 +12,7 @@ import {
PersonCreateDto, PersonCreateDto,
QueueCommandDto, QueueCommandDto,
QueueName, QueueName,
QueuesResponseDto, QueuesResponseLegacyDto,
SharedLinkCreateDto, SharedLinkCreateDto,
UpdateLibraryDto, UpdateLibraryDto,
UserAdminCreateDto, UserAdminCreateDto,
@@ -54,7 +54,7 @@ import { exec, spawn } from 'node:child_process';
import { createHash } from 'node:crypto'; import { createHash } from 'node:crypto';
import { existsSync, mkdirSync, renameSync, rmSync, writeFileSync } from 'node:fs'; import { existsSync, mkdirSync, renameSync, rmSync, writeFileSync } from 'node:fs';
import { tmpdir } from 'node:os'; import { tmpdir } from 'node:os';
import path, { dirname } from 'node:path'; import { dirname, resolve } from 'node:path';
import { setTimeout as setAsyncTimeout } from 'node:timers/promises'; import { setTimeout as setAsyncTimeout } from 'node:timers/promises';
import { promisify } from 'node:util'; import { promisify } from 'node:util';
import pg from 'pg'; import pg from 'pg';
@@ -62,6 +62,8 @@ import { io, type Socket } from 'socket.io-client';
import { loginDto, signupDto } from 'src/fixtures'; import { loginDto, signupDto } from 'src/fixtures';
import { makeRandomImage } from 'src/generators'; import { makeRandomImage } from 'src/generators';
import request from 'supertest'; import request from 'supertest';
import { playwrightDbHost, playwrightHost, playwriteBaseUrl } from '../playwright.config';
export type { Emitter } from '@socket.io/component-emitter'; export type { Emitter } from '@socket.io/component-emitter';
type CommandResponse = { stdout: string; stderr: string; exitCode: number | null }; type CommandResponse = { stdout: string; stderr: string; exitCode: number | null };
@@ -70,12 +72,12 @@ type WaitOptions = { event: EventType; id?: string; total?: number; timeout?: nu
type AdminSetupOptions = { onboarding?: boolean }; type AdminSetupOptions = { onboarding?: boolean };
type FileData = { bytes?: Buffer; filename: string }; type FileData = { bytes?: Buffer; filename: string };
const dbUrl = 'postgres://postgres:postgres@127.0.0.1:5435/immich'; const dbUrl = `postgres://postgres:postgres@${playwrightDbHost}:5435/immich`;
export const baseUrl = 'http://127.0.0.1:2285'; export const baseUrl = playwriteBaseUrl;
export const shareUrl = `${baseUrl}/share`; export const shareUrl = `${baseUrl}/share`;
export const app = `${baseUrl}/api`; export const app = `${baseUrl}/api`;
// TODO move test assets into e2e/assets // TODO move test assets into e2e/assets
export const testAssetDir = path.resolve('./test-assets'); export const testAssetDir = resolve(import.meta.dirname, '../test-assets');
export const testAssetDirInternal = '/test-assets'; export const testAssetDirInternal = '/test-assets';
export const tempDir = tmpdir(); export const tempDir = tmpdir();
export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` }); export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
@@ -482,7 +484,7 @@ export const utils = {
queueCommand: async (accessToken: string, name: QueueName, queueCommandDto: QueueCommandDto) => queueCommand: async (accessToken: string, name: QueueName, queueCommandDto: QueueCommandDto) =>
runQueueCommandLegacy({ name, queueCommandDto }, { headers: asBearerAuth(accessToken) }), runQueueCommandLegacy({ name, queueCommandDto }, { headers: asBearerAuth(accessToken) }),
setAuthCookies: async (context: BrowserContext, accessToken: string, domain = '127.0.0.1') => setAuthCookies: async (context: BrowserContext, accessToken: string, domain = playwrightHost) =>
await context.addCookies([ await context.addCookies([
{ {
name: 'immich_access_token', name: 'immich_access_token',
@@ -562,13 +564,13 @@ export const utils = {
await updateConfig({ systemConfigDto: defaultConfig }, { headers: asBearerAuth(accessToken) }); await updateConfig({ systemConfigDto: defaultConfig }, { headers: asBearerAuth(accessToken) });
}, },
isQueueEmpty: async (accessToken: string, queue: keyof QueuesResponseDto) => { isQueueEmpty: async (accessToken: string, queue: keyof QueuesResponseLegacyDto) => {
const queues = await getQueuesLegacy({ headers: asBearerAuth(accessToken) }); const queues = await getQueuesLegacy({ headers: asBearerAuth(accessToken) });
const jobCounts = queues[queue].jobCounts; const jobCounts = queues[queue].jobCounts;
return !jobCounts.active && !jobCounts.waiting; return !jobCounts.active && !jobCounts.waiting;
}, },
waitForQueueFinish: (accessToken: string, queue: keyof QueuesResponseDto, ms?: number) => { waitForQueueFinish: (accessToken: string, queue: keyof QueuesResponseLegacyDto, ms?: number) => {
// eslint-disable-next-line no-async-promise-executor // eslint-disable-next-line no-async-promise-executor
return new Promise<void>(async (resolve, reject) => { return new Promise<void>(async (resolve, reject) => {
const timeout = setTimeout(() => reject(new Error('Timed out waiting for queue to empty')), ms || 10_000); const timeout = setTimeout(() => reject(new Error('Timed out waiting for queue to empty')), ms || 10_000);
+6 -7
View File
@@ -19,10 +19,9 @@ test.describe('Maintenance', () => {
await page.goto('/admin/system-settings?isOpen=maintenance'); await page.goto('/admin/system-settings?isOpen=maintenance');
await page.getByRole('button', { name: 'Start maintenance mode' }).click(); await page.getByRole('button', { name: 'Start maintenance mode' }).click();
await page.waitForURL(`/maintenance?${new URLSearchParams({ continue: '/admin/system-settings' })}`); await expect(page.getByText('Temporarily Unavailable')).toBeVisible({ timeout: 10_000 });
await expect(page.getByText('Temporarily Unavailable')).toBeVisible();
await page.getByRole('button', { name: 'End maintenance mode' }).click(); await page.getByRole('button', { name: 'End maintenance mode' }).click();
await page.waitForURL('/admin/system-settings'); await page.waitForURL('**/admin/system-settings*', { timeout: 10_000 });
}); });
test('maintenance shows no options to users until they authenticate', async ({ page }) => { test('maintenance shows no options to users until they authenticate', async ({ page }) => {
@@ -35,10 +34,10 @@ test.describe('Maintenance', () => {
await expect(async () => { await expect(async () => {
await page.goto('/'); await page.goto('/');
await page.waitForURL('/maintenance?**', { await page.waitForURL('**/maintenance?**', {
timeout: 1e3, timeout: 1000,
}); });
}).toPass({ timeout: 1e4 }); }).toPass({ timeout: 10_000 });
await expect(page.getByText('Temporarily Unavailable')).toBeVisible(); await expect(page.getByText('Temporarily Unavailable')).toBeVisible();
await expect(page.getByRole('button', { name: 'End maintenance mode' })).toHaveCount(0); await expect(page.getByRole('button', { name: 'End maintenance mode' })).toHaveCount(0);
@@ -47,6 +46,6 @@ test.describe('Maintenance', () => {
await expect(page.getByText('Temporarily Unavailable')).toBeVisible(); await expect(page.getByText('Temporarily Unavailable')).toBeVisible();
await expect(page.getByRole('button', { name: 'End maintenance mode' })).toBeVisible(); await expect(page.getByRole('button', { name: 'End maintenance mode' })).toBeVisible();
await page.getByRole('button', { name: 'End maintenance mode' }).click(); await page.getByRole('button', { name: 'End maintenance mode' }).click();
await page.waitForURL('/auth/login'); await page.waitForURL('**/auth/login');
}); });
}); });
@@ -0,0 +1,864 @@
import { faker } from '@faker-js/faker';
import { expect, test } from '@playwright/test';
import { DateTime } from 'luxon';
import {
Changes,
createDefaultTimelineConfig,
generateTimelineData,
getAsset,
getMockAsset,
SeededRandom,
selectRandom,
selectRandomMultiple,
TimelineAssetConfig,
TimelineData,
} from 'src/generators/timeline';
import { setupBaseMockApiRoutes } from 'src/mock-network/base-network';
import { pageRoutePromise, setupTimelineMockApiRoutes, TimelineTestContext } from 'src/mock-network/timeline-network';
import { utils } from 'src/utils';
import {
assetViewerUtils,
cancelAllPollers,
padYearMonth,
pageUtils,
poll,
thumbnailUtils,
timelineUtils,
} from 'src/web/specs/timeline/utils';
test.describe.configure({ mode: 'parallel' });
test.describe('Timeline', () => {
let adminUserId: string;
let timelineRestData: TimelineData;
const assets: TimelineAssetConfig[] = [];
const yearMonths: string[] = [];
const testContext = new TimelineTestContext();
const changes: Changes = {
albumAdditions: [],
assetDeletions: [],
assetArchivals: [],
assetFavorites: [],
};
test.beforeAll(async () => {
test.fail(
process.env.PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS !== '1',
'This test requires env var: PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS=1',
);
utils.initSdk();
adminUserId = faker.string.uuid();
testContext.adminId = adminUserId;
timelineRestData = generateTimelineData({ ...createDefaultTimelineConfig(), ownerId: adminUserId });
for (const timeBucket of timelineRestData.buckets.values()) {
assets.push(...timeBucket);
}
for (const yearMonth of timelineRestData.buckets.keys()) {
const [year, month] = yearMonth.split('-');
yearMonths.push(`${year}-${Number(month)}`);
}
});
test.beforeEach(async ({ context }) => {
await setupBaseMockApiRoutes(context, adminUserId);
await setupTimelineMockApiRoutes(context, timelineRestData, changes, testContext);
});
test.afterEach(() => {
cancelAllPollers();
testContext.slowBucket = false;
changes.albumAdditions = [];
changes.assetDeletions = [];
changes.assetArchivals = [];
changes.assetFavorites = [];
});
test.describe('/photos', () => {
test('Open /photos', async ({ page }) => {
await page.goto(`/photos`);
await page.waitForSelector('#asset-grid');
await thumbnailUtils.expectTimelineHasOnScreenAssets(page);
});
test('Deep link to last photo', async ({ page }) => {
const lastAsset = assets.at(-1)!;
await pageUtils.deepLinkPhotosPage(page, lastAsset.id);
await thumbnailUtils.expectTimelineHasOnScreenAssets(page);
await thumbnailUtils.expectInViewport(page, lastAsset.id);
});
const rng = new SeededRandom(529);
for (let i = 0; i < 10; i++) {
test('Deep link to random asset ' + i, async ({ page }) => {
const asset = selectRandom(assets, rng);
await pageUtils.deepLinkPhotosPage(page, asset.id);
await thumbnailUtils.expectTimelineHasOnScreenAssets(page);
await thumbnailUtils.expectInViewport(page, asset.id);
});
}
test('Open /photos, open asset-viewer, browser back', async ({ page }) => {
const rng = new SeededRandom(22);
const asset = selectRandom(assets, rng);
await pageUtils.deepLinkPhotosPage(page, asset.id);
const scrollTopBefore = await timelineUtils.getScrollTop(page);
await thumbnailUtils.clickAssetId(page, asset.id);
await assetViewerUtils.waitForViewerLoad(page, asset);
await page.goBack();
await timelineUtils.locator(page).waitFor();
const scrollTopAfter = await timelineUtils.getScrollTop(page);
expect(scrollTopAfter).toBe(scrollTopBefore);
});
test('Open /photos, open asset-viewer, next photo, browser back, back', async ({ page }) => {
const rng = new SeededRandom(49);
const asset = selectRandom(assets, rng);
const assetIndex = assets.indexOf(asset);
const nextAsset = assets[assetIndex + 1];
await pageUtils.deepLinkPhotosPage(page, asset.id);
const scrollTopBefore = await timelineUtils.getScrollTop(page);
await thumbnailUtils.clickAssetId(page, asset.id);
await assetViewerUtils.waitForViewerLoad(page, asset);
await expect.poll(() => new URL(page.url()).pathname).toBe(`/photos/${asset.id}`);
await page.getByLabel('View next asset').click();
await assetViewerUtils.waitForViewerLoad(page, nextAsset);
await expect.poll(() => new URL(page.url()).pathname).toBe(`/photos/${nextAsset.id}`);
await page.goBack();
await assetViewerUtils.waitForViewerLoad(page, asset);
await page.goBack();
await page.waitForURL('**/photos?at=*');
const scrollTopAfter = await timelineUtils.getScrollTop(page);
expect(Math.abs(scrollTopAfter - scrollTopBefore)).toBeLessThan(5);
});
test('Open /photos, open asset-viewer, next photo 15x, backwardsArrow', async ({ page }) => {
await pageUtils.deepLinkPhotosPage(page, assets[0].id);
await thumbnailUtils.clickAssetId(page, assets[0].id);
await assetViewerUtils.waitForViewerLoad(page, assets[0]);
for (let i = 1; i <= 15; i++) {
await page.getByLabel('View next asset').click();
await assetViewerUtils.waitForViewerLoad(page, assets[i]);
}
await page.getByLabel('Go back').click();
await page.waitForURL('**/photos?at=*');
await thumbnailUtils.expectInViewport(page, assets[15].id);
await thumbnailUtils.expectBottomIsTimelineBottom(page, assets[15]!.id);
});
test('Open /photos, open asset-viewer, previous photo 15x, backwardsArrow', async ({ page }) => {
const lastAsset = assets.at(-1)!;
await pageUtils.deepLinkPhotosPage(page, lastAsset.id);
await thumbnailUtils.clickAssetId(page, lastAsset.id);
await assetViewerUtils.waitForViewerLoad(page, lastAsset);
for (let i = 1; i <= 15; i++) {
await page.getByLabel('View previous asset').click();
await assetViewerUtils.waitForViewerLoad(page, assets.at(-1 - i)!);
}
await page.getByLabel('Go back').click();
await page.waitForURL('**/photos?at=*');
await thumbnailUtils.expectInViewport(page, assets.at(-1 - 15)!.id);
await thumbnailUtils.expectTopIsTimelineTop(page, assets.at(-1 - 15)!.id);
});
});
test.describe('keyboard', () => {
/**
* This text tests keyboard nativation, and also ensures that the scroll-to-asset behavior
* scrolls the minimum amount. That is, if you are navigating using right arrow (auto scrolling
* as necessary downwards), then the asset should always be at the lowest row of the grid.
*/
test('Next/previous asset - ArrowRight/ArrowLeft', async ({ page }) => {
await pageUtils.openPhotosPage(page);
await thumbnailUtils.withAssetId(page, assets[0].id).focus();
const rightKey = 'ArrowRight';
const leftKey = 'ArrowLeft';
for (let i = 1; i < 15; i++) {
await page.keyboard.press(rightKey);
await assetViewerUtils.expectActiveAssetToBe(page, assets[i].id);
}
for (let i = 15; i <= 20; i++) {
await page.keyboard.press(rightKey);
await assetViewerUtils.expectActiveAssetToBe(page, assets[i].id);
expect(await thumbnailUtils.expectBottomIsTimelineBottom(page, assets.at(i)!.id));
}
// now test previous asset
for (let i = 19; i >= 15; i--) {
await page.keyboard.press(leftKey);
await assetViewerUtils.expectActiveAssetToBe(page, assets[i].id);
}
for (let i = 14; i > 0; i--) {
await page.keyboard.press(leftKey);
await assetViewerUtils.expectActiveAssetToBe(page, assets[i].id);
expect(await thumbnailUtils.expectTopIsTimelineTop(page, assets.at(i)!.id));
}
});
test('Next/previous asset - Tab/Shift+Tab', async ({ page }) => {
await pageUtils.openPhotosPage(page);
await thumbnailUtils.withAssetId(page, assets[0].id).focus();
const rightKey = 'Tab';
const leftKey = 'Shift+Tab';
for (let i = 1; i < 15; i++) {
await page.keyboard.press(rightKey);
await assetViewerUtils.expectActiveAssetToBe(page, assets[i].id);
}
for (let i = 15; i <= 20; i++) {
await page.keyboard.press(rightKey);
await assetViewerUtils.expectActiveAssetToBe(page, assets[i].id);
}
// now test previous asset
for (let i = 19; i >= 15; i--) {
await page.keyboard.press(leftKey);
await assetViewerUtils.expectActiveAssetToBe(page, assets[i].id);
}
for (let i = 14; i > 0; i--) {
await page.keyboard.press(leftKey);
await assetViewerUtils.expectActiveAssetToBe(page, assets[i].id);
}
});
test('Next/previous day - d, Shift+D', async ({ page }) => {
await pageUtils.openPhotosPage(page);
let asset = assets[0];
await timelineUtils.locator(page).hover();
await page.keyboard.press('d');
await assetViewerUtils.expectActiveAssetToBe(page, asset.id);
for (let i = 0; i < 15; i++) {
await page.keyboard.press('d');
const next = getMockAsset(asset, assets, 'next', 'day')!;
await assetViewerUtils.expectActiveAssetToBe(page, next.id);
asset = next;
}
for (let i = 0; i < 15; i++) {
await page.keyboard.press('Shift+D');
const previous = getMockAsset(asset, assets, 'previous', 'day')!;
await assetViewerUtils.expectActiveAssetToBe(page, previous.id);
asset = previous;
}
});
test('Next/previous month - m, Shift+M', async ({ page }) => {
await pageUtils.openPhotosPage(page);
let asset = assets[0];
await timelineUtils.locator(page).hover();
await page.keyboard.press('m');
await assetViewerUtils.expectActiveAssetToBe(page, asset.id);
for (let i = 0; i < 15; i++) {
await page.keyboard.press('m');
const next = getMockAsset(asset, assets, 'next', 'month')!;
await assetViewerUtils.expectActiveAssetToBe(page, next.id);
asset = next;
}
for (let i = 0; i < 15; i++) {
await page.keyboard.press('Shift+M');
const previous = getMockAsset(asset, assets, 'previous', 'month')!;
await assetViewerUtils.expectActiveAssetToBe(page, previous.id);
asset = previous;
}
});
test('Next/previous year - y, Shift+Y', async ({ page }) => {
await pageUtils.openPhotosPage(page);
let asset = assets[0];
await timelineUtils.locator(page).hover();
await page.keyboard.press('y');
await assetViewerUtils.expectActiveAssetToBe(page, asset.id);
for (let i = 0; i < 15; i++) {
await page.keyboard.press('y');
const next = getMockAsset(asset, assets, 'next', 'year')!;
await assetViewerUtils.expectActiveAssetToBe(page, next.id);
asset = next;
}
for (let i = 0; i < 15; i++) {
await page.keyboard.press('Shift+Y');
const previous = getMockAsset(asset, assets, 'previous', 'year')!;
await assetViewerUtils.expectActiveAssetToBe(page, previous.id);
asset = previous;
}
});
test('Navigate to time - g', async ({ page }) => {
const rng = new SeededRandom(4782);
await pageUtils.openPhotosPage(page);
for (let i = 0; i < 10; i++) {
const asset = selectRandom(assets, rng);
await pageUtils.goToAsset(page, asset.fileCreatedAt);
await thumbnailUtils.expectInViewport(page, asset.id);
}
});
});
test.describe('selection', () => {
test('Select day, unselect day', async ({ page }) => {
await pageUtils.openPhotosPage(page);
await pageUtils.selectDay(page, 'Wed, Dec 11, 2024');
await expect(thumbnailUtils.selectedAsset(page)).toHaveCount(4);
await pageUtils.selectDay(page, 'Wed, Dec 11, 2024');
await expect(thumbnailUtils.selectedAsset(page)).toHaveCount(0);
});
test('Select asset, click asset to select', async ({ page }) => {
await pageUtils.openPhotosPage(page);
await thumbnailUtils.withAssetId(page, assets[1].id).hover();
await thumbnailUtils.selectButton(page, assets[1].id).click();
await expect(thumbnailUtils.selectedAsset(page)).toHaveCount(1);
// no need to hover, once selection is active
await thumbnailUtils.clickAssetId(page, assets[2].id);
await expect(thumbnailUtils.selectedAsset(page)).toHaveCount(2);
});
test('Select asset, click unselect asset', async ({ page }) => {
await pageUtils.openPhotosPage(page);
await thumbnailUtils.withAssetId(page, assets[1].id).hover();
await thumbnailUtils.selectButton(page, assets[1].id).click();
await expect(thumbnailUtils.selectedAsset(page)).toHaveCount(1);
await thumbnailUtils.clickAssetId(page, assets[1].id);
// the hover uses a checked button too, so just move mouse away
await page.mouse.move(0, 0);
await expect(thumbnailUtils.selectedAsset(page)).toHaveCount(0);
});
test('Select asset, shift-hover candidates, shift-click end', async ({ page }) => {
await pageUtils.openPhotosPage(page);
const asset = assets[0];
await thumbnailUtils.withAssetId(page, asset.id).hover();
await thumbnailUtils.selectButton(page, asset.id).click();
await page.keyboard.down('Shift');
await thumbnailUtils.withAssetId(page, assets[2].id).hover();
await expect(
thumbnailUtils.locator(page).locator('.absolute.top-0.h-full.w-full.bg-immich-primary.opacity-40'),
).toHaveCount(3);
await thumbnailUtils.selectButton(page, assets[2].id).click();
await page.keyboard.up('Shift');
await expect(thumbnailUtils.selectedAsset(page)).toHaveCount(3);
});
test('Add multiple to selection - Select day, shift-click end', async ({ page }) => {
await pageUtils.openPhotosPage(page);
await thumbnailUtils.withAssetId(page, assets[0].id).hover();
await thumbnailUtils.selectButton(page, assets[0].id).click();
await thumbnailUtils.clickAssetId(page, assets[2].id);
await page.keyboard.down('Shift');
await thumbnailUtils.clickAssetId(page, assets[4].id);
await page.mouse.move(0, 0);
await expect(thumbnailUtils.selectedAsset(page)).toHaveCount(4);
});
});
test.describe('scroll', () => {
test('Open /photos, random click scrubber 20x', async ({ page }) => {
test.slow();
await pageUtils.openPhotosPage(page);
const rng = new SeededRandom(6637);
const selectedMonths = selectRandomMultiple(yearMonths, 20, rng);
for (const month of selectedMonths) {
await page.locator(`[data-segment-year-month="${month}"]`).click({ force: true });
const visibleMockAssetsYearMonths = await poll(page, async () => {
const assetIds = await thumbnailUtils.getAllInViewport(
page,
(assetId: string) => getYearMonth(assets, assetId) === month,
);
const visibleMockAssetsYearMonths: string[] = [];
for (const assetId of assetIds!) {
const yearMonth = getYearMonth(assets, assetId);
visibleMockAssetsYearMonths.push(yearMonth);
if (yearMonth === month) {
return [yearMonth];
}
}
});
if (page.isClosed()) {
return;
}
expect(visibleMockAssetsYearMonths).toContain(month);
}
});
test('Deep link to last photo, scroll up', async ({ page }) => {
const lastAsset = assets.at(-1)!;
await pageUtils.deepLinkPhotosPage(page, lastAsset.id);
await timelineUtils.locator(page).hover();
for (let i = 0; i < 100; i++) {
await page.mouse.wheel(0, -100);
await page.waitForTimeout(25);
}
await thumbnailUtils.expectInViewport(page, '14e5901f-fd7f-40c0-b186-4d7e7fc67968');
});
test('Deep link to first bucket, scroll down', async ({ page }) => {
const lastAsset = assets.at(0)!;
await pageUtils.deepLinkPhotosPage(page, lastAsset.id);
await timelineUtils.locator(page).hover();
for (let i = 0; i < 100; i++) {
await page.mouse.wheel(0, 100);
await page.waitForTimeout(25);
}
await thumbnailUtils.expectInViewport(page, 'b7983a13-4b4e-4950-a731-f2962d9a1555');
});
test('Deep link to last photo, drag scrubber to scroll up', async ({ page }) => {
const lastAsset = assets.at(-1)!;
await pageUtils.deepLinkPhotosPage(page, lastAsset.id);
const lastMonth = yearMonths.at(-1);
const firstScrubSegment = page.locator(`[data-segment-year-month="${yearMonths[0]}"]`);
const lastScrubSegment = page.locator(`[data-segment-year-month="${lastMonth}"]`);
const sourcebox = (await lastScrubSegment.boundingBox())!;
const targetBox = (await firstScrubSegment.boundingBox())!;
await firstScrubSegment.hover();
const currentY = sourcebox.y;
await page.mouse.move(sourcebox.x + sourcebox?.width / 2, currentY);
await page.mouse.down();
await page.mouse.move(sourcebox.x + sourcebox?.width / 2, targetBox.y, { steps: 100 });
await page.mouse.up();
await thumbnailUtils.expectInViewport(page, assets[0].id);
});
test('Deep link to first bucket, drag scrubber to scroll down', async ({ page }) => {
await pageUtils.deepLinkPhotosPage(page, assets[0].id);
const firstScrubSegment = page.locator(`[data-segment-year-month="${yearMonths[0]}"]`);
const sourcebox = (await firstScrubSegment.boundingBox())!;
await firstScrubSegment.hover();
const currentY = sourcebox.y;
await page.mouse.move(sourcebox.x + sourcebox?.width / 2, currentY);
await page.mouse.down();
const height = page.viewportSize()?.height;
expect(height).toBeDefined();
await page.mouse.move(sourcebox.x + sourcebox?.width / 2, height! - 10, {
steps: 100,
});
await page.mouse.up();
await thumbnailUtils.expectInViewport(page, assets.at(-1)!.id);
});
test('Buckets cancel on scroll', async ({ page }) => {
await pageUtils.openPhotosPage(page);
testContext.slowBucket = true;
const failedUris: string[] = [];
page.on('requestfailed', (request) => {
failedUris.push(request.url());
});
const offscreenSegment = page.locator(`[data-segment-year-month="${yearMonths[12]}"]`);
await offscreenSegment.click({ force: true });
const lastSegment = page.locator(`[data-segment-year-month="${yearMonths.at(-1)!}"]`);
await lastSegment.click({ force: true });
const uris = await poll(page, async () => (failedUris.length > 0 ? failedUris : null));
expect(uris).toEqual(expect.arrayContaining([expect.stringContaining(padYearMonth(yearMonths[12]!))]));
});
});
test.describe('/albums', () => {
test('Open album', async ({ page }) => {
const album = timelineRestData.album;
await pageUtils.openAlbumPage(page, album.id);
await thumbnailUtils.expectInViewport(page, album.assetIds[0]);
});
test('Deep link to last photo', async ({ page }) => {
const album = timelineRestData.album;
const lastAsset = album.assetIds.at(-1);
await pageUtils.deepLinkAlbumPage(page, album.id, lastAsset!);
await thumbnailUtils.expectInViewport(page, album.assetIds.at(-1)!);
await thumbnailUtils.expectBottomIsTimelineBottom(page, album.assetIds.at(-1)!);
});
test('Add photos to album pre-selects existing', async ({ page }) => {
const album = timelineRestData.album;
await pageUtils.openAlbumPage(page, album.id);
await page.getByLabel('Add photos').click();
const asset = getAsset(timelineRestData, album.assetIds[0])!;
await pageUtils.goToAsset(page, asset.fileCreatedAt);
await thumbnailUtils.expectInViewport(page, asset.id);
await thumbnailUtils.expectSelectedReadonly(page, asset.id);
});
test('Add photos to album', async ({ page }) => {
const album = timelineRestData.album;
await pageUtils.openAlbumPage(page, album.id);
await page.locator('nav button[aria-label="Add photos"]').click();
const asset = getAsset(timelineRestData, album.assetIds[0])!;
await pageUtils.goToAsset(page, asset.fileCreatedAt);
await thumbnailUtils.expectInViewport(page, asset.id);
await thumbnailUtils.expectSelectedReadonly(page, asset.id);
await pageUtils.selectDay(page, 'Tue, Feb 27, 2024');
const put = pageRoutePromise(page, `**/api/albums/${album.id}/assets`, async (route, request) => {
const requestJson = request.postDataJSON();
await route.fulfill({
status: 200,
contentType: 'application/json',
json: requestJson.ids.map((id: string) => ({ id, success: true })),
});
changes.albumAdditions.push(...requestJson.ids);
});
await page.getByText('Done').click();
await expect(put).resolves.toEqual({
ids: [
'c077ea7b-cfa1-45e4-8554-f86c00ee5658',
'040fd762-dbbc-486d-a51a-2d84115e6229',
'86af0b5f-79d3-4f75-bab3-3b61f6c72b23',
],
});
const addedAsset = getAsset(timelineRestData, 'c077ea7b-cfa1-45e4-8554-f86c00ee5658')!;
await pageUtils.goToAsset(page, addedAsset.fileCreatedAt);
await thumbnailUtils.expectInViewport(page, 'c077ea7b-cfa1-45e4-8554-f86c00ee5658');
await thumbnailUtils.expectInViewport(page, '040fd762-dbbc-486d-a51a-2d84115e6229');
await thumbnailUtils.expectInViewport(page, '86af0b5f-79d3-4f75-bab3-3b61f6c72b23');
});
});
test.describe('/trash', () => {
test('open /photos, trash photo, open /trash, restore', async ({ page }) => {
await pageUtils.openPhotosPage(page);
const assetToTrash = assets[0];
await thumbnailUtils.withAssetId(page, assetToTrash.id).hover();
await thumbnailUtils.selectButton(page, assetToTrash.id).click();
await page.getByLabel('Menu').click();
const deleteRequest = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
changes.assetDeletions.push(...requestJson.ids);
await route.fulfill({
status: 200,
contentType: 'application/json',
json: requestJson.ids.map((id: string) => ({ id, success: true })),
});
});
await page.getByRole('menuitem').getByText('Delete').click();
await expect(deleteRequest).resolves.toEqual({
force: false,
ids: [assetToTrash.id],
});
await page.getByText('Trash', { exact: true }).click();
await thumbnailUtils.expectInViewport(page, assetToTrash.id);
await thumbnailUtils.withAssetId(page, assetToTrash.id).hover();
await thumbnailUtils.selectButton(page, assetToTrash.id).click();
const restoreRequest = pageRoutePromise(page, '**/api/trash/restore/assets', async (route, request) => {
const requestJson = request.postDataJSON();
changes.assetDeletions = changes.assetDeletions.filter((id) => !requestJson.ids.includes(id));
await route.fulfill({
status: 200,
contentType: 'application/json',
json: { count: requestJson.ids.length },
});
});
await page.getByText('Restore', { exact: true }).click();
await expect(restoreRequest).resolves.toEqual({
ids: [assetToTrash.id],
});
await expect(thumbnailUtils.withAssetId(page, assetToTrash.id)).toHaveCount(0);
await page.getByText('Photos', { exact: true }).click();
await thumbnailUtils.expectInViewport(page, assetToTrash.id);
});
test('open album, trash photo, open /trash, restore', async ({ page }) => {
const album = timelineRestData.album;
await pageUtils.openAlbumPage(page, album.id);
const assetToTrash = getAsset(timelineRestData, album.assetIds[0])!;
await thumbnailUtils.withAssetId(page, assetToTrash.id).hover();
await thumbnailUtils.selectButton(page, assetToTrash.id).click();
await page.getByLabel('Menu').click();
const deleteRequest = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
changes.assetDeletions.push(...requestJson.ids);
await route.fulfill({
status: 200,
contentType: 'application/json',
json: requestJson.ids.map((id: string) => ({ id, success: true })),
});
});
await page.getByRole('menuitem').getByText('Delete').click();
await expect(deleteRequest).resolves.toEqual({
force: false,
ids: [assetToTrash.id],
});
await page.locator('#asset-selection-app-bar').getByLabel('Close').click();
await page.getByText('Trash', { exact: true }).click();
await timelineUtils.waitForTimelineLoad(page);
await thumbnailUtils.expectInViewport(page, assetToTrash.id);
await thumbnailUtils.withAssetId(page, assetToTrash.id).hover();
await thumbnailUtils.selectButton(page, assetToTrash.id).click();
const restoreRequest = pageRoutePromise(page, '**/api/trash/restore/assets', async (route, request) => {
const requestJson = request.postDataJSON();
changes.assetDeletions = changes.assetDeletions.filter((id) => !requestJson.ids.includes(id));
await route.fulfill({
status: 200,
contentType: 'application/json',
json: { count: requestJson.ids.length },
});
});
await page.getByText('Restore', { exact: true }).click();
await expect(restoreRequest).resolves.toEqual({
ids: [assetToTrash.id],
});
await expect(thumbnailUtils.withAssetId(page, assetToTrash.id)).toHaveCount(0);
await pageUtils.openAlbumPage(page, album.id);
await thumbnailUtils.expectInViewport(page, assetToTrash.id);
});
});
test.describe('/archive', () => {
test('open /photos, archive photo, open /archive, unarchive', async ({ page }) => {
await pageUtils.openPhotosPage(page);
const assetToArchive = assets[0];
await thumbnailUtils.withAssetId(page, assetToArchive.id).hover();
await thumbnailUtils.selectButton(page, assetToArchive.id).click();
await page.getByLabel('Menu').click();
const archive = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.visibility !== 'archive') {
return await route.continue();
}
await route.fulfill({
status: 204,
});
changes.assetArchivals.push(...requestJson.ids);
});
await page.getByRole('menuitem').getByText('Archive').click();
await expect(archive).resolves.toEqual({
visibility: 'archive',
ids: [assetToArchive.id],
});
await expect(thumbnailUtils.withAssetId(page, assetToArchive.id)).toHaveCount(0);
await page.getByRole('link').getByText('Archive').click();
await thumbnailUtils.expectInViewport(page, assetToArchive.id);
await thumbnailUtils.withAssetId(page, assetToArchive.id).hover();
await thumbnailUtils.selectButton(page, assetToArchive.id).click();
const unarchiveRequest = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.visibility !== 'timeline') {
return await route.continue();
}
changes.assetArchivals = changes.assetArchivals.filter((id) => !requestJson.ids.includes(id));
await route.fulfill({
status: 204,
});
});
await page.getByLabel('Unarchive').click();
await expect(unarchiveRequest).resolves.toEqual({
visibility: 'timeline',
ids: [assetToArchive.id],
});
await expect(thumbnailUtils.withAssetId(page, assetToArchive.id)).toHaveCount(0);
await page.getByText('Photos', { exact: true }).click();
await thumbnailUtils.expectInViewport(page, assetToArchive.id);
});
test('open /archive, favorite photo, unfavorite', async ({ page }) => {
const assetToFavorite = assets[0];
changes.assetArchivals.push(assetToFavorite.id);
await pageUtils.openArchivePage(page);
const favorite = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.isFavorite === undefined) {
return await route.continue();
}
const isFavorite = requestJson.isFavorite;
if (isFavorite) {
changes.assetFavorites.push(...requestJson.ids);
}
await route.fulfill({
status: 204,
});
});
await thumbnailUtils.withAssetId(page, assetToFavorite.id).hover();
await thumbnailUtils.selectButton(page, assetToFavorite.id).click();
await page.getByLabel('Favorite').click();
await expect(favorite).resolves.toEqual({
isFavorite: true,
ids: [assetToFavorite.id],
});
await expect(thumbnailUtils.withAssetId(page, assetToFavorite.id)).toHaveCount(1);
await thumbnailUtils.expectInViewport(page, assetToFavorite.id);
await thumbnailUtils.expectThumbnailIsFavorite(page, assetToFavorite.id);
await thumbnailUtils.withAssetId(page, assetToFavorite.id).hover();
await thumbnailUtils.selectButton(page, assetToFavorite.id).click();
const unFavoriteRequest = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.isFavorite === undefined) {
return await route.continue();
}
changes.assetFavorites = changes.assetFavorites.filter((id) => !requestJson.ids.includes(id));
await route.fulfill({
status: 204,
});
});
await page.getByLabel('Remove from favorites').click();
await expect(unFavoriteRequest).resolves.toEqual({
isFavorite: false,
ids: [assetToFavorite.id],
});
await expect(thumbnailUtils.withAssetId(page, assetToFavorite.id)).toHaveCount(1);
await thumbnailUtils.expectThumbnailIsNotFavorite(page, assetToFavorite.id);
});
test('open album, archive photo, open album, unarchive', async ({ page }) => {
const album = timelineRestData.album;
await pageUtils.openAlbumPage(page, album.id);
const assetToArchive = getAsset(timelineRestData, album.assetIds[0])!;
await thumbnailUtils.withAssetId(page, assetToArchive.id).hover();
await thumbnailUtils.selectButton(page, assetToArchive.id).click();
await page.getByLabel('Menu').click();
const archive = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.visibility !== 'archive') {
return await route.continue();
}
changes.assetArchivals.push(...requestJson.ids);
await route.fulfill({
status: 204,
});
});
await page.getByRole('menuitem').getByText('Archive').click();
await expect(archive).resolves.toEqual({
visibility: 'archive',
ids: [assetToArchive.id],
});
await thumbnailUtils.expectThumbnailIsArchive(page, assetToArchive.id);
await page.locator('#asset-selection-app-bar').getByLabel('Close').click();
await page.getByRole('link').getByText('Archive').click();
await timelineUtils.waitForTimelineLoad(page);
await thumbnailUtils.expectInViewport(page, assetToArchive.id);
await thumbnailUtils.withAssetId(page, assetToArchive.id).hover();
await thumbnailUtils.selectButton(page, assetToArchive.id).click();
const unarchiveRequest = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.visibility !== 'timeline') {
return await route.continue();
}
changes.assetArchivals = changes.assetArchivals.filter((id) => !requestJson.ids.includes(id));
await route.fulfill({
status: 204,
});
});
await page.getByLabel('Unarchive').click();
await expect(unarchiveRequest).resolves.toEqual({
visibility: 'timeline',
ids: [assetToArchive.id],
});
await expect(thumbnailUtils.withAssetId(page, assetToArchive.id)).toHaveCount(0);
await pageUtils.openAlbumPage(page, album.id);
await thumbnailUtils.expectInViewport(page, assetToArchive.id);
});
});
test.describe('/favorite', () => {
test('open /photos, favorite photo, open /favorites, remove favorite, open /photos', async ({ page }) => {
await pageUtils.openPhotosPage(page);
const assetToFavorite = assets[0];
await thumbnailUtils.withAssetId(page, assetToFavorite.id).hover();
await thumbnailUtils.selectButton(page, assetToFavorite.id).click();
const favorite = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.isFavorite === undefined) {
return await route.continue();
}
const isFavorite = requestJson.isFavorite;
if (isFavorite) {
changes.assetFavorites.push(...requestJson.ids);
}
await route.fulfill({
status: 204,
});
});
await page.getByLabel('Favorite').click();
await expect(favorite).resolves.toEqual({
isFavorite: true,
ids: [assetToFavorite.id],
});
// ensure thumbnail still exists and has favorite icon
await thumbnailUtils.expectThumbnailIsFavorite(page, assetToFavorite.id);
await page.getByRole('link').getByText('Favorites').click();
await thumbnailUtils.expectInViewport(page, assetToFavorite.id);
await thumbnailUtils.withAssetId(page, assetToFavorite.id).hover();
await thumbnailUtils.selectButton(page, assetToFavorite.id).click();
const unFavoriteRequest = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.isFavorite === undefined) {
return await route.continue();
}
changes.assetFavorites = changes.assetFavorites.filter((id) => !requestJson.ids.includes(id));
await route.fulfill({
status: 204,
});
});
await page.getByLabel('Remove from favorites').click();
await expect(unFavoriteRequest).resolves.toEqual({
isFavorite: false,
ids: [assetToFavorite.id],
});
await expect(thumbnailUtils.withAssetId(page, assetToFavorite.id)).toHaveCount(0);
await page.getByText('Photos', { exact: true }).click();
await thumbnailUtils.expectInViewport(page, assetToFavorite.id);
});
test('open /favorites, archive photo, unarchive photo', async ({ page }) => {
await pageUtils.openFavorites(page);
const assetToArchive = getAsset(timelineRestData, 'ad31e29f-2069-4574-b9a9-ad86523c92cb')!;
await thumbnailUtils.withAssetId(page, assetToArchive.id).hover();
await thumbnailUtils.selectButton(page, assetToArchive.id).click();
await page.getByLabel('Menu').click();
const archive = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.visibility !== 'archive') {
return await route.continue();
}
await route.fulfill({
status: 204,
});
changes.assetArchivals.push(...requestJson.ids);
});
await page.getByRole('menuitem').getByText('Archive').click();
await expect(archive).resolves.toEqual({
visibility: 'archive',
ids: [assetToArchive.id],
});
await page.getByRole('link').getByText('Archive').click();
await thumbnailUtils.expectInViewport(page, assetToArchive.id);
await thumbnailUtils.expectThumbnailIsNotArchive(page, assetToArchive.id);
await thumbnailUtils.withAssetId(page, assetToArchive.id).hover();
await thumbnailUtils.selectButton(page, assetToArchive.id).click();
const unarchiveRequest = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.visibility !== 'timeline') {
return await route.continue();
}
changes.assetArchivals = changes.assetArchivals.filter((id) => !requestJson.ids.includes(id));
await route.fulfill({
status: 204,
});
});
await page.getByLabel('Unarchive').click();
await expect(unarchiveRequest).resolves.toEqual({
visibility: 'timeline',
ids: [assetToArchive.id],
});
await expect(thumbnailUtils.withAssetId(page, assetToArchive.id)).toHaveCount(0);
await thumbnailUtils.expectThumbnailIsNotArchive(page, assetToArchive.id);
});
test('Open album, favorite photo, open /favorites, remove favorite, Open album', async ({ page }) => {
const album = timelineRestData.album;
await pageUtils.openAlbumPage(page, album.id);
const assetToFavorite = getAsset(timelineRestData, album.assetIds[0])!;
await thumbnailUtils.withAssetId(page, assetToFavorite.id).hover();
await thumbnailUtils.selectButton(page, assetToFavorite.id).click();
const favorite = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.isFavorite === undefined) {
return await route.continue();
}
const isFavorite = requestJson.isFavorite;
if (isFavorite) {
changes.assetFavorites.push(...requestJson.ids);
}
await route.fulfill({
status: 204,
});
});
await page.getByLabel('Favorite').click();
await expect(favorite).resolves.toEqual({
isFavorite: true,
ids: [assetToFavorite.id],
});
// ensure thumbnail still exists and has favorite icon
await thumbnailUtils.expectThumbnailIsFavorite(page, assetToFavorite.id);
await page.locator('#asset-selection-app-bar').getByLabel('Close').click();
await page.getByRole('link').getByText('Favorites').click();
await timelineUtils.waitForTimelineLoad(page);
await pageUtils.goToAsset(page, assetToFavorite.fileCreatedAt);
await thumbnailUtils.expectInViewport(page, assetToFavorite.id);
await thumbnailUtils.withAssetId(page, assetToFavorite.id).hover();
await thumbnailUtils.selectButton(page, assetToFavorite.id).click();
const unFavoriteRequest = pageRoutePromise(page, '**/api/assets', async (route, request) => {
const requestJson = request.postDataJSON();
if (requestJson.isFavorite === undefined) {
return await route.continue();
}
changes.assetFavorites = changes.assetFavorites.filter((id) => !requestJson.ids.includes(id));
await route.fulfill({
status: 204,
});
});
await page.getByLabel('Remove from favorites').click();
await expect(unFavoriteRequest).resolves.toEqual({
isFavorite: false,
ids: [assetToFavorite.id],
});
await expect(thumbnailUtils.withAssetId(page, assetToFavorite.id)).toHaveCount(0);
await pageUtils.openAlbumPage(page, album.id);
await thumbnailUtils.expectInViewport(page, assetToFavorite.id);
});
});
});
const getYearMonth = (assets: TimelineAssetConfig[], assetId: string) => {
const mockAsset = assets.find((mockAsset) => mockAsset.id === assetId)!;
const dateTime = DateTime.fromISO(mockAsset.fileCreatedAt!);
return dateTime.year + '-' + dateTime.month;
};
+238
View File
@@ -0,0 +1,238 @@
import { BrowserContext, expect, Page } from '@playwright/test';
import { DateTime } from 'luxon';
import { TimelineAssetConfig } from 'src/generators/timeline';
export const sleep = (ms: number) => {
return new Promise((resolve) => setTimeout(resolve, ms));
};
export const padYearMonth = (yearMonth: string) => {
const [year, month] = yearMonth.split('-');
return `${year}-${month.padStart(2, '0')}`;
};
export async function throttlePage(context: BrowserContext, page: Page) {
const session = await context.newCDPSession(page);
await session.send('Network.emulateNetworkConditions', {
offline: false,
downloadThroughput: (1.5 * 1024 * 1024) / 8,
uploadThroughput: (750 * 1024) / 8,
latency: 40,
connectionType: 'cellular3g',
});
await session.send('Emulation.setCPUThrottlingRate', { rate: 10 });
}
let activePollsAbortController = new AbortController();
export const cancelAllPollers = () => {
activePollsAbortController.abort();
activePollsAbortController = new AbortController();
};
export const poll = async <T>(
page: Page,
query: () => Promise<T>,
callback?: (result: Awaited<T> | undefined) => boolean,
) => {
let result;
const timeout = Date.now() + 10_000;
const signal = activePollsAbortController.signal;
const terminate = callback || ((result: Awaited<T> | undefined) => !!result);
while (!terminate(result) && Date.now() < timeout) {
if (signal.aborted) {
return;
}
try {
result = await query();
} catch {
// ignore
}
if (signal.aborted) {
return;
}
if (page.isClosed()) {
return;
}
try {
await page.waitForTimeout(50);
} catch {
return;
}
}
if (!result) {
// rerun to trigger error if any
result = await query();
}
return result;
};
export const thumbnailUtils = {
locator(page: Page) {
return page.locator('[data-thumbnail-focus-container]');
},
withAssetId(page: Page, assetId: string) {
return page.locator(`[data-thumbnail-focus-container][data-asset="${assetId}"]`);
},
selectButton(page: Page, assetId: string) {
return page.locator(`[data-thumbnail-focus-container][data-asset="${assetId}"] button`);
},
selectedAsset(page: Page) {
return page.locator('[data-thumbnail-focus-container]:has(button[aria-checked])');
},
async clickAssetId(page: Page, assetId: string) {
await thumbnailUtils.withAssetId(page, assetId).click();
},
async queryThumbnailInViewport(page: Page, collector: (assetId: string) => boolean) {
const assetIds: string[] = [];
for (const thumb of await this.locator(page).all()) {
const box = await thumb.boundingBox();
if (box) {
const assetId = await thumb.evaluate((e) => e.dataset.asset);
if (collector?.(assetId!)) {
return [assetId!];
}
assetIds.push(assetId!);
}
}
return assetIds;
},
async getFirstInViewport(page: Page) {
return await poll(page, () => thumbnailUtils.queryThumbnailInViewport(page, () => true));
},
async getAllInViewport(page: Page, collector: (assetId: string) => boolean) {
return await poll(page, () => thumbnailUtils.queryThumbnailInViewport(page, collector));
},
async expectThumbnailIsFavorite(page: Page, assetId: string) {
await expect(thumbnailUtils.withAssetId(page, assetId).locator('[data-icon-favorite]')).toHaveCount(1);
},
async expectThumbnailIsNotFavorite(page: Page, assetId: string) {
await expect(thumbnailUtils.withAssetId(page, assetId).locator('[data-icon-favorite]')).toHaveCount(0);
},
async expectThumbnailIsArchive(page: Page, assetId: string) {
await expect(thumbnailUtils.withAssetId(page, assetId).locator('[data-icon-archive]')).toHaveCount(1);
},
async expectThumbnailIsNotArchive(page: Page, assetId: string) {
await expect(thumbnailUtils.withAssetId(page, assetId).locator('[data-icon-archive]')).toHaveCount(0);
},
async expectSelectedReadonly(page: Page, assetId: string) {
// todo - need a data attribute for selected
await expect(
page.locator(
`[data-thumbnail-focus-container][data-asset="${assetId}"] > .group.cursor-not-allowed > .rounded-xl`,
),
).toBeVisible();
},
async expectTimelineHasOnScreenAssets(page: Page) {
const first = await thumbnailUtils.getFirstInViewport(page);
if (page.isClosed()) {
return;
}
expect(first).toBeTruthy();
},
async expectInViewport(page: Page, assetId: string) {
const box = await poll(page, () => thumbnailUtils.withAssetId(page, assetId).boundingBox());
if (page.isClosed()) {
return;
}
expect(box).toBeTruthy();
},
async expectBottomIsTimelineBottom(page: Page, assetId: string) {
const box = await thumbnailUtils.withAssetId(page, assetId).boundingBox();
const gridBox = await timelineUtils.locator(page).boundingBox();
if (page.isClosed()) {
return;
}
expect(box!.y + box!.height).toBeCloseTo(gridBox!.y + gridBox!.height, 0);
},
async expectTopIsTimelineTop(page: Page, assetId: string) {
const box = await thumbnailUtils.withAssetId(page, assetId).boundingBox();
const gridBox = await timelineUtils.locator(page).boundingBox();
if (page.isClosed()) {
return;
}
expect(box!.y).toBeCloseTo(gridBox!.y, 0);
},
};
export const timelineUtils = {
locator(page: Page) {
return page.locator('#asset-grid');
},
async waitForTimelineLoad(page: Page) {
await expect(timelineUtils.locator(page)).toBeInViewport();
await expect.poll(() => thumbnailUtils.locator(page).count()).toBeGreaterThan(0);
},
async getScrollTop(page: Page) {
const queryTop = () =>
page.evaluate(() => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return document.querySelector('#asset-grid').scrollTop;
});
await expect.poll(queryTop).toBeGreaterThan(0);
return await queryTop();
},
};
export const assetViewerUtils = {
locator(page: Page) {
return page.locator('#immich-asset-viewer');
},
async waitForViewerLoad(page: Page, asset: TimelineAssetConfig) {
await page
.locator(`img[draggable="false"][src="/api/assets/${asset.id}/thumbnail?size=preview&c=${asset.thumbhash}"]`)
.or(page.locator(`video[poster="/api/assets/${asset.id}/thumbnail?size=preview&c=${asset.thumbhash}"]`))
.waitFor();
},
async expectActiveAssetToBe(page: Page, assetId: string) {
const activeElement = () =>
page.evaluate(() => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return document.activeElement?.dataset?.asset;
});
await expect(poll(page, activeElement, (result) => result === assetId)).resolves.toBe(assetId);
},
};
export const pageUtils = {
async deepLinkPhotosPage(page: Page, assetId: string) {
await page.goto(`/photos?at=${assetId}`);
await timelineUtils.waitForTimelineLoad(page);
},
async openPhotosPage(page: Page) {
await page.goto(`/photos`);
await timelineUtils.waitForTimelineLoad(page);
},
async openFavorites(page: Page) {
await page.goto(`/favorites`);
await timelineUtils.waitForTimelineLoad(page);
},
async openAlbumPage(page: Page, albumId: string) {
await page.goto(`/albums/${albumId}`);
await timelineUtils.waitForTimelineLoad(page);
},
async openArchivePage(page: Page) {
await page.goto(`/archive`);
await timelineUtils.waitForTimelineLoad(page);
},
async deepLinkAlbumPage(page: Page, albumId: string, assetId: string) {
await page.goto(`/albums/${albumId}?at=${assetId}`);
await timelineUtils.waitForTimelineLoad(page);
},
async goToAsset(page: Page, assetDate: string) {
await timelineUtils.locator(page).hover();
const stringDate = DateTime.fromISO(assetDate).toFormat('MMddyyyy,hh:mm:ss.SSSa');
await page.keyboard.press('g');
await page.locator('#datetime').pressSequentially(stringDate);
await page.getByText('Confirm').click();
},
async selectDay(page: Page, day: string) {
await page.getByTitle(day).hover();
await page.locator('[data-group] .w-8').click();
},
async pauseTestDebug() {
console.log('NOTE: pausing test indefinately for debug');
await new Promise(() => void 0);
},
};
+2 -2
View File
@@ -54,7 +54,7 @@ test.describe('User Administration', () => {
await page.getByRole('button', { name: 'Edit' }).click(); await page.getByRole('button', { name: 'Edit' }).click();
await expect(page.getByLabel('Admin User')).not.toBeChecked(); await expect(page.getByLabel('Admin User')).not.toBeChecked();
await page.getByText('Admin User').click(); await page.getByLabel('Admin User').click();
await expect(page.getByLabel('Admin User')).toBeChecked(); await expect(page.getByLabel('Admin User')).toBeChecked();
await page.getByRole('button', { name: 'Confirm' }).click(); await page.getByRole('button', { name: 'Confirm' }).click();
@@ -83,7 +83,7 @@ test.describe('User Administration', () => {
await page.getByRole('button', { name: 'Edit' }).click(); await page.getByRole('button', { name: 'Edit' }).click();
await expect(page.getByLabel('Admin User')).toBeChecked(); await expect(page.getByLabel('Admin User')).toBeChecked();
await page.getByText('Admin User').click(); await page.getByLabel('Admin User').click();
await expect(page.getByLabel('Admin User')).not.toBeChecked(); await expect(page.getByLabel('Admin User')).not.toBeChecked();
await page.getByRole('button', { name: 'Confirm' }).click(); await page.getByRole('button', { name: 'Confirm' }).click();
+1 -1
View File
@@ -9,7 +9,7 @@
"experimentalDecorators": true, "experimentalDecorators": true,
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"target": "es2022", "target": "es2023",
"sourceMap": true, "sourceMap": true,
"outDir": "./dist", "outDir": "./dist",
"incremental": true, "incremental": true,
-2
View File
@@ -17,7 +17,6 @@
"add_birthday": "Voeg 'n verjaarsdag by", "add_birthday": "Voeg 'n verjaarsdag by",
"add_endpoint": "Voeg Koppelvlakpunt by", "add_endpoint": "Voeg Koppelvlakpunt by",
"add_exclusion_pattern": "Voeg uitsgluitingspatrone by", "add_exclusion_pattern": "Voeg uitsgluitingspatrone by",
"add_import_path": "Voeg invoerpad by",
"add_location": "Voeg ligging by", "add_location": "Voeg ligging by",
"add_more_users": "Voeg meer gebruikers by", "add_more_users": "Voeg meer gebruikers by",
"add_partner": "Voeg vennoot by", "add_partner": "Voeg vennoot by",
@@ -101,7 +100,6 @@
"job_status": "Werkstatus", "job_status": "Werkstatus",
"library_created": "Biblioteek geskep: {library}", "library_created": "Biblioteek geskep: {library}",
"library_deleted": "Biblioteek verwyder", "library_deleted": "Biblioteek verwyder",
"library_import_path_description": "Spesifiseer 'n leer om in te neem. Hierdie leer, en al die sub leers, gaan deursoek word vir prente en videos.",
"library_scanning": "Periodieke Soek", "library_scanning": "Periodieke Soek",
"library_scanning_description": "Stel periodieke deursoek van biblioteek in", "library_scanning_description": "Stel periodieke deursoek van biblioteek in",
"library_scanning_enable_description": "Aktiveer periodieke biblioteekskandering", "library_scanning_enable_description": "Aktiveer periodieke biblioteekskandering",
+53 -12
View File
@@ -17,7 +17,6 @@
"add_birthday": "أضف تاريخ الميلاد", "add_birthday": "أضف تاريخ الميلاد",
"add_endpoint": "اضف نقطة نهاية", "add_endpoint": "اضف نقطة نهاية",
"add_exclusion_pattern": "إضافة نمط إستثناء", "add_exclusion_pattern": "إضافة نمط إستثناء",
"add_import_path": "إضافة مسار الإستيراد",
"add_location": "إضافة موقع", "add_location": "إضافة موقع",
"add_more_users": "إضافة مستخدمين آخرين", "add_more_users": "إضافة مستخدمين آخرين",
"add_partner": "أضف شريكًا", "add_partner": "أضف شريكًا",
@@ -112,7 +111,6 @@
"jobs_failed": "{jobCount, plural, other {# فشلت}}", "jobs_failed": "{jobCount, plural, other {# فشلت}}",
"library_created": "تم إنشاء المكتبة: {library}", "library_created": "تم إنشاء المكتبة: {library}",
"library_deleted": "تم حذف المكتبة", "library_deleted": "تم حذف المكتبة",
"library_import_path_description": "حدد مجلدًا للاستيراد. سيتم فحص هذا المجلد، بما في ذلك المجلدات الفرعية، بحثًا عن الصور ومقاطع الفيديو.",
"library_scanning": "المسح الدوري", "library_scanning": "المسح الدوري",
"library_scanning_description": "إعداد مسح المكتبة الدوري", "library_scanning_description": "إعداد مسح المكتبة الدوري",
"library_scanning_enable_description": "تفعيل مسح المكتبة الدوري", "library_scanning_enable_description": "تفعيل مسح المكتبة الدوري",
@@ -154,6 +152,18 @@
"machine_learning_min_detection_score_description": "الحد الأدنى لنقطة الثقة لاكتشاف الوجه، تتراوح من 0 إلى 1. القيم الأقل ستكشف عن المزيد من الوجوه ولكن قد تؤدي إلى نتائج إيجابية خاطئة.", "machine_learning_min_detection_score_description": "الحد الأدنى لنقطة الثقة لاكتشاف الوجه، تتراوح من 0 إلى 1. القيم الأقل ستكشف عن المزيد من الوجوه ولكن قد تؤدي إلى نتائج إيجابية خاطئة.",
"machine_learning_min_recognized_faces": "الحد الأدنى لعدد الوجوه المتعرف عليها", "machine_learning_min_recognized_faces": "الحد الأدنى لعدد الوجوه المتعرف عليها",
"machine_learning_min_recognized_faces_description": "الحد الأدنى لعدد الوجوه المتعرف عليها لإنشاء شخص. زيادة هذا الرقم يجعل التعرف على الوجوه أكثر دقة على حساب زيادة احتمال عدم تعيين الوجه لشخص ما.", "machine_learning_min_recognized_faces_description": "الحد الأدنى لعدد الوجوه المتعرف عليها لإنشاء شخص. زيادة هذا الرقم يجعل التعرف على الوجوه أكثر دقة على حساب زيادة احتمال عدم تعيين الوجه لشخص ما.",
"machine_learning_ocr": "التعرف البصري على الحروف",
"machine_learning_ocr_description": "استخدم التعلم الآلي للتعرف على النصوص في الصور",
"machine_learning_ocr_enabled": "تفعيل التعرف البصري على الحروف",
"machine_learning_ocr_enabled_description": "في حال تعطيل هذه الميزة، لن تخضع الصور لعملية التعرف على النصوص.",
"machine_learning_ocr_max_resolution": "أقصى دقة",
"machine_learning_ocr_max_resolution_description": "سيتم تغيير حجم المعاينات التي تتجاوز هذه الدقة مع الحفاظ على نسبة العرض إلى الارتفاع. القيم الأعلى توفر دقة أكبر، ولكنها تستغرق وقتًا أطول للمعالجة وتستهلك المزيد من الذاكرة.",
"machine_learning_ocr_min_detection_score": "الحد الأدنى لدرجة الكشف",
"machine_learning_ocr_min_detection_score_description": "لحد الأدنى لدرجة الثقة المطلوبة لاكتشاف النص، وتتراوح قيمتها من 0 إلى 1. ستؤدي القيم الأقل إلى اكتشاف المزيد من النصوص ولكنها قد تؤدي إلى نتائج إيجابية خاطئة.",
"machine_learning_ocr_min_recognition_score": "الحد الأدنى لدرجة التعرّف",
"machine_learning_ocr_min_score_recognition_description": "الحد الأدنى لدرجة الثقة المطلوبة للنصوص المكتشفة ليتم التعرف عليها، وتتراوح من 0 إلى 1. ستؤدي القيم الأقل إلى التعرف على المزيد من النصوص ولكنها قد تؤدي إلى نتائج إيجابية خاطئة.",
"machine_learning_ocr_model": "نموذج التعرف البصري على الحروف",
"machine_learning_ocr_model_description": "تتميز نماذج الخوادم بدقة أكبر من نماذج الأجهزة المحمولة، ولكنها تستغرق وقتًا أطول في المعالجة وتستهلك ذاكرة أكبر.",
"machine_learning_settings": "إعدادات التعلم الآلي", "machine_learning_settings": "إعدادات التعلم الآلي",
"machine_learning_settings_description": "إدارة ميزات وإعدادات التعلم الآلي", "machine_learning_settings_description": "إدارة ميزات وإعدادات التعلم الآلي",
"machine_learning_smart_search": "البحث الذكي", "machine_learning_smart_search": "البحث الذكي",
@@ -211,6 +221,8 @@
"notification_email_ignore_certificate_errors_description": "تجاهل أخطاء التحقق من صحة شهادة TLS (غير مستحسن)", "notification_email_ignore_certificate_errors_description": "تجاهل أخطاء التحقق من صحة شهادة TLS (غير مستحسن)",
"notification_email_password_description": "كلمة المرور المستخدمة للمصادقة مع خادم البريد الإلكتروني", "notification_email_password_description": "كلمة المرور المستخدمة للمصادقة مع خادم البريد الإلكتروني",
"notification_email_port_description": "منفذ خادم البريد الإلكتروني (مثلاً 25، 465، أو 587)", "notification_email_port_description": "منفذ خادم البريد الإلكتروني (مثلاً 25، 465، أو 587)",
"notification_email_secure": "بروتوكول نقل البريد البسيط الآمن SMTPS",
"notification_email_secure_description": "استخدم بروتوكول SMTPS (بروتوكول SMTP عبر TLS)",
"notification_email_sent_test_email_button": "إرسال بريد إلكتروني تجريبي وحفظ التعديلات", "notification_email_sent_test_email_button": "إرسال بريد إلكتروني تجريبي وحفظ التعديلات",
"notification_email_setting_description": "إعدادات إرسال إشعارات البريد الإلكتروني", "notification_email_setting_description": "إعدادات إرسال إشعارات البريد الإلكتروني",
"notification_email_test_email": "إرسال بريد تجريبي", "notification_email_test_email": "إرسال بريد تجريبي",
@@ -243,6 +255,7 @@
"oauth_storage_quota_default_description": "الحصة بالجيجابايت التي سيتم استخدامها عندما لا يتم توفير مطالبة.", "oauth_storage_quota_default_description": "الحصة بالجيجابايت التي سيتم استخدامها عندما لا يتم توفير مطالبة.",
"oauth_timeout": "نفاذ وقت الطلب", "oauth_timeout": "نفاذ وقت الطلب",
"oauth_timeout_description": "نفاذ وقت الطلب بالميلي ثانية", "oauth_timeout_description": "نفاذ وقت الطلب بالميلي ثانية",
"ocr_job_description": "استخدم التعلم الآلي للتعرف على النصوص في الصور",
"password_enable_description": "تسجيل الدخول باستخدام البريد الكتروني وكلمة المرور", "password_enable_description": "تسجيل الدخول باستخدام البريد الكتروني وكلمة المرور",
"password_settings": "تسجيل الدخول بكلمة المرور", "password_settings": "تسجيل الدخول بكلمة المرور",
"password_settings_description": "إدارة تسجيل الدخول بكلمة المرور", "password_settings_description": "إدارة تسجيل الدخول بكلمة المرور",
@@ -402,11 +415,11 @@
"advanced_settings_prefer_remote_subtitle": "تكون بعض الأجهزة بطيئة للغاية في تحميل الصور المصغرة من الأصول المحلية. قم بتفعيل هذا الخيار لتحميل الصور البعيدة بدلاً من ذلك.", "advanced_settings_prefer_remote_subtitle": "تكون بعض الأجهزة بطيئة للغاية في تحميل الصور المصغرة من الأصول المحلية. قم بتفعيل هذا الخيار لتحميل الصور البعيدة بدلاً من ذلك.",
"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 الموقعة ذاتيًا [تجريبية]",
"advanced_settings_sync_remote_deletions_subtitle": "حذف او استعادة تلقائي للاصول على هذا الجهاز عند تنفيذ العملية على الويب", "advanced_settings_sync_remote_deletions_subtitle": "حذف او استعادة تلقائي للاصول على هذا الجهاز عند تنفيذ العملية على الويب",
"advanced_settings_sync_remote_deletions_title": "مزامنة عمليات الحذف عن بعد [تجريبي]", "advanced_settings_sync_remote_deletions_title": "مزامنة عمليات الحذف عن بعد [تجريبي]",
"advanced_settings_tile_subtitle": "إعدادات المستخدم المتقدمة", "advanced_settings_tile_subtitle": "إعدادات المستخدم المتقدمة",
@@ -466,10 +479,14 @@
"api_key_description": "سيتم عرض هذه القيمة مرة واحدة فقط. يرجى التأكد من نسخها قبل إغلاق النافذة.", "api_key_description": "سيتم عرض هذه القيمة مرة واحدة فقط. يرجى التأكد من نسخها قبل إغلاق النافذة.",
"api_key_empty": "يجب ألا يكون اسم مفتاح API فارغًا", "api_key_empty": "يجب ألا يكون اسم مفتاح API فارغًا",
"api_keys": "مفاتيح API", "api_keys": "مفاتيح API",
"app_architecture_variant": "متغير (الهندسة المعمارية)",
"app_bar_signout_dialog_content": "هل أنت متأكد أنك تريد تسجيل الخروج؟", "app_bar_signout_dialog_content": "هل أنت متأكد أنك تريد تسجيل الخروج؟",
"app_bar_signout_dialog_ok": "نعم", "app_bar_signout_dialog_ok": "نعم",
"app_bar_signout_dialog_title": "خروج", "app_bar_signout_dialog_title": "خروج",
"app_download_links": "روابط تحميل التطبيق",
"app_settings": "إعدادات التطبيق", "app_settings": "إعدادات التطبيق",
"app_stores": "متاجر التطبيقات",
"app_update_available": "تحديث التطبيق متاح",
"appears_in": "يظهر في", "appears_in": "يظهر في",
"apply_count": "تطبيق ({count, number})", "apply_count": "تطبيق ({count, number})",
"archive": "الأرشيف", "archive": "الأرشيف",
@@ -553,6 +570,7 @@
"backup_albums_sync": "مزامنة ألبومات النسخ الاحتياطي", "backup_albums_sync": "مزامنة ألبومات النسخ الاحتياطي",
"backup_all": "الجميع", "backup_all": "الجميع",
"backup_background_service_backup_failed_message": "فشل في النسخ الاحتياطي للأصول. جارٍ إعادة المحاولة…", "backup_background_service_backup_failed_message": "فشل في النسخ الاحتياطي للأصول. جارٍ إعادة المحاولة…",
"backup_background_service_complete_notification": "تم الانتهاء من النسخ الاحتياطي للأصول",
"backup_background_service_connection_failed_message": "فشل في الاتصال بالخادم. جارٍ إعادة المحاولة…", "backup_background_service_connection_failed_message": "فشل في الاتصال بالخادم. جارٍ إعادة المحاولة…",
"backup_background_service_current_upload_notification": "تحميل {filename}", "backup_background_service_current_upload_notification": "تحميل {filename}",
"backup_background_service_default_notification": "التحقق من الأصول الجديدة…", "backup_background_service_default_notification": "التحقق من الأصول الجديدة…",
@@ -662,6 +680,8 @@
"change_password_description": "هذه إما هي المرة الأولى التي تقوم فيها بتسجيل الدخول إلى النظام أو أنه تم تقديم طلب لتغيير كلمة المرور الخاصة بك. الرجاء إدخال كلمة المرور الجديدة أدناه.", "change_password_description": "هذه إما هي المرة الأولى التي تقوم فيها بتسجيل الدخول إلى النظام أو أنه تم تقديم طلب لتغيير كلمة المرور الخاصة بك. الرجاء إدخال كلمة المرور الجديدة أدناه.",
"change_password_form_confirm_password": "تأكيد كلمة المرور", "change_password_form_confirm_password": "تأكيد كلمة المرور",
"change_password_form_description": "مرحبًا {name}،\n\nاما ان تكون هذه هي المرة الأولى التي تقوم فيها بالتسجيل في النظام أو تم تقديم طلب لتغيير كلمة المرور الخاصة بك. الرجاء إدخال كلمة المرور الجديدة أدناه.", "change_password_form_description": "مرحبًا {name}،\n\nاما ان تكون هذه هي المرة الأولى التي تقوم فيها بالتسجيل في النظام أو تم تقديم طلب لتغيير كلمة المرور الخاصة بك. الرجاء إدخال كلمة المرور الجديدة أدناه.",
"change_password_form_log_out": "تسجيل الخروج من جميع الأجهزة الأخرى",
"change_password_form_log_out_description": "يُنصح بتسجيل الخروج من جميع الأجهزة الأخرى",
"change_password_form_new_password": "كلمة المرور الجديدة", "change_password_form_new_password": "كلمة المرور الجديدة",
"change_password_form_password_mismatch": "كلمة المرور غير مطابقة", "change_password_form_password_mismatch": "كلمة المرور غير مطابقة",
"change_password_form_reenter_new_password": "أعد إدخال كلمة مرور جديدة", "change_password_form_reenter_new_password": "أعد إدخال كلمة مرور جديدة",
@@ -689,7 +709,7 @@
"client_cert_invalid_msg": "ملف شهادة عميل غير صالحة او كلمة سر غير صحيحة", "client_cert_invalid_msg": "ملف شهادة عميل غير صالحة او كلمة سر غير صحيحة",
"client_cert_remove_msg": "تم ازالة شهادة العميل", "client_cert_remove_msg": "تم ازالة شهادة العميل",
"client_cert_subtitle": "يدعم صيغ PKCS12 (.p12, .pfx)فقط. استيراد/ازالة الشهادات متاح فقط قبل تسجيل الدخول", "client_cert_subtitle": "يدعم صيغ PKCS12 (.p12, .pfx)فقط. استيراد/ازالة الشهادات متاح فقط قبل تسجيل الدخول",
"client_cert_title": "شهادة مستخدم SSL", "client_cert_title": "شهادة مستخدم SSL [تجريبية]",
"clockwise": "باتجاه عقارب الساعة", "clockwise": "باتجاه عقارب الساعة",
"close": "إغلاق", "close": "إغلاق",
"collapse": "طي", "collapse": "طي",
@@ -739,6 +759,7 @@
"create": "انشاء", "create": "انشاء",
"create_album": "إنشاء ألبوم", "create_album": "إنشاء ألبوم",
"create_album_page_untitled": "بدون اسم", "create_album_page_untitled": "بدون اسم",
"create_api_key": "إنشاء مفتاح API",
"create_library": "إنشاء مكتبة", "create_library": "إنشاء مكتبة",
"create_link": "إنشاء رابط", "create_link": "إنشاء رابط",
"create_link_to_share": "إنشاء رابط للمشاركة", "create_link_to_share": "إنشاء رابط للمشاركة",
@@ -768,6 +789,7 @@
"daily_title_text_date_year": "E ، MMM DD ، yyyy", "daily_title_text_date_year": "E ، MMM DD ، yyyy",
"dark": "معتم", "dark": "معتم",
"dark_theme": "تبديل المظهر الداكن", "dark_theme": "تبديل المظهر الداكن",
"date": "تاريخ",
"date_after": "التارخ بعد", "date_after": "التارخ بعد",
"date_and_time": "التاريخ و الوقت", "date_and_time": "التاريخ و الوقت",
"date_before": "التاريخ قبل", "date_before": "التاريخ قبل",
@@ -870,8 +892,6 @@
"edit_description_prompt": "الرجاء اختيار وصف جديد:", "edit_description_prompt": "الرجاء اختيار وصف جديد:",
"edit_exclusion_pattern": "تعديل نمط الاستبعاد", "edit_exclusion_pattern": "تعديل نمط الاستبعاد",
"edit_faces": "تعديل الوجوه", "edit_faces": "تعديل الوجوه",
"edit_import_path": "تعديل مسار الاستيراد",
"edit_import_paths": "تعديل مسارات الاستيراد",
"edit_key": "تعديل المفتاح", "edit_key": "تعديل المفتاح",
"edit_link": "تغيير الرابط", "edit_link": "تغيير الرابط",
"edit_location": "تعديل الموقع", "edit_location": "تعديل الموقع",
@@ -943,7 +963,6 @@
"failed_to_stack_assets": "فشل في تكديس المحتويات", "failed_to_stack_assets": "فشل في تكديس المحتويات",
"failed_to_unstack_assets": "فشل في فصل المحتويات", "failed_to_unstack_assets": "فشل في فصل المحتويات",
"failed_to_update_notification_status": "فشل في تحديث حالة الإشعار", "failed_to_update_notification_status": "فشل في تحديث حالة الإشعار",
"import_path_already_exists": "مسار الاستيراد هذا موجود مسبقًا.",
"incorrect_email_or_password": "بريد أو كلمة مرور غير صحيحة", "incorrect_email_or_password": "بريد أو كلمة مرور غير صحيحة",
"paths_validation_failed": "فشل في التحقق من {paths, plural, one {# مسار} other {# مسارات}}", "paths_validation_failed": "فشل في التحقق من {paths, plural, one {# مسار} other {# مسارات}}",
"profile_picture_transparent_pixels": "لا يمكن أن تحتوي صور الملف الشخصي على أجزاء/بكسلات شفافة. يرجى التكبير و/أو تحريك الصورة.", "profile_picture_transparent_pixels": "لا يمكن أن تحتوي صور الملف الشخصي على أجزاء/بكسلات شفافة. يرجى التكبير و/أو تحريك الصورة.",
@@ -953,7 +972,6 @@
"unable_to_add_assets_to_shared_link": "تعذر إضافة المحتويات إلى الرابط المشترك", "unable_to_add_assets_to_shared_link": "تعذر إضافة المحتويات إلى الرابط المشترك",
"unable_to_add_comment": "تعذر إضافة التعليق", "unable_to_add_comment": "تعذر إضافة التعليق",
"unable_to_add_exclusion_pattern": "تعذر إضافة نمط الإستبعاد", "unable_to_add_exclusion_pattern": "تعذر إضافة نمط الإستبعاد",
"unable_to_add_import_path": "تعذر إضافة مسار الإستيراد",
"unable_to_add_partners": "تعذر إضافة الشركاء", "unable_to_add_partners": "تعذر إضافة الشركاء",
"unable_to_add_remove_archive": "تعذر {archived, select, true {إزالة المحتوى من} other {إضافة المحتوى إلى}} الأرشيف", "unable_to_add_remove_archive": "تعذر {archived, select, true {إزالة المحتوى من} other {إضافة المحتوى إلى}} الأرشيف",
"unable_to_add_remove_favorites": "تعذر {favorite, select, true {إضافة المحتوى إلى} other {إزالة المحتوى من}} المفضلة", "unable_to_add_remove_favorites": "تعذر {favorite, select, true {إضافة المحتوى إلى} other {إزالة المحتوى من}} المفضلة",
@@ -976,12 +994,10 @@
"unable_to_delete_asset": "غير قادر على حذف المحتوى", "unable_to_delete_asset": "غير قادر على حذف المحتوى",
"unable_to_delete_assets": "حدث خطأ أثناء حذف المحتويات", "unable_to_delete_assets": "حدث خطأ أثناء حذف المحتويات",
"unable_to_delete_exclusion_pattern": "غير قادر على حذف نمط الاستبعاد", "unable_to_delete_exclusion_pattern": "غير قادر على حذف نمط الاستبعاد",
"unable_to_delete_import_path": "غير قادر على حذف مسار الاستيراد",
"unable_to_delete_shared_link": "غير قادر على حذف الرابط المشترك", "unable_to_delete_shared_link": "غير قادر على حذف الرابط المشترك",
"unable_to_delete_user": "غير قادر على حذف المستخدم", "unable_to_delete_user": "غير قادر على حذف المستخدم",
"unable_to_download_files": "غير قادر على تنزيل الملفات", "unable_to_download_files": "غير قادر على تنزيل الملفات",
"unable_to_edit_exclusion_pattern": "غير قادر على تعديل نمط الاستبعاد", "unable_to_edit_exclusion_pattern": "غير قادر على تعديل نمط الاستبعاد",
"unable_to_edit_import_path": "غير قادر على تحرير مسار الاستيراد",
"unable_to_empty_trash": "غير قادر على إفراغ سلة المهملات", "unable_to_empty_trash": "غير قادر على إفراغ سلة المهملات",
"unable_to_enter_fullscreen": "غير قادر على الدخول إلى وضع ملء الشاشة", "unable_to_enter_fullscreen": "غير قادر على الدخول إلى وضع ملء الشاشة",
"unable_to_exit_fullscreen": "غير قادر على الخروج من وضع ملء الشاشة", "unable_to_exit_fullscreen": "غير قادر على الخروج من وضع ملء الشاشة",
@@ -1037,6 +1053,7 @@
"exif_bottom_sheet_description_error": "خطأ في تحديث الوصف", "exif_bottom_sheet_description_error": "خطأ في تحديث الوصف",
"exif_bottom_sheet_details": "تفاصيل", "exif_bottom_sheet_details": "تفاصيل",
"exif_bottom_sheet_location": "موقع", "exif_bottom_sheet_location": "موقع",
"exif_bottom_sheet_no_description": "لا يوجد وصف",
"exif_bottom_sheet_people": "الناس", "exif_bottom_sheet_people": "الناس",
"exif_bottom_sheet_person_add_person": "اضف اسما", "exif_bottom_sheet_person_add_person": "اضف اسما",
"exit_slideshow": "خروج من العرض التقديمي", "exit_slideshow": "خروج من العرض التقديمي",
@@ -1075,6 +1092,7 @@
"features_setting_description": "إدارة ميزات التطبيق", "features_setting_description": "إدارة ميزات التطبيق",
"file_name": "إسم الملف", "file_name": "إسم الملف",
"file_name_or_extension": "اسم الملف أو امتداده", "file_name_or_extension": "اسم الملف أو امتداده",
"file_size": "حجم الملف",
"filename": "اسم الملف", "filename": "اسم الملف",
"filetype": "نوع الملف", "filetype": "نوع الملف",
"filter": "تصفية", "filter": "تصفية",
@@ -1114,7 +1132,7 @@
"hash_asset": "عمل Hash للأصل (للملف)", "hash_asset": "عمل Hash للأصل (للملف)",
"hashed_assets": "أصول (ملفات) تم عمل Hash لها", "hashed_assets": "أصول (ملفات) تم عمل Hash لها",
"hashing": "يتم عمل Hash", "hashing": "يتم عمل Hash",
"header_settings_add_header_tip": "اضاف راس", "header_settings_add_header_tip": "إضافة رأس الصفحة",
"header_settings_field_validator_msg": "القيمة لا يمكن ان تكون فارغة", "header_settings_field_validator_msg": "القيمة لا يمكن ان تكون فارغة",
"header_settings_header_name_input": "اسم الرأس", "header_settings_header_name_input": "اسم الرأس",
"header_settings_header_value_input": "قيمة الرأس", "header_settings_header_value_input": "قيمة الرأس",
@@ -1238,6 +1256,7 @@
"local_media_summary": "ملخص الملفات المحلية", "local_media_summary": "ملخص الملفات المحلية",
"local_network": "شبكة محلية", "local_network": "شبكة محلية",
"local_network_sheet_info": "سيتصل التطبيق بالخادم من خلال عنوان URL هذا عند استخدام شبكة Wi-Fi المحددة", "local_network_sheet_info": "سيتصل التطبيق بالخادم من خلال عنوان URL هذا عند استخدام شبكة Wi-Fi المحددة",
"location": "موقع",
"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": "اختر على الخريطة",
@@ -1342,6 +1361,8 @@
"minute": "دقيقة", "minute": "دقيقة",
"minutes": "دقائق", "minutes": "دقائق",
"missing": "المفقودة", "missing": "المفقودة",
"mobile_app": "تطبيق الجوال",
"mobile_app_download_onboarding_note": "قم بتنزيل التطبيق المصاحب للهاتف المحمول باستخدام الخيارات التالية",
"model": "نموذج", "model": "نموذج",
"month": "شهر", "month": "شهر",
"monthly_title_text_date_format": "ط ط ط", "monthly_title_text_date_format": "ط ط ط",
@@ -1360,6 +1381,8 @@
"my_albums": "ألبوماتي", "my_albums": "ألبوماتي",
"name": "الاسم", "name": "الاسم",
"name_or_nickname": "الاسم أو اللقب", "name_or_nickname": "الاسم أو اللقب",
"navigate": "التنقل",
"navigate_to_time": "انتقل إلى الوقت",
"network_requirement_photos_upload": "استخدام بيانات الهاتف المحمول لعمل نسخة احتياطية للصور", "network_requirement_photos_upload": "استخدام بيانات الهاتف المحمول لعمل نسخة احتياطية للصور",
"network_requirement_videos_upload": "استخدام بيانات الهاتف المحمول لعمل نسخة احتياطية لمقاطع الفيديو", "network_requirement_videos_upload": "استخدام بيانات الهاتف المحمول لعمل نسخة احتياطية لمقاطع الفيديو",
"network_requirements": "متطلبات الشبكة", "network_requirements": "متطلبات الشبكة",
@@ -1369,6 +1392,7 @@
"never": "أبداً", "never": "أبداً",
"new_album": "البوم جديد", "new_album": "البوم جديد",
"new_api_key": "مفتاح API جديد", "new_api_key": "مفتاح API جديد",
"new_date_range": "نطاق تاريخ جديد",
"new_password": "كلمة المرور الجديدة", "new_password": "كلمة المرور الجديدة",
"new_person": "شخص جديد", "new_person": "شخص جديد",
"new_pin_code": "رمز PIN الجديد", "new_pin_code": "رمز PIN الجديد",
@@ -1419,6 +1443,9 @@
"notifications": "إشعارات", "notifications": "إشعارات",
"notifications_setting_description": "إدارة الإشعارات", "notifications_setting_description": "إدارة الإشعارات",
"oauth": "OAuth", "oauth": "OAuth",
"obtainium_configurator": "مُهيئ Obtainium",
"obtainium_configurator_instructions": "استخدم Obtainium لتثبيت تطبيق Android وتحديثه مباشرةً من صفحة إصدارات Immich على GitHub. أنشئ مفتاح API واختر الإصدار المناسب لإنشاء رابط تهيئة Obtainium الخاص بك",
"ocr": "التعرف البصري على الحروف",
"official_immich_resources": "الموارد الرسمية لشركة Immich", "official_immich_resources": "الموارد الرسمية لشركة Immich",
"offline": "غير متصل", "offline": "غير متصل",
"offset": "ازاحة", "offset": "ازاحة",
@@ -1523,6 +1550,9 @@
"play_memories": "تشغيل الذكريات", "play_memories": "تشغيل الذكريات",
"play_motion_photo": "تشغيل الصور المتحركة", "play_motion_photo": "تشغيل الصور المتحركة",
"play_or_pause_video": "تشغيل الفيديو أو إيقافه مؤقتًا", "play_or_pause_video": "تشغيل الفيديو أو إيقافه مؤقتًا",
"play_original_video": "تشغيل الفيديو الأصلي",
"play_original_video_setting_description": "تفضيل تشغيل مقاطع الفيديو الأصلية بدلاً من مقاطع الفيديو المحولة. إذا لم يكن الملف الأصلي متوافقًا، فقد لا يتم تشغيله بشكل صحيح.",
"play_transcoded_video": "تشغيل الفيديو المُعاد ترميزه",
"please_auth_to_access": "الرجاء القيام بالمصادقة للوصول", "please_auth_to_access": "الرجاء القيام بالمصادقة للوصول",
"port": "المنفذ", "port": "المنفذ",
"preferences_settings_subtitle": "ادارة تفضيلات التطبيق", "preferences_settings_subtitle": "ادارة تفضيلات التطبيق",
@@ -1659,6 +1689,7 @@
"reset_sqlite_confirmation": "هل أنت متأكد من رغبتك في إعادة ضبط قاعدة بيانات SQLite؟ ستحتاج إلى تسجيل الخروج ثم تسجيل الدخول مرة أخرى لإعادة مزامنة البيانات", "reset_sqlite_confirmation": "هل أنت متأكد من رغبتك في إعادة ضبط قاعدة بيانات SQLite؟ ستحتاج إلى تسجيل الخروج ثم تسجيل الدخول مرة أخرى لإعادة مزامنة البيانات",
"reset_sqlite_success": "تم إعادة تعيين قاعدة بيانات SQLite بنجاح", "reset_sqlite_success": "تم إعادة تعيين قاعدة بيانات SQLite بنجاح",
"reset_to_default": "إعادة التعيين إلى الافتراضي", "reset_to_default": "إعادة التعيين إلى الافتراضي",
"resolution": "دقة",
"resolve_duplicates": "معالجة النسخ المكررة", "resolve_duplicates": "معالجة النسخ المكررة",
"resolved_all_duplicates": "تم حل جميع التكرارات", "resolved_all_duplicates": "تم حل جميع التكرارات",
"restore": "الاستعاده من سلة المهملات", "restore": "الاستعاده من سلة المهملات",
@@ -1677,6 +1708,7 @@
"running": "قيد التشغيل", "running": "قيد التشغيل",
"save": "حفظ", "save": "حفظ",
"save_to_gallery": "حفظ الى المعرض", "save_to_gallery": "حفظ الى المعرض",
"saved": "تم الحفظ",
"saved_api_key": "تم حفظ مفتاح الـ API", "saved_api_key": "تم حفظ مفتاح الـ API",
"saved_profile": "تم حفظ الملف", "saved_profile": "تم حفظ الملف",
"saved_settings": "تم حفظ الإعدادات", "saved_settings": "تم حفظ الإعدادات",
@@ -1693,6 +1725,9 @@
"search_by_description_example": "يوم المشي لمسافات طويلة في سابا", "search_by_description_example": "يوم المشي لمسافات طويلة في سابا",
"search_by_filename": "البحث بإسم الملف أو نوعه", "search_by_filename": "البحث بإسم الملف أو نوعه",
"search_by_filename_example": "كـ IMG_1234.JPG أو PNG", "search_by_filename_example": "كـ IMG_1234.JPG أو PNG",
"search_by_ocr": "البحث عن طريق التعرف البصري على الحروف",
"search_by_ocr_example": "لاتيه",
"search_camera_lens_model": "بحث نموذج العدسة...",
"search_camera_make": "البحث حسب الشركة المصنعة للكاميرا...", "search_camera_make": "البحث حسب الشركة المصنعة للكاميرا...",
"search_camera_model": "البحث حسب موديل الكاميرا...", "search_camera_model": "البحث حسب موديل الكاميرا...",
"search_city": "البحث حسب المدينة...", "search_city": "البحث حسب المدينة...",
@@ -1709,6 +1744,7 @@
"search_filter_location_title": "اختر الموقع", "search_filter_location_title": "اختر الموقع",
"search_filter_media_type": "نوع الوسائط", "search_filter_media_type": "نوع الوسائط",
"search_filter_media_type_title": "اختر نوع الوسائط", "search_filter_media_type_title": "اختر نوع الوسائط",
"search_filter_ocr": "البحث عن طريق التعرف البصري على الحروف",
"search_filter_people_title": "اختر الاشخاص", "search_filter_people_title": "اختر الاشخاص",
"search_for": "البحث عن", "search_for": "البحث عن",
"search_for_existing_person": "البحث عن شخص موجود", "search_for_existing_person": "البحث عن شخص موجود",
@@ -1771,6 +1807,7 @@
"server_online": "الخادم متصل", "server_online": "الخادم متصل",
"server_privacy": "خصوصية الخادم", "server_privacy": "خصوصية الخادم",
"server_stats": "إحصائيات الخادم", "server_stats": "إحصائيات الخادم",
"server_update_available": "تحديث الخادم متاح",
"server_version": "إصدار الخادم", "server_version": "إصدار الخادم",
"set": "‏تحديد", "set": "‏تحديد",
"set_as_album_cover": "تحديد كغلاف للألبوم", "set_as_album_cover": "تحديد كغلاف للألبوم",
@@ -1799,6 +1836,8 @@
"setting_notifications_subtitle": "اضبط تفضيلات الإخطار", "setting_notifications_subtitle": "اضبط تفضيلات الإخطار",
"setting_notifications_total_progress_subtitle": "التقدم التحميل العام (تم القيام به/إجمالي الأصول)", "setting_notifications_total_progress_subtitle": "التقدم التحميل العام (تم القيام به/إجمالي الأصول)",
"setting_notifications_total_progress_title": "إظهار النسخ الاحتياطي الخلفية التقدم المحرز", "setting_notifications_total_progress_title": "إظهار النسخ الاحتياطي الخلفية التقدم المحرز",
"setting_video_viewer_auto_play_subtitle": "بدء تشغيل مقاطع الفيديو تلقائيًا عند فتحها",
"setting_video_viewer_auto_play_title": "تشغيل الفيديوهات تلقائيًا",
"setting_video_viewer_looping_title": "تكرار مقطع فيديو تلقائيًا", "setting_video_viewer_looping_title": "تكرار مقطع فيديو تلقائيًا",
"setting_video_viewer_original_video_subtitle": "عند بث فيديو من الخادم، شغّل النسخة الأصلية حتى مع توفر ترميز بديل. قد يؤدي ذلك إلى تقطيع اثناء العرض . تُشغّل الفيديوهات المتوفرة محليًا بجودة أصلية بغض النظر عن هذا الإعداد.", "setting_video_viewer_original_video_subtitle": "عند بث فيديو من الخادم، شغّل النسخة الأصلية حتى مع توفر ترميز بديل. قد يؤدي ذلك إلى تقطيع اثناء العرض . تُشغّل الفيديوهات المتوفرة محليًا بجودة أصلية بغض النظر عن هذا الإعداد.",
"setting_video_viewer_original_video_title": "اجبار عرض الفديو الاصلي", "setting_video_viewer_original_video_title": "اجبار عرض الفديو الاصلي",
@@ -1978,6 +2017,7 @@
"theme_setting_three_stage_loading_title": "تمكين تحميل ثلاث مراحل", "theme_setting_three_stage_loading_title": "تمكين تحميل ثلاث مراحل",
"they_will_be_merged_together": "سيتم دمجهم معًا", "they_will_be_merged_together": "سيتم دمجهم معًا",
"third_party_resources": "موارد الطرف الثالث", "third_party_resources": "موارد الطرف الثالث",
"time": "وقت",
"time_based_memories": "ذكريات استنادًا للوقت", "time_based_memories": "ذكريات استنادًا للوقت",
"timeline": "الخط الزمني", "timeline": "الخط الزمني",
"timezone": "المنطقة الزمنية", "timezone": "المنطقة الزمنية",
@@ -2010,6 +2050,7 @@
"troubleshoot": "استكشاف المشاكل", "troubleshoot": "استكشاف المشاكل",
"type": "النوع", "type": "النوع",
"unable_to_change_pin_code": "تفيير رمز PIN غير ممكن", "unable_to_change_pin_code": "تفيير رمز PIN غير ممكن",
"unable_to_check_version": "تعذر التحقق من إصدار التطبيق أو الخادم",
"unable_to_setup_pin_code": "انشاء رمز PIN غير ممكن", "unable_to_setup_pin_code": "انشاء رمز PIN غير ممكن",
"unarchive": "أخرج من الأرشيف", "unarchive": "أخرج من الأرشيف",
"unarchive_action_prompt": "{count} ازيل من الارشيف", "unarchive_action_prompt": "{count} ازيل من الارشيف",
-2
View File
@@ -17,7 +17,6 @@
"add_birthday": "Doğum günü əlavə et", "add_birthday": "Doğum günü əlavə et",
"add_endpoint": "Son nöqtə əlavə et", "add_endpoint": "Son nöqtə əlavə et",
"add_exclusion_pattern": "Çıxarma nümunəsi əlavə et", "add_exclusion_pattern": "Çıxarma nümunəsi əlavə et",
"add_import_path": "İdxal yolu əlavə et",
"add_location": "Məkan əlavə et", "add_location": "Məkan əlavə et",
"add_more_users": "Daha çox istifadəçi əlavə et", "add_more_users": "Daha çox istifadəçi əlavə et",
"add_partner": "Partnyor əlavə et", "add_partner": "Partnyor əlavə et",
@@ -85,7 +84,6 @@
"jobs_failed": "{jobCount, plural, other {# uğursuz}}", "jobs_failed": "{jobCount, plural, other {# uğursuz}}",
"library_created": "{library} kitabxanası yaradıldı", "library_created": "{library} kitabxanası yaradıldı",
"library_deleted": "Kitabxana silindi", "library_deleted": "Kitabxana silindi",
"library_import_path_description": "İdxal olunacaq qovluöu seçin. Bu qovluq, alt qovluqlar daxil olmaqla şəkil və videolar üçün skan ediləcəkdir.",
"library_scanning": "Periodik skan", "library_scanning": "Periodik skan",
"library_scanning_description": "Periodik kitabxana skanını confiqurasiya et", "library_scanning_description": "Periodik kitabxana skanını confiqurasiya et",
"library_scanning_enable_description": "Periodik kitabxana skanını aktivləşdir", "library_scanning_enable_description": "Periodik kitabxana skanını aktivləşdir",
+2 -3
View File
@@ -17,7 +17,6 @@
"add_birthday": "Дадаць дзень нараджэння", "add_birthday": "Дадаць дзень нараджэння",
"add_endpoint": "Дадаць кропку доступу", "add_endpoint": "Дадаць кропку доступу",
"add_exclusion_pattern": "Дадаць шаблон выключэння", "add_exclusion_pattern": "Дадаць шаблон выключэння",
"add_import_path": "Дадаць шлях імпарту",
"add_location": "Дадайце месца", "add_location": "Дадайце месца",
"add_more_users": "Дадаць больш карыстальнікаў", "add_more_users": "Дадаць больш карыстальнікаў",
"add_partner": "Дадаць партнёра", "add_partner": "Дадаць партнёра",
@@ -318,8 +317,6 @@
"edit_description": "Рэдагаваць апісанне", "edit_description": "Рэдагаваць апісанне",
"edit_description_prompt": "Выберыце новае апісанне:", "edit_description_prompt": "Выберыце новае апісанне:",
"edit_faces": "Рэдагаваць твары", "edit_faces": "Рэдагаваць твары",
"edit_import_path": "Рэдагаваць шлях імпарту",
"edit_import_paths": "Рэдагаваць шляхі імпарту",
"edit_key": "Рэдагаваць ключ", "edit_key": "Рэдагаваць ключ",
"edit_link": "Рэдагаваць спасылку", "edit_link": "Рэдагаваць спасылку",
"edit_location": "Рэдагаваць месцазнаходжанне", "edit_location": "Рэдагаваць месцазнаходжанне",
@@ -398,6 +395,8 @@
"partner_list_user_photos": "Фота карыстальніка {user}", "partner_list_user_photos": "Фота карыстальніка {user}",
"pause": "Прыпыніць", "pause": "Прыпыніць",
"people": "Людзі", "people": "Людзі",
"permanent_deletion_warning": "Папярэджанне аб канчатковым выдаленні",
"permanent_deletion_warning_setting_description": "Паказаць папярэджанне пры канчатковым выдаленні рэсурсаў",
"permission_onboarding_back": "Назад", "permission_onboarding_back": "Назад",
"permission_onboarding_continue_anyway": "Усё адно працягнуць", "permission_onboarding_continue_anyway": "Усё адно працягнуць",
"photos": "Фота", "photos": "Фота",
+49 -10
View File
@@ -17,7 +17,6 @@
"add_birthday": "Добави дата на раждане", "add_birthday": "Добави дата на раждане",
"add_endpoint": "Добави крайна точка", "add_endpoint": "Добави крайна точка",
"add_exclusion_pattern": "Добави модел за изключване", "add_exclusion_pattern": "Добави модел за изключване",
"add_import_path": "Добави път за импортиране",
"add_location": "Дoбави местоположение", "add_location": "Дoбави местоположение",
"add_more_users": "Добави още потребители", "add_more_users": "Добави още потребители",
"add_partner": "Добави партньор", "add_partner": "Добави партньор",
@@ -32,6 +31,7 @@
"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})",
"add_to_bottom_bar": "Добави към",
"add_to_shared_album": "Добави към споделен албум", "add_to_shared_album": "Добави към споделен албум",
"add_upload_to_stack": "Добави качените в група", "add_upload_to_stack": "Добави качените в група",
"add_url": "Добави URL", "add_url": "Добави URL",
@@ -112,7 +112,6 @@
"jobs_failed": "{jobCount, plural, other {# неуспешни}}", "jobs_failed": "{jobCount, plural, other {# неуспешни}}",
"library_created": "Създадена библиотека: {library}", "library_created": "Създадена библиотека: {library}",
"library_deleted": "Библиотека е изтрита", "library_deleted": "Библиотека е изтрита",
"library_import_path_description": "Посочете папка за импортиране. Тази папка, включително подпапките, ще бъдат сканирани за изображения и видеоклипове.",
"library_scanning": "Периодично сканиране", "library_scanning": "Периодично сканиране",
"library_scanning_description": "Конфигурирай периодично сканиране на библиотеката", "library_scanning_description": "Конфигурирай периодично сканиране на библиотеката",
"library_scanning_enable_description": "Включване на периодичното сканиране на библиотеката", "library_scanning_enable_description": "Включване на периодичното сканиране на библиотеката",
@@ -151,9 +150,21 @@
"machine_learning_max_recognition_distance": "Максимално разстояние за разпознаване", "machine_learning_max_recognition_distance": "Максимално разстояние за разпознаване",
"machine_learning_max_recognition_distance_description": "Максимално разстояние между две лица, за да се считат за едно и също лице, в диапазона 0-2. Намаляването му може да предотврати определянето на две лица като едно и също лице, а увеличаването му може да предотврати определянето на едно и също лице като две различни лица. Имайте предвид, че е по-лесно да се слеят две лица, отколкото да се раздели едно лице на две, така че по възможност изберете по-ниска стойност.", "machine_learning_max_recognition_distance_description": "Максимално разстояние между две лица, за да се считат за едно и също лице, в диапазона 0-2. Намаляването му може да предотврати определянето на две лица като едно и също лице, а увеличаването му може да предотврати определянето на едно и също лице като две различни лица. Имайте предвид, че е по-лесно да се слеят две лица, отколкото да се раздели едно лице на две, така че по възможност изберете по-ниска стойност.",
"machine_learning_min_detection_score": "Минимална оценка за откриване", "machine_learning_min_detection_score": "Минимална оценка за откриване",
"machine_learning_min_detection_score_description": "Минимална оценка на доверието, за да бъде считано лице като открито - от 0 до 1. По-ниските стойности ще открият повече лица, но може да доведат до фалшиви положителни резултати.", "machine_learning_min_detection_score_description": "Минимална оценка на доверие, за да бъде считано лице като открито - от 0 до 1. По-ниските стойности ще открият повече лица, но може да доведат до фалшиви положителни резултати.",
"machine_learning_min_recognized_faces": "Минимум разпознати лица", "machine_learning_min_recognized_faces": "Минимум разпознати лица",
"machine_learning_min_recognized_faces_description": "Минималният брой разпознати лица, необходими за създаването на лице. Увеличаването му прави разпознаването на лица по-прецизно за сметка на увеличаването на вероятността дадено лице да не бъде причислено към лице.", "machine_learning_min_recognized_faces_description": "Минималният брой разпознати лица, необходими за създаването на лице. Увеличаването му прави разпознаването на лица по-прецизно за сметка на увеличаването на вероятността дадено лице да не бъде причислено към лице.",
"machine_learning_ocr": "Разпознаване на текст",
"machine_learning_ocr_description": "Използвайте машинно обучение за разпознаване на текст в изображенията",
"machine_learning_ocr_enabled": "Включи разпознаване на текст",
"machine_learning_ocr_enabled_description": "Ако е забранено, няма да се прави разпознаване на текст в изображенията.",
"machine_learning_ocr_max_resolution": "Максимална резолюция",
"machine_learning_ocr_max_resolution_description": "Изображения с резолюция над зададената ще бъдат преоразмерени при запазване на пропорцията. Голяма стойност позволява по-прецизно разпознаване, но обработката използва повече време и повече памет.",
"machine_learning_ocr_min_detection_score": "Минимална оценка за откриванe",
"machine_learning_ocr_min_detection_score_description": "Минималната оценка на доверие за откриване на текст може да бъде между 0 и 1. По-ниска стойност ще открива повече текст, но може да доведе до грешни резултати.",
"machine_learning_ocr_min_recognition_score": "Минимална оценкa за откриване",
"machine_learning_ocr_min_score_recognition_description": "Минимална оценка на доверие, за да бъде считан текст като открит - от 0 до 1. По-ниските стойности ще открият повече текст, но може да доведат до фалшиви положителни резултати.",
"machine_learning_ocr_model": "Модел за разпознаване на текст",
"machine_learning_ocr_model_description": "Сървърните модели са по-точни от мобилните модели, но изискват повече време и използват повече памет.",
"machine_learning_settings": "Настройки на машинното обучение", "machine_learning_settings": "Настройки на машинното обучение",
"machine_learning_settings_description": "Управление на функциите и настройките за машинно обучение", "machine_learning_settings_description": "Управление на функциите и настройките за машинно обучение",
"machine_learning_smart_search": "Интелигентно Търсене", "machine_learning_smart_search": "Интелигентно Търсене",
@@ -245,6 +256,7 @@
"oauth_storage_quota_default_description": "Квота в GiB, която да се използва, когато не е посочено друго.", "oauth_storage_quota_default_description": "Квота в GiB, която да се използва, когато не е посочено друго.",
"oauth_timeout": "Време на изчакване при заявка", "oauth_timeout": "Време на изчакване при заявка",
"oauth_timeout_description": "Време за изчакване на отговор на заявка, в милисекунди", "oauth_timeout_description": "Време за изчакване на отговор на заявка, в милисекунди",
"ocr_job_description": "Използване на машинно обучение за разпознаване на текст в изображенията",
"password_enable_description": "Влизане с имейл и парола", "password_enable_description": "Влизане с имейл и парола",
"password_settings": "Вписване с парола", "password_settings": "Вписване с парола",
"password_settings_description": "Управление на настройките за влизане с парола", "password_settings_description": "Управление на настройките за влизане с парола",
@@ -417,6 +429,7 @@
"age_months": "Възраст {months, plural, one {# месец} other {# месеци}}", "age_months": "Възраст {months, plural, one {# месец} other {# месеци}}",
"age_year_months": "Възраст 1 година, {months, plural, one {# месец} other {# месеци}}", "age_year_months": "Възраст 1 година, {months, plural, one {# месец} other {# месеци}}",
"age_years": "{years, plural, other {Година #}}", "age_years": "{years, plural, other {Година #}}",
"album": "Албум",
"album_added": "Албумът е добавен", "album_added": "Албумът е добавен",
"album_added_notification_setting_description": "Получавайте известие по имейл, когато бъдете добавени към споделен албум", "album_added_notification_setting_description": "Получавайте известие по имейл, когато бъдете добавени към споделен албум",
"album_cover_updated": "Обложката на албума е актуализирана", "album_cover_updated": "Обложката на албума е актуализирана",
@@ -462,6 +475,7 @@
"allow_edits": "Позволяване на редакции", "allow_edits": "Позволяване на редакции",
"allow_public_user_to_download": "Позволете на публичен потребител да може да изтегля", "allow_public_user_to_download": "Позволете на публичен потребител да може да изтегля",
"allow_public_user_to_upload": "Позволете на публичния потребител да може да качва", "allow_public_user_to_upload": "Позволете на публичния потребител да може да качва",
"allowed": "Разрешено",
"alt_text_qr_code": "Изображение на QR код", "alt_text_qr_code": "Изображение на QR код",
"anti_clockwise": "Обратно на часовниковата стрелка", "anti_clockwise": "Обратно на часовниковата стрелка",
"api_key": "API ключ", "api_key": "API ключ",
@@ -669,6 +683,8 @@
"change_password_description": "Това е или първият път, когато влизате в системата, или е направена заявка за промяна на паролата ви. Моля, въведете новата парола по-долу.", "change_password_description": "Това е или първият път, когато влизате в системата, или е направена заявка за промяна на паролата ви. Моля, въведете новата парола по-долу.",
"change_password_form_confirm_password": "Потвърди паролата", "change_password_form_confirm_password": "Потвърди паролата",
"change_password_form_description": "Здравейте {name},\n\nТова или е първото ви вписване в системата или има подадена заявка за смяна на паролата. Моля, въведете нова парола в полето по-долу.", "change_password_form_description": "Здравейте {name},\n\nТова или е първото ви вписване в системата или има подадена заявка за смяна на паролата. Моля, въведете нова парола в полето по-долу.",
"change_password_form_log_out": "Излизане от профила на всички други устройства",
"change_password_form_log_out_description": "Препоръчваме да се излезе от профила на всички други устройства",
"change_password_form_new_password": "Нова парола", "change_password_form_new_password": "Нова парола",
"change_password_form_password_mismatch": "Паролите не съвпадат", "change_password_form_password_mismatch": "Паролите не съвпадат",
"change_password_form_reenter_new_password": "Повтори новата парола", "change_password_form_reenter_new_password": "Повтори новата парола",
@@ -776,6 +792,7 @@
"daily_title_text_date_year": "E, dd MMM yyyy", "daily_title_text_date_year": "E, dd MMM yyyy",
"dark": "Тъмен", "dark": "Тъмен",
"dark_theme": "Тъмна тема", "dark_theme": "Тъмна тема",
"date": "Дата",
"date_after": "Дата след", "date_after": "Дата след",
"date_and_time": "Дата и час", "date_and_time": "Дата и час",
"date_before": "Дата преди", "date_before": "Дата преди",
@@ -878,8 +895,6 @@
"edit_description_prompt": "Моля, избери ново описание:", "edit_description_prompt": "Моля, избери ново описание:",
"edit_exclusion_pattern": "Редактиране на шаблон за изключване", "edit_exclusion_pattern": "Редактиране на шаблон за изключване",
"edit_faces": "Редактиране на лица", "edit_faces": "Редактиране на лица",
"edit_import_path": "Редактиране на пътя за импортиране",
"edit_import_paths": "Редактиране на пътища за импортиране",
"edit_key": "Редактиране на ключ", "edit_key": "Редактиране на ключ",
"edit_link": "Редактиране на линк", "edit_link": "Редактиране на линк",
"edit_location": "Редактиране на местоположението", "edit_location": "Редактиране на местоположението",
@@ -951,7 +966,6 @@
"failed_to_stack_assets": "Неуспешно подреждане на обекти", "failed_to_stack_assets": "Неуспешно подреждане на обекти",
"failed_to_unstack_assets": "Неуспешно премахване на подредбата на обекти", "failed_to_unstack_assets": "Неуспешно премахване на подредбата на обекти",
"failed_to_update_notification_status": "Неуспешно обновяване на състоянието на известията", "failed_to_update_notification_status": "Неуспешно обновяване на състоянието на известията",
"import_path_already_exists": "Този път за импортиране вече съществува.",
"incorrect_email_or_password": "Неправилен имейл или парола", "incorrect_email_or_password": "Неправилен имейл или парола",
"paths_validation_failed": "{paths, plural, one {# път} other {# пътища}} не преминаха валидация", "paths_validation_failed": "{paths, plural, one {# път} other {# пътища}} не преминаха валидация",
"profile_picture_transparent_pixels": "Профилните снимки не могат да имат прозрачни пиксели. Моля, увеличете и/или преместете изображението.", "profile_picture_transparent_pixels": "Профилните снимки не могат да имат прозрачни пиксели. Моля, увеличете и/или преместете изображението.",
@@ -961,7 +975,6 @@
"unable_to_add_assets_to_shared_link": "Неуспешно добавяне на обекти в споделен линк", "unable_to_add_assets_to_shared_link": "Неуспешно добавяне на обекти в споделен линк",
"unable_to_add_comment": "Неуспешно добавяне на коментар", "unable_to_add_comment": "Неуспешно добавяне на коментар",
"unable_to_add_exclusion_pattern": "Неуспешно добавяне на шаблон за изключение", "unable_to_add_exclusion_pattern": "Неуспешно добавяне на шаблон за изключение",
"unable_to_add_import_path": "Неуспешно добавяне на път за импортиране",
"unable_to_add_partners": "Неуспешно добавяне на партньори", "unable_to_add_partners": "Неуспешно добавяне на партньори",
"unable_to_add_remove_archive": "Неуспешно {archived, select, true {премахване на обект от} other {добавяне на обект в}} архива", "unable_to_add_remove_archive": "Неуспешно {archived, select, true {премахване на обект от} other {добавяне на обект в}} архива",
"unable_to_add_remove_favorites": "Неуспешно {favorite, select, true {добавяне на обект в} other {премахване на обект от}} любими", "unable_to_add_remove_favorites": "Неуспешно {favorite, select, true {добавяне на обект в} other {премахване на обект от}} любими",
@@ -984,12 +997,10 @@
"unable_to_delete_asset": "Не може да изтрие файла", "unable_to_delete_asset": "Не може да изтрие файла",
"unable_to_delete_assets": "Грешка при изтриване на файлове", "unable_to_delete_assets": "Грешка при изтриване на файлове",
"unable_to_delete_exclusion_pattern": "Не може да изтрие шаблон за изключване", "unable_to_delete_exclusion_pattern": "Не може да изтрие шаблон за изключване",
"unable_to_delete_import_path": "Пътят за импортиране не може да се изтрие",
"unable_to_delete_shared_link": "Споделената връзка не може да се изтрие", "unable_to_delete_shared_link": "Споделената връзка не може да се изтрие",
"unable_to_delete_user": "Не може да изтрие потребител", "unable_to_delete_user": "Не може да изтрие потребител",
"unable_to_download_files": "Не могат да се изтеглят файловете", "unable_to_download_files": "Не могат да се изтеглят файловете",
"unable_to_edit_exclusion_pattern": "Не може да се редактира шаблон за изключване", "unable_to_edit_exclusion_pattern": "Не може да се редактира шаблон за изключване",
"unable_to_edit_import_path": "Пътят за импортиране не може да се редактира",
"unable_to_empty_trash": "Неуспешно изпразване на кошчето", "unable_to_empty_trash": "Неуспешно изпразване на кошчето",
"unable_to_enter_fullscreen": "Не може да се отвори в цял екран", "unable_to_enter_fullscreen": "Не може да се отвори в цял екран",
"unable_to_exit_fullscreen": "Не може да излезе от цял екран", "unable_to_exit_fullscreen": "Не може да излезе от цял екран",
@@ -1084,6 +1095,7 @@
"features_setting_description": "Управление на функциите на приложението", "features_setting_description": "Управление на функциите на приложението",
"file_name": "Име на файла", "file_name": "Име на файла",
"file_name_or_extension": "Име на файл или разширение", "file_name_or_extension": "Име на файл или разширение",
"file_size": "Размер на файла",
"filename": "Име на файл", "filename": "Име на файл",
"filetype": "Тип на файл", "filetype": "Тип на файл",
"filter": "Филтър", "filter": "Филтър",
@@ -1179,6 +1191,8 @@
"import_path": "Път за импортиране", "import_path": "Път за импортиране",
"in_albums": "В {count, plural, one {# албум} other {# албума}}", "in_albums": "В {count, plural, one {# албум} other {# албума}}",
"in_archive": "В архив", "in_archive": "В архив",
"in_year": "{year} г.",
"in_year_selector": "През",
"include_archived": "Включване на архивирани", "include_archived": "Включване на архивирани",
"include_shared_albums": "Включване на споделени албуми", "include_shared_albums": "Включване на споделени албуми",
"include_shared_partner_assets": "Включване на споделените с партньор елементи", "include_shared_partner_assets": "Включване на споделените с партньор елементи",
@@ -1215,6 +1229,7 @@
"language_setting_description": "Изберете предпочитан език", "language_setting_description": "Изберете предпочитан език",
"large_files": "Големи файлове", "large_files": "Големи файлове",
"last": "Последен", "last": "Последен",
"last_months": "{count, plural, one {Последния месец} other {Последните # месеца}}",
"last_seen": "Последно видяно", "last_seen": "Последно видяно",
"latest_version": "Последна версия", "latest_version": "Последна версия",
"latitude": "Ширина", "latitude": "Ширина",
@@ -1247,6 +1262,7 @@
"local_media_summary": "Обобщение на локалните файлове", "local_media_summary": "Обобщение на локалните файлове",
"local_network": "Локална мрежа", "local_network": "Локална мрежа",
"local_network_sheet_info": "Приложението ще се свърже със сървъра на този URL, когато устройството е свързано към зададената Wi-Fi мрежа", "local_network_sheet_info": "Приложението ще се свърже със сървъра на този URL, когато устройството е свързано към зададената Wi-Fi мрежа",
"location": "Място",
"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": "Избери на карта",
@@ -1296,6 +1312,10 @@
"main_menu": "Главно меню", "main_menu": "Главно меню",
"make": "Марка", "make": "Марка",
"manage_geolocation": "Управление на местоположенията", "manage_geolocation": "Управление на местоположенията",
"manage_media_access_rationale": "Това разрешение е необходимо за правилно преместване на обекти в кошчето и за възстановяване от там.",
"manage_media_access_settings": "Отвори Настройки",
"manage_media_access_subtitle": "Разрешете приложението Immich да управлява и мести медийни файлове.",
"manage_media_access_title": "Управление на медийни файлове",
"manage_shared_links": "Управление на споделени връзки", "manage_shared_links": "Управление на споделени връзки",
"manage_sharing_with_partners": "Управление на споделянето с партньори", "manage_sharing_with_partners": "Управление на споделянето с партньори",
"manage_the_app_settings": "Управление на настройките на приложението", "manage_the_app_settings": "Управление на настройките на приложението",
@@ -1359,6 +1379,7 @@
"more": "Още", "more": "Още",
"move": "Премести", "move": "Премести",
"move_off_locked_folder": "Извади от заключената папка", "move_off_locked_folder": "Извади от заключената папка",
"move_to": "Премести към",
"move_to_lock_folder_action_prompt": "{count} са добавени в заключената папка", "move_to_lock_folder_action_prompt": "{count} са добавени в заключената папка",
"move_to_locked_folder": "Премести в заключена папка", "move_to_locked_folder": "Премести в заключена папка",
"move_to_locked_folder_confirmation": "Тези снимки и видеа ще бъдат изтрити от всички албуми и ще са достъпни само в заключената папка", "move_to_locked_folder_confirmation": "Тези снимки и видеа ще бъдат изтрити от всички албуми и ще са достъпни само в заключената папка",
@@ -1388,6 +1409,7 @@
"new_pin_code": "Нов PIN код", "new_pin_code": "Нов PIN код",
"new_pin_code_subtitle": "Това е първи достъп до заключена папка. Създайте PIN код за защитен достъп до тази страница", "new_pin_code_subtitle": "Това е първи достъп до заключена папка. Създайте PIN код за защитен достъп до тази страница",
"new_timeline": "Нова времева линия", "new_timeline": "Нова времева линия",
"new_update": "Ново обновление",
"new_user_created": "Създаден нов потребител", "new_user_created": "Създаден нов потребител",
"new_version_available": "НАЛИЧНА НОВА ВЕРСИЯ", "new_version_available": "НАЛИЧНА НОВА ВЕРСИЯ",
"newest_first": "Най-новите първи", "newest_first": "Най-новите първи",
@@ -1403,6 +1425,7 @@
"no_cast_devices_found": "Няма намерени устройства за предаване", "no_cast_devices_found": "Няма намерени устройства за предаване",
"no_checksum_local": "Липсват контролни суми - не може да се получат локални обекти", "no_checksum_local": "Липсват контролни суми - не може да се получат локални обекти",
"no_checksum_remote": "Липсват контролни суми - не може да се получат обекти от сървъра", "no_checksum_remote": "Липсват контролни суми - не може да се получат обекти от сървъра",
"no_devices": "Няма оторизирани устройства",
"no_duplicates_found": "Не бяха открити дубликати.", "no_duplicates_found": "Не бяха открити дубликати.",
"no_exif_info_available": "Няма exif информация", "no_exif_info_available": "Няма exif информация",
"no_explore_results_message": "Качете още снимки, за да разгледате колекцията си.", "no_explore_results_message": "Качете още снимки, за да разгледате колекцията си.",
@@ -1419,6 +1442,7 @@
"no_results_description": "Опитайте със синоним или по-обща ключова дума", "no_results_description": "Опитайте със синоним или по-обща ключова дума",
"no_shared_albums_message": "Създайте албум, за да споделяте снимки и видеоклипове с хората в мрежата си", "no_shared_albums_message": "Създайте албум, за да споделяте снимки и видеоклипове с хората в мрежата си",
"no_uploads_in_progress": "Няма качване в момента", "no_uploads_in_progress": "Няма качване в момента",
"not_allowed": "Не е разрешено",
"not_available": "Неналично", "not_available": "Неналично",
"not_in_any_album": "Не е в никой албум", "not_in_any_album": "Не е в никой албум",
"not_selected": "Не е избрано", "not_selected": "Не е избрано",
@@ -1435,6 +1459,7 @@
"oauth": "OAuth", "oauth": "OAuth",
"obtainium_configurator": "Конфигуратор за получаване", "obtainium_configurator": "Конфигуратор за получаване",
"obtainium_configurator_instructions": "Използвайте Obtainium за инсталация и обновяване на приложението за Android директно от GitHub на Immich. Създайте API ключ и изберете вариант за да създадете Obtainium конфигурационен линк", "obtainium_configurator_instructions": "Използвайте Obtainium за инсталация и обновяване на приложението за Android директно от GitHub на Immich. Създайте API ключ и изберете вариант за да създадете Obtainium конфигурационен линк",
"ocr": "Оптично разпознаване на текст",
"official_immich_resources": "Официална информация за Immich", "official_immich_resources": "Официална информация за Immich",
"offline": "Офлайн", "offline": "Офлайн",
"offset": "Отместване", "offset": "Отместване",
@@ -1528,6 +1553,8 @@
"photos_count": "{count, plural, one {{count, number} Снимка} other {{count, number} Снимки}}", "photos_count": "{count, plural, one {{count, number} Снимка} other {{count, number} Снимки}}",
"photos_from_previous_years": "Снимки от предходни години", "photos_from_previous_years": "Снимки от предходни години",
"pick_a_location": "Избери локация", "pick_a_location": "Избери локация",
"pick_custom_range": "Произволен период",
"pick_date_range": "Изберете период",
"pin_code_changed_successfully": "Успешно сменен PIN код", "pin_code_changed_successfully": "Успешно сменен PIN код",
"pin_code_reset_successfully": "Успешно нулиран PIN код", "pin_code_reset_successfully": "Успешно нулиран PIN код",
"pin_code_setup_successfully": "Успешно зададен PIN код", "pin_code_setup_successfully": "Успешно зададен PIN код",
@@ -1539,6 +1566,9 @@
"play_memories": "Възпроизвеждане на спомени", "play_memories": "Възпроизвеждане на спомени",
"play_motion_photo": "Възпроизведи Motion Photo", "play_motion_photo": "Възпроизведи Motion Photo",
"play_or_pause_video": "Възпроизвеждане или пауза на видео", "play_or_pause_video": "Възпроизвеждане или пауза на видео",
"play_original_video": "Пусни оригиналното видео",
"play_original_video_setting_description": "Предпочитане на показване на оригиналното видео, вместо транскодирани. Ако формата на оригиналния файл не се поддържа, възпроизвеждането може да бъде неправилно.",
"play_transcoded_video": "Покажи транскодирано видео",
"please_auth_to_access": "Моля, удостовери за достъп", "please_auth_to_access": "Моля, удостовери за достъп",
"port": "Порт", "port": "Порт",
"preferences_settings_subtitle": "Управление на предпочитанията на приложението", "preferences_settings_subtitle": "Управление на предпочитанията на приложението",
@@ -1675,6 +1705,7 @@
"reset_sqlite_confirmation": "Наистина ли искате да нулирате базата данни SQLite? Ще трябва да излезете от системата и да се впишете отново за нова синхронизация на данните", "reset_sqlite_confirmation": "Наистина ли искате да нулирате базата данни SQLite? Ще трябва да излезете от системата и да се впишете отново за нова синхронизация на данните",
"reset_sqlite_success": "Успешно нулиране на базата данни SQLite", "reset_sqlite_success": "Успешно нулиране на базата данни SQLite",
"reset_to_default": "Връщане на фабрични настройки", "reset_to_default": "Връщане на фабрични настройки",
"resolution": "Резолюция",
"resolve_duplicates": "Реши дубликатите", "resolve_duplicates": "Реши дубликатите",
"resolved_all_duplicates": "Всички дубликати са решени", "resolved_all_duplicates": "Всички дубликати са решени",
"restore": "Възстановяване", "restore": "Възстановяване",
@@ -1693,6 +1724,7 @@
"running": "Изпълняване", "running": "Изпълняване",
"save": "Запази", "save": "Запази",
"save_to_gallery": "Запази в галерията", "save_to_gallery": "Запази в галерията",
"saved": "Записано",
"saved_api_key": "Запазен API Key", "saved_api_key": "Запазен API Key",
"saved_profile": "Запазен профил", "saved_profile": "Запазен профил",
"saved_settings": "Запазени настройки", "saved_settings": "Запазени настройки",
@@ -1709,6 +1741,9 @@
"search_by_description_example": "Разходка в Сапа", "search_by_description_example": "Разходка в Сапа",
"search_by_filename": "Търси по име на файла или разширение", "search_by_filename": "Търси по име на файла или разширение",
"search_by_filename_example": "например IMG_1234.JPG или PNG", "search_by_filename_example": "например IMG_1234.JPG или PNG",
"search_by_ocr": "Търсене на текст",
"search_by_ocr_example": "Lattе",
"search_camera_lens_model": "Търсене на модел на обектива...",
"search_camera_make": "Търси производител на камерата...", "search_camera_make": "Търси производител на камерата...",
"search_camera_model": "Търси модел на камерата...", "search_camera_model": "Търси модел на камерата...",
"search_city": "Търси град...", "search_city": "Търси град...",
@@ -1725,6 +1760,7 @@
"search_filter_location_title": "Избери място", "search_filter_location_title": "Избери място",
"search_filter_media_type": "Тип на файла", "search_filter_media_type": "Тип на файла",
"search_filter_media_type_title": "Избери тип на файла", "search_filter_media_type_title": "Избери тип на файла",
"search_filter_ocr": "Търсене нa текст",
"search_filter_people_title": "Избери хора", "search_filter_people_title": "Избери хора",
"search_for": "Търси за", "search_for": "Търси за",
"search_for_existing_person": "Търси съществуващ човек", "search_for_existing_person": "Търси съществуващ човек",
@@ -1981,7 +2017,7 @@
"template": "Шаблон", "template": "Шаблон",
"theme": "Тема", "theme": "Тема",
"theme_selection": "Избор на тема", "theme_selection": "Избор на тема",
"theme_selection_description": "Автоматично задаване на светла или тъмна тема въз основа на системните предпочитания на вашия браузър", "theme_selection_description": "Автоматично задаване на светла или тъмна тема спрямо системните предпочитания на браузъра ви",
"theme_setting_asset_list_storage_indicator_title": "Показвай индикатор за хранилището в заглавията на обектите", "theme_setting_asset_list_storage_indicator_title": "Показвай индикатор за хранилището в заглавията на обектите",
"theme_setting_asset_list_tiles_per_row_title": "Брой обекти на ред ({count})", "theme_setting_asset_list_tiles_per_row_title": "Брой обекти на ред ({count})",
"theme_setting_colorful_interface_subtitle": "Нанеси основен цвят върху фоновите повърхности.", "theme_setting_colorful_interface_subtitle": "Нанеси основен цвят върху фоновите повърхности.",
@@ -1997,7 +2033,9 @@
"theme_setting_three_stage_loading_title": "Включи три-степенно зареждане", "theme_setting_three_stage_loading_title": "Включи три-степенно зареждане",
"they_will_be_merged_together": "Те ще бъдат обединени", "they_will_be_merged_together": "Те ще бъдат обединени",
"third_party_resources": "Ресурси от трети страни", "third_party_resources": "Ресурси от трети страни",
"time": "Време",
"time_based_memories": "Спомени, базирани на времето", "time_based_memories": "Спомени, базирани на времето",
"time_based_memories_duration": "Продължителност в секунди за показване на всяка картина.",
"timeline": "Хронология", "timeline": "Хронология",
"timezone": "Часова зона", "timezone": "Часова зона",
"to_archive": "Архивирай", "to_archive": "Архивирай",
@@ -2138,6 +2176,7 @@
"welcome": "Добре дошли", "welcome": "Добре дошли",
"welcome_to_immich": "Добре дошли в Immich", "welcome_to_immich": "Добре дошли в Immich",
"wifi_name": "Wi-Fi мрежа", "wifi_name": "Wi-Fi мрежа",
"workflow": "Работен процес",
"wrong_pin_code": "Грешен PIN код", "wrong_pin_code": "Грешен PIN код",
"year": "Година", "year": "Година",
"years_ago": "преди {years, plural, one {# година} other {# години}}", "years_ago": "преди {years, plural, one {# година} other {# години}}",
+18 -2
View File
@@ -12,12 +12,28 @@
"add_a_name": "Putem nam blo hem", "add_a_name": "Putem nam blo hem",
"add_a_title": "Putem wan name blo hem", "add_a_title": "Putem wan name blo hem",
"add_exclusion_pattern": "Putem wan paten wae hemi karem aot", "add_exclusion_pattern": "Putem wan paten wae hemi karem aot",
"add_import_path": "Putem wan pat blo import",
"add_location": "Putem wan place blo hem", "add_location": "Putem wan place blo hem",
"add_more_users": "Putem mor man", "add_more_users": "Putem mor man",
"readonly_mode_enabled": "Mod blo yu no save janjem i on", "readonly_mode_enabled": "Mod blo yu no save janjem i on",
"reassigned_assets_to_new_person": "Janjem{count, plural, one {# asset} other {# assets}} blo nu man", "reassigned_assets_to_new_person": "Janjem{count, plural, one {# asset} other {# assets}} blo nu man",
"reassing_hint": "janjem ol sumtin yu bin joos i go blo wan man", "reassing_hint": "janjem ol sumtin yu bin joos i go blo wan man",
"recent-albums": "album i no old tu mas", "recent-albums": "album i no old tu mas",
"recent_searches": "lukabout wea i no old tu mas" "recent_searches": "lukabout wea i no old tu mas",
"time_based_memories_duration": "hao mus second blo wan wan imij i stap lo scrin.",
"timezone": "taemzon",
"to_change_password": "janjem pasword",
"to_login": "Login",
"to_multi_select": "to jusem mani",
"to_parent": "go lo parent",
"to_select": "to selectem",
"to_trash": "toti",
"toggle_settings": "sho settings",
"total": "Total",
"trash": "Toti",
"trash_action_prompt": "{count} igo lo plaes lo toti",
"trash_all": "Putem ol i go lo toti",
"trash_count": "Toti {count, number}",
"trash_emptied": "basket blo toti i empti nomo",
"trash_no_results_message": "Foto mo video lo basket blo toti yu save lukem lo plaes ia.",
"trash_page_delete_all": "Delete oli ol"
} }
-2
View File
@@ -17,7 +17,6 @@
"add_birthday": "একটি জন্মদিন যোগ করুন", "add_birthday": "একটি জন্মদিন যোগ করুন",
"add_endpoint": "এন্ডপয়েন্ট যোগ করুন", "add_endpoint": "এন্ডপয়েন্ট যোগ করুন",
"add_exclusion_pattern": "বহির্ভূতকরণ নমুনা", "add_exclusion_pattern": "বহির্ভূতকরণ নমুনা",
"add_import_path": "ইমপোর্ট করার পাথ যুক্ত করুন",
"add_location": "অবস্থান যুক্ত করুন", "add_location": "অবস্থান যুক্ত করুন",
"add_more_users": "আরো ব্যবহারকারী যুক্ত করুন", "add_more_users": "আরো ব্যবহারকারী যুক্ত করুন",
"add_partner": "অংশীদার যোগ করুন", "add_partner": "অংশীদার যোগ করুন",
@@ -111,7 +110,6 @@
"jobs_failed": "{jobCount, plural, other {# ব্যর্থ}}", "jobs_failed": "{jobCount, plural, other {# ব্যর্থ}}",
"library_created": "লাইব্রেরি তৈরি করা হয়েছেঃ {library}", "library_created": "লাইব্রেরি তৈরি করা হয়েছেঃ {library}",
"library_deleted": "লাইব্রেরি মুছে ফেলা হয়েছে", "library_deleted": "লাইব্রেরি মুছে ফেলা হয়েছে",
"library_import_path_description": "ইম্পোর্ট/যোগ করার জন্য একটি ফোল্ডার নির্দিষ্ট করুন। সাবফোল্ডার সহ এই ফোল্ডারটি ছবি এবং ভিডিওর জন্য স্ক্যান করা হবে।",
"library_scanning": "পর্যায়ক্রমিক স্ক্যানিং", "library_scanning": "পর্যায়ক্রমিক স্ক্যানিং",
"library_scanning_description": "পর্যায়ক্রমিক লাইব্রেরি স্ক্যানিং কনফিগার করুন", "library_scanning_description": "পর্যায়ক্রমিক লাইব্রেরি স্ক্যানিং কনফিগার করুন",
"library_scanning_enable_description": "পর্যায়ক্রমিক লাইব্রেরি স্ক্যানিং সক্ষম করুন", "library_scanning_enable_description": "পর্যায়ক্রমিক লাইব্রেরি স্ক্যানিং সক্ষম করুন",
+1
View File
@@ -0,0 +1 @@
{}
+62 -10
View File
@@ -17,7 +17,6 @@
"add_birthday": "Afegeix la data de naixement", "add_birthday": "Afegeix la data de naixement",
"add_endpoint": "afegir endpoint", "add_endpoint": "afegir endpoint",
"add_exclusion_pattern": "Afegir un patró d'exclusió", "add_exclusion_pattern": "Afegir un patró d'exclusió",
"add_import_path": "Afegir una ruta d'importació",
"add_location": "Afegir la ubicació", "add_location": "Afegir la ubicació",
"add_more_users": "Afegir més usuaris", "add_more_users": "Afegir més usuaris",
"add_partner": "Afegir company/a", "add_partner": "Afegir company/a",
@@ -32,6 +31,7 @@
"add_to_album_toggle": "Commutar selecció de {album}", "add_to_album_toggle": "Commutar selecció de {album}",
"add_to_albums": "Afegir als àlbums", "add_to_albums": "Afegir als àlbums",
"add_to_albums_count": "Afegir als àlbums ({count})", "add_to_albums_count": "Afegir als àlbums ({count})",
"add_to_bottom_bar": "Afegir a",
"add_to_shared_album": "Afegir a un àlbum compartit", "add_to_shared_album": "Afegir a un àlbum compartit",
"add_upload_to_stack": "Afegeix la càrrega a la pila", "add_upload_to_stack": "Afegeix la càrrega a la pila",
"add_url": "Afegir URL", "add_url": "Afegir URL",
@@ -112,7 +112,6 @@
"jobs_failed": "{jobCount, plural, other {# fallides}}", "jobs_failed": "{jobCount, plural, other {# fallides}}",
"library_created": "Bilbioteca creada: {library}", "library_created": "Bilbioteca creada: {library}",
"library_deleted": "Bilbioteca eliminada", "library_deleted": "Bilbioteca eliminada",
"library_import_path_description": "Especifiqueu una carpeta a importar. Aquesta carpeta, incloses les seves subcarpetes, serà escanejada per cercar-hi imatges i vídeos.",
"library_scanning": "Escaneig periòdic", "library_scanning": "Escaneig periòdic",
"library_scanning_description": "Configurar l'escaneig periòdic de bilbioteques", "library_scanning_description": "Configurar l'escaneig periòdic de bilbioteques",
"library_scanning_enable_description": "Habilita l'escaneig periòdic de biblioteques", "library_scanning_enable_description": "Habilita l'escaneig periòdic de biblioteques",
@@ -154,6 +153,18 @@
"machine_learning_min_detection_score_description": "La puntuació mínima de confiança per detectar una cara és de 0 a 1. Valors més baixos detectaran més cares, però poden donar lloc a falsos positius.", "machine_learning_min_detection_score_description": "La puntuació mínima de confiança per detectar una cara és de 0 a 1. Valors més baixos detectaran més cares, però poden donar lloc a falsos positius.",
"machine_learning_min_recognized_faces": "Nombre mínim de cares reconegudes", "machine_learning_min_recognized_faces": "Nombre mínim de cares reconegudes",
"machine_learning_min_recognized_faces_description": "El nombre mínim de cares reconegudes per crear una persona. Augmentar aquest valor fa que el reconeixement facial sigui més precís, però augmenta la possibilitat que una cara no sigui assignada a una persona.", "machine_learning_min_recognized_faces_description": "El nombre mínim de cares reconegudes per crear una persona. Augmentar aquest valor fa que el reconeixement facial sigui més precís, però augmenta la possibilitat que una cara no sigui assignada a una persona.",
"machine_learning_ocr": "OCR",
"machine_learning_ocr_description": "Fes servir machine learning per reconèixer text a imatges",
"machine_learning_ocr_enabled": "Activar OCR",
"machine_learning_ocr_enabled_description": "Si està desactivat, les imatges no seran objecte de reconeixement de text.",
"machine_learning_ocr_max_resolution": "Màxima resolució",
"machine_learning_ocr_max_resolution_description": "Vista prèvia per sobre d'aquesta resolució serà reescalada per preservar la relació d'aspecte. Resolucions altes són més precises, però triguen més i gasten més memòria.",
"machine_learning_ocr_min_detection_score": "Puntuació mínima de detecció",
"machine_learning_ocr_min_detection_score_description": "Puntuació de mínima confiança per la detecció del text entre 0-1. Valors baixos detectaran més text pero pot donar falsos positius.",
"machine_learning_ocr_min_recognition_score": "Puntuació mínima de reconeixement",
"machine_learning_ocr_min_score_recognition_description": "Puntuació de confiança mínima pel reconeixement del text entre 0-1. Valors baixos reconeixen més text però pot donar falsos positius.",
"machine_learning_ocr_model": "Model OCR",
"machine_learning_ocr_model_description": "Models de servidor són més precisos que els de móbil, pero triguen més a processar i usen més memòria.",
"machine_learning_settings": "Configuració d'aprenentatge automàtic", "machine_learning_settings": "Configuració d'aprenentatge automàtic",
"machine_learning_settings_description": "Gestiona funcions i configuració d'aprenentatge automàtic", "machine_learning_settings_description": "Gestiona funcions i configuració d'aprenentatge automàtic",
"machine_learning_smart_search": "Cerca intel·ligent", "machine_learning_smart_search": "Cerca intel·ligent",
@@ -211,6 +222,8 @@
"notification_email_ignore_certificate_errors_description": "Ignora els errors de validació de certificat TLS (no recomanat)", "notification_email_ignore_certificate_errors_description": "Ignora els errors de validació de certificat TLS (no recomanat)",
"notification_email_password_description": "Contrasenya per a autenticar-se amb el servidor de correu electrònic", "notification_email_password_description": "Contrasenya per a autenticar-se amb el servidor de correu electrònic",
"notification_email_port_description": "Port del servidor de correu electrònic (p.ex. 25, 465 o 587)", "notification_email_port_description": "Port del servidor de correu electrònic (p.ex. 25, 465 o 587)",
"notification_email_secure": "SMTPS",
"notification_email_secure_description": "Fes servir SMTPS (SMTP sobre TLS)",
"notification_email_sent_test_email_button": "Envia correu de prova i desa", "notification_email_sent_test_email_button": "Envia correu de prova i desa",
"notification_email_setting_description": "Configuració per l'enviament de notificacions per correu electrònic", "notification_email_setting_description": "Configuració per l'enviament de notificacions per correu electrònic",
"notification_email_test_email": "Envia correu de prova", "notification_email_test_email": "Envia correu de prova",
@@ -243,6 +256,7 @@
"oauth_storage_quota_default_description": "Quota disponible en GB quan no s'estableixi cap valor (Entreu 0 per a quota il·limitada).", "oauth_storage_quota_default_description": "Quota disponible en GB quan no s'estableixi cap valor (Entreu 0 per a quota il·limitada).",
"oauth_timeout": "Solicitud caducada", "oauth_timeout": "Solicitud caducada",
"oauth_timeout_description": "Timeout per a sol·licituds en mil·lisegons", "oauth_timeout_description": "Timeout per a sol·licituds en mil·lisegons",
"ocr_job_description": "Fes servir machine learning per reconèixer text a les imatges",
"password_enable_description": "Inicia sessió amb correu electrònic i contrasenya", "password_enable_description": "Inicia sessió amb correu electrònic i contrasenya",
"password_settings": "Inici de sessió amb contrasenya", "password_settings": "Inici de sessió amb contrasenya",
"password_settings_description": "Gestiona la configuració de l'inici de sessió amb contrasenya", "password_settings_description": "Gestiona la configuració de l'inici de sessió amb contrasenya",
@@ -402,11 +416,11 @@
"advanced_settings_prefer_remote_subtitle": "Alguns dispositius són molt lents en carregar miniatures dels elements locals. Activeu aquest paràmetre per carregar imatges remotes en el seu lloc.", "advanced_settings_prefer_remote_subtitle": "Alguns dispositius són molt lents en carregar miniatures dels elements locals. Activeu aquest paràmetre per carregar imatges remotes en el seu lloc.",
"advanced_settings_prefer_remote_title": "Prefereix imatges remotes", "advanced_settings_prefer_remote_title": "Prefereix imatges remotes",
"advanced_settings_proxy_headers_subtitle": "Definiu les capçaleres de proxy que Immich per enviar amb cada sol·licitud de xarxa", "advanced_settings_proxy_headers_subtitle": "Definiu les capçaleres de proxy que Immich per enviar amb cada sol·licitud de xarxa",
"advanced_settings_proxy_headers_title": "Capçaleres de proxy", "advanced_settings_proxy_headers_title": "Capçaleres de proxy particulars [EXPERIMENTAL]",
"advanced_settings_readonly_mode_subtitle": "Habilita el només de lectura mode on les fotos poden ser només vist, a coses els agrada seleccionant imatges múltiples, compartint, càsting, elimina és tot discapacitat. Habilita/Desactiva només de lectura via avatar d'usuari des de la pantalla major", "advanced_settings_readonly_mode_subtitle": "Habilita el només de lectura mode on les fotos poden ser només vist, a coses els agrada seleccionant imatges múltiples, compartint, càsting, elimina és tot discapacitat. Habilita/Desactiva només de lectura via avatar d'usuari des de la pantalla major",
"advanced_settings_readonly_mode_title": "Mode de només lectura", "advanced_settings_readonly_mode_title": "Mode de només lectura",
"advanced_settings_self_signed_ssl_subtitle": "Omet la verificació del certificat SSL del servidor. Requerit per a certificats autosignats.", "advanced_settings_self_signed_ssl_subtitle": "Omet la verificació del certificat SSL del servidor. Requerit per a certificats autosignats.",
"advanced_settings_self_signed_ssl_title": "Permet certificats SSL autosignats", "advanced_settings_self_signed_ssl_title": "Permet certificats SSL autosignats [EXPERIMENTAL]",
"advanced_settings_sync_remote_deletions_subtitle": "Suprimeix o restaura automàticament un actiu en aquest dispositiu quan es realitzi aquesta acció al web", "advanced_settings_sync_remote_deletions_subtitle": "Suprimeix o restaura automàticament un actiu en aquest dispositiu quan es realitzi aquesta acció al web",
"advanced_settings_sync_remote_deletions_title": "Sincronitza les eliminacions remotes", "advanced_settings_sync_remote_deletions_title": "Sincronitza les eliminacions remotes",
"advanced_settings_tile_subtitle": "Configuració avançada de l'usuari", "advanced_settings_tile_subtitle": "Configuració avançada de l'usuari",
@@ -415,6 +429,7 @@
"age_months": "{months, plural, one {# mes} other {# mesos}}", "age_months": "{months, plural, one {# mes} other {# mesos}}",
"age_year_months": "Un any i {months, plural, one {# mes} other {# mesos}}", "age_year_months": "Un any i {months, plural, one {# mes} other {# mesos}}",
"age_years": "{years, plural, one {# any} other {# anys}}", "age_years": "{years, plural, one {# any} other {# anys}}",
"album": "Àlbum",
"album_added": "Àlbum afegit", "album_added": "Àlbum afegit",
"album_added_notification_setting_description": "Rep una notificació per correu quan siguis afegit a un àlbum compartit", "album_added_notification_setting_description": "Rep una notificació per correu quan siguis afegit a un àlbum compartit",
"album_cover_updated": "Portada de l'àlbum actualitzada", "album_cover_updated": "Portada de l'àlbum actualitzada",
@@ -460,16 +475,21 @@
"allow_edits": "Permet editar", "allow_edits": "Permet editar",
"allow_public_user_to_download": "Permet que l'usuari públic pugui descarregar", "allow_public_user_to_download": "Permet que l'usuari públic pugui descarregar",
"allow_public_user_to_upload": "Permet que l'usuari públic pugui carregar", "allow_public_user_to_upload": "Permet que l'usuari públic pugui carregar",
"allowed": "Permès",
"alt_text_qr_code": "Codi QR", "alt_text_qr_code": "Codi QR",
"anti_clockwise": "En sentit antihorari", "anti_clockwise": "En sentit antihorari",
"api_key": "Clau API", "api_key": "Clau API",
"api_key_description": "Aquest valor només es mostrarà una vegada. Assegureu-vos de copiar-lo abans de tancar la finestra.", "api_key_description": "Aquest valor només es mostrarà una vegada. Assegureu-vos de copiar-lo abans de tancar la finestra.",
"api_key_empty": "El nom de la clau de l'API no pot estar buit", "api_key_empty": "El nom de la clau de l'API no pot estar buit",
"api_keys": "Claus API", "api_keys": "Claus API",
"app_architecture_variant": "Variant (Arquitectura)",
"app_bar_signout_dialog_content": "Estàs segur que vols tancar la sessió?", "app_bar_signout_dialog_content": "Estàs segur que vols tancar la sessió?",
"app_bar_signout_dialog_ok": "Sí", "app_bar_signout_dialog_ok": "Sí",
"app_bar_signout_dialog_title": "Tanca la sessió", "app_bar_signout_dialog_title": "Tanca la sessió",
"app_download_links": "App descarrega enllaços",
"app_settings": "Configuració de l'app", "app_settings": "Configuració de l'app",
"app_stores": "Botiga App",
"app_update_available": "Actualització App disponible",
"appears_in": "Apareix a", "appears_in": "Apareix a",
"apply_count": "Aplicar ({count, number})", "apply_count": "Aplicar ({count, number})",
"archive": "Arxiu", "archive": "Arxiu",
@@ -553,6 +573,7 @@
"backup_albums_sync": "Sincronització d'àlbums de còpia de seguretat", "backup_albums_sync": "Sincronització d'àlbums de còpia de seguretat",
"backup_all": "Tots", "backup_all": "Tots",
"backup_background_service_backup_failed_message": "No s'ha pogut copiar els elements. Tornant a intentar…", "backup_background_service_backup_failed_message": "No s'ha pogut copiar els elements. Tornant a intentar…",
"backup_background_service_complete_notification": "Backup completat d'actius",
"backup_background_service_connection_failed_message": "No s'ha pogut connectar al servidor. Tornant a intentar…", "backup_background_service_connection_failed_message": "No s'ha pogut connectar al servidor. Tornant a intentar…",
"backup_background_service_current_upload_notification": "Pujant {filename}", "backup_background_service_current_upload_notification": "Pujant {filename}",
"backup_background_service_default_notification": "Cercant nous elements…", "backup_background_service_default_notification": "Cercant nous elements…",
@@ -662,6 +683,8 @@
"change_password_description": "Aquesta és la primera vegada que inicieu la sessió al sistema o s'ha fet una sol·licitud per canviar la contrasenya. Introduïu la nova contrasenya a continuació.", "change_password_description": "Aquesta és la primera vegada que inicieu la sessió al sistema o s'ha fet una sol·licitud per canviar la contrasenya. Introduïu la nova contrasenya a continuació.",
"change_password_form_confirm_password": "Confirma la contrasenya", "change_password_form_confirm_password": "Confirma la contrasenya",
"change_password_form_description": "Hola {name},\n\nAquesta és la primera vegada que inicies sessió al sistema o bé s'ha sol·licitat canviar la teva contrasenya. Si us plau, introdueix la nova contrasenya a continuació.", "change_password_form_description": "Hola {name},\n\nAquesta és la primera vegada que inicies sessió al sistema o bé s'ha sol·licitat canviar la teva contrasenya. Si us plau, introdueix la nova contrasenya a continuació.",
"change_password_form_log_out": "Fer fora de tots els altres dispositius",
"change_password_form_log_out_description": "Es recomana fer fora de tots els altres dispositius",
"change_password_form_new_password": "Nova contrasenya", "change_password_form_new_password": "Nova contrasenya",
"change_password_form_password_mismatch": "Les contrasenyes no coincideixen", "change_password_form_password_mismatch": "Les contrasenyes no coincideixen",
"change_password_form_reenter_new_password": "Torna a introduir la nova contrasenya", "change_password_form_reenter_new_password": "Torna a introduir la nova contrasenya",
@@ -739,6 +762,7 @@
"create": "Crea", "create": "Crea",
"create_album": "Crear un àlbum", "create_album": "Crear un àlbum",
"create_album_page_untitled": "Sense títol", "create_album_page_untitled": "Sense títol",
"create_api_key": "Crear clau API",
"create_library": "Crea una llibreria", "create_library": "Crea una llibreria",
"create_link": "Crear enllaç", "create_link": "Crear enllaç",
"create_link_to_share": "Crear enllaç per compartir", "create_link_to_share": "Crear enllaç per compartir",
@@ -768,6 +792,7 @@
"daily_title_text_date_year": "E, dd MMM, yyyy", "daily_title_text_date_year": "E, dd MMM, yyyy",
"dark": "Fosc", "dark": "Fosc",
"dark_theme": "Canviar a tema fosc", "dark_theme": "Canviar a tema fosc",
"date": "Data",
"date_after": "Data posterior a", "date_after": "Data posterior a",
"date_and_time": "Data i hora", "date_and_time": "Data i hora",
"date_before": "Data anterior a", "date_before": "Data anterior a",
@@ -870,8 +895,6 @@
"edit_description_prompt": "Si us plau, selecciona una nova descripció:", "edit_description_prompt": "Si us plau, selecciona una nova descripció:",
"edit_exclusion_pattern": "Edita patró d'exclusió", "edit_exclusion_pattern": "Edita patró d'exclusió",
"edit_faces": "Edita les cares", "edit_faces": "Edita les cares",
"edit_import_path": "Edita la ruta d'importació",
"edit_import_paths": "Edita les rutes d'importació",
"edit_key": "Edita clau", "edit_key": "Edita clau",
"edit_link": "Edita enllaç", "edit_link": "Edita enllaç",
"edit_location": "Edita ubicació", "edit_location": "Edita ubicació",
@@ -943,7 +966,6 @@
"failed_to_stack_assets": "No s'han pogut apilar els elements", "failed_to_stack_assets": "No s'han pogut apilar els elements",
"failed_to_unstack_assets": "No s'han pogut desapilar els elements", "failed_to_unstack_assets": "No s'han pogut desapilar els elements",
"failed_to_update_notification_status": "Error en actualitzar l'estat de les notificacions", "failed_to_update_notification_status": "Error en actualitzar l'estat de les notificacions",
"import_path_already_exists": "Aquesta ruta d'importació ja existeix.",
"incorrect_email_or_password": "Correu electrònic o contrasenya incorrectes", "incorrect_email_or_password": "Correu electrònic o contrasenya incorrectes",
"paths_validation_failed": "{paths, plural, one {# ruta} other {# rutes}} no ha pogut validar", "paths_validation_failed": "{paths, plural, one {# ruta} other {# rutes}} no ha pogut validar",
"profile_picture_transparent_pixels": "Les fotos de perfil no poden tenir píxels transparents. Per favor, feu zoom in, mogueu la imatge o ambdues.", "profile_picture_transparent_pixels": "Les fotos de perfil no poden tenir píxels transparents. Per favor, feu zoom in, mogueu la imatge o ambdues.",
@@ -953,7 +975,6 @@
"unable_to_add_assets_to_shared_link": "No s'han pogut afegir els elements a l'enllaç compartit", "unable_to_add_assets_to_shared_link": "No s'han pogut afegir els elements a l'enllaç compartit",
"unable_to_add_comment": "No es pot afegir el comentari", "unable_to_add_comment": "No es pot afegir el comentari",
"unable_to_add_exclusion_pattern": "No s'ha pogut afegir el patró dexclusió", "unable_to_add_exclusion_pattern": "No s'ha pogut afegir el patró dexclusió",
"unable_to_add_import_path": "No s'ha pogut afegir la ruta d'importació",
"unable_to_add_partners": "No es poden afegir companys", "unable_to_add_partners": "No es poden afegir companys",
"unable_to_add_remove_archive": "No s'ha pogut {archived, select, true {eliminar l'element de} other {afegir l'element a}} l'arxiu", "unable_to_add_remove_archive": "No s'ha pogut {archived, select, true {eliminar l'element de} other {afegir l'element a}} l'arxiu",
"unable_to_add_remove_favorites": "No s'ha pogut {favorite, select, true {afegir l'element als} other {eliminar l'element dels}} preferits", "unable_to_add_remove_favorites": "No s'ha pogut {favorite, select, true {afegir l'element als} other {eliminar l'element dels}} preferits",
@@ -976,12 +997,10 @@
"unable_to_delete_asset": "No es pot suprimir el recurs", "unable_to_delete_asset": "No es pot suprimir el recurs",
"unable_to_delete_assets": "S'ha produït un error en suprimir recursos", "unable_to_delete_assets": "S'ha produït un error en suprimir recursos",
"unable_to_delete_exclusion_pattern": "No es pot suprimir el patró d'exclusió", "unable_to_delete_exclusion_pattern": "No es pot suprimir el patró d'exclusió",
"unable_to_delete_import_path": "No es pot suprimir la ruta d'importació",
"unable_to_delete_shared_link": "No es pot suprimir l'enllaç compartit", "unable_to_delete_shared_link": "No es pot suprimir l'enllaç compartit",
"unable_to_delete_user": "No es pot eliminar l'usuari", "unable_to_delete_user": "No es pot eliminar l'usuari",
"unable_to_download_files": "No es poden descarregar fitxers", "unable_to_download_files": "No es poden descarregar fitxers",
"unable_to_edit_exclusion_pattern": "No es pot editar el patró d'exclusió", "unable_to_edit_exclusion_pattern": "No es pot editar el patró d'exclusió",
"unable_to_edit_import_path": "No es pot editar la ruta d'importació",
"unable_to_empty_trash": "No es pot buidar la paperera", "unable_to_empty_trash": "No es pot buidar la paperera",
"unable_to_enter_fullscreen": "No es pot entrar a la pantalla completa", "unable_to_enter_fullscreen": "No es pot entrar a la pantalla completa",
"unable_to_exit_fullscreen": "No es pot sortir de la pantalla completa", "unable_to_exit_fullscreen": "No es pot sortir de la pantalla completa",
@@ -1076,6 +1095,7 @@
"features_setting_description": "Administrar les funcions de l'aplicació", "features_setting_description": "Administrar les funcions de l'aplicació",
"file_name": "Nom de l'arxiu", "file_name": "Nom de l'arxiu",
"file_name_or_extension": "Nom de l'arxiu o extensió", "file_name_or_extension": "Nom de l'arxiu o extensió",
"file_size": "Mida del fitxer",
"filename": "Nom del fitxer", "filename": "Nom del fitxer",
"filetype": "Tipus d'arxiu", "filetype": "Tipus d'arxiu",
"filter": "Filtrar", "filter": "Filtrar",
@@ -1171,6 +1191,8 @@
"import_path": "Ruta d'importació", "import_path": "Ruta d'importació",
"in_albums": "A {count, plural, one {# àlbum} other {# àlbums}}", "in_albums": "A {count, plural, one {# àlbum} other {# àlbums}}",
"in_archive": "En arxiu", "in_archive": "En arxiu",
"in_year": "En {year}",
"in_year_selector": "En",
"include_archived": "Incloure arxivats", "include_archived": "Incloure arxivats",
"include_shared_albums": "Inclou àlbums compartits", "include_shared_albums": "Inclou àlbums compartits",
"include_shared_partner_assets": "Incloure elements dels companys", "include_shared_partner_assets": "Incloure elements dels companys",
@@ -1207,6 +1229,7 @@
"language_setting_description": "Seleccioneu el vostre idioma", "language_setting_description": "Seleccioneu el vostre idioma",
"large_files": "Fitxers Grans", "large_files": "Fitxers Grans",
"last": "Últim", "last": "Últim",
"last_months": "{count, plural, one {Últim mes} other {Últims # mesos}}",
"last_seen": "Vist per últim cop", "last_seen": "Vist per últim cop",
"latest_version": "Última versió", "latest_version": "Última versió",
"latitude": "Latitud", "latitude": "Latitud",
@@ -1239,6 +1262,7 @@
"local_media_summary": "Resum de Mitjans Locals", "local_media_summary": "Resum de Mitjans Locals",
"local_network": "Xarxa local", "local_network": "Xarxa local",
"local_network_sheet_info": "L'aplicació es connectarà al servidor mitjançant aquest URL quan utilitzeu la xarxa Wi-Fi especificada", "local_network_sheet_info": "L'aplicació es connectarà al servidor mitjançant aquest URL quan utilitzeu la xarxa Wi-Fi especificada",
"location": "Localització",
"location_permission": "Permís d'ubicació", "location_permission": "Permís d'ubicació",
"location_permission_content": "Per utilitzar la funció de canvi automàtic, Immich necessita un permís d'ubicació precisa perquè pugui llegir el nom de la xarxa Wi-Fi actual", "location_permission_content": "Per utilitzar la funció de canvi automàtic, Immich necessita un permís d'ubicació precisa perquè pugui llegir el nom de la xarxa Wi-Fi actual",
"location_picker_choose_on_map": "Escollir en el mapa", "location_picker_choose_on_map": "Escollir en el mapa",
@@ -1288,6 +1312,10 @@
"main_menu": "Menú principal", "main_menu": "Menú principal",
"make": "Fabricant", "make": "Fabricant",
"manage_geolocation": "Gestioneu la vostra ubicació", "manage_geolocation": "Gestioneu la vostra ubicació",
"manage_media_access_rationale": "Aquest permís es necessari per a la correcta gestió dels actius que es mouen a la paperera i es restauren d'ella.",
"manage_media_access_settings": "Configuració oberta",
"manage_media_access_subtitle": "Permet a l'Immich gestionar i moure fitxers multimèdia.",
"manage_media_access_title": "Accés a la gestió de mitjans",
"manage_shared_links": "Administrar enllaços compartits", "manage_shared_links": "Administrar enllaços compartits",
"manage_sharing_with_partners": "Gestiona la compartició amb els companys", "manage_sharing_with_partners": "Gestiona la compartició amb els companys",
"manage_the_app_settings": "Gestioneu la configuració de l'aplicació", "manage_the_app_settings": "Gestioneu la configuració de l'aplicació",
@@ -1344,12 +1372,14 @@
"minutes": "Minuts", "minutes": "Minuts",
"missing": "Restants", "missing": "Restants",
"mobile_app": "Aplicació mòbil", "mobile_app": "Aplicació mòbil",
"mobile_app_download_onboarding_note": "Descarregar la App de mòbil fent servir les seguents opcions",
"model": "Model", "model": "Model",
"month": "Mes", "month": "Mes",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"more": "Més", "more": "Més",
"move": "Moure", "move": "Moure",
"move_off_locked_folder": "Moure fora de la carpeta bloquejada", "move_off_locked_folder": "Moure fora de la carpeta bloquejada",
"move_to": "Moure a",
"move_to_lock_folder_action_prompt": "{count} afegides a la carpeta protegida", "move_to_lock_folder_action_prompt": "{count} afegides a la carpeta protegida",
"move_to_locked_folder": "Moure a la carpeta bloquejada", "move_to_locked_folder": "Moure a la carpeta bloquejada",
"move_to_locked_folder_confirmation": "Aquestes fotos i vídeos seran eliminades de tots els àlbums, i només podran ser vistes des de la carpeta bloquejada", "move_to_locked_folder_confirmation": "Aquestes fotos i vídeos seran eliminades de tots els àlbums, i només podran ser vistes des de la carpeta bloquejada",
@@ -1363,6 +1393,7 @@
"name": "Nom", "name": "Nom",
"name_or_nickname": "Nom o sobrenom", "name_or_nickname": "Nom o sobrenom",
"navigate": "Navegar", "navigate": "Navegar",
"navigate_to_time": "Navegar a un punt en el temps",
"network_requirement_photos_upload": "Fes servir dades mòbils per a còpies de seguretat de fotos", "network_requirement_photos_upload": "Fes servir dades mòbils per a còpies de seguretat de fotos",
"network_requirement_videos_upload": "Fes servir dades mòbils per a còpies de seguretat de videos", "network_requirement_videos_upload": "Fes servir dades mòbils per a còpies de seguretat de videos",
"network_requirements": "Requeriments de Xarxa", "network_requirements": "Requeriments de Xarxa",
@@ -1372,11 +1403,13 @@
"never": "Mai", "never": "Mai",
"new_album": "Nou Àlbum", "new_album": "Nou Àlbum",
"new_api_key": "Nova clau de l'API", "new_api_key": "Nova clau de l'API",
"new_date_range": "Navegar a un reng de dates",
"new_password": "Nova contrasenya", "new_password": "Nova contrasenya",
"new_person": "Persona nova", "new_person": "Persona nova",
"new_pin_code": "Nou codi PIN", "new_pin_code": "Nou codi PIN",
"new_pin_code_subtitle": "Aquesta és la primera vegada que accedeixes a la carpeta bloquejada. Crea una codi PIN i accedeix de manera segura a aquesta pàgina", "new_pin_code_subtitle": "Aquesta és la primera vegada que accedeixes a la carpeta bloquejada. Crea una codi PIN i accedeix de manera segura a aquesta pàgina",
"new_timeline": "Nova Línia de Temps", "new_timeline": "Nova Línia de Temps",
"new_update": "Nova actualització",
"new_user_created": "Nou usuari creat", "new_user_created": "Nou usuari creat",
"new_version_available": "NOVA VERSIÓ DISPONIBLE", "new_version_available": "NOVA VERSIÓ DISPONIBLE",
"newest_first": "El més nou primer", "newest_first": "El més nou primer",
@@ -1392,6 +1425,7 @@
"no_cast_devices_found": "No s'han trobat dispositius per transmetre", "no_cast_devices_found": "No s'han trobat dispositius per transmetre",
"no_checksum_local": "Cap checksum disponible - no s'han pogut carregar els recursos locals", "no_checksum_local": "Cap checksum disponible - no s'han pogut carregar els recursos locals",
"no_checksum_remote": "Cap checksum disponible - no s'ha pogut obtenir el recurs remot", "no_checksum_remote": "Cap checksum disponible - no s'ha pogut obtenir el recurs remot",
"no_devices": "No hi ha dispositius autoritzats",
"no_duplicates_found": "No s'han trobat duplicats.", "no_duplicates_found": "No s'han trobat duplicats.",
"no_exif_info_available": "No hi ha informació d'exif disponible", "no_exif_info_available": "No hi ha informació d'exif disponible",
"no_explore_results_message": "Penja més fotos per explorar la teva col·lecció.", "no_explore_results_message": "Penja més fotos per explorar la teva col·lecció.",
@@ -1408,6 +1442,7 @@
"no_results_description": "Proveu un sinònim o una paraula clau més general", "no_results_description": "Proveu un sinònim o una paraula clau més general",
"no_shared_albums_message": "Creeu un àlbum per compartir fotos i vídeos amb persones a la vostra xarxa", "no_shared_albums_message": "Creeu un àlbum per compartir fotos i vídeos amb persones a la vostra xarxa",
"no_uploads_in_progress": "Cap pujada en progrés", "no_uploads_in_progress": "Cap pujada en progrés",
"not_allowed": "No permès",
"not_available": "N/A", "not_available": "N/A",
"not_in_any_album": "En cap àlbum", "not_in_any_album": "En cap àlbum",
"not_selected": "No seleccionat", "not_selected": "No seleccionat",
@@ -1422,6 +1457,9 @@
"notifications": "Notificacions", "notifications": "Notificacions",
"notifications_setting_description": "Gestiona les notificacions", "notifications_setting_description": "Gestiona les notificacions",
"oauth": "OAuth", "oauth": "OAuth",
"obtainium_configurator": "Configurador Obtainium",
"obtainium_configurator_instructions": "Utilitza Obtainium per instal·lar una actualització a la app directament des de Github-Immich. Crear una clau API i seleccionar una variant per crear un enllaç a la configuració Obtainium",
"ocr": "OCR",
"official_immich_resources": "Recursos oficials d'Immich", "official_immich_resources": "Recursos oficials d'Immich",
"offline": "Fora de línia", "offline": "Fora de línia",
"offset": "Diferència", "offset": "Diferència",
@@ -1515,6 +1553,8 @@
"photos_count": "{count, plural, one {{count, number} Foto} other {{count, number} Fotos}}", "photos_count": "{count, plural, one {{count, number} Foto} other {{count, number} Fotos}}",
"photos_from_previous_years": "Fotos d'anys anteriors", "photos_from_previous_years": "Fotos d'anys anteriors",
"pick_a_location": "Triar una ubicació", "pick_a_location": "Triar una ubicació",
"pick_custom_range": "Rang personalitzat",
"pick_date_range": "Seleccioni un rang de dates",
"pin_code_changed_successfully": "Codi PIN canviat correctament", "pin_code_changed_successfully": "Codi PIN canviat correctament",
"pin_code_reset_successfully": "S'ha restablert correctament el codi PIN", "pin_code_reset_successfully": "S'ha restablert correctament el codi PIN",
"pin_code_setup_successfully": "S'ha configurat correctament un codi PIN", "pin_code_setup_successfully": "S'ha configurat correctament un codi PIN",
@@ -1526,6 +1566,9 @@
"play_memories": "Reproduir records", "play_memories": "Reproduir records",
"play_motion_photo": "Reproduir Fotos en Moviment", "play_motion_photo": "Reproduir Fotos en Moviment",
"play_or_pause_video": "Reproduir o posar en pausa el vídeo", "play_or_pause_video": "Reproduir o posar en pausa el vídeo",
"play_original_video": "Veure el video original",
"play_original_video_setting_description": "Preferir la reproducció del video original sobre el video recodificat. Si el video original no es compatible potser no es reprodueixi correctament.",
"play_transcoded_video": "Veure el video recodificat",
"please_auth_to_access": "Per favor, autentica't per accedir", "please_auth_to_access": "Per favor, autentica't per accedir",
"port": "Port", "port": "Port",
"preferences_settings_subtitle": "Gestiona les preferències de l'aplicació", "preferences_settings_subtitle": "Gestiona les preferències de l'aplicació",
@@ -1662,6 +1705,7 @@
"reset_sqlite_confirmation": "Segur que vols reiniciar la base de dades SQLite? Hauràs de tancar la sessió i tornar a accedir per a resincronitzar les dades", "reset_sqlite_confirmation": "Segur que vols reiniciar la base de dades SQLite? Hauràs de tancar la sessió i tornar a accedir per a resincronitzar les dades",
"reset_sqlite_success": "S'ha reiniciat la base de dades correctament", "reset_sqlite_success": "S'ha reiniciat la base de dades correctament",
"reset_to_default": "Restableix els valors predeterminats", "reset_to_default": "Restableix els valors predeterminats",
"resolution": "Resolució",
"resolve_duplicates": "Resoldre duplicats", "resolve_duplicates": "Resoldre duplicats",
"resolved_all_duplicates": "Tots els duplicats resolts", "resolved_all_duplicates": "Tots els duplicats resolts",
"restore": "Recupera", "restore": "Recupera",
@@ -1680,6 +1724,7 @@
"running": "En execució", "running": "En execució",
"save": "Desa", "save": "Desa",
"save_to_gallery": "Desa a galeria", "save_to_gallery": "Desa a galeria",
"saved": "Guardat",
"saved_api_key": "Clau d'API guardada", "saved_api_key": "Clau d'API guardada",
"saved_profile": "Perfil guardat", "saved_profile": "Perfil guardat",
"saved_settings": "Configuració guardada", "saved_settings": "Configuració guardada",
@@ -1696,6 +1741,9 @@
"search_by_description_example": "Jornada de senderisme a Sapa", "search_by_description_example": "Jornada de senderisme a Sapa",
"search_by_filename": "Cerca per nom de fitxer o extensió", "search_by_filename": "Cerca per nom de fitxer o extensió",
"search_by_filename_example": "per exemple IMG_1234.JPG o PNG", "search_by_filename_example": "per exemple IMG_1234.JPG o PNG",
"search_by_ocr": "Buscar per OCR",
"search_by_ocr_example": "Després",
"search_camera_lens_model": "Buscar model de lents....",
"search_camera_make": "Buscar per fabricant de càmara...", "search_camera_make": "Buscar per fabricant de càmara...",
"search_camera_model": "Buscar per model de càmera...", "search_camera_model": "Buscar per model de càmera...",
"search_city": "Buscar per ciutat...", "search_city": "Buscar per ciutat...",
@@ -1712,6 +1760,7 @@
"search_filter_location_title": "Selecciona l'ubicació", "search_filter_location_title": "Selecciona l'ubicació",
"search_filter_media_type": "Tipus de multimèdia", "search_filter_media_type": "Tipus de multimèdia",
"search_filter_media_type_title": "Selecciona tipus de multimèdia", "search_filter_media_type_title": "Selecciona tipus de multimèdia",
"search_filter_ocr": "Buscar per OCR",
"search_filter_people_title": "Selecciona persones", "search_filter_people_title": "Selecciona persones",
"search_for": "Cercar", "search_for": "Cercar",
"search_for_existing_person": "Busca una persona existent", "search_for_existing_person": "Busca una persona existent",
@@ -1984,7 +2033,9 @@
"theme_setting_three_stage_loading_title": "Activa la càrrega en tres etapes", "theme_setting_three_stage_loading_title": "Activa la càrrega en tres etapes",
"they_will_be_merged_together": "Es combinaran", "they_will_be_merged_together": "Es combinaran",
"third_party_resources": "Recursos de tercers", "third_party_resources": "Recursos de tercers",
"time": "Temps",
"time_based_memories": "Records basats en el temps", "time_based_memories": "Records basats en el temps",
"time_based_memories_duration": "Quants segons es mostrarà cada imatge.",
"timeline": "Cronologia", "timeline": "Cronologia",
"timezone": "Fus horari", "timezone": "Fus horari",
"to_archive": "Arxivar", "to_archive": "Arxivar",
@@ -2125,6 +2176,7 @@
"welcome": "Benvingut", "welcome": "Benvingut",
"welcome_to_immich": "Benvingut a immich", "welcome_to_immich": "Benvingut a immich",
"wifi_name": "Nom Wi-Fi", "wifi_name": "Nom Wi-Fi",
"workflow": "Flux de treball",
"wrong_pin_code": "Codi PIN incorrecte", "wrong_pin_code": "Codi PIN incorrecte",
"year": "Any", "year": "Any",
"years_ago": "Fa {years, plural, one {# any} other {# anys}}", "years_ago": "Fa {years, plural, one {# any} other {# anys}}",
+42 -10
View File
@@ -17,7 +17,6 @@
"add_birthday": "Přidat datum narození", "add_birthday": "Přidat datum narození",
"add_endpoint": "Přidat koncový bod", "add_endpoint": "Přidat koncový bod",
"add_exclusion_pattern": "Přidat vzor vyloučení", "add_exclusion_pattern": "Přidat vzor vyloučení",
"add_import_path": "Přidat cestu importu",
"add_location": "Přidat polohu", "add_location": "Přidat polohu",
"add_more_users": "Přidat další uživatele", "add_more_users": "Přidat další uživatele",
"add_partner": "Přidat partnera", "add_partner": "Přidat partnera",
@@ -32,6 +31,7 @@
"add_to_album_toggle": "Přepnout výběr pro {album}", "add_to_album_toggle": "Přepnout výběr pro {album}",
"add_to_albums": "Přidat do alb", "add_to_albums": "Přidat do alb",
"add_to_albums_count": "Přidat do alb ({count})", "add_to_albums_count": "Přidat do alb ({count})",
"add_to_bottom_bar": "Přidat do",
"add_to_shared_album": "Přidat do sdíleného alba", "add_to_shared_album": "Přidat do sdíleného alba",
"add_upload_to_stack": "Přidat nahrané do zásobníku", "add_upload_to_stack": "Přidat nahrané do zásobníku",
"add_url": "Přidat URL", "add_url": "Přidat URL",
@@ -112,13 +112,17 @@
"jobs_failed": "{jobCount, plural, one {# neúspěšný} few {# neúspěšné} other {# neúspěšných}}", "jobs_failed": "{jobCount, plural, one {# neúspěšný} few {# neúspěšné} other {# neúspěšných}}",
"library_created": "Vytvořena knihovna: {library}", "library_created": "Vytvořena knihovna: {library}",
"library_deleted": "Knihovna smazána", "library_deleted": "Knihovna smazána",
"library_import_path_description": "Zadejte složku, kterou chcete importovat. Tato složka bude prohledána včetně podsložek a budou v ní hledány obrázky a videa.", "library_details": "Podrobnosti o knihovně",
"library_folder_description": "Zadejte složku, kterou chcete importovat. Tato složka, včetně podsložek, bude prohledána pro obrázky a videa.",
"library_remove_exclusion_pattern_prompt": "Opravdu chcete odstranit tento vzor vyloučení?",
"library_remove_folder_prompt": "Opravdu chcete odstranit tuto složku importu?",
"library_scanning": "Pravidelné prohledávání", "library_scanning": "Pravidelné prohledávání",
"library_scanning_description": "Nastavení pravidelného prohledávání knihovny", "library_scanning_description": "Nastavení pravidelného prohledávání knihovny",
"library_scanning_enable_description": "Povolit pravidelné prohledávání knihovny", "library_scanning_enable_description": "Povolit pravidelné prohledávání knihovny",
"library_settings": "Externí knihovna", "library_settings": "Externí knihovna",
"library_settings_description": "Správa nastavení externí knihovny", "library_settings_description": "Správa nastavení externí knihovny",
"library_tasks_description": "Vyhledávání nových nebo změněných položek v externích knihovnách", "library_tasks_description": "Vyhledávání nových nebo změněných položek v externích knihovnách",
"library_updated": "Knihovna aktualizována",
"library_watching_enable_description": "Sledovat změny souborů v externích knihovnách", "library_watching_enable_description": "Sledovat změny souborů v externích knihovnách",
"library_watching_settings": "Sledování knihovny [EXPERIMENTÁLNÍ]", "library_watching_settings": "Sledování knihovny [EXPERIMENTÁLNÍ]",
"library_watching_settings_description": "Automatické sledování změněných souborů", "library_watching_settings_description": "Automatické sledování změněných souborů",
@@ -173,6 +177,10 @@
"machine_learning_smart_search_enabled": "Povolit chytré vyhledávání", "machine_learning_smart_search_enabled": "Povolit chytré vyhledávání",
"machine_learning_smart_search_enabled_description": "Pokud je vypnuto, obrázky nebudou kódovány pro inteligentní vyhledávání.", "machine_learning_smart_search_enabled_description": "Pokud je vypnuto, obrázky nebudou kódovány pro inteligentní vyhledávání.",
"machine_learning_url_description": "URL serveru strojového učení. Pokud je zadáno více URL adres, budou jednotlivé servery zkoušeny postupně, dokud jeden z nich neodpoví úspěšně, a to v pořadí od prvního k poslednímu. Servery, které neodpoví, budou dočasně ignorovány, dokud nebudou opět online.", "machine_learning_url_description": "URL serveru strojového učení. Pokud je zadáno více URL adres, budou jednotlivé servery zkoušeny postupně, dokud jeden z nich neodpoví úspěšně, a to v pořadí od prvního k poslednímu. Servery, které neodpoví, budou dočasně ignorovány, dokud nebudou opět online.",
"maintenance_settings": "Údržba",
"maintenance_settings_description": "Přepnout Immich do režimu údržby.",
"maintenance_start": "Zahájit režim údržby",
"maintenance_start_error": "Nepodařilo se zahájit režim údržby.",
"manage_concurrency": "Správa souběžnosti", "manage_concurrency": "Správa souběžnosti",
"manage_log_settings": "Správa nastavení protokolu", "manage_log_settings": "Správa nastavení protokolu",
"map_dark_style": "Tmavý motiv", "map_dark_style": "Tmavý motiv",
@@ -430,6 +438,7 @@
"age_months": "{months, plural, one {# měsíc} few {# měsíce} other {# měsíců}}", "age_months": "{months, plural, one {# měsíc} few {# měsíce} other {# měsíců}}",
"age_year_months": "1 rok a {months, plural, one {# měsíc} few {# měsíce} other {# měsíců}}", "age_year_months": "1 rok a {months, plural, one {# měsíc} few {# měsíce} other {# měsíců}}",
"age_years": "{years, plural, one {# rok} few {# roky} other {# let}}", "age_years": "{years, plural, one {# rok} few {# roky} other {# let}}",
"album": "Album",
"album_added": "Přidáno album", "album_added": "Přidáno album",
"album_added_notification_setting_description": "Dostávat e-mailové oznámení, když jste přidáni do sdíleného alba", "album_added_notification_setting_description": "Dostávat e-mailové oznámení, když jste přidáni do sdíleného alba",
"album_cover_updated": "Obal alba aktualizován", "album_cover_updated": "Obal alba aktualizován",
@@ -475,6 +484,7 @@
"allow_edits": "Povolit úpravy", "allow_edits": "Povolit úpravy",
"allow_public_user_to_download": "Povolit veřejnosti stahovat", "allow_public_user_to_download": "Povolit veřejnosti stahovat",
"allow_public_user_to_upload": "Povolit veřejnosti nahrávat", "allow_public_user_to_upload": "Povolit veřejnosti nahrávat",
"allowed": "Povoleno",
"alt_text_qr_code": "Obrázek QR kódu", "alt_text_qr_code": "Obrázek QR kódu",
"anti_clockwise": "Proti směru hodinových ručiček", "anti_clockwise": "Proti směru hodinových ručiček",
"api_key": "API klíč", "api_key": "API klíč",
@@ -894,8 +904,6 @@
"edit_description_prompt": "Vyberte nový popis:", "edit_description_prompt": "Vyberte nový popis:",
"edit_exclusion_pattern": "Upravit vzor vyloučení", "edit_exclusion_pattern": "Upravit vzor vyloučení",
"edit_faces": "Upravit obličeje", "edit_faces": "Upravit obličeje",
"edit_import_path": "Upravit cestu importu",
"edit_import_paths": "Úpravit importní cesty",
"edit_key": "Upravit klíč", "edit_key": "Upravit klíč",
"edit_link": "Upravit odkaz", "edit_link": "Upravit odkaz",
"edit_location": "Upravit polohu", "edit_location": "Upravit polohu",
@@ -967,8 +975,8 @@
"failed_to_stack_assets": "Nepodařilo se seskupit položky", "failed_to_stack_assets": "Nepodařilo se seskupit položky",
"failed_to_unstack_assets": "Nepodařilo se zrušit seskupení položek", "failed_to_unstack_assets": "Nepodařilo se zrušit seskupení položek",
"failed_to_update_notification_status": "Nepodařilo se aktualizovat stav oznámení", "failed_to_update_notification_status": "Nepodařilo se aktualizovat stav oznámení",
"import_path_already_exists": "Tato cesta importu již existuje.",
"incorrect_email_or_password": "Nesprávný e-mail nebo heslo", "incorrect_email_or_password": "Nesprávný e-mail nebo heslo",
"library_folder_already_exists": "Tato importní cesta již existuje.",
"paths_validation_failed": "{paths, plural, one {# cesta neprošla} few {# cesty neprošly} other {# cest neprošlo}} kontrolou", "paths_validation_failed": "{paths, plural, one {# cesta neprošla} few {# cesty neprošly} other {# cest neprošlo}} kontrolou",
"profile_picture_transparent_pixels": "Profilové obrázky nemohou mít průhledné pixely. Obrázek si prosím zvětšete nebo posuňte.", "profile_picture_transparent_pixels": "Profilové obrázky nemohou mít průhledné pixely. Obrázek si prosím zvětšete nebo posuňte.",
"quota_higher_than_disk_size": "Nastavili jste kvótu vyšší, než je velikost disku", "quota_higher_than_disk_size": "Nastavili jste kvótu vyšší, než je velikost disku",
@@ -977,7 +985,6 @@
"unable_to_add_assets_to_shared_link": "Nelze přidat položky do sdíleného odkazu", "unable_to_add_assets_to_shared_link": "Nelze přidat položky do sdíleného odkazu",
"unable_to_add_comment": "Nelze přidat komentář", "unable_to_add_comment": "Nelze přidat komentář",
"unable_to_add_exclusion_pattern": "Nelze přidat vzor vyloučení", "unable_to_add_exclusion_pattern": "Nelze přidat vzor vyloučení",
"unable_to_add_import_path": "Nelze přidat cestu importu",
"unable_to_add_partners": "Nelze přidat partnery", "unable_to_add_partners": "Nelze přidat partnery",
"unable_to_add_remove_archive": "Nelze {archived, select, true {odstranit položku z} other {přidat položku do}} archivu", "unable_to_add_remove_archive": "Nelze {archived, select, true {odstranit položku z} other {přidat položku do}} archivu",
"unable_to_add_remove_favorites": "Nelze {favorite, select, true {oblíbit položku} other {zrušit oblíbení položky}}", "unable_to_add_remove_favorites": "Nelze {favorite, select, true {oblíbit položku} other {zrušit oblíbení položky}}",
@@ -1000,12 +1007,10 @@
"unable_to_delete_asset": "Nelze odstranit položku", "unable_to_delete_asset": "Nelze odstranit položku",
"unable_to_delete_assets": "Chyba při odstraňování položek", "unable_to_delete_assets": "Chyba při odstraňování položek",
"unable_to_delete_exclusion_pattern": "Nelze odstranit vzor vyloučení", "unable_to_delete_exclusion_pattern": "Nelze odstranit vzor vyloučení",
"unable_to_delete_import_path": "Nelze odstranit cestu importu",
"unable_to_delete_shared_link": "Nepodařilo se odstranit sdílený odkaz", "unable_to_delete_shared_link": "Nepodařilo se odstranit sdílený odkaz",
"unable_to_delete_user": "Nelze odstranit uživatele", "unable_to_delete_user": "Nelze odstranit uživatele",
"unable_to_download_files": "Nelze stáhnout soubory", "unable_to_download_files": "Nelze stáhnout soubory",
"unable_to_edit_exclusion_pattern": "Nelze upravit vzor vyloučení", "unable_to_edit_exclusion_pattern": "Nelze upravit vzor vyloučení",
"unable_to_edit_import_path": "Nelze upravit cestu importu",
"unable_to_empty_trash": "Nelze vyprázdnit koš", "unable_to_empty_trash": "Nelze vyprázdnit koš",
"unable_to_enter_fullscreen": "Nelze přejít do režimu celé obrazovky", "unable_to_enter_fullscreen": "Nelze přejít do režimu celé obrazovky",
"unable_to_exit_fullscreen": "Nelze ukončit zobrazení na celou obrazovku", "unable_to_exit_fullscreen": "Nelze ukončit zobrazení na celou obrazovku",
@@ -1056,6 +1061,7 @@
"unable_to_update_user": "Nelze aktualizovat uživatele", "unable_to_update_user": "Nelze aktualizovat uživatele",
"unable_to_upload_file": "Nepodařilo se nahrát soubor" "unable_to_upload_file": "Nepodařilo se nahrát soubor"
}, },
"exclusion_pattern": "Vzor vyloučení",
"exif": "Exif", "exif": "Exif",
"exif_bottom_sheet_description": "Přidat popis...", "exif_bottom_sheet_description": "Přidat popis...",
"exif_bottom_sheet_description_error": "Chyba při aktualizaci popisu", "exif_bottom_sheet_description_error": "Chyba při aktualizaci popisu",
@@ -1115,6 +1121,7 @@
"folders_feature_description": "Procházení zobrazení složek s fotografiemi a videi v souborovém systému", "folders_feature_description": "Procházení zobrazení složek s fotografiemi a videi v souborovém systému",
"forgot_pin_code_question": "Zapomněli jste PIN?", "forgot_pin_code_question": "Zapomněli jste PIN?",
"forward": "Dopředu", "forward": "Dopředu",
"full_path": "Úplná cesta: {path}",
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Tato funkce načítá externí zdroje z Googlu, aby mohla fungovat.", "gcast_enabled_description": "Tato funkce načítá externí zdroje z Googlu, aby mohla fungovat.",
"general": "Obecné", "general": "Obecné",
@@ -1196,6 +1203,8 @@
"import_path": "Cesta importu", "import_path": "Cesta importu",
"in_albums": "{count, plural, one {V # albu} few {Ve # albech} other {V # albech}}", "in_albums": "{count, plural, one {V # albu} few {Ve # albech} other {V # albech}}",
"in_archive": "V archivu", "in_archive": "V archivu",
"in_year": "V roce {year}",
"in_year_selector": "V roce",
"include_archived": "Včetně archivovaných", "include_archived": "Včetně archivovaných",
"include_shared_albums": "Včetně sdílených alb", "include_shared_albums": "Včetně sdílených alb",
"include_shared_partner_assets": "Včetně sdílených položek partnera", "include_shared_partner_assets": "Včetně sdílených položek partnera",
@@ -1232,6 +1241,7 @@
"language_setting_description": "Vyberte upřednostňovaný jazyk", "language_setting_description": "Vyberte upřednostňovaný jazyk",
"large_files": "Velké soubory", "large_files": "Velké soubory",
"last": "Poslední", "last": "Poslední",
"last_months": "{count, plural, one {Poslední měsíc} few {Poslední # měsíce} other {Posledních # měsíců}}",
"last_seen": "Naposledy viděno", "last_seen": "Naposledy viděno",
"latest_version": "Nejnovější verze", "latest_version": "Nejnovější verze",
"latitude": "Zeměpisná šířka", "latitude": "Zeměpisná šířka",
@@ -1241,6 +1251,8 @@
"let_others_respond": "Nechte ostatní reagovat", "let_others_respond": "Nechte ostatní reagovat",
"level": "Úroveň", "level": "Úroveň",
"library": "Knihovna", "library": "Knihovna",
"library_add_folder": "Přidat složku",
"library_edit_folder": "Upravit složku",
"library_options": "Možnosti knihovny", "library_options": "Možnosti knihovny",
"library_page_device_albums": "Alba v zařízení", "library_page_device_albums": "Alba v zařízení",
"library_page_new_album": "Nové album", "library_page_new_album": "Nové album",
@@ -1312,8 +1324,17 @@
"loop_videos_description": "Povolit automatickou smyčku videa v prohlížeči.", "loop_videos_description": "Povolit automatickou smyčku videa v prohlížeči.",
"main_branch_warning": "Používáte vývojovou verzi; důrazně doporučujeme používat verzi z vydání!", "main_branch_warning": "Používáte vývojovou verzi; důrazně doporučujeme používat verzi z vydání!",
"main_menu": "Hlavní nabídka", "main_menu": "Hlavní nabídka",
"maintenance_description": "Immich byl přepnut do <link>režimu údržby</link>.",
"maintenance_end": "Ukončit režim údržby",
"maintenance_end_error": "Nepodařilo se ukončit režim údržby.",
"maintenance_logged_in_as": "Aktuálně přihlášen jako {user}",
"maintenance_title": "Dočasně nedostupné",
"make": "Výrobce", "make": "Výrobce",
"manage_geolocation": "Spravovat polohu", "manage_geolocation": "Spravovat polohu",
"manage_media_access_rationale": "Toto oprávnění je vyžadováno pro správné zacházení s přesunem položek do koše a jejich obnovováním z něj.",
"manage_media_access_settings": "Otevřít nastavení",
"manage_media_access_subtitle": "Povolte aplikaci Immich spravovat a přesouvat soubory médií.",
"manage_media_access_title": "Přístup ke správě médií",
"manage_shared_links": "Spravovat sdílené odkazy", "manage_shared_links": "Spravovat sdílené odkazy",
"manage_sharing_with_partners": "Správa sdílení s partnery", "manage_sharing_with_partners": "Správa sdílení s partnery",
"manage_the_app_settings": "Správa nastavení aplikace", "manage_the_app_settings": "Správa nastavení aplikace",
@@ -1377,6 +1398,7 @@
"more": "Více", "more": "Více",
"move": "Přesunout", "move": "Přesunout",
"move_off_locked_folder": "Přesunout z uzamčené složky", "move_off_locked_folder": "Přesunout z uzamčené složky",
"move_to": "Přesunout do",
"move_to_lock_folder_action_prompt": "{count} přidaných do uzamčené složky", "move_to_lock_folder_action_prompt": "{count} přidaných do uzamčené složky",
"move_to_locked_folder": "Přesunout do uzamčené složky", "move_to_locked_folder": "Přesunout do uzamčené složky",
"move_to_locked_folder_confirmation": "Tyto fotky a videa budou odstraněny ze všech alb a bude je možné zobrazit pouze v uzamčené složce", "move_to_locked_folder_confirmation": "Tyto fotky a videa budou odstraněny ze všech alb a bude je možné zobrazit pouze v uzamčené složce",
@@ -1406,6 +1428,7 @@
"new_pin_code": "Nový PIN kód", "new_pin_code": "Nový PIN kód",
"new_pin_code_subtitle": "Poprvé přistupujete k uzamčené složce. Vytvořte si kód PIN pro bezpečný přístup na tuto stránku", "new_pin_code_subtitle": "Poprvé přistupujete k uzamčené složce. Vytvořte si kód PIN pro bezpečný přístup na tuto stránku",
"new_timeline": "Nová časová osa", "new_timeline": "Nová časová osa",
"new_update": "Nová aktualizace",
"new_user_created": "Vytvořen nový uživatel", "new_user_created": "Vytvořen nový uživatel",
"new_version_available": "NOVÁ VERZE K DISPOZICI", "new_version_available": "NOVÁ VERZE K DISPOZICI",
"newest_first": "Nejnovější první", "newest_first": "Nejnovější první",
@@ -1421,12 +1444,14 @@
"no_cast_devices_found": "Nebyla nalezena žádná zařízení", "no_cast_devices_found": "Nebyla nalezena žádná zařízení",
"no_checksum_local": "Není k dispozici kontrolní součet - nelze načíst místní položky", "no_checksum_local": "Není k dispozici kontrolní součet - nelze načíst místní položky",
"no_checksum_remote": "Není k dispozici kontrolní součet - nelze načíst vzdálenou položku", "no_checksum_remote": "Není k dispozici kontrolní součet - nelze načíst vzdálenou položku",
"no_devices": "Žádná autorizovaná zařízení",
"no_duplicates_found": "Nebyly nalezeny žádné duplicity.", "no_duplicates_found": "Nebyly nalezeny žádné duplicity.",
"no_exif_info_available": "Exif není k dispozici", "no_exif_info_available": "Exif není k dispozici",
"no_explore_results_message": "Nahrajte další fotografie a prozkoumejte svou sbírku.", "no_explore_results_message": "Nahrajte další fotografie a prozkoumejte svou sbírku.",
"no_favorites_message": "Přidejte si oblíbené položky a rychle najděte své nejlepší obrázky a videa", "no_favorites_message": "Přidejte si oblíbené položky a rychle najděte své nejlepší obrázky a videa",
"no_libraries_message": "Vytvořte si externí knihovnu pro zobrazení fotografií a videí", "no_libraries_message": "Vytvořte si externí knihovnu pro zobrazení fotografií a videí",
"no_local_assets_found": "Nebyly nalezeny žádné místní položky s tímto kontrolním součtem", "no_local_assets_found": "Nebyly nalezeny žádné místní položky s tímto kontrolním součtem",
"no_location_set": "Není nastavena poloha",
"no_locked_photos_message": "Fotky a videa v uzamčené složce jsou skryté a při procházení nebo vyhledávání v knihovně se nezobrazují.", "no_locked_photos_message": "Fotky a videa v uzamčené složce jsou skryté a při procházení nebo vyhledávání v knihovně se nezobrazují.",
"no_name": "Bez jména", "no_name": "Bez jména",
"no_notifications": "Žádná oznámení", "no_notifications": "Žádná oznámení",
@@ -1437,6 +1462,7 @@
"no_results_description": "Zkuste použít synonymum nebo obecnější klíčové slovo", "no_results_description": "Zkuste použít synonymum nebo obecnější klíčové slovo",
"no_shared_albums_message": "Vytvořte si album a sdílejte fotografie a videa s lidmi ve své síti", "no_shared_albums_message": "Vytvořte si album a sdílejte fotografie a videa s lidmi ve své síti",
"no_uploads_in_progress": "Neprobíhá žádné nahrávání", "no_uploads_in_progress": "Neprobíhá žádné nahrávání",
"not_allowed": "Nepovoleno",
"not_available": "Není k dispozici", "not_available": "Není k dispozici",
"not_in_any_album": "Bez alba", "not_in_any_album": "Bez alba",
"not_selected": "Není vybráno", "not_selected": "Není vybráno",
@@ -1451,8 +1477,8 @@
"notifications": "Oznámení", "notifications": "Oznámení",
"notifications_setting_description": "Správa oznámení", "notifications_setting_description": "Správa oznámení",
"oauth": "OAuth", "oauth": "OAuth",
"obtainium_configurator": "Obtainium konfigurátor", "obtainium_configurator": "Konfigurátor Obtainium",
"obtainium_configurator_instructions": "Pomocí Obtainia nainstalujte a aktualizujte aplikaci pro Android přímo z vydání na Immich GitHubu. Vytvořte API klíč a vyberte variantu pro vytvoření konfiguračního odkazu Obtainia", "obtainium_configurator_instructions": "Pomocí aplikace Obtainium nainstalujte a aktualizujte aplikaci pro Android přímo z vydání na GitHubu Immich. Vytvořte API klíč a vyberte variantu pro vytvoření konfiguračního odkazu pro Obtainium",
"ocr": "OCR", "ocr": "OCR",
"official_immich_resources": "Oficiální zdroje Immich", "official_immich_resources": "Oficiální zdroje Immich",
"offline": "Offline", "offline": "Offline",
@@ -1547,6 +1573,8 @@
"photos_count": "{count, plural, one {{count, number} fotka} few {{count, number} fotky} other {{count, number} fotek}}", "photos_count": "{count, plural, one {{count, number} fotka} few {{count, number} fotky} other {{count, number} fotek}}",
"photos_from_previous_years": "Fotky z předchozích let", "photos_from_previous_years": "Fotky z předchozích let",
"pick_a_location": "Vyberte polohu", "pick_a_location": "Vyberte polohu",
"pick_custom_range": "Vlastní rozsah",
"pick_date_range": "Vyberte rozsah dat",
"pin_code_changed_successfully": "PIN kód byl úspěšně změněn", "pin_code_changed_successfully": "PIN kód byl úspěšně změněn",
"pin_code_reset_successfully": "PIN kód úspěšně resetován", "pin_code_reset_successfully": "PIN kód úspěšně resetován",
"pin_code_setup_successfully": "PIN kód úspěšně nastaven", "pin_code_setup_successfully": "PIN kód úspěšně nastaven",
@@ -1814,6 +1842,8 @@
"server_offline": "Server offline", "server_offline": "Server offline",
"server_online": "Server online", "server_online": "Server online",
"server_privacy": "Ochrana soukromí serveru", "server_privacy": "Ochrana soukromí serveru",
"server_restarting_description": "Tato stránka se za chvíli obnoví.",
"server_restarting_title": "Server se restartuje",
"server_stats": "Statistiky serveru", "server_stats": "Statistiky serveru",
"server_update_available": "K dispozici je aktualizace serveru", "server_update_available": "K dispozici je aktualizace serveru",
"server_version": "Verze serveru", "server_version": "Verze serveru",
@@ -2027,6 +2057,7 @@
"third_party_resources": "Zdroje třetích stran", "third_party_resources": "Zdroje třetích stran",
"time": "Čas", "time": "Čas",
"time_based_memories": "Časové vzpomínky", "time_based_memories": "Časové vzpomínky",
"time_based_memories_duration": "Počet sekund k zobrazení každého obrázku.",
"timeline": "Časová osa", "timeline": "Časová osa",
"timezone": "Časové pásmo", "timezone": "Časové pásmo",
"to_archive": "Archivovat", "to_archive": "Archivovat",
@@ -2167,6 +2198,7 @@
"welcome": "Vítejte", "welcome": "Vítejte",
"welcome_to_immich": "Vítejte v Immichi", "welcome_to_immich": "Vítejte v Immichi",
"wifi_name": "Název Wi-Fi", "wifi_name": "Název Wi-Fi",
"workflow": "Pracovní postup",
"wrong_pin_code": "Chybný PIN kód", "wrong_pin_code": "Chybný PIN kód",
"year": "Rok", "year": "Rok",
"years_ago": "Před {years, plural, one {rokem} other {# lety}}", "years_ago": "Před {years, plural, one {rokem} other {# lety}}",
-1
View File
@@ -17,7 +17,6 @@
"add_birthday": "Ҫуралнӑ кун хушӑр", "add_birthday": "Ҫуралнӑ кун хушӑр",
"add_endpoint": "Вӗҫӗмлӗ пӑнчӑ хушар", "add_endpoint": "Вӗҫӗмлӗ пӑнчӑ хушар",
"add_exclusion_pattern": "Кӑларса пӑрахмалли йӗрке хуш", "add_exclusion_pattern": "Кӑларса пӑрахмалли йӗрке хуш",
"add_import_path": "Импорт ҫулне хуш",
"add_location": "Вырӑн хуш", "add_location": "Вырӑн хуш",
"add_more_users": "Усӑҫсем ытларах хуш", "add_more_users": "Усӑҫсем ытларах хуш",
"add_partner": "Мӑшӑр хуш", "add_partner": "Мӑшӑр хуш",
+52 -31
View File
@@ -17,7 +17,6 @@
"add_birthday": "Tilføj en fødselsdag", "add_birthday": "Tilføj en fødselsdag",
"add_endpoint": "Tilføj endepunkt", "add_endpoint": "Tilføj endepunkt",
"add_exclusion_pattern": "Tilføj udelukkelsesmønster", "add_exclusion_pattern": "Tilføj udelukkelsesmønster",
"add_import_path": "Tilføj importsti",
"add_location": "Tilføj placering", "add_location": "Tilføj placering",
"add_more_users": "Tilføj flere brugere", "add_more_users": "Tilføj flere brugere",
"add_partner": "Tilføj partner", "add_partner": "Tilføj partner",
@@ -32,6 +31,7 @@
"add_to_album_toggle": "Skift selektion for {album}", "add_to_album_toggle": "Skift selektion for {album}",
"add_to_albums": "Tilføj til albummer", "add_to_albums": "Tilføj til albummer",
"add_to_albums_count": "Tilføj til albummer({count})", "add_to_albums_count": "Tilføj til albummer({count})",
"add_to_bottom_bar": "Tilføj til",
"add_to_shared_album": "Tilføj til delt album", "add_to_shared_album": "Tilføj til delt album",
"add_upload_to_stack": "Tilføj upload til stack", "add_upload_to_stack": "Tilføj upload til stack",
"add_url": "Tilføj URL", "add_url": "Tilføj URL",
@@ -112,7 +112,6 @@
"jobs_failed": "{jobCount, plural, one {# fejlet} other {# fejlede}}", "jobs_failed": "{jobCount, plural, one {# fejlet} other {# fejlede}}",
"library_created": "Skabte bibliotek: {library}", "library_created": "Skabte bibliotek: {library}",
"library_deleted": "Bibliotek slettet", "library_deleted": "Bibliotek slettet",
"library_import_path_description": "Angiv en mappe, der skal importeres. Denne mappe, inklusive undermapper, vil blive scannet for billeder og videoer.",
"library_scanning": "Periodisk scanning", "library_scanning": "Periodisk scanning",
"library_scanning_description": "Konfigurer periodisk biblioteksscanning", "library_scanning_description": "Konfigurer periodisk biblioteksscanning",
"library_scanning_enable_description": "Aktiver periodisk biblioteksscanning", "library_scanning_enable_description": "Aktiver periodisk biblioteksscanning",
@@ -173,6 +172,10 @@
"machine_learning_smart_search_enabled": "Aktiver smart søgning", "machine_learning_smart_search_enabled": "Aktiver smart søgning",
"machine_learning_smart_search_enabled_description": "Hvis deaktiveret, vil billeder ikke blive kodet til smart søgning.", "machine_learning_smart_search_enabled_description": "Hvis deaktiveret, vil billeder ikke blive kodet til smart søgning.",
"machine_learning_url_description": "URLen for maskinlæringsserveren. Hvis mere end én URL angives, vil hver server blive forsøgt én ad gangen, indtil en svarer succesfuldt, i rækkefølge fra første til sidste. Servere, der ikke svarer, vil midlertidigt blive ignoreret, indtil de kommer online igen.", "machine_learning_url_description": "URLen for maskinlæringsserveren. Hvis mere end én URL angives, vil hver server blive forsøgt én ad gangen, indtil en svarer succesfuldt, i rækkefølge fra første til sidste. Servere, der ikke svarer, vil midlertidigt blive ignoreret, indtil de kommer online igen.",
"maintenance_settings": "Vedligeholdelse",
"maintenance_settings_description": "Sæt Immich i vedligeholdelsestilstand.",
"maintenance_start": "Start vedligeholdelsestilstand",
"maintenance_start_error": "Vedligeholdelsestilstand kunne ikke startes.",
"manage_concurrency": "Administrer antallet af samtidige opgaver", "manage_concurrency": "Administrer antallet af samtidige opgaver",
"manage_log_settings": "Administrer logindstillinger", "manage_log_settings": "Administrer logindstillinger",
"map_dark_style": "Mørk tema", "map_dark_style": "Mørk tema",
@@ -301,7 +304,7 @@
"storage_template_settings_description": "Administrer mappestrukturen og filnavnet for den uploadede mediefil", "storage_template_settings_description": "Administrer mappestrukturen og filnavnet for den uploadede mediefil",
"storage_template_user_label": "<code>{label}</code> er brugerens Lagringsmærkat", "storage_template_user_label": "<code>{label}</code> er brugerens Lagringsmærkat",
"system_settings": "Systemindstillinger", "system_settings": "Systemindstillinger",
"tag_cleanup_job": "\"Tag\" cleanup", "tag_cleanup_job": "\"Tag\"-oprydning",
"template_email_available_tags": "Du kan bruge følgende variabler i din skabelon: {tags}", "template_email_available_tags": "Du kan bruge følgende variabler i din skabelon: {tags}",
"template_email_if_empty": "Hvis skabelonen er tom, vil standard-e-mailen blive brugt.", "template_email_if_empty": "Hvis skabelonen er tom, vil standard-e-mailen blive brugt.",
"template_email_invite_album": "Inviterings albumskabelon", "template_email_invite_album": "Inviterings albumskabelon",
@@ -377,11 +380,11 @@
"transcoding_two_pass_encoding_setting_description": "Transkoder af to omgange for at producere bedre indkodede videoer. Når den maksimale bitrate er slået til (som det kræver for at det fungerer med H.264 og HEVC), bruger denne tilstand en bitrateinterval baseret på den maksimale birate og ignorerer CRF. For VP9, kan CRF bruges hvis den maksimale bitrate er slået fra.", "transcoding_two_pass_encoding_setting_description": "Transkoder af to omgange for at producere bedre indkodede videoer. Når den maksimale bitrate er slået til (som det kræver for at det fungerer med H.264 og HEVC), bruger denne tilstand en bitrateinterval baseret på den maksimale birate og ignorerer CRF. For VP9, kan CRF bruges hvis den maksimale bitrate er slået fra.",
"transcoding_video_codec": "Videocodec", "transcoding_video_codec": "Videocodec",
"transcoding_video_codec_description": "VP9 har en højere effektivitet og webkompatibilitet, men indkodningen tager længere tid. HEVC har lignende ydelse, men har lavere webkompatibilitet og er hurtig at transkode, men giver meget større filer. AV1 er det mest effektive codec, men mangler understøttelse på ældre enheder.", "transcoding_video_codec_description": "VP9 har en højere effektivitet og webkompatibilitet, men indkodningen tager længere tid. HEVC har lignende ydelse, men har lavere webkompatibilitet og er hurtig at transkode, men giver meget større filer. AV1 er det mest effektive codec, men mangler understøttelse på ældre enheder.",
"trash_enabled_description": "Aktivér skraldefunktioner", "trash_enabled_description": "Aktivér \"Papirkurvs\"-funktioner",
"trash_number_of_days": "Antal dage", "trash_number_of_days": "Antal dage",
"trash_number_of_days_description": "Antal dage aktiver i skraldespanden skal beholdes inden de fjernes permanent", "trash_number_of_days_description": "Antal dage elementer i papirkurven skal beholdes inden de fjernes permanent",
"trash_settings": "Skraldeindstillinger", "trash_settings": "Papirkurvs-indstillinger",
"trash_settings_description": "Administrér skraldeindstillinger", "trash_settings_description": "Administrér papirkurvs-indstillinger",
"unlink_all_oauth_accounts": "Ophæv link til alle OAuth konti", "unlink_all_oauth_accounts": "Ophæv link til alle OAuth konti",
"unlink_all_oauth_accounts_description": "Husk at fjerne linket til alle OAuth konti før du migrerer til en ny udbyder.", "unlink_all_oauth_accounts_description": "Husk at fjerne linket til alle OAuth konti før du migrerer til en ny udbyder.",
"unlink_all_oauth_accounts_prompt": "Er du sikker på, at du vil ophæve link til alle OAuth konti? Dette vil nulstille OAuth ID for hver bruger og kan ikke fortrydes.", "unlink_all_oauth_accounts_prompt": "Er du sikker på, at du vil ophæve link til alle OAuth konti? Dette vil nulstille OAuth ID for hver bruger og kan ikke fortrydes.",
@@ -430,6 +433,7 @@
"age_months": "Alder {months, plural, one {# måned} other {# måneder}}", "age_months": "Alder {months, plural, one {# måned} other {# måneder}}",
"age_year_months": "Alder 1 år, {months, plural, one {# måned} other {# måneder}}", "age_year_months": "Alder 1 år, {months, plural, one {# måned} other {# måneder}}",
"age_years": "{years, plural, other {Alder #}}", "age_years": "{years, plural, other {Alder #}}",
"album": "Album",
"album_added": "Album tilføjet", "album_added": "Album tilføjet",
"album_added_notification_setting_description": "Modtag en emailnotifikation når du bliver tilføjet til en delt album", "album_added_notification_setting_description": "Modtag en emailnotifikation når du bliver tilføjet til en delt album",
"album_cover_updated": "Albumcover opdateret", "album_cover_updated": "Albumcover opdateret",
@@ -475,6 +479,7 @@
"allow_edits": "Tillad redigeringer", "allow_edits": "Tillad redigeringer",
"allow_public_user_to_download": "Tillad offentlige brugere til at hente", "allow_public_user_to_download": "Tillad offentlige brugere til at hente",
"allow_public_user_to_upload": "Tillad offentlige brugere til at uploade", "allow_public_user_to_upload": "Tillad offentlige brugere til at uploade",
"allowed": "Tilladt",
"alt_text_qr_code": "QR-kode billede", "alt_text_qr_code": "QR-kode billede",
"anti_clockwise": "Mod uret", "anti_clockwise": "Mod uret",
"api_key": "API-nøgle", "api_key": "API-nøgle",
@@ -522,7 +527,7 @@
"asset_offline_description": "Denne eksterne mediefil kan ikke længere findes på drevet. Kontakt venligst din Immich-administrator for hjælp.", "asset_offline_description": "Denne eksterne mediefil kan ikke længere findes på drevet. Kontakt venligst din Immich-administrator for hjælp.",
"asset_restored_successfully": "Elementet blev gendannet succesfuldt", "asset_restored_successfully": "Elementet blev gendannet succesfuldt",
"asset_skipped": "Sprunget over", "asset_skipped": "Sprunget over",
"asset_skipped_in_trash": "I skraldespand", "asset_skipped_in_trash": "I papirkurv",
"asset_trashed": "Objekt kasseret", "asset_trashed": "Objekt kasseret",
"asset_troubleshoot": "Fejlsøg på objekt", "asset_troubleshoot": "Fejlsøg på objekt",
"asset_uploaded": "Uploadet", "asset_uploaded": "Uploadet",
@@ -894,8 +899,6 @@
"edit_description_prompt": "Vælg venligst en ny beskrivelse:", "edit_description_prompt": "Vælg venligst en ny beskrivelse:",
"edit_exclusion_pattern": "Redigér udelukkelsesmønster", "edit_exclusion_pattern": "Redigér udelukkelsesmønster",
"edit_faces": "Redigér ansigter", "edit_faces": "Redigér ansigter",
"edit_import_path": "Redigér import-sti",
"edit_import_paths": "Redigér import-stier",
"edit_key": "Redigér nøgle", "edit_key": "Redigér nøgle",
"edit_link": "Rediger link", "edit_link": "Rediger link",
"edit_location": "Rediger placering", "edit_location": "Rediger placering",
@@ -967,7 +970,6 @@
"failed_to_stack_assets": "Det lykkedes ikke at stable mediefiler", "failed_to_stack_assets": "Det lykkedes ikke at stable mediefiler",
"failed_to_unstack_assets": "Det lykkedes ikke at fjerne gruperingen af mediefiler", "failed_to_unstack_assets": "Det lykkedes ikke at fjerne gruperingen af mediefiler",
"failed_to_update_notification_status": "Kunne ikke uploade notifikations status", "failed_to_update_notification_status": "Kunne ikke uploade notifikations status",
"import_path_already_exists": "Denne importsti findes allerede.",
"incorrect_email_or_password": "Forkert email eller kodeord", "incorrect_email_or_password": "Forkert email eller kodeord",
"paths_validation_failed": "{paths, plural, one {# sti} other {# stier}} slog fejl ved validering", "paths_validation_failed": "{paths, plural, one {# sti} other {# stier}} slog fejl ved validering",
"profile_picture_transparent_pixels": "Profilbilleder kan ikke have gennemsigtige pixels. Zoom venligst ind og/eller flyt billedet.", "profile_picture_transparent_pixels": "Profilbilleder kan ikke have gennemsigtige pixels. Zoom venligst ind og/eller flyt billedet.",
@@ -977,7 +979,6 @@
"unable_to_add_assets_to_shared_link": "Kan ikke tilføje mediefiler til det delte link", "unable_to_add_assets_to_shared_link": "Kan ikke tilføje mediefiler til det delte link",
"unable_to_add_comment": "Ikke i stand til at tilføje kommentar", "unable_to_add_comment": "Ikke i stand til at tilføje kommentar",
"unable_to_add_exclusion_pattern": "Kunne ikke tilføje udelukkelsesmønster", "unable_to_add_exclusion_pattern": "Kunne ikke tilføje udelukkelsesmønster",
"unable_to_add_import_path": "Kunne ikke tilføje importsti",
"unable_to_add_partners": "Ikke i stand til at tilføje partnere", "unable_to_add_partners": "Ikke i stand til at tilføje partnere",
"unable_to_add_remove_archive": "Kan Ikke {archived, select, true {fjerne aktiv fra} other {tilføje aktiv til}} Arkiv", "unable_to_add_remove_archive": "Kan Ikke {archived, select, true {fjerne aktiv fra} other {tilføje aktiv til}} Arkiv",
"unable_to_add_remove_favorites": "Kan ikke {favorite, select, true {tilføje aktiv til} other {fjerne aktiv fra}} favoritter", "unable_to_add_remove_favorites": "Kan ikke {favorite, select, true {tilføje aktiv til} other {fjerne aktiv fra}} favoritter",
@@ -1000,13 +1001,11 @@
"unable_to_delete_asset": "Kan ikke slette mediefil", "unable_to_delete_asset": "Kan ikke slette mediefil",
"unable_to_delete_assets": "Fejl i sletning af mediefiler", "unable_to_delete_assets": "Fejl i sletning af mediefiler",
"unable_to_delete_exclusion_pattern": "Kunne ikke slette udelukkelsesmønster", "unable_to_delete_exclusion_pattern": "Kunne ikke slette udelukkelsesmønster",
"unable_to_delete_import_path": "Kunne ikke slette importsti",
"unable_to_delete_shared_link": "Kunne ikke slette delt link", "unable_to_delete_shared_link": "Kunne ikke slette delt link",
"unable_to_delete_user": "Ikke i stand til at slette bruger", "unable_to_delete_user": "Ikke i stand til at slette bruger",
"unable_to_download_files": "Kan ikke downloade filer", "unable_to_download_files": "Kan ikke downloade filer",
"unable_to_edit_exclusion_pattern": "Kunne ikke redigere udelukkelsesmønster", "unable_to_edit_exclusion_pattern": "Kunne ikke redigere udelukkelsesmønster",
"unable_to_edit_import_path": "Kunne ikke redigere importsti", "unable_to_empty_trash": "Ikke i stand til at tømme papirkurv",
"unable_to_empty_trash": "Ikke i stand til at tømme skraldespand",
"unable_to_enter_fullscreen": "Kan ikke aktivere fuldskærmstilstand", "unable_to_enter_fullscreen": "Kan ikke aktivere fuldskærmstilstand",
"unable_to_exit_fullscreen": "Kan ikke forlade fuldskærmstilstand", "unable_to_exit_fullscreen": "Kan ikke forlade fuldskærmstilstand",
"unable_to_get_comments_number": "Kan ikke få antallet af kommentarer", "unable_to_get_comments_number": "Kan ikke få antallet af kommentarer",
@@ -1031,7 +1030,7 @@
"unable_to_reset_pin_code": "Kunne ikke nulstille din PIN kode", "unable_to_reset_pin_code": "Kunne ikke nulstille din PIN kode",
"unable_to_resolve_duplicate": "Kunne ikke opklare duplikat", "unable_to_resolve_duplicate": "Kunne ikke opklare duplikat",
"unable_to_restore_assets": "Kunne ikke gendanne medierfil", "unable_to_restore_assets": "Kunne ikke gendanne medierfil",
"unable_to_restore_trash": "Ikke i stand til at gendanne fra skraldespanden", "unable_to_restore_trash": "Ikke i stand til at gendanne fra papirkurv",
"unable_to_restore_user": "Ikke i stand til at gendanne bruger", "unable_to_restore_user": "Ikke i stand til at gendanne bruger",
"unable_to_save_album": "Ikke i stand til at gemme album", "unable_to_save_album": "Ikke i stand til at gemme album",
"unable_to_save_api_key": "Kunne ikke gemme API-nøgle", "unable_to_save_api_key": "Kunne ikke gemme API-nøgle",
@@ -1196,6 +1195,8 @@
"import_path": "Import-sti", "import_path": "Import-sti",
"in_albums": "I {count, plural, one {# album} other {# albummer}}", "in_albums": "I {count, plural, one {# album} other {# albummer}}",
"in_archive": "I arkiv", "in_archive": "I arkiv",
"in_year": "I {year}",
"in_year_selector": "I",
"include_archived": "Inkluder arkiveret", "include_archived": "Inkluder arkiveret",
"include_shared_albums": "Inkludér delte albummer", "include_shared_albums": "Inkludér delte albummer",
"include_shared_partner_assets": "Inkludér delte partnermedier", "include_shared_partner_assets": "Inkludér delte partnermedier",
@@ -1232,6 +1233,7 @@
"language_setting_description": "Vælg dit foretrukne sprog", "language_setting_description": "Vælg dit foretrukne sprog",
"large_files": "Store filer", "large_files": "Store filer",
"last": "Sidste", "last": "Sidste",
"last_months": "{count, plural, one {Sidste måned} other {Sidste # måneder}}",
"last_seen": "Sidst set", "last_seen": "Sidst set",
"latest_version": "Seneste version", "latest_version": "Seneste version",
"latitude": "Breddegrad", "latitude": "Breddegrad",
@@ -1312,8 +1314,17 @@
"loop_videos_description": "Aktivér for at genafspille videoer automatisk i detaljeret visning.", "loop_videos_description": "Aktivér for at genafspille videoer automatisk i detaljeret visning.",
"main_branch_warning": "Du bruger en udviklingsversion; vi anbefaler kraftigt at bruge en udgivelsesversion!", "main_branch_warning": "Du bruger en udviklingsversion; vi anbefaler kraftigt at bruge en udgivelsesversion!",
"main_menu": "Hovedmenu", "main_menu": "Hovedmenu",
"maintenance_description": "Immich er blevet sat i <link>vedligeholdelsestilstand</link>.",
"maintenance_end": "Afslut vedligeholdelsestilstand",
"maintenance_end_error": "Vedligeholdelsestilstand kunne ikke afsluttes.",
"maintenance_logged_in_as": "Aktuelt logget ind som {user}",
"maintenance_title": "Midlertidigt Utilgængelig",
"make": "Producent", "make": "Producent",
"manage_geolocation": "Administrer placering", "manage_geolocation": "Administrer placering",
"manage_media_access_rationale": "Denne tilladelse er påkrævet for korrekt håndtering af flytning af elementer til papirkurven og gendannelse af dem fra den.",
"manage_media_access_settings": "Åben instillinger",
"manage_media_access_subtitle": "Tillad Immich appen at administrere og flytte mediefiler.",
"manage_media_access_title": "Mediestyringsadgang",
"manage_shared_links": "Håndter delte links", "manage_shared_links": "Håndter delte links",
"manage_sharing_with_partners": "Administrér deling med partnere", "manage_sharing_with_partners": "Administrér deling med partnere",
"manage_the_app_settings": "Administrer appindstillinger", "manage_the_app_settings": "Administrer appindstillinger",
@@ -1377,12 +1388,13 @@
"more": "Mere", "more": "Mere",
"move": "Flyt", "move": "Flyt",
"move_off_locked_folder": "Flyt ud af låst mappe", "move_off_locked_folder": "Flyt ud af låst mappe",
"move_to": "Flyt til",
"move_to_lock_folder_action_prompt": "{count} føjet til den låste mappe", "move_to_lock_folder_action_prompt": "{count} føjet til den låste mappe",
"move_to_locked_folder": "Flyt til låst mappe", "move_to_locked_folder": "Flyt til låst mappe",
"move_to_locked_folder_confirmation": "Disse billeder og videoer vil blive fjernet fra alle albums, og vil kun være synlig fra den låste mappe", "move_to_locked_folder_confirmation": "Disse billeder og videoer vil blive fjernet fra alle albums, og vil kun være synlig fra den låste mappe",
"moved_to_archive": "Flyttede {count, plural, one {# mediefil} other {# mediefiler}} til arkivet", "moved_to_archive": "Flyttede {count, plural, one {# mediefil} other {# mediefiler}} til arkivet",
"moved_to_library": "Flyttede {count, plural, one {# mediefil} other {# mediefiler}} til biblioteket", "moved_to_library": "Flyttede {count, plural, one {# mediefil} other {# mediefiler}} til biblioteket",
"moved_to_trash": "Flyttet til skraldespand", "moved_to_trash": "Flyttet til papirkurv",
"multiselect_grid_edit_date_time_err_read_only": "Kan ikke redigere datoen på skrivebeskyttet elementer. Springer over", "multiselect_grid_edit_date_time_err_read_only": "Kan ikke redigere datoen på skrivebeskyttet elementer. Springer over",
"multiselect_grid_edit_gps_err_read_only": "Kan ikke redigere lokation af skrivebeskyttet elementer. Springer over", "multiselect_grid_edit_gps_err_read_only": "Kan ikke redigere lokation af skrivebeskyttet elementer. Springer over",
"mute_memories": "Dæmp minder", "mute_memories": "Dæmp minder",
@@ -1406,6 +1418,7 @@
"new_pin_code": "Ny PIN kode", "new_pin_code": "Ny PIN kode",
"new_pin_code_subtitle": "Dette er første gang du tilgår den låste mappe. Lav en PIN kode for sikkert at tilgå denne side", "new_pin_code_subtitle": "Dette er første gang du tilgår den låste mappe. Lav en PIN kode for sikkert at tilgå denne side",
"new_timeline": "Ny tidslinje", "new_timeline": "Ny tidslinje",
"new_update": "Ny opdatering",
"new_user_created": "Ny bruger oprettet", "new_user_created": "Ny bruger oprettet",
"new_version_available": "NY VERSION TILGÆNGELIG", "new_version_available": "NY VERSION TILGÆNGELIG",
"newest_first": "Nyeste først", "newest_first": "Nyeste først",
@@ -1421,6 +1434,7 @@
"no_cast_devices_found": "Ingen Cast-enheder fundet", "no_cast_devices_found": "Ingen Cast-enheder fundet",
"no_checksum_local": "Ingen checksum tilgængelig kan ikke hente lokale objekter", "no_checksum_local": "Ingen checksum tilgængelig kan ikke hente lokale objekter",
"no_checksum_remote": "Ingen checksum tilgængelig kan ikke hente eksterne objekter", "no_checksum_remote": "Ingen checksum tilgængelig kan ikke hente eksterne objekter",
"no_devices": "Ingen godkendte enheder",
"no_duplicates_found": "Ingen duplikater fundet.", "no_duplicates_found": "Ingen duplikater fundet.",
"no_exif_info_available": "Ingen tilgængelig exif information", "no_exif_info_available": "Ingen tilgængelig exif information",
"no_explore_results_message": "Upload flere billeder for at udforske din samling.", "no_explore_results_message": "Upload flere billeder for at udforske din samling.",
@@ -1437,6 +1451,7 @@
"no_results_description": "Prøv et synonym eller et mere generelt søgeord", "no_results_description": "Prøv et synonym eller et mere generelt søgeord",
"no_shared_albums_message": "Opret et album for at dele billeder og videoer med personer i dit netværk", "no_shared_albums_message": "Opret et album for at dele billeder og videoer med personer i dit netværk",
"no_uploads_in_progress": "Ingen upload i gang", "no_uploads_in_progress": "Ingen upload i gang",
"not_allowed": "Ikke tilladt",
"not_available": "ikke tilgængelig", "not_available": "ikke tilgængelig",
"not_in_any_album": "Ikke i noget album", "not_in_any_album": "Ikke i noget album",
"not_selected": "Ikke valgt", "not_selected": "Ikke valgt",
@@ -1547,6 +1562,8 @@
"photos_count": "{count, plural, one {{count, number} Billede} other {{count, number} Billeder}}", "photos_count": "{count, plural, one {{count, number} Billede} other {{count, number} Billeder}}",
"photos_from_previous_years": "Billeder fra tidligere år", "photos_from_previous_years": "Billeder fra tidligere år",
"pick_a_location": "Vælg et sted", "pick_a_location": "Vælg et sted",
"pick_custom_range": "Brugerdefineret periode",
"pick_date_range": "Vælg et datointerval",
"pin_code_changed_successfully": "Ændring af PIN kode vellykket", "pin_code_changed_successfully": "Ændring af PIN kode vellykket",
"pin_code_reset_successfully": "Nulstilling af PIN kode vellykket", "pin_code_reset_successfully": "Nulstilling af PIN kode vellykket",
"pin_code_setup_successfully": "Opsætning af PIN kode vellykket", "pin_code_setup_successfully": "Opsætning af PIN kode vellykket",
@@ -1718,7 +1735,7 @@
"save_to_gallery": "Gem til galleri", "save_to_gallery": "Gem til galleri",
"saved": "Gemt", "saved": "Gemt",
"saved_api_key": "Gemt API-nøgle", "saved_api_key": "Gemt API-nøgle",
"saved_profile": "Gemte profil", "saved_profile": "Gemt profil",
"saved_settings": "Gemte indstillinger", "saved_settings": "Gemte indstillinger",
"say_something": "Skriv noget", "say_something": "Skriv noget",
"scaffold_body_error_occurred": "Der opstod en fejl", "scaffold_body_error_occurred": "Der opstod en fejl",
@@ -1734,7 +1751,7 @@
"search_by_filename": "Søg efter filnavn eller filtypenavn", "search_by_filename": "Søg efter filnavn eller filtypenavn",
"search_by_filename_example": "dvs. IMG_1234.JPG eller PNG", "search_by_filename_example": "dvs. IMG_1234.JPG eller PNG",
"search_by_ocr": "Søg via OCR", "search_by_ocr": "Søg via OCR",
"search_by_ocr_example": "Latte", "search_by_ocr_example": "Søg efter tekst i dine billeder",
"search_camera_lens_model": "Søg objektiv model...", "search_camera_lens_model": "Søg objektiv model...",
"search_camera_make": "Søg efter kameraproducent...", "search_camera_make": "Søg efter kameraproducent...",
"search_camera_model": "Søg efter kameramodel...", "search_camera_model": "Søg efter kameramodel...",
@@ -1763,7 +1780,7 @@
"search_options": "Søgemuligheder", "search_options": "Søgemuligheder",
"search_page_categories": "Kategorier", "search_page_categories": "Kategorier",
"search_page_motion_photos": "Bevægelsesbilleder", "search_page_motion_photos": "Bevægelsesbilleder",
"search_page_no_objects": "Ingen elementer er tilgængelige", "search_page_no_objects": "Ingen elementinfomation er tilgængelig",
"search_page_no_places": "Ingen placeringsinformation er tilgængelig", "search_page_no_places": "Ingen placeringsinformation er tilgængelig",
"search_page_screenshots": "Skærmbilleder", "search_page_screenshots": "Skærmbilleder",
"search_page_search_photos_videos": "Søg i dine billeder og videoer", "search_page_search_photos_videos": "Søg i dine billeder og videoer",
@@ -1814,6 +1831,8 @@
"server_offline": "Server offline", "server_offline": "Server offline",
"server_online": "Server online", "server_online": "Server online",
"server_privacy": "Serverens privatliv", "server_privacy": "Serverens privatliv",
"server_restarting_description": "Denne side opdateres om et øjeblik.",
"server_restarting_title": "Serveren genstarter",
"server_stats": "Serverstatus", "server_stats": "Serverstatus",
"server_update_available": "Serveropdatering er tilgængelig", "server_update_available": "Serveropdatering er tilgængelig",
"server_version": "Server version", "server_version": "Server version",
@@ -1843,10 +1862,10 @@
"setting_notifications_single_progress_title": "Vis detaljeret baggrundsuploadstatus", "setting_notifications_single_progress_title": "Vis detaljeret baggrundsuploadstatus",
"setting_notifications_subtitle": "Tilpas dine notifikationspræferencer", "setting_notifications_subtitle": "Tilpas dine notifikationspræferencer",
"setting_notifications_total_progress_subtitle": "Samlet uploadstatus (færdige/samlet antal elementer)", "setting_notifications_total_progress_subtitle": "Samlet uploadstatus (færdige/samlet antal elementer)",
"setting_notifications_total_progress_title": "Vis samlet baggrundsuploadstatus", "setting_notifications_total_progress_title": "Vis samlet baggrunds upload status",
"setting_video_viewer_auto_play_subtitle": "Begynd automatisk at afspille videoer, når de åbnes", "setting_video_viewer_auto_play_subtitle": "Begynd automatisk at afspille videoer, når de åbnes",
"setting_video_viewer_auto_play_title": "Automatisk afspilning af videoer", "setting_video_viewer_auto_play_title": "Automatisk afspilning af videoer",
"setting_video_viewer_looping_title": "Looper", "setting_video_viewer_looping_title": "Genafspilning",
"setting_video_viewer_original_video_subtitle": "Når der streames video fra serveren, afspil da den originale selv når en omkodet udgave er tilgængelig. Kan føre til buffering. Videoer, der er tilgængelige lokalt, afspilles i original kvalitet uanset denne indstilling.", "setting_video_viewer_original_video_subtitle": "Når der streames video fra serveren, afspil da den originale selv når en omkodet udgave er tilgængelig. Kan føre til buffering. Videoer, der er tilgængelige lokalt, afspilles i original kvalitet uanset denne indstilling.",
"setting_video_viewer_original_video_title": "Tving original video", "setting_video_viewer_original_video_title": "Tving original video",
"settings": "Indstillinger", "settings": "Indstillinger",
@@ -1902,7 +1921,7 @@
"shared_link_info_chip_metadata": "EXIF", "shared_link_info_chip_metadata": "EXIF",
"shared_link_manage_links": "Håndter delte links", "shared_link_manage_links": "Håndter delte links",
"shared_link_options": "Muligheder for delt link", "shared_link_options": "Muligheder for delt link",
"shared_link_password_description": "Kræv et kodeord for at få adgang til dette delte link", "shared_link_password_description": "Kodeord krævet for at få adgang til dette delte link",
"shared_links": "Delte links", "shared_links": "Delte links",
"shared_links_description": "Del billeder og videoer med et link", "shared_links_description": "Del billeder og videoer med et link",
"shared_photos_and_videos_count": "{assetCount, plural, other {# delte billeder & videoer.}}", "shared_photos_and_videos_count": "{assetCount, plural, other {# delte billeder & videoer.}}",
@@ -1935,8 +1954,8 @@
"show_search_options": "Vis søgeindstillinger", "show_search_options": "Vis søgeindstillinger",
"show_shared_links": "Vis delte links", "show_shared_links": "Vis delte links",
"show_slideshow_transition": "Vis overgang til diasshow", "show_slideshow_transition": "Vis overgang til diasshow",
"show_supporter_badge": "Supportermærke", "show_supporter_badge": "Supporter skilt",
"show_supporter_badge_description": "Vis et supportermærke", "show_supporter_badge_description": "Vis et supporter ikon",
"show_text_search_menu": "Vis tekstsøgningsmenu", "show_text_search_menu": "Vis tekstsøgningsmenu",
"shuffle": "Bland", "shuffle": "Bland",
"sidebar": "Sidebjælke", "sidebar": "Sidebjælke",
@@ -1971,7 +1990,7 @@
"start_date_before_end_date": "Startdato skal ligge før slutdato", "start_date_before_end_date": "Startdato skal ligge før slutdato",
"state": "Stat", "state": "Stat",
"status": "Status", "status": "Status",
"stop_casting": "Stop støbning", "stop_casting": "Stop casting",
"stop_motion_photo": "Stopmotionbillede", "stop_motion_photo": "Stopmotionbillede",
"stop_photo_sharing": "Stop med at dele dine billeder?", "stop_photo_sharing": "Stop med at dele dine billeder?",
"stop_photo_sharing_description": "{partner} vil ikke længere kunne tilgå dine billeder.", "stop_photo_sharing_description": "{partner} vil ikke længere kunne tilgå dine billeder.",
@@ -2027,17 +2046,18 @@
"third_party_resources": "Tredjepartsressourcer", "third_party_resources": "Tredjepartsressourcer",
"time": "Tid", "time": "Tid",
"time_based_memories": "Tidsbaserede minder", "time_based_memories": "Tidsbaserede minder",
"time_based_memories_duration": "Antal sekunder, hvert billede skal vises.",
"timeline": "Tidslinje", "timeline": "Tidslinje",
"timezone": "Tidszone", "timezone": "Tidszone",
"to_archive": "Arkivér", "to_archive": "Arkivér",
"to_change_password": "Skift adgangskode", "to_change_password": "Skift adgangskode",
"to_favorite": "Gør til favorit", "to_favorite": "Gør til favorit",
"to_login": "Login", "to_login": "Login",
"to_multi_select": "For at vælge flere", "to_multi_select": "for at vælge flere",
"to_parent": "Gå op", "to_parent": "Gå et niveau op",
"to_select": "for at vælge", "to_select": "for at vælge",
"to_trash": "Papirkurv", "to_trash": "Papirkurv",
"toggle_settings": "S indstillinger til eller fra", "toggle_settings": "Skift indstillinger",
"total": "Total", "total": "Total",
"total_usage": "Samlet forbrug", "total_usage": "Samlet forbrug",
"trash": "Papirkurv", "trash": "Papirkurv",
@@ -2054,13 +2074,13 @@
"trash_page_restore_all": "Gendan alt", "trash_page_restore_all": "Gendan alt",
"trash_page_select_assets_btn": "Vælg elementer", "trash_page_select_assets_btn": "Vælg elementer",
"trash_page_title": "Papirkurv ({count})", "trash_page_title": "Papirkurv ({count})",
"trashed_items_will_be_permanently_deleted_after": "Mediefiler i skraldespanden vil blive slettet permanent efter {days, plural, one {# dag} other {# dage}}.", "trashed_items_will_be_permanently_deleted_after": "Mediefiler i papirkurven vil blive slettet permanent efter {days, plural, one {# dag} other {# dage}}.",
"troubleshoot": "Fejlfinding", "troubleshoot": "Fejlfinding",
"type": "Type", "type": "Type",
"unable_to_change_pin_code": "Kunne ikke ændre PIN kode", "unable_to_change_pin_code": "Kunne ikke ændre PIN kode",
"unable_to_check_version": "Kan ikke tjekke app- eller serverversion", "unable_to_check_version": "Kan ikke tjekke app- eller serverversion",
"unable_to_setup_pin_code": "Kunne ikke sætte PIN kode", "unable_to_setup_pin_code": "Kunne ikke sætte PIN kode",
"unarchive": "Afakivér", "unarchive": "Af Akivér",
"unarchive_action_prompt": "{count} slettet fra Arkiv", "unarchive_action_prompt": "{count} slettet fra Arkiv",
"unarchived_count": "{count, plural, other {Uarkiveret #}}", "unarchived_count": "{count, plural, other {Uarkiveret #}}",
"undo": "Fortryd", "undo": "Fortryd",
@@ -2167,6 +2187,7 @@
"welcome": "Velkommen", "welcome": "Velkommen",
"welcome_to_immich": "Velkommen til Immich", "welcome_to_immich": "Velkommen til Immich",
"wifi_name": "Wi-Fi navn", "wifi_name": "Wi-Fi navn",
"workflow": "Arbejdsproces",
"wrong_pin_code": "Forkert PIN kode", "wrong_pin_code": "Forkert PIN kode",
"year": "År", "year": "År",
"years_ago": "{years, plural, one {# år} other {# år}} siden", "years_ago": "{years, plural, one {# år} other {# år}} siden",
+19 -12
View File
@@ -17,7 +17,6 @@
"add_birthday": "Geburtsdatum hinzufügen", "add_birthday": "Geburtsdatum hinzufügen",
"add_endpoint": "Endpunkt hinzufügen", "add_endpoint": "Endpunkt hinzufügen",
"add_exclusion_pattern": "Ausschlussmuster hinzufügen", "add_exclusion_pattern": "Ausschlussmuster hinzufügen",
"add_import_path": "Importpfad hinzufügen",
"add_location": "Standort hinzufügen", "add_location": "Standort hinzufügen",
"add_more_users": "Weitere Nutzer hinzufügen", "add_more_users": "Weitere Nutzer hinzufügen",
"add_partner": "Partner hinzufügen", "add_partner": "Partner hinzufügen",
@@ -112,7 +111,6 @@
"jobs_failed": "{jobCount, plural, other {# fehlgeschlagen}}", "jobs_failed": "{jobCount, plural, other {# fehlgeschlagen}}",
"library_created": "Bibliothek erstellt: {library}", "library_created": "Bibliothek erstellt: {library}",
"library_deleted": "Bibliothek gelöscht", "library_deleted": "Bibliothek gelöscht",
"library_import_path_description": "Gib einen Ordner für den Import an. Dieser Ordner, einschließlich der Unterordner, wird nach Bildern und Videos durchsucht.",
"library_scanning": "Periodisches Scannen", "library_scanning": "Periodisches Scannen",
"library_scanning_description": "Regelmäßiges Durchsuchen der Bibliothek einstellen", "library_scanning_description": "Regelmäßiges Durchsuchen der Bibliothek einstellen",
"library_scanning_enable_description": "Regelmäßiges Scannen der Bibliothek aktivieren", "library_scanning_enable_description": "Regelmäßiges Scannen der Bibliothek aktivieren",
@@ -150,7 +148,7 @@
"machine_learning_max_detection_distance_description": "Maximaler Unterschied zwischen zwei Bildern, um sie als Duplikate zu betrachten, im Bereich von 0,001-0,1. Bei höheren Werten werden mehr Duplikate erkannt, aber es kann zu falsch-positiven Ergebnissen kommen.", "machine_learning_max_detection_distance_description": "Maximaler Unterschied zwischen zwei Bildern, um sie als Duplikate zu betrachten, im Bereich von 0,001-0,1. Bei höheren Werten werden mehr Duplikate erkannt, aber es kann zu falsch-positiven Ergebnissen kommen.",
"machine_learning_max_recognition_distance": "Maximaler Erkennungsabstand", "machine_learning_max_recognition_distance": "Maximaler Erkennungsabstand",
"machine_learning_max_recognition_distance_description": "Maximaler Abstand zwischen zwei Gesichtern, die als dieselbe Person angesehen werden, von 0-2. Ein niedrigerer Wert kann verhindern, dass zwei Personen als dieselbe Person eingestuft werden, während ein höherer Wert verhindern kann, dass ein und dieselbe Person als zwei verschiedene Personen eingestuft wird. Bitte beachte dabei, dass es einfacher ist, zwei Personen zu verschmelzen, als eine Person in zwei zu teilen, also wähle nach Möglichkeit einen niedrigeren Schwellenwert.", "machine_learning_max_recognition_distance_description": "Maximaler Abstand zwischen zwei Gesichtern, die als dieselbe Person angesehen werden, von 0-2. Ein niedrigerer Wert kann verhindern, dass zwei Personen als dieselbe Person eingestuft werden, während ein höherer Wert verhindern kann, dass ein und dieselbe Person als zwei verschiedene Personen eingestuft wird. Bitte beachte dabei, dass es einfacher ist, zwei Personen zu verschmelzen, als eine Person in zwei zu teilen, also wähle nach Möglichkeit einen niedrigeren Schwellenwert.",
"machine_learning_min_detection_score": "Minimale Erkennungsrate", "machine_learning_min_detection_score": "Mindest-Erkennungs Wert",
"machine_learning_min_detection_score_description": "Minimale Konfidenzrate für die Erkennung eines Gesichts von 0-1. Bei niedrigeren Werten werden mehr Gesichter erkannt, aber es kann zu falsch-positiven Ergebnissen kommen.", "machine_learning_min_detection_score_description": "Minimale Konfidenzrate für die Erkennung eines Gesichts von 0-1. Bei niedrigeren Werten werden mehr Gesichter erkannt, aber es kann zu falsch-positiven Ergebnissen kommen.",
"machine_learning_min_recognized_faces": "Mindestens erkannte Gesichter", "machine_learning_min_recognized_faces": "Mindestens erkannte Gesichter",
"machine_learning_min_recognized_faces_description": "Die Mindestanzahl von erkannten Gesichtern, damit eine Person erstellt werden kann. Eine Erhöhung dieses Wertes macht die Gesichtserkennung präziser, erhöht aber die Wahrscheinlichkeit, dass ein Gesicht nicht zu einer Person zugeordnet wird.", "machine_learning_min_recognized_faces_description": "Die Mindestanzahl von erkannten Gesichtern, damit eine Person erstellt werden kann. Eine Erhöhung dieses Wertes macht die Gesichtserkennung präziser, erhöht aber die Wahrscheinlichkeit, dass ein Gesicht nicht zu einer Person zugeordnet wird.",
@@ -162,7 +160,7 @@
"machine_learning_ocr_max_resolution_description": "Vorschauen über dieser Auflösung werden unter Beibehaltung des Seitenverhältnisses verkleinert. Höhere Werte sind genauer, benötigen jedoch mehr Zeit für die Verarbeitung und verbrauchen mehr Speicher.", "machine_learning_ocr_max_resolution_description": "Vorschauen über dieser Auflösung werden unter Beibehaltung des Seitenverhältnisses verkleinert. Höhere Werte sind genauer, benötigen jedoch mehr Zeit für die Verarbeitung und verbrauchen mehr Speicher.",
"machine_learning_ocr_min_detection_score": "Minimaler Erkennungswert", "machine_learning_ocr_min_detection_score": "Minimaler Erkennungswert",
"machine_learning_ocr_min_detection_score_description": "Minimale Konfidenzrate für die Texterkennung von 01. Niedrigere Werte führen dazu, dass mehr Text erkannt wird, können jedoch zu falsch-positiven Ergebnissen führen.", "machine_learning_ocr_min_detection_score_description": "Minimale Konfidenzrate für die Texterkennung von 01. Niedrigere Werte führen dazu, dass mehr Text erkannt wird, können jedoch zu falsch-positiven Ergebnissen führen.",
"machine_learning_ocr_min_recognition_score": "Minimale Erkennungsrate", "machine_learning_ocr_min_recognition_score": "Mindest-Erkennungswert",
"machine_learning_ocr_min_score_recognition_description": "Minimale Konfidenzrate für die Erkennung von erkanntem Text von 01. Niedrigere Werte führen dazu, dass mehr Text erkannt wird, können jedoch zu falsch-positiven Ergebnissen führen.", "machine_learning_ocr_min_score_recognition_description": "Minimale Konfidenzrate für die Erkennung von erkanntem Text von 01. Niedrigere Werte führen dazu, dass mehr Text erkannt wird, können jedoch zu falsch-positiven Ergebnissen führen.",
"machine_learning_ocr_model": "OCR Modell", "machine_learning_ocr_model": "OCR Modell",
"machine_learning_ocr_model_description": "Server Modelle sind genauer als mobile Modelle, brauchen aber länger zur Verarbeitung und brauchen mehr Speicher.", "machine_learning_ocr_model_description": "Server Modelle sind genauer als mobile Modelle, brauchen aber länger zur Verarbeitung und brauchen mehr Speicher.",
@@ -475,6 +473,7 @@
"allow_edits": "Bearbeiten erlauben", "allow_edits": "Bearbeiten erlauben",
"allow_public_user_to_download": "Erlaube öffentlichen Benutzern, herunterzuladen", "allow_public_user_to_download": "Erlaube öffentlichen Benutzern, herunterzuladen",
"allow_public_user_to_upload": "Erlaube öffentlichen Benutzern, hochzuladen", "allow_public_user_to_upload": "Erlaube öffentlichen Benutzern, hochzuladen",
"allowed": "Erlaubt",
"alt_text_qr_code": "QR-Code Bild", "alt_text_qr_code": "QR-Code Bild",
"anti_clockwise": "Gegen den Uhrzeigersinn", "anti_clockwise": "Gegen den Uhrzeigersinn",
"api_key": "API-Schlüssel", "api_key": "API-Schlüssel",
@@ -894,8 +893,6 @@
"edit_description_prompt": "Bitte wähle eine neue Beschreibung:", "edit_description_prompt": "Bitte wähle eine neue Beschreibung:",
"edit_exclusion_pattern": "Ausschlussmuster bearbeiten", "edit_exclusion_pattern": "Ausschlussmuster bearbeiten",
"edit_faces": "Gesichter bearbeiten", "edit_faces": "Gesichter bearbeiten",
"edit_import_path": "Importpfad bearbeiten",
"edit_import_paths": "Importpfade bearbeiten",
"edit_key": "Schlüssel bearbeiten", "edit_key": "Schlüssel bearbeiten",
"edit_link": "Link bearbeiten", "edit_link": "Link bearbeiten",
"edit_location": "Standort bearbeiten", "edit_location": "Standort bearbeiten",
@@ -967,7 +964,6 @@
"failed_to_stack_assets": "Dateien konnten nicht gestapelt werden", "failed_to_stack_assets": "Dateien konnten nicht gestapelt werden",
"failed_to_unstack_assets": "Dateien konnten nicht entstapelt werden", "failed_to_unstack_assets": "Dateien konnten nicht entstapelt werden",
"failed_to_update_notification_status": "Benachrichtigungsstatus aktualisieren fehlgeschlagen", "failed_to_update_notification_status": "Benachrichtigungsstatus aktualisieren fehlgeschlagen",
"import_path_already_exists": "Dieser Importpfad existiert bereits.",
"incorrect_email_or_password": "Ungültige E-Mail oder Passwort", "incorrect_email_or_password": "Ungültige E-Mail oder Passwort",
"paths_validation_failed": "{paths, plural, one {# Pfad konnte} other {# Pfade konnten}} nicht validiert werden", "paths_validation_failed": "{paths, plural, one {# Pfad konnte} other {# Pfade konnten}} nicht validiert werden",
"profile_picture_transparent_pixels": "Profilbilder dürfen keine transparenten Pixel haben. Bitte zoome heran und/oder verschiebe das Bild.", "profile_picture_transparent_pixels": "Profilbilder dürfen keine transparenten Pixel haben. Bitte zoome heran und/oder verschiebe das Bild.",
@@ -977,7 +973,6 @@
"unable_to_add_assets_to_shared_link": "Datei konnte nicht zum geteilten Link hinzugefügt werden", "unable_to_add_assets_to_shared_link": "Datei konnte nicht zum geteilten Link hinzugefügt werden",
"unable_to_add_comment": "Es kann kein Kommentar hinzufügt werden", "unable_to_add_comment": "Es kann kein Kommentar hinzufügt werden",
"unable_to_add_exclusion_pattern": "Ausschlussmuster konnte nicht hinzugefügt werden", "unable_to_add_exclusion_pattern": "Ausschlussmuster konnte nicht hinzugefügt werden",
"unable_to_add_import_path": "Importpfad konnte nicht hinzugefügt werden",
"unable_to_add_partners": "Es können keine Partner hinzufügt werden", "unable_to_add_partners": "Es können keine Partner hinzufügt werden",
"unable_to_add_remove_archive": "Datei konnte nicht {archived, select, true {aus dem Archiv entfernt} other {zum Archiv hinzugefügt}} werden", "unable_to_add_remove_archive": "Datei konnte nicht {archived, select, true {aus dem Archiv entfernt} other {zum Archiv hinzugefügt}} werden",
"unable_to_add_remove_favorites": "Datei konnte nicht {favorite, select, true {von den Favoriten entfernt} other {zu den Favoriten hinzugefügt}} werden", "unable_to_add_remove_favorites": "Datei konnte nicht {favorite, select, true {von den Favoriten entfernt} other {zu den Favoriten hinzugefügt}} werden",
@@ -1000,12 +995,10 @@
"unable_to_delete_asset": "Datei konnte nicht gelöscht werden", "unable_to_delete_asset": "Datei konnte nicht gelöscht werden",
"unable_to_delete_assets": "Fehler beim Löschen von Dateien", "unable_to_delete_assets": "Fehler beim Löschen von Dateien",
"unable_to_delete_exclusion_pattern": "Ausschlussmuster konnte nicht gelöscht werden", "unable_to_delete_exclusion_pattern": "Ausschlussmuster konnte nicht gelöscht werden",
"unable_to_delete_import_path": "Importpfad konnte nicht gelöscht werden",
"unable_to_delete_shared_link": "Geteilter Link kann nicht gelöscht werden", "unable_to_delete_shared_link": "Geteilter Link kann nicht gelöscht werden",
"unable_to_delete_user": "Nutzer konnte nicht gelöscht werden", "unable_to_delete_user": "Nutzer konnte nicht gelöscht werden",
"unable_to_download_files": "Dateien konnten nicht heruntergeladen werden", "unable_to_download_files": "Dateien konnten nicht heruntergeladen werden",
"unable_to_edit_exclusion_pattern": "Ausschlussmuster konnte nicht bearbeitet werden", "unable_to_edit_exclusion_pattern": "Ausschlussmuster konnte nicht bearbeitet werden",
"unable_to_edit_import_path": "Importpfad konnte nicht bearbeitet werden",
"unable_to_empty_trash": "Papierkorb konnte nicht geleert werden", "unable_to_empty_trash": "Papierkorb konnte nicht geleert werden",
"unable_to_enter_fullscreen": "Vollbildmodus kann nicht aktiviert werden", "unable_to_enter_fullscreen": "Vollbildmodus kann nicht aktiviert werden",
"unable_to_exit_fullscreen": "Vollbildmodus kann nicht deaktiviert werden", "unable_to_exit_fullscreen": "Vollbildmodus kann nicht deaktiviert werden",
@@ -1196,6 +1189,8 @@
"import_path": "Importpfad", "import_path": "Importpfad",
"in_albums": "In {count, plural, one {# Album} other {# Alben}}", "in_albums": "In {count, plural, one {# Album} other {# Alben}}",
"in_archive": "Im Archiv", "in_archive": "Im Archiv",
"in_year": "Im Jahr {year}",
"in_year_selector": "Im Jahr",
"include_archived": "Archivierte Dateien einbeziehen", "include_archived": "Archivierte Dateien einbeziehen",
"include_shared_albums": "Freigegebene Alben einbeziehen", "include_shared_albums": "Freigegebene Alben einbeziehen",
"include_shared_partner_assets": "Geteilte Partner-Dateien mit einbeziehen", "include_shared_partner_assets": "Geteilte Partner-Dateien mit einbeziehen",
@@ -1232,6 +1227,7 @@
"language_setting_description": "Wähle deine bevorzugte Sprache", "language_setting_description": "Wähle deine bevorzugte Sprache",
"large_files": "Große Dateien", "large_files": "Große Dateien",
"last": "Letzte", "last": "Letzte",
"last_months": "{count, plural, one {Letzter Monat} other {Letzte # Monate}}",
"last_seen": "Zuletzt gesehen", "last_seen": "Zuletzt gesehen",
"latest_version": "Aktuelle Version", "latest_version": "Aktuelle Version",
"latitude": "Breitengrad", "latitude": "Breitengrad",
@@ -1301,7 +1297,7 @@
"login_form_server_empty": "Serveradresse eingeben.", "login_form_server_empty": "Serveradresse eingeben.",
"login_form_server_error": "Es Konnte sich nicht mit dem Server verbunden werden.", "login_form_server_error": "Es Konnte sich nicht mit dem Server verbunden werden.",
"login_has_been_disabled": "Die Anmeldung wurde deaktiviert.", "login_has_been_disabled": "Die Anmeldung wurde deaktiviert.",
"login_password_changed_error": "Fehler beim Ändern deines Passwort", "login_password_changed_error": "Fehler beim Ändern deines Passwortes",
"login_password_changed_success": "Passwort erfolgreich geändert", "login_password_changed_success": "Passwort erfolgreich geändert",
"logout_all_device_confirmation": "Bist du sicher, dass du alle Geräte abmelden willst?", "logout_all_device_confirmation": "Bist du sicher, dass du alle Geräte abmelden willst?",
"logout_this_device_confirmation": "Bist du sicher, dass du dieses Gerät abmelden willst?", "logout_this_device_confirmation": "Bist du sicher, dass du dieses Gerät abmelden willst?",
@@ -1314,6 +1310,10 @@
"main_menu": "Hauptmenü", "main_menu": "Hauptmenü",
"make": "Marke", "make": "Marke",
"manage_geolocation": "Standort verwalten", "manage_geolocation": "Standort verwalten",
"manage_media_access_rationale": "Diese Berechtigung wird benötigt, um Dateien ordnungsgemäß in den Papierkorb schieben und daraus wiederherstellen zu können.",
"manage_media_access_settings": "Einstellungen öffnen",
"manage_media_access_subtitle": "Erlaube Immich, Mediendateien zu verwalten und zu verschieben.",
"manage_media_access_title": "Verwaltung von Mediendateien",
"manage_shared_links": "Freigegebene Links verwalten", "manage_shared_links": "Freigegebene Links verwalten",
"manage_sharing_with_partners": "Gemeinsame Nutzung mit Partnern verwalten", "manage_sharing_with_partners": "Gemeinsame Nutzung mit Partnern verwalten",
"manage_the_app_settings": "App-Einstellungen verwalten", "manage_the_app_settings": "App-Einstellungen verwalten",
@@ -1361,7 +1361,7 @@
"menu": "Menü", "menu": "Menü",
"merge": "Zusammenführen", "merge": "Zusammenführen",
"merge_people": "Personen zusammenführen", "merge_people": "Personen zusammenführen",
"merge_people_limit": "Du kannst nur bis zu 5 Gesichter auf einmal zusammenführen", "merge_people_limit": "Du kannst maximal 5 Gesichter auf einmal zusammenführen",
"merge_people_prompt": "Willst du diese Personen zusammenführen? Diese Aktion kann nicht rückgängig gemacht werden.", "merge_people_prompt": "Willst du diese Personen zusammenführen? Diese Aktion kann nicht rückgängig gemacht werden.",
"merge_people_successfully": "Personen erfolgreich zusammengeführt", "merge_people_successfully": "Personen erfolgreich zusammengeführt",
"merged_people_count": "{count, plural, one {# Person} other {# Personen}} zusammengefügt", "merged_people_count": "{count, plural, one {# Person} other {# Personen}} zusammengefügt",
@@ -1377,6 +1377,7 @@
"more": "Mehr", "more": "Mehr",
"move": "Verschieben", "move": "Verschieben",
"move_off_locked_folder": "Aus dem gesperrten Ordner verschieben", "move_off_locked_folder": "Aus dem gesperrten Ordner verschieben",
"move_to": "Verschieben nach",
"move_to_lock_folder_action_prompt": "{count} zum gesperrten Ordner hinzugefügt", "move_to_lock_folder_action_prompt": "{count} zum gesperrten Ordner hinzugefügt",
"move_to_locked_folder": "In den gesperrten Ordner verschieben", "move_to_locked_folder": "In den gesperrten Ordner verschieben",
"move_to_locked_folder_confirmation": "Diese Fotos und Videos werden aus allen Alben entfernt und können nur noch im gesperrten Ordner angezeigt werden", "move_to_locked_folder_confirmation": "Diese Fotos und Videos werden aus allen Alben entfernt und können nur noch im gesperrten Ordner angezeigt werden",
@@ -1406,6 +1407,7 @@
"new_pin_code": "Neuer PIN-Code", "new_pin_code": "Neuer PIN-Code",
"new_pin_code_subtitle": "Dies ist dein erster Zugriff auf den gesperrten Ordner. Erstelle einen PIN-Code für den sicheren Zugriff auf diese Seite", "new_pin_code_subtitle": "Dies ist dein erster Zugriff auf den gesperrten Ordner. Erstelle einen PIN-Code für den sicheren Zugriff auf diese Seite",
"new_timeline": "Neue Zeitleiste", "new_timeline": "Neue Zeitleiste",
"new_update": "Neues Update",
"new_user_created": "Neuer Benutzer wurde erstellt", "new_user_created": "Neuer Benutzer wurde erstellt",
"new_version_available": "NEUE VERSION VERFÜGBAR", "new_version_available": "NEUE VERSION VERFÜGBAR",
"newest_first": "Neueste zuerst", "newest_first": "Neueste zuerst",
@@ -1421,6 +1423,7 @@
"no_cast_devices_found": "Keine Geräte zum Übertragen gefunden", "no_cast_devices_found": "Keine Geräte zum Übertragen gefunden",
"no_checksum_local": "Prüfsumme nicht verfügbar - kann lokale Datei/en nicht laden", "no_checksum_local": "Prüfsumme nicht verfügbar - kann lokale Datei/en nicht laden",
"no_checksum_remote": "Prüfsumme nicht verfügbar - kann entfernte Datei/en nicht laden", "no_checksum_remote": "Prüfsumme nicht verfügbar - kann entfernte Datei/en nicht laden",
"no_devices": "Keine verwendeten Geräte",
"no_duplicates_found": "Es wurden keine Duplikate gefunden.", "no_duplicates_found": "Es wurden keine Duplikate gefunden.",
"no_exif_info_available": "Keine EXIF-Informationen vorhanden", "no_exif_info_available": "Keine EXIF-Informationen vorhanden",
"no_explore_results_message": "Lade weitere Fotos hoch, um deine Sammlung zu erkunden.", "no_explore_results_message": "Lade weitere Fotos hoch, um deine Sammlung zu erkunden.",
@@ -1437,6 +1440,7 @@
"no_results_description": "Versuche es mit einem Synonym oder einem allgemeineren Stichwort", "no_results_description": "Versuche es mit einem Synonym oder einem allgemeineren Stichwort",
"no_shared_albums_message": "Erstelle ein Album, um Fotos und Videos mit Personen in deinem Netzwerk zu teilen", "no_shared_albums_message": "Erstelle ein Album, um Fotos und Videos mit Personen in deinem Netzwerk zu teilen",
"no_uploads_in_progress": "Kein Upload in Bearbeitung", "no_uploads_in_progress": "Kein Upload in Bearbeitung",
"not_allowed": "Nicht erlaubt",
"not_available": "N/A", "not_available": "N/A",
"not_in_any_album": "In keinem Album", "not_in_any_album": "In keinem Album",
"not_selected": "Nicht ausgewählt", "not_selected": "Nicht ausgewählt",
@@ -1547,6 +1551,8 @@
"photos_count": "{count, plural, one {{count, number} Foto} other {{count, number} Fotos}}", "photos_count": "{count, plural, one {{count, number} Foto} other {{count, number} Fotos}}",
"photos_from_previous_years": "Fotos von vorherigen Jahren", "photos_from_previous_years": "Fotos von vorherigen Jahren",
"pick_a_location": "Wähle einen Ort", "pick_a_location": "Wähle einen Ort",
"pick_custom_range": "Benutzerdefinierter Zeitraum",
"pick_date_range": "Wähle einen Zeitraum",
"pin_code_changed_successfully": "PIN-Code erfolgreich geändert", "pin_code_changed_successfully": "PIN-Code erfolgreich geändert",
"pin_code_reset_successfully": "PIN-Code erfolgreich zurückgesetzt", "pin_code_reset_successfully": "PIN-Code erfolgreich zurückgesetzt",
"pin_code_setup_successfully": "PIN-Code erfolgreich festgelegt", "pin_code_setup_successfully": "PIN-Code erfolgreich festgelegt",
@@ -2027,6 +2033,7 @@
"third_party_resources": "Drittanbieter-Quellen", "third_party_resources": "Drittanbieter-Quellen",
"time": "Zeit", "time": "Zeit",
"time_based_memories": "Zeitbasierte Erinnerungen", "time_based_memories": "Zeitbasierte Erinnerungen",
"time_based_memories_duration": "Anzahl der Sekunden, die jedes Bild angezeigt wird.",
"timeline": "Zeitleiste", "timeline": "Zeitleiste",
"timezone": "Zeitzone", "timezone": "Zeitzone",
"to_archive": "Archivieren", "to_archive": "Archivieren",
-8
View File
@@ -17,7 +17,6 @@
"add_birthday": "Προσθήκη γενεθλίων", "add_birthday": "Προσθήκη γενεθλίων",
"add_endpoint": "Προσθήκη τελικού σημείου", "add_endpoint": "Προσθήκη τελικού σημείου",
"add_exclusion_pattern": "Προσθήκη μοτίβου αποκλεισμού", "add_exclusion_pattern": "Προσθήκη μοτίβου αποκλεισμού",
"add_import_path": "Προσθήκη μονοπατιού εισαγωγής",
"add_location": "Προσθήκη τοποθεσίας", "add_location": "Προσθήκη τοποθεσίας",
"add_more_users": "Προσθήκη επιπλέον χρηστών", "add_more_users": "Προσθήκη επιπλέον χρηστών",
"add_partner": "Προσθήκη συνεργάτη", "add_partner": "Προσθήκη συνεργάτη",
@@ -112,7 +111,6 @@
"jobs_failed": "{jobCount, plural, one {# απέτυχε} other {# απέτυχαν}}", "jobs_failed": "{jobCount, plural, one {# απέτυχε} other {# απέτυχαν}}",
"library_created": "Δημιουργήθηκε η βιβλιοθήκη: {library}", "library_created": "Δημιουργήθηκε η βιβλιοθήκη: {library}",
"library_deleted": "Η βιβλιοθήκη διαγράφηκε", "library_deleted": "Η βιβλιοθήκη διαγράφηκε",
"library_import_path_description": "Καθορίστε έναν φάκελο για εισαγωγή. Αυτός ο φάκελος, συμπεριλαμβανομένων των υποφακέλων του, θα σαρωθεί για εικόνες και βίντεο.",
"library_scanning": "Περιοδική Σάρωση", "library_scanning": "Περιοδική Σάρωση",
"library_scanning_description": "Ρύθμιση περιοδικής σάρωσης βιβλιοθήκης", "library_scanning_description": "Ρύθμιση περιοδικής σάρωσης βιβλιοθήκης",
"library_scanning_enable_description": "Ενεργοποίηση περιοδικής σάρωσης βιβλιοθήκης", "library_scanning_enable_description": "Ενεργοποίηση περιοδικής σάρωσης βιβλιοθήκης",
@@ -873,8 +871,6 @@
"edit_description_prompt": "Παρακαλώ επιλέξτε νέα περιγραφή:", "edit_description_prompt": "Παρακαλώ επιλέξτε νέα περιγραφή:",
"edit_exclusion_pattern": "Επεξεργασία μοτίβου αποκλεισμού", "edit_exclusion_pattern": "Επεξεργασία μοτίβου αποκλεισμού",
"edit_faces": "Επεξεργασία προσώπων", "edit_faces": "Επεξεργασία προσώπων",
"edit_import_path": "Επεξεργασία διαδρομής εισαγωγής",
"edit_import_paths": "Επεξεργασία Διαδρομών Εισαγωγής",
"edit_key": "Επεξεργασία κλειδιού", "edit_key": "Επεξεργασία κλειδιού",
"edit_link": "Επεξεργασία συνδέσμου", "edit_link": "Επεξεργασία συνδέσμου",
"edit_location": "Επεξεργασία τοποθεσίας", "edit_location": "Επεξεργασία τοποθεσίας",
@@ -946,7 +942,6 @@
"failed_to_stack_assets": "Αποτυχία στην συμπίεση των στοιχείων", "failed_to_stack_assets": "Αποτυχία στην συμπίεση των στοιχείων",
"failed_to_unstack_assets": "Αποτυχία στην αποσυμπίεση των στοιχείων", "failed_to_unstack_assets": "Αποτυχία στην αποσυμπίεση των στοιχείων",
"failed_to_update_notification_status": "Αποτυχία ενημέρωσης της κατάστασης ειδοποίησης", "failed_to_update_notification_status": "Αποτυχία ενημέρωσης της κατάστασης ειδοποίησης",
"import_path_already_exists": "Αυτή η διαδρομή εισαγωγής υπάρχει ήδη.",
"incorrect_email_or_password": "Λανθασμένο email ή κωδικός πρόσβασης", "incorrect_email_or_password": "Λανθασμένο email ή κωδικός πρόσβασης",
"paths_validation_failed": "{paths, plural, one {# διαδρομή} other {# διαδρομές}} απέτυχαν κατά την επικύρωση", "paths_validation_failed": "{paths, plural, one {# διαδρομή} other {# διαδρομές}} απέτυχαν κατά την επικύρωση",
"profile_picture_transparent_pixels": "Οι εικόνες προφίλ δεν μπορούν να έχουν διαφανή εικονοστοιχεία. Παρακαλώ μεγεθύνετε ή/και μετακινήστε την εικόνα.", "profile_picture_transparent_pixels": "Οι εικόνες προφίλ δεν μπορούν να έχουν διαφανή εικονοστοιχεία. Παρακαλώ μεγεθύνετε ή/και μετακινήστε την εικόνα.",
@@ -956,7 +951,6 @@
"unable_to_add_assets_to_shared_link": "Αδυναμία προσθήκης στοιχείου στον κοινόχρηστο σύνδεσμο", "unable_to_add_assets_to_shared_link": "Αδυναμία προσθήκης στοιχείου στον κοινόχρηστο σύνδεσμο",
"unable_to_add_comment": "Αδυναμία προσθήκης σχολίου", "unable_to_add_comment": "Αδυναμία προσθήκης σχολίου",
"unable_to_add_exclusion_pattern": "Αδυναμία προσθήκης μοτίβου αποκλεισμού", "unable_to_add_exclusion_pattern": "Αδυναμία προσθήκης μοτίβου αποκλεισμού",
"unable_to_add_import_path": "Αδυναμία προσθήκης διαδρομής εισαγωγής",
"unable_to_add_partners": "Αδυναμία προσθήκης συνεργατών", "unable_to_add_partners": "Αδυναμία προσθήκης συνεργατών",
"unable_to_add_remove_archive": "Αδυναμία {archived, select, true {αφαίρεσης του στοιχείου από το} other {προσθήκης του στοιχείου στο}} αρχείο", "unable_to_add_remove_archive": "Αδυναμία {archived, select, true {αφαίρεσης του στοιχείου από το} other {προσθήκης του στοιχείου στο}} αρχείο",
"unable_to_add_remove_favorites": "Αδυναμία {favorite, select, true {προσθήκης του στοιχείου στα} other {αφαίρεσης του στοιχείου από τα}} αγαπημένα", "unable_to_add_remove_favorites": "Αδυναμία {favorite, select, true {προσθήκης του στοιχείου στα} other {αφαίρεσης του στοιχείου από τα}} αγαπημένα",
@@ -979,12 +973,10 @@
"unable_to_delete_asset": "Αδυναμία διαγραφής στοιχείου", "unable_to_delete_asset": "Αδυναμία διαγραφής στοιχείου",
"unable_to_delete_assets": "Σφάλμα κατα τη διαγραφή στοιχείων", "unable_to_delete_assets": "Σφάλμα κατα τη διαγραφή στοιχείων",
"unable_to_delete_exclusion_pattern": "Αδυναμία διαγραφής μοτίβου αποκλεισμού", "unable_to_delete_exclusion_pattern": "Αδυναμία διαγραφής μοτίβου αποκλεισμού",
"unable_to_delete_import_path": "Αδυναμία διαγραφής διαδρομής εισαγωγής",
"unable_to_delete_shared_link": "Αδυναμία διαγραφής κοινόχρηστου συνδέσμου", "unable_to_delete_shared_link": "Αδυναμία διαγραφής κοινόχρηστου συνδέσμου",
"unable_to_delete_user": "Αδυναμία διαγραφής χρήστη", "unable_to_delete_user": "Αδυναμία διαγραφής χρήστη",
"unable_to_download_files": "Αδυναμία λήψης αρχείων", "unable_to_download_files": "Αδυναμία λήψης αρχείων",
"unable_to_edit_exclusion_pattern": "Αδυναμία επεξεργασίας μοτίβου αποκλεισμού", "unable_to_edit_exclusion_pattern": "Αδυναμία επεξεργασίας μοτίβου αποκλεισμού",
"unable_to_edit_import_path": "Αδυναμία επεξεργασίας διαδρομής εισαγωγής",
"unable_to_empty_trash": "Αδυναμία αδειάσματος του κάδου απορριμμάτων", "unable_to_empty_trash": "Αδυναμία αδειάσματος του κάδου απορριμμάτων",
"unable_to_enter_fullscreen": "Αδυναμία μετάβασης σε πλήρη οθόνη", "unable_to_enter_fullscreen": "Αδυναμία μετάβασης σε πλήρη οθόνη",
"unable_to_exit_fullscreen": "Αδυναμία εξόδου από πλήρη οθόνη", "unable_to_exit_fullscreen": "Αδυναμία εξόδου από πλήρη οθόνη",
+31 -2
View File
@@ -7,8 +7,10 @@
"action_common_update": "Update", "action_common_update": "Update",
"actions": "Actions", "actions": "Actions",
"active": "Active", "active": "Active",
"active_count": "Active: {count}",
"activity": "Activity", "activity": "Activity",
"activity_changed": "Activity is {enabled, select, true {enabled} other {disabled}}", "activity_changed": "Activity is {enabled, select, true {enabled} other {disabled}}",
"activity_count": "{count, plural, =0 {Activity} =1 {1 activity} other {{count} activities}}",
"add": "Add", "add": "Add",
"add_a_description": "Add a description", "add_a_description": "Add a description",
"add_a_location": "Add a location", "add_a_location": "Add a location",
@@ -67,6 +69,7 @@
"confirm_reprocess_all_faces": "Are you sure you want to reprocess all faces? This will also clear named people.", "confirm_reprocess_all_faces": "Are you sure you want to reprocess all faces? This will also clear named people.",
"confirm_user_password_reset": "Are you sure you want to reset {user}'s password?", "confirm_user_password_reset": "Are you sure you want to reset {user}'s password?",
"confirm_user_pin_code_reset": "Are you sure you want to reset {user}'s PIN code?", "confirm_user_pin_code_reset": "Are you sure you want to reset {user}'s PIN code?",
"copy_config_to_clipboard_description": "Copy the current system config as a JSON object to the clipboard",
"create_job": "Create job", "create_job": "Create job",
"cron_expression": "Cron expression", "cron_expression": "Cron expression",
"cron_expression_description": "Set the scanning interval using the cron format. For more information please refer to e.g. <link>Crontab Guru</link>", "cron_expression_description": "Set the scanning interval using the cron format. For more information please refer to e.g. <link>Crontab Guru</link>",
@@ -74,7 +77,8 @@
"disable_login": "Disable login", "disable_login": "Disable login",
"duplicate_detection_job_description": "Run machine learning on assets to detect similar images. Relies on Smart Search", "duplicate_detection_job_description": "Run machine learning on assets to detect similar images. Relies on Smart Search",
"exclusion_pattern_description": "Exclusion patterns lets you ignore files and folders when scanning your library. This is useful if you have folders that contain files you don't want to import, such as RAW files.", "exclusion_pattern_description": "Exclusion patterns lets you ignore files and folders when scanning your library. This is useful if you have folders that contain files you don't want to import, such as RAW files.",
"external_library_management": "External Library Management", "export_config_as_json_description": "Download the current system config as a JSON file",
"external_libraries_page_description": "Admin external library page",
"face_detection": "Face detection", "face_detection": "Face detection",
"face_detection_description": "Detect the faces in assets using machine learning. For videos, only the thumbnail is considered. \"Refresh\" (re-)processes all assets. \"Reset\" additionally clears all current face data. \"Missing\" queues assets that haven't been processed yet. Detected faces will be queued for Facial Recognition after Face Detection is complete, grouping them into existing or new people.", "face_detection_description": "Detect the faces in assets using machine learning. For videos, only the thumbnail is considered. \"Refresh\" (re-)processes all assets. \"Reset\" additionally clears all current face data. \"Missing\" queues assets that haven't been processed yet. Detected faces will be queued for Facial Recognition after Face Detection is complete, grouping them into existing or new people.",
"facial_recognition_job_description": "Group detected faces into people. This step runs after Face Detection is complete. \"Reset\" (re-)clusters all faces. \"Missing\" queues faces that don't have a person assigned.", "facial_recognition_job_description": "Group detected faces into people. This step runs after Face Detection is complete. \"Reset\" (re-)clusters all faces. \"Missing\" queues faces that don't have a person assigned.",
@@ -102,14 +106,15 @@
"image_thumbnail_description": "Small thumbnail with stripped metadata, used when viewing groups of photos like the main timeline", "image_thumbnail_description": "Small thumbnail with stripped metadata, used when viewing groups of photos like the main timeline",
"image_thumbnail_quality_description": "Thumbnail quality from 1-100. Higher is better, but produces larger files and can reduce app responsiveness.", "image_thumbnail_quality_description": "Thumbnail quality from 1-100. Higher is better, but produces larger files and can reduce app responsiveness.",
"image_thumbnail_title": "Thumbnail Settings", "image_thumbnail_title": "Thumbnail Settings",
"import_config_from_json_description": "Import system config by uploading a JSON config file",
"job_concurrency": "{job} concurrency", "job_concurrency": "{job} concurrency",
"job_created": "Job created", "job_created": "Job created",
"job_not_concurrency_safe": "This job is not concurrency-safe.", "job_not_concurrency_safe": "This job is not concurrency-safe.",
"job_settings": "Job Settings", "job_settings": "Job Settings",
"job_settings_description": "Manage job concurrency", "job_settings_description": "Manage job concurrency",
"job_status": "Job Status",
"jobs_delayed": "{jobCount, plural, other {# delayed}}", "jobs_delayed": "{jobCount, plural, other {# delayed}}",
"jobs_failed": "{jobCount, plural, other {# failed}}", "jobs_failed": "{jobCount, plural, other {# failed}}",
"jobs_over_time": "Jobs over time",
"library_created": "Created library: {library}", "library_created": "Created library: {library}",
"library_deleted": "Library deleted", "library_deleted": "Library deleted",
"library_details": "Library details", "library_details": "Library details",
@@ -182,6 +187,7 @@
"maintenance_start": "Start maintenance mode", "maintenance_start": "Start maintenance mode",
"maintenance_start_error": "Failed to start maintenance mode.", "maintenance_start_error": "Failed to start maintenance mode.",
"manage_concurrency": "Manage Concurrency", "manage_concurrency": "Manage Concurrency",
"manage_concurrency_description": "Navigate to the jobs page to manage job concurrency",
"manage_log_settings": "Manage log settings", "manage_log_settings": "Manage log settings",
"map_dark_style": "Dark style", "map_dark_style": "Dark style",
"map_enable_description": "Enable map features", "map_enable_description": "Enable map features",
@@ -271,10 +277,14 @@
"password_settings_description": "Manage password login settings", "password_settings_description": "Manage password login settings",
"paths_validated_successfully": "All paths validated successfully", "paths_validated_successfully": "All paths validated successfully",
"person_cleanup_job": "Person cleanup", "person_cleanup_job": "Person cleanup",
"queue_details": "Queue Details",
"queues": "Job Queues",
"queues_page_description": "Admin job queues page",
"quota_size_gib": "Quota Size (GiB)", "quota_size_gib": "Quota Size (GiB)",
"refreshing_all_libraries": "Refreshing all libraries", "refreshing_all_libraries": "Refreshing all libraries",
"registration": "Admin Registration", "registration": "Admin Registration",
"registration_description": "Since you are the first user on the system, you will be assigned as the Admin and are responsible for administrative tasks, and additional users will be created by you.", "registration_description": "Since you are the first user on the system, you will be assigned as the Admin and are responsible for administrative tasks, and additional users will be created by you.",
"remove_failed_jobs": "Remove failed jobs",
"require_password_change_on_login": "Require user to change password on first login", "require_password_change_on_login": "Require user to change password on first login",
"reset_settings_to_default": "Reset settings to default", "reset_settings_to_default": "Reset settings to default",
"reset_settings_to_recent_saved": "Reset settings to the recent saved settings", "reset_settings_to_recent_saved": "Reset settings to the recent saved settings",
@@ -287,8 +297,10 @@
"server_public_users_description": "All users (name and email) are listed when adding a user to shared albums. When disabled, the user list will only be available to admin users.", "server_public_users_description": "All users (name and email) are listed when adding a user to shared albums. When disabled, the user list will only be available to admin users.",
"server_settings": "Server Settings", "server_settings": "Server Settings",
"server_settings_description": "Manage server settings", "server_settings_description": "Manage server settings",
"server_stats_page_description": "Admin server statistics page",
"server_welcome_message": "Welcome message", "server_welcome_message": "Welcome message",
"server_welcome_message_description": "A message that is displayed on the login page.", "server_welcome_message_description": "A message that is displayed on the login page.",
"settings_page_description": "Admin settings page",
"sidecar_job": "Sidecar metadata", "sidecar_job": "Sidecar metadata",
"sidecar_job_description": "Discover or synchronize sidecar metadata from the filesystem", "sidecar_job_description": "Discover or synchronize sidecar metadata from the filesystem",
"slideshow_duration_description": "Number of seconds to display each image", "slideshow_duration_description": "Number of seconds to display each image",
@@ -408,6 +420,7 @@
"user_settings": "User Settings", "user_settings": "User Settings",
"user_settings_description": "Manage user settings", "user_settings_description": "Manage user settings",
"user_successfully_removed": "User {email} has been successfully removed.", "user_successfully_removed": "User {email} has been successfully removed.",
"users_page_description": "Admin users page",
"version_check_enabled_description": "Enable version check", "version_check_enabled_description": "Enable version check",
"version_check_implications": "The version check feature relies on periodic communication with github.com", "version_check_implications": "The version check feature relies on periodic communication with github.com",
"version_check_settings": "Version Check", "version_check_settings": "Version Check",
@@ -640,6 +653,7 @@
"backup_options_page_title": "Backup options", "backup_options_page_title": "Backup options",
"backup_setting_subtitle": "Manage background and foreground upload settings", "backup_setting_subtitle": "Manage background and foreground upload settings",
"backup_settings_subtitle": "Manage upload settings", "backup_settings_subtitle": "Manage upload settings",
"backup_upload_details_page_more_details": "Tap for more details",
"backward": "Backward", "backward": "Backward",
"biometric_auth_enabled": "Biometric authentication enabled", "biometric_auth_enabled": "Biometric authentication enabled",
"biometric_locked_out": "You are locked out of biometric authentication", "biometric_locked_out": "You are locked out of biometric authentication",
@@ -706,6 +720,7 @@
"check_corrupt_asset_backup_button": "Perform check", "check_corrupt_asset_backup_button": "Perform check",
"check_corrupt_asset_backup_description": "Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.", "check_corrupt_asset_backup_description": "Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.",
"check_logs": "Check Logs", "check_logs": "Check Logs",
"checksum": "Checksum",
"choose_matching_people_to_merge": "Choose matching people to merge", "choose_matching_people_to_merge": "Choose matching people to merge",
"city": "City", "city": "City",
"clear": "Clear", "clear": "Clear",
@@ -728,6 +743,7 @@
"collapse_all": "Collapse all", "collapse_all": "Collapse all",
"color": "Color", "color": "Color",
"color_theme": "Color theme", "color_theme": "Color theme",
"command": "Command",
"comment_deleted": "Comment deleted", "comment_deleted": "Comment deleted",
"comment_options": "Comment options", "comment_options": "Comment options",
"comments_and_likes": "Comments & likes", "comments_and_likes": "Comments & likes",
@@ -1092,6 +1108,7 @@
"external_network_sheet_info": "When not on the preferred Wi-Fi 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_sheet_info": "When not on the preferred Wi-Fi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom",
"face_unassigned": "Unassigned", "face_unassigned": "Unassigned",
"failed": "Failed", "failed": "Failed",
"failed_count": "Failed: {count}",
"failed_to_authenticate": "Failed to authenticate", "failed_to_authenticate": "Failed to authenticate",
"failed_to_load_assets": "Failed to load assets", "failed_to_load_assets": "Failed to load assets",
"failed_to_load_folder": "Failed to load folder", "failed_to_load_folder": "Failed to load folder",
@@ -1121,6 +1138,7 @@
"folders_feature_description": "Browsing the folder view for the photos and videos on the file system", "folders_feature_description": "Browsing the folder view for the photos and videos on the file system",
"forgot_pin_code_question": "Forgot your PIN?", "forgot_pin_code_question": "Forgot your PIN?",
"forward": "Forward", "forward": "Forward",
"full_path": "Full path: {path}",
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "This feature loads external resources from Google in order to work.", "gcast_enabled_description": "This feature loads external resources from Google in order to work.",
"general": "General", "general": "General",
@@ -1151,12 +1169,14 @@
"header_settings_header_name_input": "Header name", "header_settings_header_name_input": "Header name",
"header_settings_header_value_input": "Header value", "header_settings_header_value_input": "Header value",
"headers_settings_tile_title": "Custom proxy headers", "headers_settings_tile_title": "Custom proxy headers",
"height": "Height",
"hi_user": "Hi {name} ({email})", "hi_user": "Hi {name} ({email})",
"hide_all_people": "Hide all people", "hide_all_people": "Hide all people",
"hide_gallery": "Hide gallery", "hide_gallery": "Hide gallery",
"hide_named_person": "Hide person {name}", "hide_named_person": "Hide person {name}",
"hide_password": "Hide password", "hide_password": "Hide password",
"hide_person": "Hide person", "hide_person": "Hide person",
"hide_text_recognition": "Hide text recognition",
"hide_unnamed_people": "Hide unnamed people", "hide_unnamed_people": "Hide unnamed people",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.", "home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping", "home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
@@ -1272,6 +1292,7 @@
"local": "Local", "local": "Local",
"local_asset_cast_failed": "Unable to cast an asset that is not uploaded to the server", "local_asset_cast_failed": "Unable to cast an asset that is not uploaded to the server",
"local_assets": "Local Assets", "local_assets": "Local Assets",
"local_id": "Local ID",
"local_media_summary": "Local Media Summary", "local_media_summary": "Local Media Summary",
"local_network": "Local network", "local_network": "Local network",
"local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network", "local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network",
@@ -1450,6 +1471,7 @@
"no_favorites_message": "Add favorites to quickly find your best pictures and videos", "no_favorites_message": "Add favorites to quickly find your best pictures and videos",
"no_libraries_message": "Create an external library to view your photos and videos", "no_libraries_message": "Create an external library to view your photos and videos",
"no_local_assets_found": "No local assets found with this checksum", "no_local_assets_found": "No local assets found with this checksum",
"no_location_set": "No location set",
"no_locked_photos_message": "Photos and videos in the locked folder are hidden and won't show up as you browse or search your library.", "no_locked_photos_message": "Photos and videos in the locked folder are hidden and won't show up as you browse or search your library.",
"no_name": "No Name", "no_name": "No Name",
"no_notifications": "No notifications", "no_notifications": "No notifications",
@@ -1509,6 +1531,7 @@
"other_variables": "Other variables", "other_variables": "Other variables",
"owned": "Owned", "owned": "Owned",
"owner": "Owner", "owner": "Owner",
"page": "Page",
"partner": "Partner", "partner": "Partner",
"partner_can_access": "{partner} can access", "partner_can_access": "{partner} can access",
"partner_can_access_assets": "All your photos and videos except those in Archived and Deleted", "partner_can_access_assets": "All your photos and videos except those in Archived and Deleted",
@@ -1965,6 +1988,7 @@
"show_slideshow_transition": "Show slideshow transition", "show_slideshow_transition": "Show slideshow transition",
"show_supporter_badge": "Supporter badge", "show_supporter_badge": "Supporter badge",
"show_supporter_badge_description": "Show a supporter badge", "show_supporter_badge_description": "Show a supporter badge",
"show_text_recognition": "Show text recognition",
"show_text_search_menu": "Show text search menu", "show_text_search_menu": "Show text search menu",
"shuffle": "Shuffle", "shuffle": "Shuffle",
"sidebar": "Sidebar", "sidebar": "Sidebar",
@@ -2035,6 +2059,7 @@
"tags": "Tags", "tags": "Tags",
"tap_to_run_job": "Tap to run job", "tap_to_run_job": "Tap to run job",
"template": "Template", "template": "Template",
"text_recognition": "Text recognition",
"theme": "Theme", "theme": "Theme",
"theme_selection": "Theme selection", "theme_selection": "Theme selection",
"theme_selection_description": "Automatically set the theme to light or dark based on your browser's system preference", "theme_selection_description": "Automatically set the theme to light or dark based on your browser's system preference",
@@ -2067,6 +2092,7 @@
"to_select": "to select", "to_select": "to select",
"to_trash": "Trash", "to_trash": "Trash",
"toggle_settings": "Toggle settings", "toggle_settings": "Toggle settings",
"toggle_theme_description": "Toggle theme",
"total": "Total", "total": "Total",
"total_usage": "Total usage", "total_usage": "Total usage",
"trash": "Trash", "trash": "Trash",
@@ -2175,6 +2201,7 @@
"view_album": "View Album", "view_album": "View Album",
"view_all": "View All", "view_all": "View All",
"view_all_users": "View all users", "view_all_users": "View all users",
"view_asset_owners": "View asset owners",
"view_details": "View Details", "view_details": "View Details",
"view_in_timeline": "View in timeline", "view_in_timeline": "View in timeline",
"view_link": "View link", "view_link": "View link",
@@ -2191,10 +2218,12 @@
"viewer_unstack": "Un-Stack", "viewer_unstack": "Un-Stack",
"visibility_changed": "Visibility changed for {count, plural, one {# person} other {# people}}", "visibility_changed": "Visibility changed for {count, plural, one {# person} other {# people}}",
"waiting": "Waiting", "waiting": "Waiting",
"waiting_count": "Waiting: {count}",
"warning": "Warning", "warning": "Warning",
"week": "Week", "week": "Week",
"welcome": "Welcome", "welcome": "Welcome",
"welcome_to_immich": "Welcome to Immich", "welcome_to_immich": "Welcome to Immich",
"width": "Width",
"wifi_name": "Wi-Fi Name", "wifi_name": "Wi-Fi Name",
"workflow": "Workflow", "workflow": "Workflow",
"wrong_pin_code": "Wrong PIN code", "wrong_pin_code": "Wrong PIN code",
+1
View File
@@ -0,0 +1 @@
{}
+47 -15
View File
@@ -17,7 +17,6 @@
"add_birthday": "Agregar un cumpleaños", "add_birthday": "Agregar un cumpleaños",
"add_endpoint": "Agregar endpoint", "add_endpoint": "Agregar endpoint",
"add_exclusion_pattern": "Agregar patrón de exclusión", "add_exclusion_pattern": "Agregar patrón de exclusión",
"add_import_path": "Agregar ruta de importación",
"add_location": "Agregar ubicación", "add_location": "Agregar ubicación",
"add_more_users": "Agregar más usuarios", "add_more_users": "Agregar más usuarios",
"add_partner": "Agregar compañero", "add_partner": "Agregar compañero",
@@ -32,6 +31,7 @@
"add_to_album_toggle": "Alternar selección para el {album}", "add_to_album_toggle": "Alternar selección para el {album}",
"add_to_albums": "Incluir en álbumes", "add_to_albums": "Incluir en álbumes",
"add_to_albums_count": "Incluir en {count} álbumes", "add_to_albums_count": "Incluir en {count} álbumes",
"add_to_bottom_bar": "Añadir a",
"add_to_shared_album": "Incluir en álbum compartido", "add_to_shared_album": "Incluir en álbum compartido",
"add_upload_to_stack": "Añadir archivo y apilar", "add_upload_to_stack": "Añadir archivo y apilar",
"add_url": "Agregar URL", "add_url": "Agregar URL",
@@ -112,13 +112,17 @@
"jobs_failed": "{jobCount, plural, one {# fallido} other {# fallidos}}", "jobs_failed": "{jobCount, plural, one {# fallido} other {# fallidos}}",
"library_created": "La biblioteca ha sido creada: {library}", "library_created": "La biblioteca ha sido creada: {library}",
"library_deleted": "Biblioteca eliminada", "library_deleted": "Biblioteca eliminada",
"library_import_path_description": "Indica una carpeta para importar. Esta carpeta y sus subcarpetas serán escaneadas en busca de elementos multimedia.", "library_details": "Detalles de la biblioteca",
"library_folder_description": "Especifica una carpeta para importar. Esta carpeta, incluidas sus subcarpetas, se analizará en busca de imágenes y vídeos.",
"library_remove_exclusion_pattern_prompt": "¿Estás seguro de que quieres eliminar este patrón de exclusión?",
"library_remove_folder_prompt": "¿Estás seguro de que quieres eliminar esta carpeta de importación?",
"library_scanning": "Escaneo periódico", "library_scanning": "Escaneo periódico",
"library_scanning_description": "Configurar el escaneo periódico de la biblioteca", "library_scanning_description": "Configurar el escaneo periódico de la biblioteca",
"library_scanning_enable_description": "Activar el escaneo periódico de la biblioteca", "library_scanning_enable_description": "Activar el escaneo periódico de la biblioteca",
"library_settings": "Biblioteca externa", "library_settings": "Biblioteca externa",
"library_settings_description": "Administrar configuración biblioteca externa", "library_settings_description": "Administrar configuración biblioteca externa",
"library_tasks_description": "Buscar elementos nuevos o modificados en bibliotecas externas", "library_tasks_description": "Buscar elementos nuevos o modificados en bibliotecas externas",
"library_updated": "Biblioteca actualizada",
"library_watching_enable_description": "Vigilar las bibliotecas externas para detectar cambios en los archivos", "library_watching_enable_description": "Vigilar las bibliotecas externas para detectar cambios en los archivos",
"library_watching_settings": "Vigilancia de la biblioteca [EXPERIMENTAL]", "library_watching_settings": "Vigilancia de la biblioteca [EXPERIMENTAL]",
"library_watching_settings_description": "Vigilar automaticamente en busca de archivos modificados", "library_watching_settings_description": "Vigilar automaticamente en busca de archivos modificados",
@@ -173,6 +177,10 @@
"machine_learning_smart_search_enabled": "Habilitar búsqueda inteligente", "machine_learning_smart_search_enabled": "Habilitar búsqueda inteligente",
"machine_learning_smart_search_enabled_description": "Al desactivarlo las imágenes no se procesarán para usar la búsqueda inteligente.", "machine_learning_smart_search_enabled_description": "Al desactivarlo las imágenes no se procesarán para usar la búsqueda inteligente.",
"machine_learning_url_description": "La URL del servidor de aprendizaje automático. Si se proporciona más de una URL se intentará acceder a cada servidor sucesivamente hasta que uno responda correctamente en el orden especificado. Los servidores que no respondan serán ignorados temporalmente hasta que vuelvan a estar en línea.", "machine_learning_url_description": "La URL del servidor de aprendizaje automático. Si se proporciona más de una URL se intentará acceder a cada servidor sucesivamente hasta que uno responda correctamente en el orden especificado. Los servidores que no respondan serán ignorados temporalmente hasta que vuelvan a estar en línea.",
"maintenance_settings": "Mantenimiento",
"maintenance_settings_description": "Poner Immich en modo de mantenimiento.",
"maintenance_start": "Iniciar el modo de mantenimiento",
"maintenance_start_error": "Error al iniciar el modo de mantenimiento.",
"manage_concurrency": "Ajustes de concurrencia", "manage_concurrency": "Ajustes de concurrencia",
"manage_log_settings": "Administrar la configuración de los registros", "manage_log_settings": "Administrar la configuración de los registros",
"map_dark_style": "Estilo oscuro", "map_dark_style": "Estilo oscuro",
@@ -430,6 +438,7 @@
"age_months": "Tiempo {months, plural, one {# mes} other {# meses}}", "age_months": "Tiempo {months, plural, one {# mes} other {# meses}}",
"age_year_months": "1 año, {months, plural, one {# mes} other {# meses}}", "age_year_months": "1 año, {months, plural, one {# mes} other {# meses}}",
"age_years": "Edad {years, plural, one {# año} other {# años}}", "age_years": "Edad {years, plural, one {# año} other {# años}}",
"album": "Álbum",
"album_added": "Álbum agregado", "album_added": "Álbum agregado",
"album_added_notification_setting_description": "Reciba una notificación por correo electrónico cuando lo agreguen a un álbum compartido", "album_added_notification_setting_description": "Reciba una notificación por correo electrónico cuando lo agreguen a un álbum compartido",
"album_cover_updated": "Portada del álbum actualizada", "album_cover_updated": "Portada del álbum actualizada",
@@ -475,6 +484,7 @@
"allow_edits": "Permitir edición", "allow_edits": "Permitir edición",
"allow_public_user_to_download": "Permitir descargas a los usuarios públicos", "allow_public_user_to_download": "Permitir descargas a los usuarios públicos",
"allow_public_user_to_upload": "Permitir a los usuarios públicos subir fotos", "allow_public_user_to_upload": "Permitir a los usuarios públicos subir fotos",
"allowed": "Permitido",
"alt_text_qr_code": "Código QR", "alt_text_qr_code": "Código QR",
"anti_clockwise": "En sentido antihorario", "anti_clockwise": "En sentido antihorario",
"api_key": "Clave API", "api_key": "Clave API",
@@ -487,7 +497,7 @@
"app_bar_signout_dialog_title": "Cerrar sesión", "app_bar_signout_dialog_title": "Cerrar sesión",
"app_download_links": "Enlaces de Descarga de la Aplicación", "app_download_links": "Enlaces de Descarga de la Aplicación",
"app_settings": "Ajustes de la aplicacion", "app_settings": "Ajustes de la aplicacion",
"app_stores": "App Stores", "app_stores": "Tiendas de Aplicaciones",
"app_update_available": "Actualización de aplicación está disponible", "app_update_available": "Actualización de aplicación está disponible",
"appears_in": "Aparece en", "appears_in": "Aparece en",
"apply_count": "Aplicar ({count, number})", "apply_count": "Aplicar ({count, number})",
@@ -496,14 +506,14 @@
"archive_or_unarchive_photo": "Archivar o restaurar foto", "archive_or_unarchive_photo": "Archivar o restaurar foto",
"archive_page_no_archived_assets": "No se encontraron elementos archivados", "archive_page_no_archived_assets": "No se encontraron elementos archivados",
"archive_page_title": "Archivo ({count})", "archive_page_title": "Archivo ({count})",
"archive_size": "Tamaño del archivo", "archive_size": "Tamaño de archivo comprimido",
"archive_size_description": "Configure el tamaño del archivo para descargas (en GB)", "archive_size_description": "Configure el tamaño del archivo para descargas (en GB)",
"archived": "Archivado", "archived": "Archivado",
"archived_count": "{count, plural, one {# archivado} other {# archivados}}", "archived_count": "{count, plural, one {# archivado} other {# archivados}}",
"are_these_the_same_person": "¿Son la misma persona?", "are_these_the_same_person": "¿Son la misma persona?",
"are_you_sure_to_do_this": "¿Estas seguro de que quieres hacer esto?", "are_you_sure_to_do_this": "¿Estás seguro de que quieres hacer esto?",
"asset_action_delete_err_read_only": "No se pueden borrar el archivo(s) de solo lectura, omitiendo", "asset_action_delete_err_read_only": "No se puede borrar archivo(s) de solo lectura, omitiendo",
"asset_action_share_err_offline": "No se pudo obtener el archivo(s) sin conexión, omitiendo", "asset_action_share_err_offline": "No se pudo obtener archivo(s) sin conexión, omitiendo",
"asset_added_to_album": "Agregado al álbum", "asset_added_to_album": "Agregado al álbum",
"asset_adding_to_album": "Agregando al álbum…", "asset_adding_to_album": "Agregando al álbum…",
"asset_description_updated": "La descripción del elemento ha sido actualizada", "asset_description_updated": "La descripción del elemento ha sido actualizada",
@@ -669,7 +679,7 @@
"cannot_merge_people": "No se pueden fusionar personas", "cannot_merge_people": "No se pueden fusionar personas",
"cannot_undo_this_action": "¡No puedes deshacer esta acción!", "cannot_undo_this_action": "¡No puedes deshacer esta acción!",
"cannot_update_the_description": "No se puede actualizar la descripción", "cannot_update_the_description": "No se puede actualizar la descripción",
"cast": "Enviar contenido", "cast": "Transmitir",
"cast_description": "Configura los posibles destinos de retransmisión", "cast_description": "Configura los posibles destinos de retransmisión",
"change_date": "Cambiar fecha", "change_date": "Cambiar fecha",
"change_description": "Cambiar descripción", "change_description": "Cambiar descripción",
@@ -744,7 +754,7 @@
"control_bottom_app_bar_edit_location": "Editar ubicación", "control_bottom_app_bar_edit_location": "Editar ubicación",
"control_bottom_app_bar_edit_time": "Editar fecha y hora", "control_bottom_app_bar_edit_time": "Editar fecha y hora",
"control_bottom_app_bar_share_link": "Enlace para compartir", "control_bottom_app_bar_share_link": "Enlace para compartir",
"control_bottom_app_bar_share_to": "Enviar", "control_bottom_app_bar_share_to": "Compartir a",
"control_bottom_app_bar_trash_from_immich": "Mover a la papelera", "control_bottom_app_bar_trash_from_immich": "Mover a la papelera",
"copied_image_to_clipboard": "Imagen copiada al portapapeles.", "copied_image_to_clipboard": "Imagen copiada al portapapeles.",
"copied_to_clipboard": "¡Copiado al portapapeles!", "copied_to_clipboard": "¡Copiado al portapapeles!",
@@ -894,8 +904,6 @@
"edit_description_prompt": "Por favor selecciona una nueva descripción:", "edit_description_prompt": "Por favor selecciona una nueva descripción:",
"edit_exclusion_pattern": "Editar patrón de exclusión", "edit_exclusion_pattern": "Editar patrón de exclusión",
"edit_faces": "Editar rostros", "edit_faces": "Editar rostros",
"edit_import_path": "Editar ruta de importación",
"edit_import_paths": "Editar ruta de importación",
"edit_key": "Editar clave", "edit_key": "Editar clave",
"edit_link": "Editar enlace", "edit_link": "Editar enlace",
"edit_location": "Editar ubicación", "edit_location": "Editar ubicación",
@@ -967,8 +975,8 @@
"failed_to_stack_assets": "No se pudieron agrupar los archivos", "failed_to_stack_assets": "No se pudieron agrupar los archivos",
"failed_to_unstack_assets": "Error al desagrupar los archivos", "failed_to_unstack_assets": "Error al desagrupar los archivos",
"failed_to_update_notification_status": "Error al actualizar el estado de la notificación", "failed_to_update_notification_status": "Error al actualizar el estado de la notificación",
"import_path_already_exists": "Esta ruta de importación ya existe.",
"incorrect_email_or_password": "Contraseña o email incorrecto", "incorrect_email_or_password": "Contraseña o email incorrecto",
"library_folder_already_exists": "Esta ruta de importación ya existe.",
"paths_validation_failed": "Falló la validación en {paths, plural, one {# carpeta} other {# carpetas}}", "paths_validation_failed": "Falló la validación en {paths, plural, one {# carpeta} other {# carpetas}}",
"profile_picture_transparent_pixels": "Las imágenes de perfil no pueden tener píxeles transparentes. Por favor amplíe y/o mueva la imagen.", "profile_picture_transparent_pixels": "Las imágenes de perfil no pueden tener píxeles transparentes. Por favor amplíe y/o mueva la imagen.",
"quota_higher_than_disk_size": "Se ha establecido una cuota superior al tamaño del disco", "quota_higher_than_disk_size": "Se ha establecido una cuota superior al tamaño del disco",
@@ -977,7 +985,6 @@
"unable_to_add_assets_to_shared_link": "No se pueden agregar archivos al enlace compartido", "unable_to_add_assets_to_shared_link": "No se pueden agregar archivos al enlace compartido",
"unable_to_add_comment": "No se puede agregar comentario", "unable_to_add_comment": "No se puede agregar comentario",
"unable_to_add_exclusion_pattern": "No se puede agregar el patrón de exclusión", "unable_to_add_exclusion_pattern": "No se puede agregar el patrón de exclusión",
"unable_to_add_import_path": "No se puede agregar la ruta de importación",
"unable_to_add_partners": "No se pueden agregar compañeros", "unable_to_add_partners": "No se pueden agregar compañeros",
"unable_to_add_remove_archive": "No se puede archivar {archived, select, true {remove asset from} other {add asset to}}", "unable_to_add_remove_archive": "No se puede archivar {archived, select, true {remove asset from} other {add asset to}}",
"unable_to_add_remove_favorites": "{favorite, select, true {No se pudo agregar el elemento a los favoritos} other {No se pudo eliminar el elemento de los favoritos}}", "unable_to_add_remove_favorites": "{favorite, select, true {No se pudo agregar el elemento a los favoritos} other {No se pudo eliminar el elemento de los favoritos}}",
@@ -1000,12 +1007,10 @@
"unable_to_delete_asset": "No se puede eliminar el archivo", "unable_to_delete_asset": "No se puede eliminar el archivo",
"unable_to_delete_assets": "Error al eliminar archivos", "unable_to_delete_assets": "Error al eliminar archivos",
"unable_to_delete_exclusion_pattern": "No se puede eliminar el patrón de exclusión", "unable_to_delete_exclusion_pattern": "No se puede eliminar el patrón de exclusión",
"unable_to_delete_import_path": "No se puede eliminar la ruta de importación",
"unable_to_delete_shared_link": "No se puede eliminar el enlace compartido", "unable_to_delete_shared_link": "No se puede eliminar el enlace compartido",
"unable_to_delete_user": "No se puede eliminar el usuario", "unable_to_delete_user": "No se puede eliminar el usuario",
"unable_to_download_files": "No se pueden descargar archivos", "unable_to_download_files": "No se pueden descargar archivos",
"unable_to_edit_exclusion_pattern": "No se puede editar el patrón de exclusión", "unable_to_edit_exclusion_pattern": "No se puede editar el patrón de exclusión",
"unable_to_edit_import_path": "No se puede editar la ruta de importación",
"unable_to_empty_trash": "No se puede vaciar la papelera", "unable_to_empty_trash": "No se puede vaciar la papelera",
"unable_to_enter_fullscreen": "No se puede acceder al modo pantalla completa", "unable_to_enter_fullscreen": "No se puede acceder al modo pantalla completa",
"unable_to_exit_fullscreen": "No se puede salir del modo pantalla completa", "unable_to_exit_fullscreen": "No se puede salir del modo pantalla completa",
@@ -1056,6 +1061,7 @@
"unable_to_update_user": "No se puede actualizar el usuario", "unable_to_update_user": "No se puede actualizar el usuario",
"unable_to_upload_file": "Error al subir el archivo" "unable_to_upload_file": "Error al subir el archivo"
}, },
"exclusion_pattern": "Patrón de exclusión",
"exif": "EXIF", "exif": "EXIF",
"exif_bottom_sheet_description": "Agregar descripción…", "exif_bottom_sheet_description": "Agregar descripción…",
"exif_bottom_sheet_description_error": "Error al actualizar la descripción", "exif_bottom_sheet_description_error": "Error al actualizar la descripción",
@@ -1115,6 +1121,7 @@
"folders_feature_description": "Explorar la vista de carpetas para las fotos y los videos en el sistema de archivos", "folders_feature_description": "Explorar la vista de carpetas para las fotos y los videos en el sistema de archivos",
"forgot_pin_code_question": "¿Olvidaste tu código PIN?", "forgot_pin_code_question": "¿Olvidaste tu código PIN?",
"forward": "Avanzar", "forward": "Avanzar",
"full_path": "Ruta completa: {path}",
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Esta funcionalidad carga recursos externos desde Google para poder funcionar.", "gcast_enabled_description": "Esta funcionalidad carga recursos externos desde Google para poder funcionar.",
"general": "General", "general": "General",
@@ -1196,6 +1203,8 @@
"import_path": "Importar ruta", "import_path": "Importar ruta",
"in_albums": "En {count, plural, one {# álbum} other {# álbumes}}", "in_albums": "En {count, plural, one {# álbum} other {# álbumes}}",
"in_archive": "En archivo", "in_archive": "En archivo",
"in_year": "En {year}",
"in_year_selector": "En",
"include_archived": "Incluir archivados", "include_archived": "Incluir archivados",
"include_shared_albums": "Incluir álbumes compartidos", "include_shared_albums": "Incluir álbumes compartidos",
"include_shared_partner_assets": "Incluir elementos compartidos por compañeros", "include_shared_partner_assets": "Incluir elementos compartidos por compañeros",
@@ -1232,6 +1241,7 @@
"language_setting_description": "Selecciona tu idioma preferido", "language_setting_description": "Selecciona tu idioma preferido",
"large_files": "Archivos Grandes", "large_files": "Archivos Grandes",
"last": "Último", "last": "Último",
"last_months": "{count, plural, one {Último mes} other {Últimos # meses}}",
"last_seen": "Ultima vez visto", "last_seen": "Ultima vez visto",
"latest_version": "Última versión", "latest_version": "Última versión",
"latitude": "Latitud", "latitude": "Latitud",
@@ -1241,6 +1251,8 @@
"let_others_respond": "Permitir que otros respondan", "let_others_respond": "Permitir que otros respondan",
"level": "Nivel", "level": "Nivel",
"library": "Biblioteca", "library": "Biblioteca",
"library_add_folder": "Añadir carpeta",
"library_edit_folder": "Editar carpeta",
"library_options": "Opciones de biblioteca", "library_options": "Opciones de biblioteca",
"library_page_device_albums": "Álbumes en el dispositivo", "library_page_device_albums": "Álbumes en el dispositivo",
"library_page_new_album": "Nuevo álbum", "library_page_new_album": "Nuevo álbum",
@@ -1312,8 +1324,17 @@
"loop_videos_description": "Habilite la reproducción automática de un video en el visor de detalles.", "loop_videos_description": "Habilite la reproducción automática de un video en el visor de detalles.",
"main_branch_warning": "Está utilizando una versión de desarrollo; ¡le recomendamos encarecidamente que utilice una versión de lanzamiento!", "main_branch_warning": "Está utilizando una versión de desarrollo; ¡le recomendamos encarecidamente que utilice una versión de lanzamiento!",
"main_menu": "Menú principal", "main_menu": "Menú principal",
"maintenance_description": "Immich se ha puesto en <link>modo de mantenimiento</link>.",
"maintenance_end": "Finalizar el modo de mantenimiento",
"maintenance_end_error": "Error al finalizar el modo de mantenimiento.",
"maintenance_logged_in_as": "Sesión iniciada actualmente como {user}",
"maintenance_title": "No disponible temporalmente",
"make": "Marca", "make": "Marca",
"manage_geolocation": "Administrar ubicación", "manage_geolocation": "Administrar ubicación",
"manage_media_access_rationale": "Este permiso se requiere para mover recursos a la papelera correctamente, así como para restaurarlos desde la misma.",
"manage_media_access_settings": "Abrir configuración",
"manage_media_access_subtitle": "Permitir a la app Immich gestionar y mover archivos multimedia.",
"manage_media_access_title": "Acceso a gestión de archivos multimedia",
"manage_shared_links": "Administrar enlaces compartidos", "manage_shared_links": "Administrar enlaces compartidos",
"manage_sharing_with_partners": "Gestionar el uso compartido con compañeros", "manage_sharing_with_partners": "Gestionar el uso compartido con compañeros",
"manage_the_app_settings": "Administrar la configuración de la aplicación", "manage_the_app_settings": "Administrar la configuración de la aplicación",
@@ -1377,6 +1398,7 @@
"more": "Mas", "more": "Mas",
"move": "Mover", "move": "Mover",
"move_off_locked_folder": "Sacar de la carpeta protegida", "move_off_locked_folder": "Sacar de la carpeta protegida",
"move_to": "Mover a",
"move_to_lock_folder_action_prompt": "{count} agregado(s) a la carpeta protegida", "move_to_lock_folder_action_prompt": "{count} agregado(s) a la carpeta protegida",
"move_to_locked_folder": "Mover a la carpeta protegida", "move_to_locked_folder": "Mover a la carpeta protegida",
"move_to_locked_folder_confirmation": "Estas fotos y vídeos se eliminarán de todos los álbumes; solo se podrán ver en la carpeta protegida", "move_to_locked_folder_confirmation": "Estas fotos y vídeos se eliminarán de todos los álbumes; solo se podrán ver en la carpeta protegida",
@@ -1406,6 +1428,7 @@
"new_pin_code": "Nuevo PIN", "new_pin_code": "Nuevo PIN",
"new_pin_code_subtitle": "Esta es la primera vez que accedes a la carpeta protegida. Crea un código PIN seguro para acceder a esta página", "new_pin_code_subtitle": "Esta es la primera vez que accedes a la carpeta protegida. Crea un código PIN seguro para acceder a esta página",
"new_timeline": "Nueva Línea de tiempo", "new_timeline": "Nueva Línea de tiempo",
"new_update": "Nueva actualización",
"new_user_created": "Nuevo usuario creado", "new_user_created": "Nuevo usuario creado",
"new_version_available": "NUEVA VERSIÓN DISPONIBLE", "new_version_available": "NUEVA VERSIÓN DISPONIBLE",
"newest_first": "El más reciente primero", "newest_first": "El más reciente primero",
@@ -1421,12 +1444,14 @@
"no_cast_devices_found": "No se encontraron dispositivos de transmisión", "no_cast_devices_found": "No se encontraron dispositivos de transmisión",
"no_checksum_local": "Suma de verificación no disponible. No se pueden obtener los elementos locales", "no_checksum_local": "Suma de verificación no disponible. No se pueden obtener los elementos locales",
"no_checksum_remote": "Suma de verificación no disponible. No se puede obtener el elemento remoto", "no_checksum_remote": "Suma de verificación no disponible. No se puede obtener el elemento remoto",
"no_devices": "Dispositivos no autorizados",
"no_duplicates_found": "No se encontraron duplicados.", "no_duplicates_found": "No se encontraron duplicados.",
"no_exif_info_available": "No hay información exif disponible", "no_exif_info_available": "No hay información exif disponible",
"no_explore_results_message": "Sube más fotos para explorar tu colección.", "no_explore_results_message": "Sube más fotos para explorar tu colección.",
"no_favorites_message": "Agregue favoritos para encontrar rápidamente sus mejores fotos y videos", "no_favorites_message": "Agregue favoritos para encontrar rápidamente sus mejores fotos y videos",
"no_libraries_message": "Crea una biblioteca externa para ver tus fotos y vídeos", "no_libraries_message": "Crea una biblioteca externa para ver tus fotos y vídeos",
"no_local_assets_found": "No se encontraron elementos locales con esta suma de comprobación", "no_local_assets_found": "No se encontraron elementos locales con esta suma de comprobación",
"no_location_set": "No se ha establecido ninguna ubicación",
"no_locked_photos_message": "Las fotos y los vídeos de la carpeta protegida se mantienen ocultos; no aparecerán cuando veas o busques elementos en tu biblioteca.", "no_locked_photos_message": "Las fotos y los vídeos de la carpeta protegida se mantienen ocultos; no aparecerán cuando veas o busques elementos en tu biblioteca.",
"no_name": "Sin nombre", "no_name": "Sin nombre",
"no_notifications": "Ninguna notificación", "no_notifications": "Ninguna notificación",
@@ -1437,6 +1462,7 @@
"no_results_description": "Pruebe con un sinónimo o una palabra clave más general", "no_results_description": "Pruebe con un sinónimo o una palabra clave más general",
"no_shared_albums_message": "Crea un álbum para compartir fotos y vídeos con personas de tu red", "no_shared_albums_message": "Crea un álbum para compartir fotos y vídeos con personas de tu red",
"no_uploads_in_progress": "No hay cargas en progreso", "no_uploads_in_progress": "No hay cargas en progreso",
"not_allowed": "No permitido",
"not_available": "N/D", "not_available": "N/D",
"not_in_any_album": "Sin álbum", "not_in_any_album": "Sin álbum",
"not_selected": "No seleccionado", "not_selected": "No seleccionado",
@@ -1547,6 +1573,8 @@
"photos_count": "{count, plural, one {{count, number} Foto} other {{count, number} Fotos}}", "photos_count": "{count, plural, one {{count, number} Foto} other {{count, number} Fotos}}",
"photos_from_previous_years": "Fotos de años anteriores", "photos_from_previous_years": "Fotos de años anteriores",
"pick_a_location": "Elige una ubicación", "pick_a_location": "Elige una ubicación",
"pick_custom_range": "Rango personalizado",
"pick_date_range": "Seleccione un rango de fechas",
"pin_code_changed_successfully": "PIN cambiado exitosamente", "pin_code_changed_successfully": "PIN cambiado exitosamente",
"pin_code_reset_successfully": "PIN restablecido exitosamente", "pin_code_reset_successfully": "PIN restablecido exitosamente",
"pin_code_setup_successfully": "PIN establecido exitosamente", "pin_code_setup_successfully": "PIN establecido exitosamente",
@@ -1814,6 +1842,8 @@
"server_offline": "Servidor desconectado", "server_offline": "Servidor desconectado",
"server_online": "Servidor en línea", "server_online": "Servidor en línea",
"server_privacy": "Privacidad del Servidor", "server_privacy": "Privacidad del Servidor",
"server_restarting_description": "Esta página se actualizará en breve.",
"server_restarting_title": "El servidor se está reiniciando",
"server_stats": "Estadísticas del servidor", "server_stats": "Estadísticas del servidor",
"server_update_available": "Actualización de servidor disponible", "server_update_available": "Actualización de servidor disponible",
"server_version": "Versión del servidor", "server_version": "Versión del servidor",
@@ -2027,6 +2057,7 @@
"third_party_resources": "Recursos de terceros", "third_party_resources": "Recursos de terceros",
"time": "Tiempo", "time": "Tiempo",
"time_based_memories": "Recuerdos basados en tiempo", "time_based_memories": "Recuerdos basados en tiempo",
"time_based_memories_duration": "Número de segundos que se mostrará cada imagen.",
"timeline": "Cronología", "timeline": "Cronología",
"timezone": "Zona horaria", "timezone": "Zona horaria",
"to_archive": "Archivar", "to_archive": "Archivar",
@@ -2167,6 +2198,7 @@
"welcome": "Bienvenido", "welcome": "Bienvenido",
"welcome_to_immich": "Bienvenido a Immich", "welcome_to_immich": "Bienvenido a Immich",
"wifi_name": "Nombre Wi-Fi", "wifi_name": "Nombre Wi-Fi",
"workflow": "Flujo de trabajo",
"wrong_pin_code": "Código PIN incorrecto", "wrong_pin_code": "Código PIN incorrecto",
"year": "Año", "year": "Año",
"years_ago": "Hace {years, plural, one {# año} other {# años}}", "years_ago": "Hace {years, plural, one {# año} other {# años}}",
+44 -9
View File
@@ -17,7 +17,6 @@
"add_birthday": "Lisa sünnipäev", "add_birthday": "Lisa sünnipäev",
"add_endpoint": "Lisa lõpp-punkt", "add_endpoint": "Lisa lõpp-punkt",
"add_exclusion_pattern": "Lisa välistamismuster", "add_exclusion_pattern": "Lisa välistamismuster",
"add_import_path": "Lisa imporditee",
"add_location": "Lisa asukoht", "add_location": "Lisa asukoht",
"add_more_users": "Lisa rohkem kasutajaid", "add_more_users": "Lisa rohkem kasutajaid",
"add_partner": "Lisa partner", "add_partner": "Lisa partner",
@@ -32,6 +31,7 @@
"add_to_album_toggle": "Muuda albumi {album} valikut", "add_to_album_toggle": "Muuda albumi {album} valikut",
"add_to_albums": "Lisa albumitesse", "add_to_albums": "Lisa albumitesse",
"add_to_albums_count": "Lisa albumitesse ({count})", "add_to_albums_count": "Lisa albumitesse ({count})",
"add_to_bottom_bar": "Lisa",
"add_to_shared_album": "Lisa jagatud albumisse", "add_to_shared_album": "Lisa jagatud albumisse",
"add_upload_to_stack": "Virnasta üleslaaditud üksus", "add_upload_to_stack": "Virnasta üleslaaditud üksus",
"add_url": "Lisa URL", "add_url": "Lisa URL",
@@ -112,13 +112,17 @@
"jobs_failed": "{jobCount, plural, other {# ebaõnnestus}}", "jobs_failed": "{jobCount, plural, other {# ebaõnnestus}}",
"library_created": "Lisatud kogu: {library}", "library_created": "Lisatud kogu: {library}",
"library_deleted": "Kogu kustutatud", "library_deleted": "Kogu kustutatud",
"library_import_path_description": "Määra kaust, mida importida. Sellest kaustast ning alamkaustadest otsitakse pilte ja videosid.", "library_details": "Kogu detailid",
"library_folder_description": "Vali kaust, mida importida. Sellest kaustast ja alamkaustadest otsitakse pilte ja videosid.",
"library_remove_exclusion_pattern_prompt": "Kas oled kindel, et soovid selle välistamismustri eemaldada?",
"library_remove_folder_prompt": "Kas oled kindel, et soovid selle impordikausta eemaldada?",
"library_scanning": "Perioodiline skaneerimine", "library_scanning": "Perioodiline skaneerimine",
"library_scanning_description": "Seadista kogu perioodiline skaneerimine", "library_scanning_description": "Seadista kogu perioodiline skaneerimine",
"library_scanning_enable_description": "Luba kogu perioodiline skaneerimine", "library_scanning_enable_description": "Luba kogu perioodiline skaneerimine",
"library_settings": "Väline kogu", "library_settings": "Väline kogu",
"library_settings_description": "Halda välise kogu seadeid", "library_settings_description": "Halda välise kogu seadeid",
"library_tasks_description": "Otsi välistest kogudest uusi ja muutunud üksuseid", "library_tasks_description": "Otsi välistest kogudest uusi ja muutunud üksuseid",
"library_updated": "Kogu uuendatud",
"library_watching_enable_description": "Jälgi välises kogus failide muudatusi", "library_watching_enable_description": "Jälgi välises kogus failide muudatusi",
"library_watching_settings": "Kogu jälgimine [EKSPERIMENTAALNE]", "library_watching_settings": "Kogu jälgimine [EKSPERIMENTAALNE]",
"library_watching_settings_description": "Jälgi automaatselt muutunud faile", "library_watching_settings_description": "Jälgi automaatselt muutunud faile",
@@ -173,6 +177,10 @@
"machine_learning_smart_search_enabled": "Luba nutiotsing", "machine_learning_smart_search_enabled": "Luba nutiotsing",
"machine_learning_smart_search_enabled_description": "Kui keelatud, siis ei kodeerita pilte nutiotsingu jaoks.", "machine_learning_smart_search_enabled_description": "Kui keelatud, siis ei kodeerita pilte nutiotsingu jaoks.",
"machine_learning_url_description": "Masinõppe serveri URL. Kui ette on antud rohkem kui üks URL, proovitakse neid järjest ükshaaval, kuni üks edukalt vastab. Servereid, mis ei vasta, ignoreeritakse ajutiselt, kuni ühendus taastub.", "machine_learning_url_description": "Masinõppe serveri URL. Kui ette on antud rohkem kui üks URL, proovitakse neid järjest ükshaaval, kuni üks edukalt vastab. Servereid, mis ei vasta, ignoreeritakse ajutiselt, kuni ühendus taastub.",
"maintenance_settings": "Hooldus",
"maintenance_settings_description": "Pane Immich hooldusrežiimi.",
"maintenance_start": "Käivita hooldusrežiim",
"maintenance_start_error": "Hooldusrežiimi käivitamine ebaõnnestus.",
"manage_concurrency": "Halda samaaegsust", "manage_concurrency": "Halda samaaegsust",
"manage_log_settings": "Halda logi seadeid", "manage_log_settings": "Halda logi seadeid",
"map_dark_style": "Tume stiil", "map_dark_style": "Tume stiil",
@@ -430,6 +438,7 @@
"age_months": "Vanus {months, plural, one {# kuu} other {# kuud}}", "age_months": "Vanus {months, plural, one {# kuu} other {# kuud}}",
"age_year_months": "Vanus 1 aasta, {months, plural, one {# kuu} other {# kuud}}", "age_year_months": "Vanus 1 aasta, {months, plural, one {# kuu} other {# kuud}}",
"age_years": "{years, plural, other {Vanus #}}", "age_years": "{years, plural, other {Vanus #}}",
"album": "Album",
"album_added": "Album lisatud", "album_added": "Album lisatud",
"album_added_notification_setting_description": "Saa teavitus e-posti teel, kui sind lisatakse jagatud albumisse", "album_added_notification_setting_description": "Saa teavitus e-posti teel, kui sind lisatakse jagatud albumisse",
"album_cover_updated": "Albumi kaanepilt muudetud", "album_cover_updated": "Albumi kaanepilt muudetud",
@@ -475,6 +484,7 @@
"allow_edits": "Luba muutmine", "allow_edits": "Luba muutmine",
"allow_public_user_to_download": "Luba avalikul kasutajal alla laadida", "allow_public_user_to_download": "Luba avalikul kasutajal alla laadida",
"allow_public_user_to_upload": "Luba avalikul kasutajal üles laadida", "allow_public_user_to_upload": "Luba avalikul kasutajal üles laadida",
"allowed": "Lubatud",
"alt_text_qr_code": "QR kood", "alt_text_qr_code": "QR kood",
"anti_clockwise": "Vastupäeva", "anti_clockwise": "Vastupäeva",
"api_key": "API võti", "api_key": "API võti",
@@ -894,8 +904,6 @@
"edit_description_prompt": "Palun vali uus kirjeldus:", "edit_description_prompt": "Palun vali uus kirjeldus:",
"edit_exclusion_pattern": "Muuda välistamismustrit", "edit_exclusion_pattern": "Muuda välistamismustrit",
"edit_faces": "Muuda nägusid", "edit_faces": "Muuda nägusid",
"edit_import_path": "Muuda imporditeed",
"edit_import_paths": "Muuda imporditeid",
"edit_key": "Muuda võtit", "edit_key": "Muuda võtit",
"edit_link": "Muuda linki", "edit_link": "Muuda linki",
"edit_location": "Muuda asukohta", "edit_location": "Muuda asukohta",
@@ -967,8 +975,8 @@
"failed_to_stack_assets": "Üksuste virnastamine ebaõnnestus", "failed_to_stack_assets": "Üksuste virnastamine ebaõnnestus",
"failed_to_unstack_assets": "Üksuste eraldamine ebaõnnestus", "failed_to_unstack_assets": "Üksuste eraldamine ebaõnnestus",
"failed_to_update_notification_status": "Teavituste seisundi uuendamine ebaõnnestus", "failed_to_update_notification_status": "Teavituste seisundi uuendamine ebaõnnestus",
"import_path_already_exists": "See imporditee on juba olemas.",
"incorrect_email_or_password": "Vale e-posti aadress või parool", "incorrect_email_or_password": "Vale e-posti aadress või parool",
"library_folder_already_exists": "See imporditee on juba olemas.",
"paths_validation_failed": "{paths, plural, one {# tee} other {# teed}} ei valideerunud", "paths_validation_failed": "{paths, plural, one {# tee} other {# teed}} ei valideerunud",
"profile_picture_transparent_pixels": "Profiilipildis ei tohi olla läbipaistvaid piksleid. Palun suumi sisse ja/või liiguta pilti.", "profile_picture_transparent_pixels": "Profiilipildis ei tohi olla läbipaistvaid piksleid. Palun suumi sisse ja/või liiguta pilti.",
"quota_higher_than_disk_size": "Määratud kvoot on suurem kui kettamaht", "quota_higher_than_disk_size": "Määratud kvoot on suurem kui kettamaht",
@@ -977,7 +985,6 @@
"unable_to_add_assets_to_shared_link": "Üksuste jagatud lingile lisamine ebaõnnestus", "unable_to_add_assets_to_shared_link": "Üksuste jagatud lingile lisamine ebaõnnestus",
"unable_to_add_comment": "Kommentaari lisamine ebaõnnestus", "unable_to_add_comment": "Kommentaari lisamine ebaõnnestus",
"unable_to_add_exclusion_pattern": "Välistamismustri lisamine ebaõnnestus", "unable_to_add_exclusion_pattern": "Välistamismustri lisamine ebaõnnestus",
"unable_to_add_import_path": "Imporditee lisamine ebaõnnestus",
"unable_to_add_partners": "Partnerite lisamine ebaõnnestus", "unable_to_add_partners": "Partnerite lisamine ebaõnnestus",
"unable_to_add_remove_archive": "{archived, select, true {Üksuse arhiivist taastamine} other {Üksuse arhiveerimine}} ebaõnnestus", "unable_to_add_remove_archive": "{archived, select, true {Üksuse arhiivist taastamine} other {Üksuse arhiveerimine}} ebaõnnestus",
"unable_to_add_remove_favorites": "Üksuse {favorite, select, true {lemmikuks lisamine} other {lemmikutest eemaldamine}} ebaõnnestus", "unable_to_add_remove_favorites": "Üksuse {favorite, select, true {lemmikuks lisamine} other {lemmikutest eemaldamine}} ebaõnnestus",
@@ -1000,12 +1007,10 @@
"unable_to_delete_asset": "Üksuse kustutamine ebaõnnestus", "unable_to_delete_asset": "Üksuse kustutamine ebaõnnestus",
"unable_to_delete_assets": "Viga üksuste kustutamisel", "unable_to_delete_assets": "Viga üksuste kustutamisel",
"unable_to_delete_exclusion_pattern": "Välistamismustri kustutamine ebaõnnestus", "unable_to_delete_exclusion_pattern": "Välistamismustri kustutamine ebaõnnestus",
"unable_to_delete_import_path": "Imporditee kustutamine ebaõnnestus",
"unable_to_delete_shared_link": "Jagatud lingi kustutamine ebaõnnestus", "unable_to_delete_shared_link": "Jagatud lingi kustutamine ebaõnnestus",
"unable_to_delete_user": "Kasutaja kustutamine ebaõnnestus", "unable_to_delete_user": "Kasutaja kustutamine ebaõnnestus",
"unable_to_download_files": "Failide allalaadimine ebaõnnestus", "unable_to_download_files": "Failide allalaadimine ebaõnnestus",
"unable_to_edit_exclusion_pattern": "Välistamismustri muutmine ebaõnnestus", "unable_to_edit_exclusion_pattern": "Välistamismustri muutmine ebaõnnestus",
"unable_to_edit_import_path": "Imporditee muutmine ebaõnnestus",
"unable_to_empty_trash": "Prügikasti tühjendamine ebaõnnestus", "unable_to_empty_trash": "Prügikasti tühjendamine ebaõnnestus",
"unable_to_enter_fullscreen": "Täisekraanile lülitamine ebaõnnestus", "unable_to_enter_fullscreen": "Täisekraanile lülitamine ebaõnnestus",
"unable_to_exit_fullscreen": "Täisekraanilt väljumine ebaõnnestus", "unable_to_exit_fullscreen": "Täisekraanilt väljumine ebaõnnestus",
@@ -1056,6 +1061,7 @@
"unable_to_update_user": "Kasutaja muutmine ebaõnnestus", "unable_to_update_user": "Kasutaja muutmine ebaõnnestus",
"unable_to_upload_file": "Faili üleslaadimine ebaõnnestus" "unable_to_upload_file": "Faili üleslaadimine ebaõnnestus"
}, },
"exclusion_pattern": "Välistamismuster",
"exif": "Exif", "exif": "Exif",
"exif_bottom_sheet_description": "Lisa kirjeldus...", "exif_bottom_sheet_description": "Lisa kirjeldus...",
"exif_bottom_sheet_description_error": "Viga kirjelduse muutmisel", "exif_bottom_sheet_description_error": "Viga kirjelduse muutmisel",
@@ -1115,6 +1121,7 @@
"folders_feature_description": "Kaustavaate abil failisüsteemis olevate fotode ja videote sirvimine", "folders_feature_description": "Kaustavaate abil failisüsteemis olevate fotode ja videote sirvimine",
"forgot_pin_code_question": "Unustasid oma PIN-koodi?", "forgot_pin_code_question": "Unustasid oma PIN-koodi?",
"forward": "Edasi", "forward": "Edasi",
"full_path": "Täielik tee: {path}",
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "See funktsionaalsus laadib töötamiseks Google'st väliseid ressursse.", "gcast_enabled_description": "See funktsionaalsus laadib töötamiseks Google'st väliseid ressursse.",
"general": "Üldine", "general": "Üldine",
@@ -1151,6 +1158,7 @@
"hide_named_person": "Peida isik {name}", "hide_named_person": "Peida isik {name}",
"hide_password": "Peida parool", "hide_password": "Peida parool",
"hide_person": "Peida isik", "hide_person": "Peida isik",
"hide_text_recognition": "Peida tekstituvastus",
"hide_unnamed_people": "Peida nimetud isikud", "hide_unnamed_people": "Peida nimetud isikud",
"home_page_add_to_album_conflicts": "{added} üksust lisati albumisse {album}. {failed} üksust oli juba albumis.", "home_page_add_to_album_conflicts": "{added} üksust lisati albumisse {album}. {failed} üksust oli juba albumis.",
"home_page_add_to_album_err_local": "Lokaalseid üksuseid ei saa veel albumisse lisada, jäetakse vahele", "home_page_add_to_album_err_local": "Lokaalseid üksuseid ei saa veel albumisse lisada, jäetakse vahele",
@@ -1196,6 +1204,8 @@
"import_path": "Imporditee", "import_path": "Imporditee",
"in_albums": "{count, plural, one {# albumis} other {# albumis}}", "in_albums": "{count, plural, one {# albumis} other {# albumis}}",
"in_archive": "Arhiivis", "in_archive": "Arhiivis",
"in_year": "Aastal {year}",
"in_year_selector": "Aastal",
"include_archived": "Kaasa arhiveeritud", "include_archived": "Kaasa arhiveeritud",
"include_shared_albums": "Kaasa jagatud albumid", "include_shared_albums": "Kaasa jagatud albumid",
"include_shared_partner_assets": "Kaasa partneri jagatud üksused", "include_shared_partner_assets": "Kaasa partneri jagatud üksused",
@@ -1232,6 +1242,7 @@
"language_setting_description": "Vali oma eelistatud keel", "language_setting_description": "Vali oma eelistatud keel",
"large_files": "Suured failid", "large_files": "Suured failid",
"last": "Viimane", "last": "Viimane",
"last_months": "{count, plural, one {Eelmine kuu} other {Eelmised # kuud}}",
"last_seen": "Viimati nähtud", "last_seen": "Viimati nähtud",
"latest_version": "Uusim versioon", "latest_version": "Uusim versioon",
"latitude": "Laiuskraad", "latitude": "Laiuskraad",
@@ -1241,6 +1252,8 @@
"let_others_respond": "Luba teistel vastata", "let_others_respond": "Luba teistel vastata",
"level": "Tase", "level": "Tase",
"library": "Kogu", "library": "Kogu",
"library_add_folder": "Lisa kaust",
"library_edit_folder": "Muuda kausta",
"library_options": "Kogu seaded", "library_options": "Kogu seaded",
"library_page_device_albums": "Albumid seadmes", "library_page_device_albums": "Albumid seadmes",
"library_page_new_album": "Uus album", "library_page_new_album": "Uus album",
@@ -1312,8 +1325,17 @@
"loop_videos_description": "Lülita sisse, et detailvaates videot automaatselt taasesitada.", "loop_videos_description": "Lülita sisse, et detailvaates videot automaatselt taasesitada.",
"main_branch_warning": "Sa kasutad arendusversiooni; soovitame tungivalt kasutada väljalaskeversiooni!", "main_branch_warning": "Sa kasutad arendusversiooni; soovitame tungivalt kasutada väljalaskeversiooni!",
"main_menu": "Peamenüü", "main_menu": "Peamenüü",
"maintenance_description": "Immich on <link>hooldusrežiimis</link>.",
"maintenance_end": "Lõpeta hooldusrežiim",
"maintenance_end_error": "Hooldusrežiimi lõpetamine ebaõnnestus.",
"maintenance_logged_in_as": "Logitud sisse kasutajana {user}",
"maintenance_title": "Ajutiselt mittesaadaval",
"make": "Mark", "make": "Mark",
"manage_geolocation": "Halda asukohta", "manage_geolocation": "Halda asukohta",
"manage_media_access_rationale": "Seda luba on vaja üksuste prügikasti liigutamiseks ja sealt taastamiseks.",
"manage_media_access_settings": "Ava seaded",
"manage_media_access_subtitle": "Luba Immich'i rakendusel multimeediafaile hallata ja liigutada.",
"manage_media_access_title": "Üksuste haldamise ligipääs",
"manage_shared_links": "Halda jagatud linke", "manage_shared_links": "Halda jagatud linke",
"manage_sharing_with_partners": "Halda partneritega jagamist", "manage_sharing_with_partners": "Halda partneritega jagamist",
"manage_the_app_settings": "Halda rakenduse seadeid", "manage_the_app_settings": "Halda rakenduse seadeid",
@@ -1377,6 +1399,7 @@
"more": "Rohkem", "more": "Rohkem",
"move": "Liiguta", "move": "Liiguta",
"move_off_locked_folder": "Liiguta lukustatud kaustast välja", "move_off_locked_folder": "Liiguta lukustatud kaustast välja",
"move_to": "Liiguta",
"move_to_lock_folder_action_prompt": "{count} lisatud lukustatud kausta", "move_to_lock_folder_action_prompt": "{count} lisatud lukustatud kausta",
"move_to_locked_folder": "Liiguta lukustatud kausta", "move_to_locked_folder": "Liiguta lukustatud kausta",
"move_to_locked_folder_confirmation": "Need fotod ja videod eemaldatakse kõigist albumitest ning nad on nähtavad ainult lukustatud kaustas", "move_to_locked_folder_confirmation": "Need fotod ja videod eemaldatakse kõigist albumitest ning nad on nähtavad ainult lukustatud kaustas",
@@ -1406,6 +1429,7 @@
"new_pin_code": "Uus PIN-kood", "new_pin_code": "Uus PIN-kood",
"new_pin_code_subtitle": "See on sul esimene kord lukustatud kausta kasutada. Turvaliseks ligipääsuks loo PIN-kood", "new_pin_code_subtitle": "See on sul esimene kord lukustatud kausta kasutada. Turvaliseks ligipääsuks loo PIN-kood",
"new_timeline": "Uus ajajoon", "new_timeline": "Uus ajajoon",
"new_update": "Uus uuendus",
"new_user_created": "Uus kasutaja lisatud", "new_user_created": "Uus kasutaja lisatud",
"new_version_available": "UUS VERSIOON SAADAVAL", "new_version_available": "UUS VERSIOON SAADAVAL",
"newest_first": "Uuemad eespool", "newest_first": "Uuemad eespool",
@@ -1421,12 +1445,14 @@
"no_cast_devices_found": "Edastamise seadmeid ei leitud", "no_cast_devices_found": "Edastamise seadmeid ei leitud",
"no_checksum_local": "Kontrollsumma pole saadaval - lokaalse üksuse pärimine ebaõnnestus", "no_checksum_local": "Kontrollsumma pole saadaval - lokaalse üksuse pärimine ebaõnnestus",
"no_checksum_remote": "Kontrollsumma pole saadaval - kaugüksuse pärimine ebaõnnestus", "no_checksum_remote": "Kontrollsumma pole saadaval - kaugüksuse pärimine ebaõnnestus",
"no_devices": "Autoriseeritud seadmeid pole",
"no_duplicates_found": "Ühtegi duplikaati ei leitud.", "no_duplicates_found": "Ühtegi duplikaati ei leitud.",
"no_exif_info_available": "Exif info pole saadaval", "no_exif_info_available": "Exif info pole saadaval",
"no_explore_results_message": "Oma kogu avastamiseks laadi üles rohkem fotosid.", "no_explore_results_message": "Oma kogu avastamiseks laadi üles rohkem fotosid.",
"no_favorites_message": "Lisa lemmikud, et oma parimaid fotosid ja videosid kiiresti leida", "no_favorites_message": "Lisa lemmikud, et oma parimaid fotosid ja videosid kiiresti leida",
"no_libraries_message": "Lisa väline kogu oma fotode ja videote vaatamiseks", "no_libraries_message": "Lisa väline kogu oma fotode ja videote vaatamiseks",
"no_local_assets_found": "Selle kontrollsummaga lokaalseid üksuseid ei leitud", "no_local_assets_found": "Selle kontrollsummaga lokaalseid üksuseid ei leitud",
"no_location_set": "Asukoht pole määratud",
"no_locked_photos_message": "Lukustatud kaustas olevad fotod ja videod on peidetud ning need pole kogu sirvimisel ja otsimisel nähtavad.", "no_locked_photos_message": "Lukustatud kaustas olevad fotod ja videod on peidetud ning need pole kogu sirvimisel ja otsimisel nähtavad.",
"no_name": "Nimetu", "no_name": "Nimetu",
"no_notifications": "Teavitusi pole", "no_notifications": "Teavitusi pole",
@@ -1437,6 +1463,7 @@
"no_results_description": "Proovi sünonüümi või üldisemat märksõna", "no_results_description": "Proovi sünonüümi või üldisemat märksõna",
"no_shared_albums_message": "Lisa album, et fotosid ja videosid teistega jagada", "no_shared_albums_message": "Lisa album, et fotosid ja videosid teistega jagada",
"no_uploads_in_progress": "Üleslaadimisi käimas ei ole", "no_uploads_in_progress": "Üleslaadimisi käimas ei ole",
"not_allowed": "Keelatud",
"not_available": "Pole saadaval", "not_available": "Pole saadaval",
"not_in_any_album": "Pole üheski albumis", "not_in_any_album": "Pole üheski albumis",
"not_selected": "Ei ole valitud", "not_selected": "Ei ole valitud",
@@ -1547,6 +1574,8 @@
"photos_count": "{count, plural, one {{count, number} foto} other {{count, number} fotot}}", "photos_count": "{count, plural, one {{count, number} foto} other {{count, number} fotot}}",
"photos_from_previous_years": "Fotod varasematest aastatest", "photos_from_previous_years": "Fotod varasematest aastatest",
"pick_a_location": "Vali asukoht", "pick_a_location": "Vali asukoht",
"pick_custom_range": "Kohandatud vahemik",
"pick_date_range": "Vali kuupäevavahemik",
"pin_code_changed_successfully": "PIN-kood edukalt muudetud", "pin_code_changed_successfully": "PIN-kood edukalt muudetud",
"pin_code_reset_successfully": "PIN-kood edukalt lähtestatud", "pin_code_reset_successfully": "PIN-kood edukalt lähtestatud",
"pin_code_setup_successfully": "PIN-kood edukalt seadistatud", "pin_code_setup_successfully": "PIN-kood edukalt seadistatud",
@@ -1814,6 +1843,8 @@
"server_offline": "Serveriga ühendus puudub", "server_offline": "Serveriga ühendus puudub",
"server_online": "Server ühendatud", "server_online": "Server ühendatud",
"server_privacy": "Serveri privaatsus", "server_privacy": "Serveri privaatsus",
"server_restarting_description": "Leht värskendatakse hetkeliselt.",
"server_restarting_title": "Server taaskäivitub",
"server_stats": "Serveri statistika", "server_stats": "Serveri statistika",
"server_update_available": "Serveri uuendus on saadaval", "server_update_available": "Serveri uuendus on saadaval",
"server_version": "Serveri versioon", "server_version": "Serveri versioon",
@@ -1937,6 +1968,7 @@
"show_slideshow_transition": "Kuva slaidiesitluse üleminekud", "show_slideshow_transition": "Kuva slaidiesitluse üleminekud",
"show_supporter_badge": "Toetaja märk", "show_supporter_badge": "Toetaja märk",
"show_supporter_badge_description": "Kuva toetaja märki", "show_supporter_badge_description": "Kuva toetaja märki",
"show_text_recognition": "Kuva tekstituvastust",
"show_text_search_menu": "Kuva tekstiotsingu menüüd", "show_text_search_menu": "Kuva tekstiotsingu menüüd",
"shuffle": "Juhuslik", "shuffle": "Juhuslik",
"sidebar": "Külgmenüü", "sidebar": "Külgmenüü",
@@ -2007,6 +2039,7 @@
"tags": "Sildid", "tags": "Sildid",
"tap_to_run_job": "Puuduta tööte käivitamiseks", "tap_to_run_job": "Puuduta tööte käivitamiseks",
"template": "Mall", "template": "Mall",
"text_recognition": "Tekstituvastus",
"theme": "Teema", "theme": "Teema",
"theme_selection": "Teema valik", "theme_selection": "Teema valik",
"theme_selection_description": "Sea automaatselt hele või tume teema vastavalt veebilehitseja eelistustele", "theme_selection_description": "Sea automaatselt hele või tume teema vastavalt veebilehitseja eelistustele",
@@ -2027,6 +2060,7 @@
"third_party_resources": "Kolmanda osapoole ressursid", "third_party_resources": "Kolmanda osapoole ressursid",
"time": "Aeg", "time": "Aeg",
"time_based_memories": "Ajapõhised mälestused", "time_based_memories": "Ajapõhised mälestused",
"time_based_memories_duration": "Aeg sekundites, kui kaua igat pilti kuvada.",
"timeline": "Ajajoon", "timeline": "Ajajoon",
"timezone": "Ajavöönd", "timezone": "Ajavöönd",
"to_archive": "Arhiivi", "to_archive": "Arhiivi",
@@ -2142,7 +2176,7 @@
"video_hover_setting_description": "Esita video eelvaade, kui hiirt selle kohal hõljutada. Isegi kui keelatud, saab taasesituse alustada taasesitusnupu kohal hõljutades.", "video_hover_setting_description": "Esita video eelvaade, kui hiirt selle kohal hõljutada. Isegi kui keelatud, saab taasesituse alustada taasesitusnupu kohal hõljutades.",
"videos": "Videod", "videos": "Videod",
"videos_count": "{count, plural, one {# video} other {# videot}}", "videos_count": "{count, plural, one {# video} other {# videot}}",
"view": "Vaade", "view": "Vaata",
"view_album": "Vaata albumit", "view_album": "Vaata albumit",
"view_all": "Vaata kõiki", "view_all": "Vaata kõiki",
"view_all_users": "Vaata kõiki kasutajaid", "view_all_users": "Vaata kõiki kasutajaid",
@@ -2167,6 +2201,7 @@
"welcome": "Tere tulemast", "welcome": "Tere tulemast",
"welcome_to_immich": "Tere tulemast Immich'isse", "welcome_to_immich": "Tere tulemast Immich'isse",
"wifi_name": "WiFi-võrgu nimi", "wifi_name": "WiFi-võrgu nimi",
"workflow": "Töövoog",
"wrong_pin_code": "Vale PIN-kood", "wrong_pin_code": "Vale PIN-kood",
"year": "Aasta", "year": "Aasta",
"years_ago": "{years, plural, one {# aasta} other {# aastat}} tagasi", "years_ago": "{years, plural, one {# aasta} other {# aastat}} tagasi",
-1
View File
@@ -17,7 +17,6 @@
"add_birthday": "Urtebetetzea gehitu", "add_birthday": "Urtebetetzea gehitu",
"add_endpoint": "Endpoint-a gehitu", "add_endpoint": "Endpoint-a gehitu",
"add_exclusion_pattern": "Bazterketa eredua gehitu", "add_exclusion_pattern": "Bazterketa eredua gehitu",
"add_import_path": "Inportazio bidea gehitu",
"add_location": "Kokapena gehitu", "add_location": "Kokapena gehitu",
"add_more_users": "Erabiltzaile gehiago gehitu", "add_more_users": "Erabiltzaile gehiago gehitu",
"add_partner": "Kidea gehitu", "add_partner": "Kidea gehitu",
+6 -2
View File
@@ -15,23 +15,28 @@
"add_a_title": "افزودن عنوان", "add_a_title": "افزودن عنوان",
"add_birthday": "افزودن تاریخ تولد", "add_birthday": "افزودن تاریخ تولد",
"add_exclusion_pattern": "افزودن الگوی استثنا", "add_exclusion_pattern": "افزودن الگوی استثنا",
"add_import_path": "افزودن مسیر ورودی",
"add_location": "افزودن مکان", "add_location": "افزودن مکان",
"add_more_users": "افزودن کاربرهای بیشتر", "add_more_users": "افزودن کاربرهای بیشتر",
"add_partner": "افزودن شریک", "add_partner": "افزودن شریک",
"add_path": "افزودن مسیر", "add_path": "افزودن مسیر",
"add_photos": "افزودن عکس ها", "add_photos": "افزودن عکس ها",
"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_bottom_sheet_some_local_assets": "برخی از محتواهای محلی را نشد به آلبوم اضافه کرد", "add_to_album_bottom_sheet_some_local_assets": "برخی از محتواهای محلی را نشد به آلبوم اضافه کرد",
"add_to_albums": "افزودن به آلبوم",
"add_to_albums_count": "افزودن به آلبوم ها {count}",
"add_to_shared_album": "افزودن به آلبوم اشتراکی", "add_to_shared_album": "افزودن به آلبوم اشتراکی",
"add_upload_to_stack": "افزودن فایل ارسالی به مجموعه",
"add_url": "افزودن آدرس URL",
"added_to_archive": "به آرشیو اضافه شد", "added_to_archive": "به آرشیو اضافه شد",
"added_to_favorites": "به علاقه مندی ها اضافه شد", "added_to_favorites": "به علاقه مندی ها اضافه شد",
"added_to_favorites_count": "{count, number} تا به علاقه مندی ها اضافه شد", "added_to_favorites_count": "{count, number} تا به علاقه مندی ها اضافه شد",
"admin": { "admin": {
"add_exclusion_pattern_description": "الگوهای استثنا را اضافه کنید. پشتیبانی از گلابینگ با استفاده از *, ** و ? وجود دارد. برای نادیده گرفتن تمام فایل‌ها در هر دایرکتوری با نام \"Raw\"، از \"**/Raw/**\" استفاده کنید. برای نادیده گرفتن تمام فایل‌هایی که با \".tif\" پایان می‌یابند، از \"**/*.tif\" استفاده کنید. برای نادیده گرفتن یک مسیر مطلق، از \"/path/to/ignore/**\" استفاده کنید.", "add_exclusion_pattern_description": "الگوهای استثنا را اضافه کنید. پشتیبانی از گلابینگ با استفاده از *, ** و ? وجود دارد. برای نادیده گرفتن تمام فایل‌ها در هر دایرکتوری با نام \"Raw\"، از \"**/Raw/**\" استفاده کنید. برای نادیده گرفتن تمام فایل‌هایی که با \".tif\" پایان می‌یابند، از \"**/*.tif\" استفاده کنید. برای نادیده گرفتن یک مسیر مطلق، از \"/path/to/ignore/**\" استفاده کنید.",
"admin_user": "ادمین",
"authentication_settings": "تنظیمات احراز هویت", "authentication_settings": "تنظیمات احراز هویت",
"authentication_settings_description": "مدیریت رمز عبور، OAuth، و سایر تنظیمات احراز هویت", "authentication_settings_description": "مدیریت رمز عبور، OAuth، و سایر تنظیمات احراز هویت",
"authentication_settings_disable_all": "آیا مطمئن هستید که می‌خواهید تمام روش‌های ورود را غیرفعال کنید؟ ورود به طور کامل غیرفعال خواهد شد.", "authentication_settings_disable_all": "آیا مطمئن هستید که می‌خواهید تمام روش‌های ورود را غیرفعال کنید؟ ورود به طور کامل غیرفعال خواهد شد.",
@@ -79,7 +84,6 @@
"job_status": "وضعیت کار", "job_status": "وضعیت کار",
"library_created": "کتابخانه ایجاد شده: {library}", "library_created": "کتابخانه ایجاد شده: {library}",
"library_deleted": "کتابخانه حذف شد", "library_deleted": "کتابخانه حذف شد",
"library_import_path_description": "یک پوشه برای وارد کردن مشخص کنید. این پوشه، به همراه زیرپوشه‌ها، برای یافتن تصاویر و ویدیوها اسکن خواهد شد.",
"library_scanning": "اسکن دوره ای", "library_scanning": "اسکن دوره ای",
"library_scanning_description": "تنظیم اسکن دوره‌ای کتابخانه", "library_scanning_description": "تنظیم اسکن دوره‌ای کتابخانه",
"library_scanning_enable_description": "فعال کردن اسکن دوره‌ای کتابخانه", "library_scanning_enable_description": "فعال کردن اسکن دوره‌ای کتابخانه",
+9 -12
View File
@@ -17,7 +17,6 @@
"add_birthday": "Lisää syntymäpäivä", "add_birthday": "Lisää syntymäpäivä",
"add_endpoint": "Lisää päätepiste", "add_endpoint": "Lisää päätepiste",
"add_exclusion_pattern": "Lisää poissulkemismalli", "add_exclusion_pattern": "Lisää poissulkemismalli",
"add_import_path": "Lisää tuontipolku",
"add_location": "Lisää sijainti", "add_location": "Lisää sijainti",
"add_more_users": "Lisää käyttäjiä", "add_more_users": "Lisää käyttäjiä",
"add_partner": "Lisää kumppani", "add_partner": "Lisää kumppani",
@@ -32,6 +31,7 @@
"add_to_album_toggle": "Vaihda albumin {album} valintaa", "add_to_album_toggle": "Vaihda albumin {album} valintaa",
"add_to_albums": "Lisää albumeihin", "add_to_albums": "Lisää albumeihin",
"add_to_albums_count": "Lisää albumeihin ({count})", "add_to_albums_count": "Lisää albumeihin ({count})",
"add_to_bottom_bar": "Lisää",
"add_to_shared_album": "Lisää jaettuun albumiin", "add_to_shared_album": "Lisää jaettuun albumiin",
"add_upload_to_stack": "Lisää kuvapinoon", "add_upload_to_stack": "Lisää kuvapinoon",
"add_url": "Lisää URL", "add_url": "Lisää URL",
@@ -112,7 +112,6 @@
"jobs_failed": "{jobCount, plural, other {# epäonnistunutta}}", "jobs_failed": "{jobCount, plural, other {# epäonnistunutta}}",
"library_created": "Kirjasto {library} luotu", "library_created": "Kirjasto {library} luotu",
"library_deleted": "Kirjasto poistettu", "library_deleted": "Kirjasto poistettu",
"library_import_path_description": "Määritä kansio joka tuodaan. Kuvat ja videot skannataan tästä kansiosta, sekä alikansioista.",
"library_scanning": "Ajoittainen skannaus", "library_scanning": "Ajoittainen skannaus",
"library_scanning_description": "Määritä ajoittaiset kirjastojen skannaukset", "library_scanning_description": "Määritä ajoittaiset kirjastojen skannaukset",
"library_scanning_enable_description": "Ota käyttöön ajoittaiset kirjastojen skannaukset", "library_scanning_enable_description": "Ota käyttöön ajoittaiset kirjastojen skannaukset",
@@ -160,8 +159,8 @@
"machine_learning_ocr_enabled_description": "Jos asetus on pois päältä, kuvia ei prosessoida tekstin tunnistamiseksi.", "machine_learning_ocr_enabled_description": "Jos asetus on pois päältä, kuvia ei prosessoida tekstin tunnistamiseksi.",
"machine_learning_ocr_max_resolution": "Maksimiresoluutio", "machine_learning_ocr_max_resolution": "Maksimiresoluutio",
"machine_learning_ocr_max_resolution_description": "Tätä suuremmat esikatselukuvat tullaan pienentämään samassa kuvasuhteessa. Suuremmat arvot ovat tarkempia, mutta kestävät pidempään prosessoida ja käyttävät enemmän muistia.", "machine_learning_ocr_max_resolution_description": "Tätä suuremmat esikatselukuvat tullaan pienentämään samassa kuvasuhteessa. Suuremmat arvot ovat tarkempia, mutta kestävät pidempään prosessoida ja käyttävät enemmän muistia.",
"machine_learning_ocr_min_detection_score": "Pienin paikannuksen pistemäärä", "machine_learning_ocr_min_detection_score": "Tunnistuksen vähimmäispistemäärä",
"machine_learning_ocr_min_detection_score_description": "Pienin arvo tekstin paikannukselle varmuudelle välillä 0-1. Pienemmät arvot paikantavat enemmän tekstiä, mutta saattavat johtaa useampaan väärään positiiviseen.", "machine_learning_ocr_min_detection_score_description": "Tekstin tunnistuksen vähimmäisluottamusarvo (01). Pienemmät arvot tunnistavat enemmän tekstiä, mutta voivat johtaa virheellisiin osumiin.",
"machine_learning_ocr_min_recognition_score": "Pienin tunnistuksen pistemäärä", "machine_learning_ocr_min_recognition_score": "Pienin tunnistuksen pistemäärä",
"machine_learning_ocr_min_score_recognition_description": "Pienin arvo tekstin tunnistuksen varmuudelle välillä 0-1. Pienemmät arvot tunnistavat enemmän tekstiä, mutta saattavat johtaa useampaan väärään positiiviseen.", "machine_learning_ocr_min_score_recognition_description": "Pienin arvo tekstin tunnistuksen varmuudelle välillä 0-1. Pienemmät arvot tunnistavat enemmän tekstiä, mutta saattavat johtaa useampaan väärään positiiviseen.",
"machine_learning_ocr_model": "OCR-malli", "machine_learning_ocr_model": "OCR-malli",
@@ -430,6 +429,7 @@
"age_months": "Ikä {months, plural, one {# kuukausi} other {# kuukautta}}", "age_months": "Ikä {months, plural, one {# kuukausi} other {# kuukautta}}",
"age_year_months": "Ikä 1 vuosi, {months, plural, one {# kuukausi} other {# kuukautta}}", "age_year_months": "Ikä 1 vuosi, {months, plural, one {# kuukausi} other {# kuukautta}}",
"age_years": "{years, plural, other {Ikä #v}}", "age_years": "{years, plural, other {Ikä #v}}",
"album": "Albumi",
"album_added": "Albumi lisätty", "album_added": "Albumi lisätty",
"album_added_notification_setting_description": "Saa sähköpostia kun sinut lisätään jaettuun albumiin", "album_added_notification_setting_description": "Saa sähköpostia kun sinut lisätään jaettuun albumiin",
"album_cover_updated": "Albumin kansikuva päivitetty", "album_cover_updated": "Albumin kansikuva päivitetty",
@@ -475,6 +475,7 @@
"allow_edits": "Salli muutokset", "allow_edits": "Salli muutokset",
"allow_public_user_to_download": "Salli julkisten käyttäjien ladata tiedostoja", "allow_public_user_to_download": "Salli julkisten käyttäjien ladata tiedostoja",
"allow_public_user_to_upload": "Salli julkisten käyttäjien lähettää tiedostoja", "allow_public_user_to_upload": "Salli julkisten käyttäjien lähettää tiedostoja",
"allowed": "Sallittu",
"alt_text_qr_code": "QR-koodi", "alt_text_qr_code": "QR-koodi",
"anti_clockwise": "Vastapäivään", "anti_clockwise": "Vastapäivään",
"api_key": "API-avain", "api_key": "API-avain",
@@ -683,7 +684,7 @@
"change_password_form_confirm_password": "Vahvista salasana", "change_password_form_confirm_password": "Vahvista salasana",
"change_password_form_description": "Hei {name},\n\nTämä on joko ensimmäinen kerta, kun kirjaudut järjestelmään, tai sinulta on pyydetty salasanan vaihtoa. Ole hyvä ja syötä uusi salasana alle.", "change_password_form_description": "Hei {name},\n\nTämä on joko ensimmäinen kerta, kun kirjaudut järjestelmään, tai sinulta on pyydetty salasanan vaihtoa. Ole hyvä ja syötä uusi salasana alle.",
"change_password_form_log_out": "Kirjaudu ulos kaikilta muilta laitteilta", "change_password_form_log_out": "Kirjaudu ulos kaikilta muilta laitteilta",
"change_password_form_log_out_description": "On suositeltavaa kirjautua ulos kaikilta muilta laitteilta", "change_password_form_log_out_description": "On suositeltavaa kirjautua ulos kaikilta laitteilta",
"change_password_form_new_password": "Uusi salasana", "change_password_form_new_password": "Uusi salasana",
"change_password_form_password_mismatch": "Salasanat eivät täsmää", "change_password_form_password_mismatch": "Salasanat eivät täsmää",
"change_password_form_reenter_new_password": "Uusi salasana uudelleen", "change_password_form_reenter_new_password": "Uusi salasana uudelleen",
@@ -894,8 +895,6 @@
"edit_description_prompt": "Valitse uusi kuvaus:", "edit_description_prompt": "Valitse uusi kuvaus:",
"edit_exclusion_pattern": "Muokkaa poissulkemismallia", "edit_exclusion_pattern": "Muokkaa poissulkemismallia",
"edit_faces": "Muokkaa kasvoja", "edit_faces": "Muokkaa kasvoja",
"edit_import_path": "Muokkaa tuontipolkua",
"edit_import_paths": "Muokkaa tuontipolkuja",
"edit_key": "Muokkaa avainta", "edit_key": "Muokkaa avainta",
"edit_link": "Muokkaa linkkiä", "edit_link": "Muokkaa linkkiä",
"edit_location": "Muokkaa sijaintia", "edit_location": "Muokkaa sijaintia",
@@ -967,7 +966,6 @@
"failed_to_stack_assets": "Medioiden pinoaminen epäonnistui", "failed_to_stack_assets": "Medioiden pinoaminen epäonnistui",
"failed_to_unstack_assets": "Medioiden pinoamisen purku epäonnistui", "failed_to_unstack_assets": "Medioiden pinoamisen purku epäonnistui",
"failed_to_update_notification_status": "Ilmoituksen tilan päivittäminen epäonnistui", "failed_to_update_notification_status": "Ilmoituksen tilan päivittäminen epäonnistui",
"import_path_already_exists": "Tämä tuontipolku on jo olemassa.",
"incorrect_email_or_password": "Väärä sähköpostiosoite tai salasana", "incorrect_email_or_password": "Väärä sähköpostiosoite tai salasana",
"paths_validation_failed": "{paths, plural, one {# polun} other {# polun}} validointi epäonnistui", "paths_validation_failed": "{paths, plural, one {# polun} other {# polun}} validointi epäonnistui",
"profile_picture_transparent_pixels": "Profiilikuvassa ei voi olla läpinäkyviä pikseleitä. Zoomaa lähemmäs ja/tai siirrä kuvaa.", "profile_picture_transparent_pixels": "Profiilikuvassa ei voi olla läpinäkyviä pikseleitä. Zoomaa lähemmäs ja/tai siirrä kuvaa.",
@@ -977,7 +975,6 @@
"unable_to_add_assets_to_shared_link": "Medioiden lisääminen jaettuun linkkiin epäonnistui", "unable_to_add_assets_to_shared_link": "Medioiden lisääminen jaettuun linkkiin epäonnistui",
"unable_to_add_comment": "Kommentin lisääminen epäonnistui", "unable_to_add_comment": "Kommentin lisääminen epäonnistui",
"unable_to_add_exclusion_pattern": "Ei voida lisätä poissulkemismallia", "unable_to_add_exclusion_pattern": "Ei voida lisätä poissulkemismallia",
"unable_to_add_import_path": "Tuontipolkua ei voitu lisätä",
"unable_to_add_partners": "Kumppaneita ei voitu lisätä", "unable_to_add_partners": "Kumppaneita ei voitu lisätä",
"unable_to_add_remove_archive": "Ei voida {archived, select, true {poistaa kohdetta arkistosta} other {lisätä kohdetta arkistoon}}", "unable_to_add_remove_archive": "Ei voida {archived, select, true {poistaa kohdetta arkistosta} other {lisätä kohdetta arkistoon}}",
"unable_to_add_remove_favorites": "Ei voida {favorite, select, true {lisätä kohdetta suosikkeihin} other {poistaa kohdetta suosikeista}}", "unable_to_add_remove_favorites": "Ei voida {favorite, select, true {lisätä kohdetta suosikkeihin} other {poistaa kohdetta suosikeista}}",
@@ -1000,12 +997,10 @@
"unable_to_delete_asset": "Kohteen poistaminen epäonnistui", "unable_to_delete_asset": "Kohteen poistaminen epäonnistui",
"unable_to_delete_assets": "Virhe kohteen poistamisessa", "unable_to_delete_assets": "Virhe kohteen poistamisessa",
"unable_to_delete_exclusion_pattern": "Ei voida poistaa poissulkemismallia", "unable_to_delete_exclusion_pattern": "Ei voida poistaa poissulkemismallia",
"unable_to_delete_import_path": "Tuontipolkua ei voitu poistaa",
"unable_to_delete_shared_link": "Jaetun linkin poistaminen epäonnistui", "unable_to_delete_shared_link": "Jaetun linkin poistaminen epäonnistui",
"unable_to_delete_user": "Käyttäjän poistaminen epäonnistui", "unable_to_delete_user": "Käyttäjän poistaminen epäonnistui",
"unable_to_download_files": "Tiedostojen lataaminen epäonnistui", "unable_to_download_files": "Tiedostojen lataaminen epäonnistui",
"unable_to_edit_exclusion_pattern": "Ei voida muokata poissulkemismallia", "unable_to_edit_exclusion_pattern": "Ei voida muokata poissulkemismallia",
"unable_to_edit_import_path": "Tuontipolkua ei voitu muokata",
"unable_to_empty_trash": "Roskakorin tyhjentäminen epäonnistui", "unable_to_empty_trash": "Roskakorin tyhjentäminen epäonnistui",
"unable_to_enter_fullscreen": "Koko ruudun tilaan siirtyminen epäonnistui", "unable_to_enter_fullscreen": "Koko ruudun tilaan siirtyminen epäonnistui",
"unable_to_exit_fullscreen": "Koko ruudun tilasta poistuminen epäonnistui", "unable_to_exit_fullscreen": "Koko ruudun tilasta poistuminen epäonnistui",
@@ -1551,7 +1546,7 @@
"pin_code_reset_successfully": "PIN-koodin nollaus onnistui", "pin_code_reset_successfully": "PIN-koodin nollaus onnistui",
"pin_code_setup_successfully": "PIN-koodin asettaminen onnistui", "pin_code_setup_successfully": "PIN-koodin asettaminen onnistui",
"pin_verification": "PIN-koodin vahvistus", "pin_verification": "PIN-koodin vahvistus",
"place": "Sijainti", "place": "Paikka",
"places": "Paikat", "places": "Paikat",
"places_count": "{count, plural, one {{count, number} Paikka} other {{count, number} Paikkaa}}", "places_count": "{count, plural, one {{count, number} Paikka} other {{count, number} Paikkaa}}",
"play": "Toista", "play": "Toista",
@@ -1716,6 +1711,7 @@
"running": "Käynnissä", "running": "Käynnissä",
"save": "Tallenna", "save": "Tallenna",
"save_to_gallery": "Tallenna galleriaan", "save_to_gallery": "Tallenna galleriaan",
"saved": "Tallennettu",
"saved_api_key": "API-avain tallennettu", "saved_api_key": "API-avain tallennettu",
"saved_profile": "Profiili tallennettu", "saved_profile": "Profiili tallennettu",
"saved_settings": "Asetukset tallennettu", "saved_settings": "Asetukset tallennettu",
@@ -2026,6 +2022,7 @@
"third_party_resources": "Kolmannen osapuolen resurssit", "third_party_resources": "Kolmannen osapuolen resurssit",
"time": "Aika", "time": "Aika",
"time_based_memories": "Aikaan perustuvat muistot", "time_based_memories": "Aikaan perustuvat muistot",
"time_based_memories_duration": "Kuvien näyttöaika sekunteina.",
"timeline": "Aikajana", "timeline": "Aikajana",
"timezone": "Aikavyöhyke", "timezone": "Aikavyöhyke",
"to_archive": "Arkistoi", "to_archive": "Arkistoi",
-1
View File
@@ -62,7 +62,6 @@
"exclusion_pattern_description": "Maaaring gamitin ang mga pattern na pangbukod para hindi pansinin ang ilang file o folder habang binabasa ang iyong library. Mainam itong solusyon para sa mga folder na may file na ayaw niyong ma-import, tulad ng mga RAW na file.", "exclusion_pattern_description": "Maaaring gamitin ang mga pattern na pangbukod para hindi pansinin ang ilang file o folder habang binabasa ang iyong library. Mainam itong solusyon para sa mga folder na may file na ayaw niyong ma-import, tulad ng mga RAW na file.",
"force_delete_user_warning": "BABALA: Tatanggalin itong user at lahat ng asset nila, Hindi ito mababawi at ang kanilang files ay hindi na mababalik", "force_delete_user_warning": "BABALA: Tatanggalin itong user at lahat ng asset nila, Hindi ito mababawi at ang kanilang files ay hindi na mababalik",
"image_format": "Format", "image_format": "Format",
"library_import_path_description": "Tukuyin ang folder na i-import. Ang folder na ito, kasama ang subfolders, ay mag sa-scan para sa mga imahe at mga videos.",
"note_cannot_be_changed_later": "TANDAAN: Hindi na ito pwede baguhin sa susunod!", "note_cannot_be_changed_later": "TANDAAN: Hindi na ito pwede baguhin sa susunod!",
"server_welcome_message_description": "Mensahe na ipapakita sa login page.", "server_welcome_message_description": "Mensahe na ipapakita sa login page.",
"user_restore_description": "Ang account ni <b>{user}</b> ay maibabalik." "user_restore_description": "Ang account ni <b>{user}</b> ay maibabalik."
+42 -10
View File
@@ -4,7 +4,7 @@
"account_settings": "Paramètres du compte", "account_settings": "Paramètres du compte",
"acknowledge": "Compris", "acknowledge": "Compris",
"action": "Action", "action": "Action",
"action_common_update": "Mise à jour", "action_common_update": "Mettre à jour",
"actions": "Actions", "actions": "Actions",
"active": "En cours", "active": "En cours",
"activity": "Activité", "activity": "Activité",
@@ -17,7 +17,6 @@
"add_birthday": "Ajouter un anniversaire", "add_birthday": "Ajouter un anniversaire",
"add_endpoint": "Ajouter une adresse", "add_endpoint": "Ajouter une adresse",
"add_exclusion_pattern": "Ajouter un schéma d'exclusion", "add_exclusion_pattern": "Ajouter un schéma d'exclusion",
"add_import_path": "Ajouter un chemin à importer",
"add_location": "Ajouter une localisation", "add_location": "Ajouter une localisation",
"add_more_users": "Ajouter plus d'utilisateurs", "add_more_users": "Ajouter plus d'utilisateurs",
"add_partner": "Ajouter un partenaire", "add_partner": "Ajouter un partenaire",
@@ -32,6 +31,7 @@
"add_to_album_toggle": "Basculer la sélection pour {album}", "add_to_album_toggle": "Basculer la sélection pour {album}",
"add_to_albums": "Ajouter aux albums", "add_to_albums": "Ajouter aux albums",
"add_to_albums_count": "Ajouter aux albums ({count})", "add_to_albums_count": "Ajouter aux albums ({count})",
"add_to_bottom_bar": "Ajouter à",
"add_to_shared_album": "Ajouter à l'album partagé", "add_to_shared_album": "Ajouter à l'album partagé",
"add_upload_to_stack": "Ajouter les éléments téléversés à la pile", "add_upload_to_stack": "Ajouter les éléments téléversés à la pile",
"add_url": "Ajouter l'URL", "add_url": "Ajouter l'URL",
@@ -112,13 +112,17 @@
"jobs_failed": "{jobCount, plural, other {# en échec}}", "jobs_failed": "{jobCount, plural, other {# en échec}}",
"library_created": "Bibliothèque créée: {library}", "library_created": "Bibliothèque créée: {library}",
"library_deleted": "Bibliothèque supprimée", "library_deleted": "Bibliothèque supprimée",
"library_import_path_description": "Spécifier un dossier à importer. Ce dossier, y compris ses sous-dossiers, sera analysé à la recherche d'images et de vidéos.", "library_details": "Détails de la bibliothèque",
"library_folder_description": "Renseignez un dossier à importer. Ce dossier et ses sous-dossiers seront scannés pour leurs images et vidéos.",
"library_remove_exclusion_pattern_prompt": "Êtes-vous sûr de vouloir supprimer ce schéma d'exclusion?",
"library_remove_folder_prompt": "Êtes-vous sûr de vouloir supprimer ce dossier d'import?",
"library_scanning": "Analyse périodique", "library_scanning": "Analyse périodique",
"library_scanning_description": "Configurer l'analyse périodique de la bibliothèque", "library_scanning_description": "Configurer l'analyse périodique de la bibliothèque",
"library_scanning_enable_description": "Activer l'analyse périodique de la bibliothèque", "library_scanning_enable_description": "Activer l'analyse périodique de la bibliothèque",
"library_settings": "Bibliothèque externe", "library_settings": "Bibliothèque externe",
"library_settings_description": "Gestion des paramètres des bibliothèques externes", "library_settings_description": "Gestion des paramètres des bibliothèques externes",
"library_tasks_description": "Scanner les bibliothèques externes pour les nouveaux et/ou les éléments modifiés", "library_tasks_description": "Scanner les bibliothèques externes pour les nouveaux et/ou les éléments modifiés",
"library_updated": "Bibliothèque mise à jour",
"library_watching_enable_description": "Surveiller les modifications de fichiers dans les bibliothèques externes", "library_watching_enable_description": "Surveiller les modifications de fichiers dans les bibliothèques externes",
"library_watching_settings": "Surveillance de bibliothèque [EXPÉRIMENTAL]", "library_watching_settings": "Surveillance de bibliothèque [EXPÉRIMENTAL]",
"library_watching_settings_description": "Surveiller automatiquement les fichiers modifiés", "library_watching_settings_description": "Surveiller automatiquement les fichiers modifiés",
@@ -173,6 +177,10 @@
"machine_learning_smart_search_enabled": "Activer la recherche intelligente", "machine_learning_smart_search_enabled": "Activer la recherche intelligente",
"machine_learning_smart_search_enabled_description": "Si cette option est désactivée, les images ne seront pas encodées pour la recherche intelligente.", "machine_learning_smart_search_enabled_description": "Si cette option est désactivée, les images ne seront pas encodées pour la recherche intelligente.",
"machine_learning_url_description": "LURL du serveur d'apprentissage automatique. Si plusieurs URL sont fournies, chaque serveur sera essayé un par un jusqu’à ce que lun deux réponde avec succès, dans lordre de la première à la dernière. Les serveurs ne répondant pas seront temporairement ignorés jusqu'à ce qu'ils soient de nouveau opérationnels.", "machine_learning_url_description": "LURL du serveur d'apprentissage automatique. Si plusieurs URL sont fournies, chaque serveur sera essayé un par un jusqu’à ce que lun deux réponde avec succès, dans lordre de la première à la dernière. Les serveurs ne répondant pas seront temporairement ignorés jusqu'à ce qu'ils soient de nouveau opérationnels.",
"maintenance_settings": "Maintenance",
"maintenance_settings_description": "Mettre Immich en mode maintenance.",
"maintenance_start": "Démarrer le mode maintenance",
"maintenance_start_error": "Échec du démarrage du mode maintenance.",
"manage_concurrency": "Gérer du multitâche", "manage_concurrency": "Gérer du multitâche",
"manage_log_settings": "Gérer les paramètres de journalisation", "manage_log_settings": "Gérer les paramètres de journalisation",
"map_dark_style": "Thème sombre", "map_dark_style": "Thème sombre",
@@ -430,6 +438,7 @@
"age_months": "Âge {months, plural, one {# mois} other {# mois}}", "age_months": "Âge {months, plural, one {# mois} other {# mois}}",
"age_year_months": "Âge 1 an, {months, plural, one {# mois} other {# mois}}", "age_year_months": "Âge 1 an, {months, plural, one {# mois} other {# mois}}",
"age_years": "Âge {years, plural, one {# an} other {# ans}}", "age_years": "Âge {years, plural, one {# an} other {# ans}}",
"album": "Album",
"album_added": "Album ajouté", "album_added": "Album ajouté",
"album_added_notification_setting_description": "Recevoir une notification par courriel lorsque vous êtes ajouté(e) à un album partagé", "album_added_notification_setting_description": "Recevoir une notification par courriel lorsque vous êtes ajouté(e) à un album partagé",
"album_cover_updated": "Couverture de l'album mise à jour", "album_cover_updated": "Couverture de l'album mise à jour",
@@ -475,6 +484,7 @@
"allow_edits": "Autoriser les modifications", "allow_edits": "Autoriser les modifications",
"allow_public_user_to_download": "Permettre le téléchargement par des utilisateurs non connectés", "allow_public_user_to_download": "Permettre le téléchargement par des utilisateurs non connectés",
"allow_public_user_to_upload": "Permettre l'envoi par des utilisateurs non connectés", "allow_public_user_to_upload": "Permettre l'envoi par des utilisateurs non connectés",
"allowed": "Autorisé",
"alt_text_qr_code": "Image du code QR", "alt_text_qr_code": "Image du code QR",
"anti_clockwise": "Sens anti-horaire", "anti_clockwise": "Sens anti-horaire",
"api_key": "Clé API", "api_key": "Clé API",
@@ -724,7 +734,7 @@
"comments_are_disabled": "Les commentaires sont désactivés", "comments_are_disabled": "Les commentaires sont désactivés",
"common_create_new_album": "Créer un nouvel album", "common_create_new_album": "Créer un nouvel album",
"completed": "Complété", "completed": "Complété",
"confirm": "Confirmez", "confirm": "Confirmer",
"confirm_admin_password": "Confirmez le mot de passe Admin", "confirm_admin_password": "Confirmez le mot de passe Admin",
"confirm_delete_face": "Êtes-vous sûr de vouloir supprimer le visage de {name} du média?", "confirm_delete_face": "Êtes-vous sûr de vouloir supprimer le visage de {name} du média?",
"confirm_delete_shared_link": "Voulez-vous vraiment supprimer ce lien partagé ?", "confirm_delete_shared_link": "Voulez-vous vraiment supprimer ce lien partagé ?",
@@ -894,8 +904,6 @@
"edit_description_prompt": "Choisir une nouvelle description :", "edit_description_prompt": "Choisir une nouvelle description :",
"edit_exclusion_pattern": "Modifier le schéma d'exclusion", "edit_exclusion_pattern": "Modifier le schéma d'exclusion",
"edit_faces": "Modifier les visages", "edit_faces": "Modifier les visages",
"edit_import_path": "Modifier le chemin d'importation",
"edit_import_paths": "Modifier les chemins d'importation",
"edit_key": "Modifier la clé", "edit_key": "Modifier la clé",
"edit_link": "Modifier le lien", "edit_link": "Modifier le lien",
"edit_location": "Modifier la localisation", "edit_location": "Modifier la localisation",
@@ -967,8 +975,8 @@
"failed_to_stack_assets": "Impossible d'empiler les médias", "failed_to_stack_assets": "Impossible d'empiler les médias",
"failed_to_unstack_assets": "Impossible de dépiler les médias", "failed_to_unstack_assets": "Impossible de dépiler les médias",
"failed_to_update_notification_status": "Erreur de mise à jour du statut des notifications", "failed_to_update_notification_status": "Erreur de mise à jour du statut des notifications",
"import_path_already_exists": "Ce chemin d'importation existe déjà.",
"incorrect_email_or_password": "Courriel ou mot de passe incorrect", "incorrect_email_or_password": "Courriel ou mot de passe incorrect",
"library_folder_already_exists": "Ce chemin d'import existe déjà.",
"paths_validation_failed": "Validation échouée pour {paths, plural, one {# un chemin} other {# plusieurs chemins}}", "paths_validation_failed": "Validation échouée pour {paths, plural, one {# un chemin} other {# plusieurs chemins}}",
"profile_picture_transparent_pixels": "Les images de profil ne peuvent pas avoir de pixels transparents. Veuillez agrandir et/ou déplacer l'image.", "profile_picture_transparent_pixels": "Les images de profil ne peuvent pas avoir de pixels transparents. Veuillez agrandir et/ou déplacer l'image.",
"quota_higher_than_disk_size": "Le quota saisi est supérieur à l'espace disponible", "quota_higher_than_disk_size": "Le quota saisi est supérieur à l'espace disponible",
@@ -977,7 +985,6 @@
"unable_to_add_assets_to_shared_link": "Impossible d'ajouter des médias au lien partagé", "unable_to_add_assets_to_shared_link": "Impossible d'ajouter des médias au lien partagé",
"unable_to_add_comment": "Impossible d'ajouter un commentaire", "unable_to_add_comment": "Impossible d'ajouter un commentaire",
"unable_to_add_exclusion_pattern": "Impossible d'ajouter un schéma d'exclusion", "unable_to_add_exclusion_pattern": "Impossible d'ajouter un schéma d'exclusion",
"unable_to_add_import_path": "Impossible d'ajouter le chemin d'importation",
"unable_to_add_partners": "Impossible d'ajouter des partenaires", "unable_to_add_partners": "Impossible d'ajouter des partenaires",
"unable_to_add_remove_archive": "Impossible {archived, select, true {de supprimer des médias de} other {d'ajouter des médias à}} l'archive", "unable_to_add_remove_archive": "Impossible {archived, select, true {de supprimer des médias de} other {d'ajouter des médias à}} l'archive",
"unable_to_add_remove_favorites": "Impossible {favorite, select, true {d'ajouter des médias aux} other {de supprimer des médias des}} favoris", "unable_to_add_remove_favorites": "Impossible {favorite, select, true {d'ajouter des médias aux} other {de supprimer des médias des}} favoris",
@@ -1000,12 +1007,10 @@
"unable_to_delete_asset": "Impossible de supprimer le média", "unable_to_delete_asset": "Impossible de supprimer le média",
"unable_to_delete_assets": "Erreur lors de la suppression des médias", "unable_to_delete_assets": "Erreur lors de la suppression des médias",
"unable_to_delete_exclusion_pattern": "Impossible de supprimer le modèle d'exclusion", "unable_to_delete_exclusion_pattern": "Impossible de supprimer le modèle d'exclusion",
"unable_to_delete_import_path": "Impossible de supprimer le chemin d'importation",
"unable_to_delete_shared_link": "Impossible de supprimer le lien de partage", "unable_to_delete_shared_link": "Impossible de supprimer le lien de partage",
"unable_to_delete_user": "Impossible de supprimer l'utilisateur", "unable_to_delete_user": "Impossible de supprimer l'utilisateur",
"unable_to_download_files": "Impossible de télécharger les fichiers", "unable_to_download_files": "Impossible de télécharger les fichiers",
"unable_to_edit_exclusion_pattern": "Impossible de modifier le modèle d'exclusion", "unable_to_edit_exclusion_pattern": "Impossible de modifier le modèle d'exclusion",
"unable_to_edit_import_path": "Impossible de modifier le chemin d'importation",
"unable_to_empty_trash": "Impossible de vider la corbeille", "unable_to_empty_trash": "Impossible de vider la corbeille",
"unable_to_enter_fullscreen": "Mode plein écran indisponible", "unable_to_enter_fullscreen": "Mode plein écran indisponible",
"unable_to_exit_fullscreen": "Impossible de sortir du mode plein écran", "unable_to_exit_fullscreen": "Impossible de sortir du mode plein écran",
@@ -1056,6 +1061,7 @@
"unable_to_update_user": "Impossible de mettre à jour l'utilisateur", "unable_to_update_user": "Impossible de mettre à jour l'utilisateur",
"unable_to_upload_file": "Impossible d'envoyer le fichier" "unable_to_upload_file": "Impossible d'envoyer le fichier"
}, },
"exclusion_pattern": "Schéma d'exclusion",
"exif": "Exif", "exif": "Exif",
"exif_bottom_sheet_description": "Ajouter une description...", "exif_bottom_sheet_description": "Ajouter une description...",
"exif_bottom_sheet_description_error": "Erreur de mise à jour de la description", "exif_bottom_sheet_description_error": "Erreur de mise à jour de la description",
@@ -1115,6 +1121,7 @@
"folders_feature_description": "Parcourir l'affichage par dossiers pour les photos et les vidéos sur le système de fichiers", "folders_feature_description": "Parcourir l'affichage par dossiers pour les photos et les vidéos sur le système de fichiers",
"forgot_pin_code_question": "Code PIN oublié ?", "forgot_pin_code_question": "Code PIN oublié ?",
"forward": "Avant", "forward": "Avant",
"full_path": "Chemin complet : {path}",
"gcast_enabled": "Diffusion Google Cast", "gcast_enabled": "Diffusion Google Cast",
"gcast_enabled_description": "Cette fonctionnalité charge des ressources externes depuis Google pour fonctionner.", "gcast_enabled_description": "Cette fonctionnalité charge des ressources externes depuis Google pour fonctionner.",
"general": "Général", "general": "Général",
@@ -1196,6 +1203,8 @@
"import_path": "Chemin d'importation", "import_path": "Chemin d'importation",
"in_albums": "Dans {count, plural, one {# album} other {# albums}}", "in_albums": "Dans {count, plural, one {# album} other {# albums}}",
"in_archive": "Dans les archives", "in_archive": "Dans les archives",
"in_year": "Dans {year}",
"in_year_selector": "Dans",
"include_archived": "Inclure les archives", "include_archived": "Inclure les archives",
"include_shared_albums": "Inclure les albums partagés", "include_shared_albums": "Inclure les albums partagés",
"include_shared_partner_assets": "Inclure les médias partagés du partenaire", "include_shared_partner_assets": "Inclure les médias partagés du partenaire",
@@ -1232,6 +1241,7 @@
"language_setting_description": "Sélectionnez votre langue préférée", "language_setting_description": "Sélectionnez votre langue préférée",
"large_files": "Fichiers volumineux", "large_files": "Fichiers volumineux",
"last": "Dernier", "last": "Dernier",
"last_months": "{count, plural, one {Dernier mois} other {Derniers # mois}}",
"last_seen": "Dernièrement utilisé", "last_seen": "Dernièrement utilisé",
"latest_version": "Dernière version", "latest_version": "Dernière version",
"latitude": "Latitude", "latitude": "Latitude",
@@ -1241,6 +1251,8 @@
"let_others_respond": "Laisser les autres réagir", "let_others_respond": "Laisser les autres réagir",
"level": "Niveau", "level": "Niveau",
"library": "Bibliothèque", "library": "Bibliothèque",
"library_add_folder": "Ajouter un dossier",
"library_edit_folder": "Modifier un dossier",
"library_options": "Options de bibliothèque", "library_options": "Options de bibliothèque",
"library_page_device_albums": "Albums sur l'appareil", "library_page_device_albums": "Albums sur l'appareil",
"library_page_new_album": "Nouvel album", "library_page_new_album": "Nouvel album",
@@ -1312,8 +1324,17 @@
"loop_videos_description": "Activer pour voir la vidéo en boucle dans le lecteur détaillé.", "loop_videos_description": "Activer pour voir la vidéo en boucle dans le lecteur détaillé.",
"main_branch_warning": "Vous utilisez une version de développement. Nous vous recommandons fortement d'utiliser une version stable!", "main_branch_warning": "Vous utilisez une version de développement. Nous vous recommandons fortement d'utiliser une version stable!",
"main_menu": "Menu principal", "main_menu": "Menu principal",
"maintenance_description": "Immich a été mis en <link>mode maintenance</link>.",
"maintenance_end": "Arrêter le mode maintenance",
"maintenance_end_error": "Échec de l'arrêt du mode maintenance.",
"maintenance_logged_in_as": "Actuellement connecté en tant que {user}",
"maintenance_title": "Temporairement non disponible",
"make": "Marque", "make": "Marque",
"manage_geolocation": "Gérer la localisation", "manage_geolocation": "Gérer la localisation",
"manage_media_access_rationale": "Cette autorisation est nécessaire pour gérer correctement le déplacement de médias vers la corbeille et la restauration depuis celle-ci.",
"manage_media_access_settings": "Ouvrir les paramètres",
"manage_media_access_subtitle": "Autoriser l'application Immich à gérer et déplacer des fichiers de média.",
"manage_media_access_title": "Accès à la gestion de médias",
"manage_shared_links": "Gérer les liens partagés", "manage_shared_links": "Gérer les liens partagés",
"manage_sharing_with_partners": "Gérer le partage avec les partenaires", "manage_sharing_with_partners": "Gérer le partage avec les partenaires",
"manage_the_app_settings": "Gérer les paramètres de l'application", "manage_the_app_settings": "Gérer les paramètres de l'application",
@@ -1377,6 +1398,7 @@
"more": "Plus", "more": "Plus",
"move": "Déplacer", "move": "Déplacer",
"move_off_locked_folder": "Déplacer en dehors du dossier verrouillé", "move_off_locked_folder": "Déplacer en dehors du dossier verrouillé",
"move_to": "Déplacer vers",
"move_to_lock_folder_action_prompt": "{count} ajouté(s) au dossier verrouillé", "move_to_lock_folder_action_prompt": "{count} ajouté(s) au dossier verrouillé",
"move_to_locked_folder": "Déplacer dans le dossier verrouillé", "move_to_locked_folder": "Déplacer dans le dossier verrouillé",
"move_to_locked_folder_confirmation": "Ces photos et vidéos seront retirées de tous les albums et ne seront visibles que dans le dossier verrouillé", "move_to_locked_folder_confirmation": "Ces photos et vidéos seront retirées de tous les albums et ne seront visibles que dans le dossier verrouillé",
@@ -1406,6 +1428,7 @@
"new_pin_code": "Nouveau code PIN", "new_pin_code": "Nouveau code PIN",
"new_pin_code_subtitle": "C'est votre premier accès au dossier verrouillé. Créez un code PIN pour sécuriser l'accès à cette page", "new_pin_code_subtitle": "C'est votre premier accès au dossier verrouillé. Créez un code PIN pour sécuriser l'accès à cette page",
"new_timeline": "Nouvelle vue chronologique", "new_timeline": "Nouvelle vue chronologique",
"new_update": "Nouvelle mise à jour",
"new_user_created": "Nouvel utilisateur créé", "new_user_created": "Nouvel utilisateur créé",
"new_version_available": "NOUVELLE VERSION DISPONIBLE", "new_version_available": "NOUVELLE VERSION DISPONIBLE",
"newest_first": "Récents en premier", "newest_first": "Récents en premier",
@@ -1421,12 +1444,14 @@
"no_cast_devices_found": "Aucun appareil de diffusion trouvé", "no_cast_devices_found": "Aucun appareil de diffusion trouvé",
"no_checksum_local": "Aucune empreinte numerique disponible - impossible de récupérer les médias locaux", "no_checksum_local": "Aucune empreinte numerique disponible - impossible de récupérer les médias locaux",
"no_checksum_remote": "Aucune empreinte numérique disponible - impossible de récupérer les médias distants", "no_checksum_remote": "Aucune empreinte numérique disponible - impossible de récupérer les médias distants",
"no_devices": "Aucun appareil autorisé",
"no_duplicates_found": "Aucun doublon n'a été trouvé.", "no_duplicates_found": "Aucun doublon n'a été trouvé.",
"no_exif_info_available": "Aucune information exif disponible", "no_exif_info_available": "Aucune information exif disponible",
"no_explore_results_message": "Envoyez plus de photos pour explorer votre bibliothèque.", "no_explore_results_message": "Envoyez plus de photos pour explorer votre bibliothèque.",
"no_favorites_message": "Ajouter des photos et vidéos à vos favoris pour les retrouver plus rapidement", "no_favorites_message": "Ajouter des photos et vidéos à vos favoris pour les retrouver plus rapidement",
"no_libraries_message": "Créer une bibliothèque externe pour voir vos photos et vidéos dans un autre espace de stockage", "no_libraries_message": "Créer une bibliothèque externe pour voir vos photos et vidéos dans un autre espace de stockage",
"no_local_assets_found": "Aucun média local trouvé avec cette empreinte numerique", "no_local_assets_found": "Aucun média local trouvé avec cette empreinte numerique",
"no_location_set": "Aucune localisation definie",
"no_locked_photos_message": "Les photos et vidéos du dossier verrouillé sont masqués et ne s'afficheront pas dans votre galerie ou la recherche.", "no_locked_photos_message": "Les photos et vidéos du dossier verrouillé sont masqués et ne s'afficheront pas dans votre galerie ou la recherche.",
"no_name": "Pas de nom", "no_name": "Pas de nom",
"no_notifications": "Pas de notification", "no_notifications": "Pas de notification",
@@ -1437,6 +1462,7 @@
"no_results_description": "Essayez un synonyme ou un mot-clé plus général", "no_results_description": "Essayez un synonyme ou un mot-clé plus général",
"no_shared_albums_message": "Créer un album pour partager vos photos et vidéos avec les personnes de votre réseau", "no_shared_albums_message": "Créer un album pour partager vos photos et vidéos avec les personnes de votre réseau",
"no_uploads_in_progress": "Pas d'envoi en cours", "no_uploads_in_progress": "Pas d'envoi en cours",
"not_allowed": "Non autorisé",
"not_available": "N/A", "not_available": "N/A",
"not_in_any_album": "Dans aucun album", "not_in_any_album": "Dans aucun album",
"not_selected": "Non sélectionné", "not_selected": "Non sélectionné",
@@ -1547,6 +1573,8 @@
"photos_count": "{count, plural, one {{count, number} Photo} other {{count, number} Photos}}", "photos_count": "{count, plural, one {{count, number} Photo} other {{count, number} Photos}}",
"photos_from_previous_years": "Photos des années précédentes", "photos_from_previous_years": "Photos des années précédentes",
"pick_a_location": "Choisissez une localisation", "pick_a_location": "Choisissez une localisation",
"pick_custom_range": "Période personnalisée",
"pick_date_range": "Sélectionner une période de dates",
"pin_code_changed_successfully": "Code PIN changé avec succès", "pin_code_changed_successfully": "Code PIN changé avec succès",
"pin_code_reset_successfully": "Réinitialisation du code PIN réussie", "pin_code_reset_successfully": "Réinitialisation du code PIN réussie",
"pin_code_setup_successfully": "Définition du code PIN réussie", "pin_code_setup_successfully": "Définition du code PIN réussie",
@@ -1814,6 +1842,8 @@
"server_offline": "Serveur hors ligne", "server_offline": "Serveur hors ligne",
"server_online": "Serveur en ligne", "server_online": "Serveur en ligne",
"server_privacy": "Vie privée pour le serveur", "server_privacy": "Vie privée pour le serveur",
"server_restarting_description": "Cette page va se rafraîchir dans quelques instants.",
"server_restarting_title": "Le serveur redémarre",
"server_stats": "Statistiques du serveur", "server_stats": "Statistiques du serveur",
"server_update_available": "Une mise à jour du serveur est disponible", "server_update_available": "Une mise à jour du serveur est disponible",
"server_version": "Version du serveur", "server_version": "Version du serveur",
@@ -2027,6 +2057,7 @@
"third_party_resources": "Ressources tierces", "third_party_resources": "Ressources tierces",
"time": "Horaire", "time": "Horaire",
"time_based_memories": "Souvenirs basés sur la date", "time_based_memories": "Souvenirs basés sur la date",
"time_based_memories_duration": "Durée en secondes d'affichage de chaque image.",
"timeline": "Vue chronologique", "timeline": "Vue chronologique",
"timezone": "Fuseau horaire", "timezone": "Fuseau horaire",
"to_archive": "Archiver", "to_archive": "Archiver",
@@ -2167,6 +2198,7 @@
"welcome": "Bienvenue", "welcome": "Bienvenue",
"welcome_to_immich": "Bienvenue sur Immich", "welcome_to_immich": "Bienvenue sur Immich",
"wifi_name": "Nom du réseau wifi", "wifi_name": "Nom du réseau wifi",
"workflow": "Flux de travail",
"wrong_pin_code": "Code PIN erroné", "wrong_pin_code": "Code PIN erroné",
"year": "Année", "year": "Année",
"years_ago": "Il y a {years, plural, one {# an} other {# ans}}", "years_ago": "Il y a {years, plural, one {# an} other {# ans}}",
+1
View File
@@ -0,0 +1 @@
{}
+61 -16
View File
@@ -17,7 +17,6 @@
"add_birthday": "Engadir cumpreanos", "add_birthday": "Engadir cumpreanos",
"add_endpoint": "Engadir punto final", "add_endpoint": "Engadir punto final",
"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_location": "Engadir localización", "add_location": "Engadir localización",
"add_more_users": "Engadir máis usuarios", "add_more_users": "Engadir máis usuarios",
"add_partner": "Engadir compañeiro/a", "add_partner": "Engadir compañeiro/a",
@@ -32,6 +31,7 @@
"add_to_album_toggle": "Alternar selección para {album}", "add_to_album_toggle": "Alternar selección para {album}",
"add_to_albums": "Engadir a álbums", "add_to_albums": "Engadir a álbums",
"add_to_albums_count": "Engadir a {count} álbums", "add_to_albums_count": "Engadir a {count} álbums",
"add_to_bottom_bar": "Engadir a",
"add_to_shared_album": "Engadir ao álbum compartido", "add_to_shared_album": "Engadir ao álbum compartido",
"add_upload_to_stack": "Engade cargar á pila", "add_upload_to_stack": "Engade cargar á pila",
"add_url": "Engadir URL", "add_url": "Engadir URL",
@@ -112,7 +112,6 @@
"jobs_failed": "{jobCount, plural, other {# fallados}}", "jobs_failed": "{jobCount, plural, other {# fallados}}",
"library_created": "Biblioteca creada: {library}", "library_created": "Biblioteca creada: {library}",
"library_deleted": "Biblioteca eliminada", "library_deleted": "Biblioteca eliminada",
"library_import_path_description": "Especifique un cartafol para importar. Este cartafol, incluídos os subcartafoles, escanearase en busca de imaxes e vídeos.",
"library_scanning": "Escaneo periódico", "library_scanning": "Escaneo periódico",
"library_scanning_description": "Configurar o escaneo periódico da biblioteca", "library_scanning_description": "Configurar o escaneo periódico da biblioteca",
"library_scanning_enable_description": "Activar o escaneo periódico da biblioteca", "library_scanning_enable_description": "Activar o escaneo periódico da biblioteca",
@@ -120,7 +119,7 @@
"library_settings_description": "Xestionar a configuración da biblioteca externa", "library_settings_description": "Xestionar a configuración da biblioteca externa",
"library_tasks_description": "Escanear bibliotecas externas en busca de activos novos e/ou modificados", "library_tasks_description": "Escanear bibliotecas externas en busca de activos novos e/ou modificados",
"library_watching_enable_description": "Vixiar bibliotecas externas para detectar cambios nos ficheiros", "library_watching_enable_description": "Vixiar bibliotecas externas para detectar cambios nos ficheiros",
"library_watching_settings": "Vixilancia da biblioteca (EXPERIMENTAL)", "library_watching_settings": "Vixilancia da biblioteca [EXPERIMENTAL]",
"library_watching_settings_description": "Vixiar automaticamente os ficheiros modificados", "library_watching_settings_description": "Vixiar automaticamente os ficheiros modificados",
"logging_enable_description": "Activar rexistro", "logging_enable_description": "Activar rexistro",
"logging_level_description": "Cando estea activado, que nivel de rexistro usar.", "logging_level_description": "Cando estea activado, que nivel de rexistro usar.",
@@ -154,6 +153,18 @@
"machine_learning_min_detection_score_description": "Puntuación mínima de confianza para que unha cara sexa detectada, de 0 a 1. Valores máis baixos detectarán máis caras pero poden resultar en falsos positivos.", "machine_learning_min_detection_score_description": "Puntuación mínima de confianza para que unha cara sexa detectada, de 0 a 1. Valores máis baixos detectarán máis caras pero poden resultar en falsos positivos.",
"machine_learning_min_recognized_faces": "Mínimo de caras recoñecidas", "machine_learning_min_recognized_faces": "Mínimo de caras recoñecidas",
"machine_learning_min_recognized_faces_description": "O número mínimo de caras recoñecidas para que se cree unha persoa. Aumentar isto fai que o Recoñecemento Facial sexa máis preciso a costa de aumentar a posibilidade de que unha cara non se asigne a unha persoa.", "machine_learning_min_recognized_faces_description": "O número mínimo de caras recoñecidas para que se cree unha persoa. Aumentar isto fai que o Recoñecemento Facial sexa máis preciso a costa de aumentar a posibilidade de que unha cara non se asigne a unha persoa.",
"machine_learning_ocr": "OCR",
"machine_learning_ocr_description": "Emprega aprendizaxe automática para recoñecer texto en imaxes",
"machine_learning_ocr_enabled": "Activa o OCR",
"machine_learning_ocr_enabled_description": "Se está desactivado, as imaxes non se someterán a recoñecemento de texto.",
"machine_learning_ocr_max_resolution": "Resolución máxima",
"machine_learning_ocr_max_resolution_description": "As previsualizacións por enriba desta resolución redimensionaranse mantendo a proporción. Os valores máis altos son máis precisos, pero tardan máis en procesarse e usan máis memoria.",
"machine_learning_ocr_min_detection_score": "Puntuación mínima de detección",
"machine_learning_ocr_min_detection_score_description": "Puntuación mínima de confianza para que o texto sexa detectado, de 0 a 1. Os valores máis baixos detectarán máis texto, pero poden producir falsos positivos.",
"machine_learning_ocr_min_recognition_score": "Puntuación mínima de recoñecemento",
"machine_learning_ocr_min_score_recognition_description": "Puntuación mínima de confianza para que o texto detectado sexa recoñecido, de 0 a 1. Os valores máis baixos recoñecerán máis texto, pero poden producir falsos positivos.",
"machine_learning_ocr_model": "Modelo OCR",
"machine_learning_ocr_model_description": "Os modelos de servidor son máis precisos que os modelos móbiles, pero tardan máis en procesarse e usan máis memoria.",
"machine_learning_settings": "Configuración da Aprendizaxe Automática", "machine_learning_settings": "Configuración da Aprendizaxe Automática",
"machine_learning_settings_description": "Xestionar funcións e configuracións da aprendizaxe automática", "machine_learning_settings_description": "Xestionar funcións e configuracións da aprendizaxe automática",
"machine_learning_smart_search": "Busca Intelixente", "machine_learning_smart_search": "Busca Intelixente",
@@ -245,6 +256,7 @@
"oauth_storage_quota_default_description": "Cota en GiB a empregar cando non se proporciona ningunha declaración.", "oauth_storage_quota_default_description": "Cota en GiB a empregar cando non se proporciona ningunha declaración.",
"oauth_timeout": "Tempo máximo de espera da solicitude", "oauth_timeout": "Tempo máximo de espera da solicitude",
"oauth_timeout_description": "Tempo máximo de espera para as solicitudes en milisegundos", "oauth_timeout_description": "Tempo máximo de espera para as solicitudes en milisegundos",
"ocr_job_description": "Emprega aprendizaxe automática para recoñecer texto en imaxes",
"password_enable_description": "Iniciar sesión con correo electrónico e contrasinal", "password_enable_description": "Iniciar sesión con correo electrónico e contrasinal",
"password_settings": "Inicio de sesión con contrasinal", "password_settings": "Inicio de sesión con contrasinal",
"password_settings_description": "Xestionar a configuración de inicio de sesión con contrasinal", "password_settings_description": "Xestionar a configuración de inicio de sesión con contrasinal",
@@ -404,11 +416,11 @@
"advanced_settings_prefer_remote_subtitle": "Algúns dispositivos tardan moito en cargar as miniaturas de ficheiros locais. Active esta opción para cargar imaxes remotas no seu lugar.", "advanced_settings_prefer_remote_subtitle": "Algúns dispositivos tardan moito en cargar as miniaturas de ficheiros locais. Active esta opción para cargar imaxes remotas no seu lugar.",
"advanced_settings_prefer_remote_title": "Preferir imaxes remotas", "advanced_settings_prefer_remote_title": "Preferir imaxes remotas",
"advanced_settings_proxy_headers_subtitle": "Definir cabeceiras de proxy que Immich debería enviar con cada solicitude de rede", "advanced_settings_proxy_headers_subtitle": "Definir cabeceiras de proxy que Immich debería enviar con cada solicitude de rede",
"advanced_settings_proxy_headers_title": "Cabeceiras de Proxy", "advanced_settings_proxy_headers_title": "Cabeceiras de proxy personalizadas [EXPERIMENTAL]",
"advanced_settings_readonly_mode_subtitle": "Activa o modo de só lectura, no que as fotos só se poden visualizar; opcións como seleccionar varias imaxes, compartir, enviar a outros dispositivos ou eliminar están deshabilitadas. Active/desactive o modo de só lectura a través do avatar do usuario na pantalla principal", "advanced_settings_readonly_mode_subtitle": "Activa o modo de só lectura, no que as fotos só se poden visualizar; opcións como seleccionar varias imaxes, compartir, enviar a outros dispositivos ou eliminar están deshabilitadas. Active/desactive o modo de só lectura a través do avatar do usuario na pantalla principal",
"advanced_settings_readonly_mode_title": "Modo de só lectura", "advanced_settings_readonly_mode_title": "Modo de só lectura",
"advanced_settings_self_signed_ssl_subtitle": "Omite a verificación do certificado SSL para o punto final do servidor. Requirido para certificados autofirmados.", "advanced_settings_self_signed_ssl_subtitle": "Omite a verificación do certificado SSL para o punto final do servidor. Requirido para certificados autofirmados.",
"advanced_settings_self_signed_ssl_title": "Permitir certificados SSL autofirmados", "advanced_settings_self_signed_ssl_title": "Permitir certificados SSL autofirmados [EXPERIMENTAL]",
"advanced_settings_sync_remote_deletions_subtitle": "Eliminar ou restaurar automaticamente un activo neste dispositivo cando esa acción se realiza na web", "advanced_settings_sync_remote_deletions_subtitle": "Eliminar ou restaurar automaticamente un activo neste dispositivo cando esa acción se realiza na web",
"advanced_settings_sync_remote_deletions_title": "Sincronizar eliminacións remotas [EXPERIMENTAL]", "advanced_settings_sync_remote_deletions_title": "Sincronizar eliminacións remotas [EXPERIMENTAL]",
"advanced_settings_tile_subtitle": "Configuración de usuario avanzado", "advanced_settings_tile_subtitle": "Configuración de usuario avanzado",
@@ -417,6 +429,7 @@
"age_months": "Idade: {months, plural, one {# mes} other {# meses}}", "age_months": "Idade: {months, plural, one {# mes} other {# meses}}",
"age_year_months": "Idade: 1 ano e {months, plural, one {# mes} other {# meses}}", "age_year_months": "Idade: 1 ano e {months, plural, one {# mes} other {# meses}}",
"age_years": "Idade: {years, plural, one {# ano} other {# anos}}", "age_years": "Idade: {years, plural, one {# ano} other {# anos}}",
"album": "Álbum",
"album_added": "Álbum engadido", "album_added": "Álbum engadido",
"album_added_notification_setting_description": "Recibir unha notificación por correo electrónico cando sexa engadido a un álbum compartido", "album_added_notification_setting_description": "Recibir unha notificación por correo electrónico cando sexa engadido a un álbum compartido",
"album_cover_updated": "Portada do álbum actualizada", "album_cover_updated": "Portada do álbum actualizada",
@@ -462,6 +475,7 @@
"allow_edits": "Permitir edicións", "allow_edits": "Permitir edicións",
"allow_public_user_to_download": "Permitir que o usuario público descargue", "allow_public_user_to_download": "Permitir que o usuario público descargue",
"allow_public_user_to_upload": "Permitir que o usuario público cargue", "allow_public_user_to_upload": "Permitir que o usuario público cargue",
"allowed": "Permitido",
"alt_text_qr_code": "Imaxe de código QR", "alt_text_qr_code": "Imaxe de código QR",
"anti_clockwise": "Sentido antihorario", "anti_clockwise": "Sentido antihorario",
"api_key": "Chave API", "api_key": "Chave API",
@@ -474,6 +488,8 @@
"app_bar_signout_dialog_title": "Pechar sesión", "app_bar_signout_dialog_title": "Pechar sesión",
"app_download_links": "Ligazóns de Descarga da Aplicación", "app_download_links": "Ligazóns de Descarga da Aplicación",
"app_settings": "Configuración da Aplicación", "app_settings": "Configuración da Aplicación",
"app_stores": "Tendas de aplicacións",
"app_update_available": "Hai unha actualización da aplicación dispoñible",
"appears_in": "Aparece en", "appears_in": "Aparece en",
"apply_count": "Aplicar ({count, number})", "apply_count": "Aplicar ({count, number})",
"archive": "Arquivo", "archive": "Arquivo",
@@ -557,6 +573,7 @@
"backup_albums_sync": "Sincronización de álbums da copia de seguridade", "backup_albums_sync": "Sincronización de álbums da copia de seguridade",
"backup_all": "Todo", "backup_all": "Todo",
"backup_background_service_backup_failed_message": "Erro ao facer copia de seguridade dos activos. Reintentando…", "backup_background_service_backup_failed_message": "Erro ao facer copia de seguridade dos activos. Reintentando…",
"backup_background_service_complete_notification": "Copia de seguridade dos recursos completada",
"backup_background_service_connection_failed_message": "Erro ao conectar co servidor. Reintentando…", "backup_background_service_connection_failed_message": "Erro ao conectar co servidor. Reintentando…",
"backup_background_service_current_upload_notification": "Subindo {filename}", "backup_background_service_current_upload_notification": "Subindo {filename}",
"backup_background_service_default_notification": "Comprobando novos activos…", "backup_background_service_default_notification": "Comprobando novos activos…",
@@ -666,6 +683,8 @@
"change_password_description": "Esta é a primeira vez que inicia sesión no sistema ou solicitouse un cambio do seu contrasinal. Introduza o novo contrasinal a continuación.", "change_password_description": "Esta é a primeira vez que inicia sesión no sistema ou solicitouse un cambio do seu contrasinal. Introduza o novo contrasinal a continuación.",
"change_password_form_confirm_password": "Confirmar Contrasinal", "change_password_form_confirm_password": "Confirmar Contrasinal",
"change_password_form_description": "Ola {name},\n\nEsta é a primeira vez que inicia sesión no sistema ou solicitouse un cambio do seu contrasinal. Introduza o novo contrasinal a continuación.", "change_password_form_description": "Ola {name},\n\nEsta é a primeira vez que inicia sesión no sistema ou solicitouse un cambio do seu contrasinal. Introduza o novo contrasinal a continuación.",
"change_password_form_log_out": "Pechar sesión en todos os outros dispositivos",
"change_password_form_log_out_description": "Recoméndase pechar sesión en todos os outros dispositivos",
"change_password_form_new_password": "Novo Contrasinal", "change_password_form_new_password": "Novo Contrasinal",
"change_password_form_password_mismatch": "Os contrasinais non coinciden", "change_password_form_password_mismatch": "Os contrasinais non coinciden",
"change_password_form_reenter_new_password": "Reintroducir Novo Contrasinal", "change_password_form_reenter_new_password": "Reintroducir Novo Contrasinal",
@@ -692,8 +711,8 @@
"client_cert_import_success_msg": "Certificado de cliente importado", "client_cert_import_success_msg": "Certificado de cliente importado",
"client_cert_invalid_msg": "Ficheiro de certificado inválido ou contrasinal incorrecto", "client_cert_invalid_msg": "Ficheiro de certificado inválido ou contrasinal incorrecto",
"client_cert_remove_msg": "Certificado de cliente eliminado", "client_cert_remove_msg": "Certificado de cliente eliminado",
"client_cert_subtitle": "Só admite o formato PKCS12 (.p12, .pfx). A importación/eliminación de certificados está dispoñible antes de iniciar sesión", "client_cert_subtitle": "Soporta só o formato PKCS12 (.p12, .pfx). A importación ou eliminación de certificados está dispoñible antes de iniciar sesión",
"client_cert_title": "Certificado de Cliente SSL", "client_cert_title": "Certificado de cliente SSL [EXPERIMENTAL]",
"clockwise": "Sentido horario", "clockwise": "Sentido horario",
"close": "Pechar", "close": "Pechar",
"collapse": "Contraer", "collapse": "Contraer",
@@ -743,6 +762,7 @@
"create": "Crear", "create": "Crear",
"create_album": "Crear álbum", "create_album": "Crear álbum",
"create_album_page_untitled": "Sen título", "create_album_page_untitled": "Sen título",
"create_api_key": "Crear chave API",
"create_library": "Crear Biblioteca", "create_library": "Crear Biblioteca",
"create_link": "Crear ligazón", "create_link": "Crear ligazón",
"create_link_to_share": "Crear ligazón para compartir", "create_link_to_share": "Crear ligazón para compartir",
@@ -772,6 +792,7 @@
"daily_title_text_date_year": "E, dd MMM, yyyy", "daily_title_text_date_year": "E, dd MMM, yyyy",
"dark": "Escuro", "dark": "Escuro",
"dark_theme": "Alternar tema escuro", "dark_theme": "Alternar tema escuro",
"date": "Data",
"date_after": "Data posterior a", "date_after": "Data posterior a",
"date_and_time": "Data e Hora", "date_and_time": "Data e Hora",
"date_before": "Data anterior a", "date_before": "Data anterior a",
@@ -874,8 +895,6 @@
"edit_description_prompt": "Por favor, seleccione unha nova descrición:", "edit_description_prompt": "Por favor, seleccione unha nova descrición:",
"edit_exclusion_pattern": "Editar patrón de exclusión", "edit_exclusion_pattern": "Editar patrón de exclusión",
"edit_faces": "Editar caras", "edit_faces": "Editar caras",
"edit_import_path": "Editar ruta de importación",
"edit_import_paths": "Editar Rutas de Importación",
"edit_key": "Editar chave", "edit_key": "Editar chave",
"edit_link": "Editar ligazón", "edit_link": "Editar ligazón",
"edit_location": "Editar localización", "edit_location": "Editar localización",
@@ -947,7 +966,6 @@
"failed_to_stack_assets": "Erro ao apilar activos", "failed_to_stack_assets": "Erro ao apilar activos",
"failed_to_unstack_assets": "Erro ao desapilar activos", "failed_to_unstack_assets": "Erro ao desapilar activos",
"failed_to_update_notification_status": "Erro ao actualizar o estado das notificacións", "failed_to_update_notification_status": "Erro ao actualizar o estado das notificacións",
"import_path_already_exists": "Esta ruta de importación xa existe.",
"incorrect_email_or_password": "Correo electrónico ou contrasinal incorrectos", "incorrect_email_or_password": "Correo electrónico ou contrasinal incorrectos",
"paths_validation_failed": "{paths, plural, one {# ruta fallou} other {# rutas fallaron}} na validación", "paths_validation_failed": "{paths, plural, one {# ruta fallou} other {# rutas fallaron}} na validación",
"profile_picture_transparent_pixels": "As imaxes de perfil non poden ter píxeles transparentes. Por favor, faga zoom e/ou mova a imaxe.", "profile_picture_transparent_pixels": "As imaxes de perfil non poden ter píxeles transparentes. Por favor, faga zoom e/ou mova a imaxe.",
@@ -957,7 +975,6 @@
"unable_to_add_assets_to_shared_link": "Non se puideron engadir activos á ligazón compartida", "unable_to_add_assets_to_shared_link": "Non se puideron engadir activos á ligazón compartida",
"unable_to_add_comment": "Non se puido engadir o comentario", "unable_to_add_comment": "Non se puido engadir o comentario",
"unable_to_add_exclusion_pattern": "Non se puido engadir o patrón de exclusión", "unable_to_add_exclusion_pattern": "Non se puido engadir o patrón de exclusión",
"unable_to_add_import_path": "Non se puido engadir a ruta de importación",
"unable_to_add_partners": "Non se puideron engadir compañeiros/as", "unable_to_add_partners": "Non se puideron engadir compañeiros/as",
"unable_to_add_remove_archive": "Non se puido {archived, select, true {eliminar activo do} other {engadir activo ao}} arquivo", "unable_to_add_remove_archive": "Non se puido {archived, select, true {eliminar activo do} other {engadir activo ao}} arquivo",
"unable_to_add_remove_favorites": "Non se puido {favorite, select, true {engadir activo a} other {eliminar activo de}} favoritos", "unable_to_add_remove_favorites": "Non se puido {favorite, select, true {engadir activo a} other {eliminar activo de}} favoritos",
@@ -980,12 +997,10 @@
"unable_to_delete_asset": "Non se puido eliminar o activo", "unable_to_delete_asset": "Non se puido eliminar o activo",
"unable_to_delete_assets": "Erro ao eliminar activos", "unable_to_delete_assets": "Erro ao eliminar activos",
"unable_to_delete_exclusion_pattern": "Non se puido eliminar o patrón de exclusión", "unable_to_delete_exclusion_pattern": "Non se puido eliminar o patrón de exclusión",
"unable_to_delete_import_path": "Non se puido eliminar a ruta de importación",
"unable_to_delete_shared_link": "Non se puido eliminar a ligazón compartida", "unable_to_delete_shared_link": "Non se puido eliminar a ligazón compartida",
"unable_to_delete_user": "Non se puido eliminar o usuario", "unable_to_delete_user": "Non se puido eliminar o usuario",
"unable_to_download_files": "Non se puideron descargar os ficheiros", "unable_to_download_files": "Non se puideron descargar os ficheiros",
"unable_to_edit_exclusion_pattern": "Non se puido editar o patrón de exclusión", "unable_to_edit_exclusion_pattern": "Non se puido editar o patrón de exclusión",
"unable_to_edit_import_path": "Non se puido editar a ruta de importación",
"unable_to_empty_trash": "Non se puido baleirar o lixo", "unable_to_empty_trash": "Non se puido baleirar o lixo",
"unable_to_enter_fullscreen": "Non se puido entrar en pantalla completa", "unable_to_enter_fullscreen": "Non se puido entrar en pantalla completa",
"unable_to_exit_fullscreen": "Non se puido saír da pantalla completa", "unable_to_exit_fullscreen": "Non se puido saír da pantalla completa",
@@ -1080,6 +1095,7 @@
"features_setting_description": "Xestionar as funcións da aplicación", "features_setting_description": "Xestionar as funcións da aplicación",
"file_name": "Nome do ficheiro", "file_name": "Nome do ficheiro",
"file_name_or_extension": "Nome do ficheiro ou extensión", "file_name_or_extension": "Nome do ficheiro ou extensión",
"file_size": "Tamaño do arquivo",
"filename": "Nome do ficheiro", "filename": "Nome do ficheiro",
"filetype": "Tipo de ficheiro", "filetype": "Tipo de ficheiro",
"filter": "Filtro", "filter": "Filtro",
@@ -1119,7 +1135,7 @@
"hash_asset": "Facer hash do recurso", "hash_asset": "Facer hash do recurso",
"hashed_assets": "Recursos cun hash", "hashed_assets": "Recursos cun hash",
"hashing": "Aplicando hash", "hashing": "Aplicando hash",
"header_settings_add_header_tip": "Engadir Cabeceira", "header_settings_add_header_tip": "Engadir cabeceira",
"header_settings_field_validator_msg": "O valor non pode estar baleiro", "header_settings_field_validator_msg": "O valor non pode estar baleiro",
"header_settings_header_name_input": "Nome da cabeceira", "header_settings_header_name_input": "Nome da cabeceira",
"header_settings_header_value_input": "Valor da cabeceira", "header_settings_header_value_input": "Valor da cabeceira",
@@ -1175,6 +1191,8 @@
"import_path": "Ruta de importación", "import_path": "Ruta de importación",
"in_albums": "En {count, plural, one {# álbum} other {# álbums}}", "in_albums": "En {count, plural, one {# álbum} other {# álbums}}",
"in_archive": "No arquivo", "in_archive": "No arquivo",
"in_year": "No {year}",
"in_year_selector": "No",
"include_archived": "Incluír arquivados", "include_archived": "Incluír arquivados",
"include_shared_albums": "Incluír álbums compartidos", "include_shared_albums": "Incluír álbums compartidos",
"include_shared_partner_assets": "Incluír activos de compañeiro/a compartidos", "include_shared_partner_assets": "Incluír activos de compañeiro/a compartidos",
@@ -1211,6 +1229,7 @@
"language_setting_description": "Seleccione a súa lingua preferida", "language_setting_description": "Seleccione a súa lingua preferida",
"large_files": "Ficheiros Grandes", "large_files": "Ficheiros Grandes",
"last": "Último/a", "last": "Último/a",
"last_months": "{count, plural, one {O mes pasado} other {Os últimos # meses}}",
"last_seen": "Visto por última vez", "last_seen": "Visto por última vez",
"latest_version": "Última Versión", "latest_version": "Última Versión",
"latitude": "Latitude", "latitude": "Latitude",
@@ -1243,6 +1262,7 @@
"local_media_summary": "Resumo de Contido Local", "local_media_summary": "Resumo de Contido Local",
"local_network": "Rede local", "local_network": "Rede local",
"local_network_sheet_info": "A aplicación conectarase ao servidor a través desta URL cando use a rede wifi especificada", "local_network_sheet_info": "A aplicación conectarase ao servidor a través desta URL cando use a rede wifi especificada",
"location": "Localización",
"location_permission": "Permiso de localización", "location_permission": "Permiso de localización",
"location_permission_content": "Para usar a función de cambio automático, Immich necesita permiso de localización precisa para poder ler o nome da rede wifi actual", "location_permission_content": "Para usar a función de cambio automático, Immich necesita permiso de localización precisa para poder ler o nome da rede wifi actual",
"location_picker_choose_on_map": "Elixir no mapa", "location_picker_choose_on_map": "Elixir no mapa",
@@ -1292,6 +1312,10 @@
"main_menu": "Menú principal", "main_menu": "Menú principal",
"make": "Marca", "make": "Marca",
"manage_geolocation": "Xestionar a localización", "manage_geolocation": "Xestionar a localización",
"manage_media_access_rationale": "Requírese este permiso para xestionar correctamente o traslado dos recursos ao lixo e a súa restauración desde el.",
"manage_media_access_settings": "Abrir axustes",
"manage_media_access_subtitle": "Permitir que a aplicación Immich xestione e mova ficheiros multimedia.",
"manage_media_access_title": "Acceso á xestión de medios",
"manage_shared_links": "Xestionar ligazóns compartidas", "manage_shared_links": "Xestionar ligazóns compartidas",
"manage_sharing_with_partners": "Xestionar compartición con compañeiros/as", "manage_sharing_with_partners": "Xestionar compartición con compañeiros/as",
"manage_the_app_settings": "Xestionar a configuración da aplicación", "manage_the_app_settings": "Xestionar a configuración da aplicación",
@@ -1348,13 +1372,14 @@
"minutes": "Minutos", "minutes": "Minutos",
"missing": "Faltantes", "missing": "Faltantes",
"mobile_app": "Aplicación Móbil", "mobile_app": "Aplicación Móbil",
"mobile_app_download_onboarding_note": "Podes acceder a estas opcións de novo dende a páxina de Utilidades.", "mobile_app_download_onboarding_note": "Descarga a aplicación móbil complementaria usando as seguintes opcións",
"model": "Modelo", "model": "Modelo",
"month": "Mes", "month": "Mes",
"monthly_title_text_date_format": "MMMM a", "monthly_title_text_date_format": "MMMM a",
"more": "Máis", "more": "Máis",
"move": "Mover", "move": "Mover",
"move_off_locked_folder": "Mover fóra do cartafol bloqueado", "move_off_locked_folder": "Mover fóra do cartafol bloqueado",
"move_to": "Mover a",
"move_to_lock_folder_action_prompt": "{count} engadido/a ao cartafol bloqueado", "move_to_lock_folder_action_prompt": "{count} engadido/a ao cartafol bloqueado",
"move_to_locked_folder": "Mover ao cartafol bloqueado", "move_to_locked_folder": "Mover ao cartafol bloqueado",
"move_to_locked_folder_confirmation": "Estas fotos e vídeo eliminaranse de todos os álbums e só serán visíbeis dende o cartafol bloqueado", "move_to_locked_folder_confirmation": "Estas fotos e vídeo eliminaranse de todos os álbums e só serán visíbeis dende o cartafol bloqueado",
@@ -1384,6 +1409,7 @@
"new_pin_code": "Novo código PIN", "new_pin_code": "Novo código PIN",
"new_pin_code_subtitle": "Esta é a túa primeira vez accedendo á carpeta segura. Crea un código PIN para acceder de maneira segura a esta páxina", "new_pin_code_subtitle": "Esta é a túa primeira vez accedendo á carpeta segura. Crea un código PIN para acceder de maneira segura a esta páxina",
"new_timeline": "Nova liña de tempo", "new_timeline": "Nova liña de tempo",
"new_update": "Nova actualización",
"new_user_created": "Novo usuario creado", "new_user_created": "Novo usuario creado",
"new_version_available": "NOVA VERSIÓN DISPOÑIBLE", "new_version_available": "NOVA VERSIÓN DISPOÑIBLE",
"newest_first": "Máis recentes primeiro", "newest_first": "Máis recentes primeiro",
@@ -1399,6 +1425,7 @@
"no_cast_devices_found": "Non se atoparon dispositivos de transmisión", "no_cast_devices_found": "Non se atoparon dispositivos de transmisión",
"no_checksum_local": "Non hai suma de verificación dispoñible - non se poden obter os activos locais", "no_checksum_local": "Non hai suma de verificación dispoñible - non se poden obter os activos locais",
"no_checksum_remote": "Non hai suma de verificación dispoñible - non se pode obter o activo remoto", "no_checksum_remote": "Non hai suma de verificación dispoñible - non se pode obter o activo remoto",
"no_devices": "Dispositivos non autorizados",
"no_duplicates_found": "Non se atoparon duplicados.", "no_duplicates_found": "Non se atoparon duplicados.",
"no_exif_info_available": "Non hai información EXIF dispoñible", "no_exif_info_available": "Non hai información EXIF dispoñible",
"no_explore_results_message": "Suba máis fotos para explorar a súa colección.", "no_explore_results_message": "Suba máis fotos para explorar a súa colección.",
@@ -1415,6 +1442,7 @@
"no_results_description": "Probe cun sinónimo ou palabra chave máis xeral", "no_results_description": "Probe cun sinónimo ou palabra chave máis xeral",
"no_shared_albums_message": "Cree un álbum para compartir fotos e vídeos con persoas na súa rede", "no_shared_albums_message": "Cree un álbum para compartir fotos e vídeos con persoas na súa rede",
"no_uploads_in_progress": "Non hai cargas en curso", "no_uploads_in_progress": "Non hai cargas en curso",
"not_allowed": "Non permitido",
"not_available": "Non dispoñible", "not_available": "Non dispoñible",
"not_in_any_album": "Non está en ningún álbum", "not_in_any_album": "Non está en ningún álbum",
"not_selected": "Non seleccionado", "not_selected": "Non seleccionado",
@@ -1430,7 +1458,8 @@
"notifications_setting_description": "Xestionar notificacións", "notifications_setting_description": "Xestionar notificacións",
"oauth": "OAuth", "oauth": "OAuth",
"obtainium_configurator": "Configurador de Obtainium", "obtainium_configurator": "Configurador de Obtainium",
"obtainium_configurator_instructions": "Por favor, crea unha chave API e selecciona unha variante para xerar a túa ligazón de configuración de Obtainium.", "obtainium_configurator_instructions": "Emprega Obtainium para instalar e actualizar a aplicación de Android directamente desde o lanzamento do GitHub de Immich. Crea unha chave API e selecciona unha variante para xerar o teu enlace de configuración de Obtainium",
"ocr": "OCR",
"official_immich_resources": "Recursos Oficiais de Immich", "official_immich_resources": "Recursos Oficiais de Immich",
"offline": "Fóra de liña", "offline": "Fóra de liña",
"offset": "Desprazamento", "offset": "Desprazamento",
@@ -1524,6 +1553,8 @@
"photos_count": "{count, plural, one {{count, number} Foto} other {{count, number} Fotos}}", "photos_count": "{count, plural, one {{count, number} Foto} other {{count, number} Fotos}}",
"photos_from_previous_years": "Fotos de anos anteriores", "photos_from_previous_years": "Fotos de anos anteriores",
"pick_a_location": "Elixir unha localización", "pick_a_location": "Elixir unha localización",
"pick_custom_range": "Rango personalizado",
"pick_date_range": "Seleccionar un rango de datas",
"pin_code_changed_successfully": "Código PIN cambiado correctamente", "pin_code_changed_successfully": "Código PIN cambiado correctamente",
"pin_code_reset_successfully": "Código PIN restablecido correctamente", "pin_code_reset_successfully": "Código PIN restablecido correctamente",
"pin_code_setup_successfully": "Código PIN configurado correctamente", "pin_code_setup_successfully": "Código PIN configurado correctamente",
@@ -1535,6 +1566,9 @@
"play_memories": "Reproducir recordos", "play_memories": "Reproducir recordos",
"play_motion_photo": "Reproducir Foto en Movemento", "play_motion_photo": "Reproducir Foto en Movemento",
"play_or_pause_video": "Reproducir ou pausar vídeo", "play_or_pause_video": "Reproducir ou pausar vídeo",
"play_original_video": "Reproducir o vídeo orixinal",
"play_original_video_setting_description": "Preferir a reprodución dos vídeos orixinais en vez dos vídeos transcodificados. Se o recurso orixinal non é compatible, pode que non se reproduza correctamente.",
"play_transcoded_video": "Reproducir vídeo transcodificado",
"please_auth_to_access": "Por favor, autentícate para acceder", "please_auth_to_access": "Por favor, autentícate para acceder",
"port": "Porto", "port": "Porto",
"preferences_settings_subtitle": "Xestionar as preferencias da aplicación", "preferences_settings_subtitle": "Xestionar as preferencias da aplicación",
@@ -1671,6 +1705,7 @@
"reset_sqlite_confirmation": "Estás seguro de que queres restablecer a base de datos SQLite? Terás que pechar a sesión e iniciar sesión de novo para sincronizar os datos outra vez", "reset_sqlite_confirmation": "Estás seguro de que queres restablecer a base de datos SQLite? Terás que pechar a sesión e iniciar sesión de novo para sincronizar os datos outra vez",
"reset_sqlite_success": "Base de datos SQLite restablecida correctamente", "reset_sqlite_success": "Base de datos SQLite restablecida correctamente",
"reset_to_default": "Restablecer ao predeterminado", "reset_to_default": "Restablecer ao predeterminado",
"resolution": "Resolución",
"resolve_duplicates": "Resolver duplicados", "resolve_duplicates": "Resolver duplicados",
"resolved_all_duplicates": "Resolvéronse todos os duplicados", "resolved_all_duplicates": "Resolvéronse todos os duplicados",
"restore": "Restaurar", "restore": "Restaurar",
@@ -1689,6 +1724,7 @@
"running": "Executándose", "running": "Executándose",
"save": "Gardar", "save": "Gardar",
"save_to_gallery": "Gardar na galería", "save_to_gallery": "Gardar na galería",
"saved": "Gardo",
"saved_api_key": "Chave API gardada", "saved_api_key": "Chave API gardada",
"saved_profile": "Perfil gardado", "saved_profile": "Perfil gardado",
"saved_settings": "Configuración gardada", "saved_settings": "Configuración gardada",
@@ -1705,6 +1741,9 @@
"search_by_description_example": "Día de sendeirismo en Sapa", "search_by_description_example": "Día de sendeirismo en Sapa",
"search_by_filename": "Buscar por nome de ficheiro ou extensión", "search_by_filename": "Buscar por nome de ficheiro ou extensión",
"search_by_filename_example": "p. ex. IMG_1234.JPG ou PNG", "search_by_filename_example": "p. ex. IMG_1234.JPG ou PNG",
"search_by_ocr": "Buscar mediante OCR",
"search_by_ocr_example": "Latte",
"search_camera_lens_model": "Buscar modelo de lente...",
"search_camera_make": "Buscar marca de cámara...", "search_camera_make": "Buscar marca de cámara...",
"search_camera_model": "Buscar modelo de cámara...", "search_camera_model": "Buscar modelo de cámara...",
"search_city": "Buscar cidade...", "search_city": "Buscar cidade...",
@@ -1721,6 +1760,7 @@
"search_filter_location_title": "Seleccionar localización", "search_filter_location_title": "Seleccionar localización",
"search_filter_media_type": "Tipo de Medio", "search_filter_media_type": "Tipo de Medio",
"search_filter_media_type_title": "Seleccionar tipo de medio", "search_filter_media_type_title": "Seleccionar tipo de medio",
"search_filter_ocr": "Buscar por OCR",
"search_filter_people_title": "Seleccionar persoas", "search_filter_people_title": "Seleccionar persoas",
"search_for": "Buscar por", "search_for": "Buscar por",
"search_for_existing_person": "Buscar persoa existente", "search_for_existing_person": "Buscar persoa existente",
@@ -1783,6 +1823,7 @@
"server_online": "Servidor En Liña", "server_online": "Servidor En Liña",
"server_privacy": "Privacidade do Servidor", "server_privacy": "Privacidade do Servidor",
"server_stats": "Estatísticas do Servidor", "server_stats": "Estatísticas do Servidor",
"server_update_available": "Hai unha actualización do servidor dispoñible",
"server_version": "Versión do Servidor", "server_version": "Versión do Servidor",
"set": "Establecer", "set": "Establecer",
"set_as_album_cover": "Establecer como portada do álbum", "set_as_album_cover": "Establecer como portada do álbum",
@@ -1992,7 +2033,9 @@
"theme_setting_three_stage_loading_title": "Activar carga en tres etapas", "theme_setting_three_stage_loading_title": "Activar carga en tres etapas",
"they_will_be_merged_together": "Fusionaranse xuntos", "they_will_be_merged_together": "Fusionaranse xuntos",
"third_party_resources": "Recursos de Terceiros", "third_party_resources": "Recursos de Terceiros",
"time": "Hora",
"time_based_memories": "Recordos baseados no tempo", "time_based_memories": "Recordos baseados no tempo",
"time_based_memories_duration": "Número de segundos para mostrar cada imaxe.",
"timeline": "Liña de tempo", "timeline": "Liña de tempo",
"timezone": "Fuso horario", "timezone": "Fuso horario",
"to_archive": "Arquivar", "to_archive": "Arquivar",
@@ -2024,6 +2067,7 @@
"troubleshoot": "Solucionar problemas", "troubleshoot": "Solucionar problemas",
"type": "Tipo", "type": "Tipo",
"unable_to_change_pin_code": "Non é posible cambiar o código PIN", "unable_to_change_pin_code": "Non é posible cambiar o código PIN",
"unable_to_check_version": "Non se puido verificar a versión da aplicación ou do servidor",
"unable_to_setup_pin_code": "Non é posible configurar o código PIN", "unable_to_setup_pin_code": "Non é posible configurar o código PIN",
"unarchive": "Desarquivar", "unarchive": "Desarquivar",
"unarchive_action_prompt": "{count} eliminados do Arquivo", "unarchive_action_prompt": "{count} eliminados do Arquivo",
@@ -2132,6 +2176,7 @@
"welcome": "Benvido/a", "welcome": "Benvido/a",
"welcome_to_immich": "Benvido/a a Immich", "welcome_to_immich": "Benvido/a a Immich",
"wifi_name": "Nome da wifi", "wifi_name": "Nome da wifi",
"workflow": "Fluxo de traballo",
"wrong_pin_code": "Código PIN incorrecto", "wrong_pin_code": "Código PIN incorrecto",
"year": "Ano", "year": "Ano",
"years_ago": "Hai {years, plural, one {# ano} other {# anos}}", "years_ago": "Hai {years, plural, one {# ano} other {# anos}}",
+1
View File
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
+59 -15
View File
@@ -17,7 +17,6 @@
"add_birthday": "הוספת יום הולדת", "add_birthday": "הוספת יום הולדת",
"add_endpoint": "הוסף כתובת URL", "add_endpoint": "הוסף כתובת URL",
"add_exclusion_pattern": "הוספת דפוס החרגה", "add_exclusion_pattern": "הוספת דפוס החרגה",
"add_import_path": "הוספת נתיב יבוא",
"add_location": "הוספת מיקום", "add_location": "הוספת מיקום",
"add_more_users": "הוספת עוד משתמשים", "add_more_users": "הוספת עוד משתמשים",
"add_partner": "הוספת שותף", "add_partner": "הוספת שותף",
@@ -112,7 +111,6 @@
"jobs_failed": "{jobCount, plural, other {# נכשלו}}", "jobs_failed": "{jobCount, plural, other {# נכשלו}}",
"library_created": "נוצרה ספרייה: {library}", "library_created": "נוצרה ספרייה: {library}",
"library_deleted": "ספרייה נמחקה", "library_deleted": "ספרייה נמחקה",
"library_import_path_description": "ציין תיקיה לייבוא. תיקייה זו, כולל תיקיות משנה, תיסרק עבור תמונות וסרטונים.",
"library_scanning": "סריקה תקופתית", "library_scanning": "סריקה תקופתית",
"library_scanning_description": "הגדר סריקת ספרייה תקופתית", "library_scanning_description": "הגדר סריקת ספרייה תקופתית",
"library_scanning_enable_description": "אפשר סריקת ספרייה תקופתית", "library_scanning_enable_description": "אפשר סריקת ספרייה תקופתית",
@@ -120,7 +118,7 @@
"library_settings_description": "ניהול הגדרות ספרייה חיצונית", "library_settings_description": "ניהול הגדרות ספרייה חיצונית",
"library_tasks_description": "סרוק ספריות חיצוניות עבור תמונות חדשות ו/או שהשתנו", "library_tasks_description": "סרוק ספריות חיצוניות עבור תמונות חדשות ו/או שהשתנו",
"library_watching_enable_description": "עקוב אחר שינויי קבצים בספריות חיצוניות", "library_watching_enable_description": "עקוב אחר שינויי קבצים בספריות חיצוניות",
"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": "כאשר פועל, באיזה רמת יומן לתעד.",
@@ -154,6 +152,18 @@
"machine_learning_min_detection_score_description": "ציון ביטחון מינימלי לאיתור פנים מ-0 עד 1. ערכים נמוכים יותר יאתרו יותר פנים אך עלולים לגרום לתוצאות חיוביות שגויות.", "machine_learning_min_detection_score_description": "ציון ביטחון מינימלי לאיתור פנים מ-0 עד 1. ערכים נמוכים יותר יאתרו יותר פנים אך עלולים לגרום לתוצאות חיוביות שגויות.",
"machine_learning_min_recognized_faces": "מינימום פנים מזוהים", "machine_learning_min_recognized_faces": "מינימום פנים מזוהים",
"machine_learning_min_recognized_faces_description": "המספר המינימלי של פנים מזוהים ליצירת אדם. הגדלת ערך זה הופכת את זיהוי הפנים למדויק יותר בעלות של הגברת הסיכוי שלא יוקצו פנים לאדם.", "machine_learning_min_recognized_faces_description": "המספר המינימלי של פנים מזוהים ליצירת אדם. הגדלת ערך זה הופכת את זיהוי הפנים למדויק יותר בעלות של הגברת הסיכוי שלא יוקצו פנים לאדם.",
"machine_learning_ocr": "OCR",
"machine_learning_ocr_description": "השתמש בלמידת מכונה לזיהוי טקסט בתמונות",
"machine_learning_ocr_enabled": "הפעלת OCR",
"machine_learning_ocr_enabled_description": "אם מבוטל, תמונות לא יעברו זיהוי טקסט.",
"machine_learning_ocr_max_resolution": "רזולוציה מירבית",
"machine_learning_ocr_max_resolution_description": "תצוגות מקדימות מעל רזולוציה זו ישונו תוך שמירה על יחס גובה לרוחב. ערכים גבוהים הם מדויקים יותר, אך דורשים יותר זמן עיבוד וזיכרון.",
"machine_learning_ocr_min_detection_score": "ציון איתור מזערי",
"machine_learning_ocr_min_detection_score_description": "ציון ביטחון מזערי לאיתור טקסט בטווח 0-1. ערכים נמוכים יאתרו יותר טקסט אך עלולים לגרום לאיתורים שגויים.",
"machine_learning_ocr_min_recognition_score": "ציון זיהוי מזערי",
"machine_learning_ocr_min_score_recognition_description": "ציון ביטחון מזערי לזיהוי טקסט שאותר בטווח 0-1. ערכים נמוכים יזהו יותר טקסט אך עלולים לגרום לזיהויים שגויים.",
"machine_learning_ocr_model": "מודל OCR",
"machine_learning_ocr_model_description": "מודלי שרת הינם מדויקים יותר ממודלי טלפון, אך לוקחים יותר זמן עיבוד וצורכים יותר זיכרון.",
"machine_learning_settings": "הגדרות למידת מכונה", "machine_learning_settings": "הגדרות למידת מכונה",
"machine_learning_settings_description": "ניהול התכונות וההגדרות של למידת המכונה", "machine_learning_settings_description": "ניהול התכונות וההגדרות של למידת המכונה",
"machine_learning_smart_search": "חיפוש חכם", "machine_learning_smart_search": "חיפוש חכם",
@@ -211,6 +221,8 @@
"notification_email_ignore_certificate_errors_description": "התעלם משגיאות אימות תעודת TLS (לא מומלץ)", "notification_email_ignore_certificate_errors_description": "התעלם משגיאות אימות תעודת TLS (לא מומלץ)",
"notification_email_password_description": "סיסמה לשימוש בעת אימות עם שרת הדוא\"ל", "notification_email_password_description": "סיסמה לשימוש בעת אימות עם שרת הדוא\"ל",
"notification_email_port_description": "יציאה של שרת הדוא\"ל (למשל 25, 465, או 587)", "notification_email_port_description": "יציאה של שרת הדוא\"ל (למשל 25, 465, או 587)",
"notification_email_secure": "SMTPS",
"notification_email_secure_description": "השתמש ב-SMTPS (פרוטוקול SMTP מעל TLS)",
"notification_email_sent_test_email_button": "שלח דוא\"ל בדיקה ושמור", "notification_email_sent_test_email_button": "שלח דוא\"ל בדיקה ושמור",
"notification_email_setting_description": "הגדרות לשליחת התראות דוא\"ל", "notification_email_setting_description": "הגדרות לשליחת התראות דוא\"ל",
"notification_email_test_email": "שלח דוא\"ל בדיקה", "notification_email_test_email": "שלח דוא\"ל בדיקה",
@@ -243,6 +255,7 @@
"oauth_storage_quota_default_description": "מכסה ב-GiB לשימוש כאשר לא מסופקת דרישה.", "oauth_storage_quota_default_description": "מכסה ב-GiB לשימוש כאשר לא מסופקת דרישה.",
"oauth_timeout": "הבקשה נכשלה – הזמן הקצוב הסתיים", "oauth_timeout": "הבקשה נכשלה – הזמן הקצוב הסתיים",
"oauth_timeout_description": "זמן קצוב לבקשות (במילישניות)", "oauth_timeout_description": "זמן קצוב לבקשות (במילישניות)",
"ocr_job_description": "השתמש בלמידת מכונה לזיהוי טקסט בתמונות",
"password_enable_description": "התחבר עם דוא\"ל וסיסמה", "password_enable_description": "התחבר עם דוא\"ל וסיסמה",
"password_settings": "סיסמת התחברות", "password_settings": "סיסמת התחברות",
"password_settings_description": "ניהול הגדרות סיסמת התחברות", "password_settings_description": "ניהול הגדרות סיסמת התחברות",
@@ -333,7 +346,7 @@
"transcoding_max_b_frames": "B-פריימים מרביים", "transcoding_max_b_frames": "B-פריימים מרביים",
"transcoding_max_b_frames_description": "ערכים גבוהים יותר משפרים את יעילות הדחיסה, אך מאטים את הקידוד. ייתכן שלא יהיה תואם עם האצת חומרה במכשירים ישנים יותר. 0 משבית את B-פריימים, בעוד ש1- מגדיר את הערך זה באופן אוטומטי.", "transcoding_max_b_frames_description": "ערכים גבוהים יותר משפרים את יעילות הדחיסה, אך מאטים את הקידוד. ייתכן שלא יהיה תואם עם האצת חומרה במכשירים ישנים יותר. 0 משבית את B-פריימים, בעוד ש1- מגדיר את הערך זה באופן אוטומטי.",
"transcoding_max_bitrate": "קצב סיביות מרבי", "transcoding_max_bitrate": "קצב סיביות מרבי",
"transcoding_max_bitrate_description": "קביעת קצב סיביות מרבי יכולה להפוך את גדלי הקבצים לצפויים יותר בעלות קלה לאיכות. ב-720p, ערכים טיפוסיים הם 2600 kbit/s עבור VP9 או HEVC, או 4500 kbit/s עבור H.264. מושבת אם מוגדר ל-0.", "transcoding_max_bitrate_description": "קביעת קצב סיביות מרבי יכולה להפוך את גדלי הקבצים לצפויים יותר בעלות קלה לאיכות. ב-720p, ערכים טיפוסיים הם 2600 kbit/s עבור VP9 או HEVC, או 4500 kbit/s עבור H.264. מושבת אם מוגדר ל-0. אם לא הוגדרו יחידות, ייעשה שימוש ב-k (עבור kbit/s)ף כלומר 5000, 5000k ו-5M (עבור Mbit/s) שקולים.",
"transcoding_max_keyframe_interval": "מרווח תמונת מפתח מרבי", "transcoding_max_keyframe_interval": "מרווח תמונת מפתח מרבי",
"transcoding_max_keyframe_interval_description": "מגדיר את מרחק הפריימים המרבי בין תמונות מפתח. ערכים נמוכים גורעים את יעילות הדחיסה, אך משפרים את זמני החיפוש ועשויים לשפר את האיכות בסצנות עם תנועה מהירה. 0 מגדיר ערך זה באופן אוטומטי.", "transcoding_max_keyframe_interval_description": "מגדיר את מרחק הפריימים המרבי בין תמונות מפתח. ערכים נמוכים גורעים את יעילות הדחיסה, אך משפרים את זמני החיפוש ועשויים לשפר את האיכות בסצנות עם תנועה מהירה. 0 מגדיר ערך זה באופן אוטומטי.",
"transcoding_optimal_description": "סרטונים גבוהים מרזולוציית היעד או לא בפורמט מקובל", "transcoding_optimal_description": "סרטונים גבוהים מרזולוציית היעד או לא בפורמט מקובל",
@@ -351,7 +364,7 @@
"transcoding_target_resolution": "רזולוציה יעד", "transcoding_target_resolution": "רזולוציה יעד",
"transcoding_target_resolution_description": "רזולוציות גבוהות יותר יכולות לשמר פרטים רבים יותר אך לוקחות זמן רב יותר לקידוד, יש להן גדלי קבצים גדולים יותר, ויכולות להפחית את תגובתיות היישום.", "transcoding_target_resolution_description": "רזולוציות גבוהות יותר יכולות לשמר פרטים רבים יותר אך לוקחות זמן רב יותר לקידוד, יש להן גדלי קבצים גדולים יותר, ויכולות להפחית את תגובתיות היישום.",
"transcoding_temporal_aq": "AQ מבוסס זמן", "transcoding_temporal_aq": "AQ מבוסס זמן",
"transcoding_temporal_aq_description": "חל רק על NVENC. מגביר את האיכות של סצנות עם רמת פירוט גבוהה בהילוך איטי. ייתכן שלא יהיה תואם למכשירים ישנים יותר.", "transcoding_temporal_aq_description": "חל רק על NVENC. כימות מסתגל לפי זמן מגביר את האיכות של סצנות עם רמת פירוט גבוהה בהילוך איטי. ייתכן שלא יהיה תואם למכשירים ישנים יותר.",
"transcoding_threads": "תהליכונים", "transcoding_threads": "תהליכונים",
"transcoding_threads_description": "ערכים גבוהים יותר מובילים לקידוד מהיר יותר, אך משאירים פחות מקום לשרת לעבד משימות אחרות בעודו פעיל. ערך זה לא אמור להיות יותר ממספר ליבות המעבד. ממקסם את הניצול אם מוגדר ל-0.", "transcoding_threads_description": "ערכים גבוהים יותר מובילים לקידוד מהיר יותר, אך משאירים פחות מקום לשרת לעבד משימות אחרות בעודו פעיל. ערך זה לא אמור להיות יותר ממספר ליבות המעבד. ממקסם את הניצול אם מוגדר ל-0.",
"transcoding_tone_mapping": "מיפוי גוונים", "transcoding_tone_mapping": "מיפוי גוונים",
@@ -402,11 +415,11 @@
"advanced_settings_prefer_remote_subtitle": "במכשירים מסוימים טעינת תמונות ממוזערות מקבצים מקומיים עלולה להיות איטית במיוחד. הפעל הגדרה זו כדי לטעון תמונות מרוחקות במקום זאת.", "advanced_settings_prefer_remote_subtitle": "במכשירים מסוימים טעינת תמונות ממוזערות מקבצים מקומיים עלולה להיות איטית במיוחד. הפעל הגדרה זו כדי לטעון תמונות מרוחקות במקום זאת.",
"advanced_settings_prefer_remote_title": "העדף תמונות מרוחקות", "advanced_settings_prefer_remote_title": "העדף תמונות מרוחקות",
"advanced_settings_proxy_headers_subtitle": "הגדר proxy headers שהיישום צריך לשלוח עם כל בקשת רשת", "advanced_settings_proxy_headers_subtitle": "הגדר proxy headers שהיישום צריך לשלוח עם כל בקשת רשת",
"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 עבור כתובת URL של השרת. דרוש עבור תעודות בחתימה עצמית.", "advanced_settings_self_signed_ssl_subtitle": "מדלג על אימות תעודת SSL עבור כתובת URL של השרת. דרוש עבור תעודות בחתימה עצמית.",
"advanced_settings_self_signed_ssl_title": "התר תעודות SSL בחתימה עצמית", "advanced_settings_self_signed_ssl_title": "התר תעודות SSL בחתימה עצמית [ניסיוני]",
"advanced_settings_sync_remote_deletions_subtitle": "מחק או שחזר תמונה במכשיר זה באופן אוטומטי כאשר פעולה זו נעשית בדפדפן", "advanced_settings_sync_remote_deletions_subtitle": "מחק או שחזר תמונה במכשיר זה באופן אוטומטי כאשר פעולה זו נעשית בדפדפן",
"advanced_settings_sync_remote_deletions_title": "סנכרן מחיקות שבוצעו במכשירים אחרים [נסיוני]", "advanced_settings_sync_remote_deletions_title": "סנכרן מחיקות שבוצעו במכשירים אחרים [נסיוני]",
"advanced_settings_tile_subtitle": "הגדרות משתמש מתקדם", "advanced_settings_tile_subtitle": "הגדרות משתמש מתקדם",
@@ -466,10 +479,14 @@
"api_key_description": "הערך הזה יוצג רק פעם אחת. נא לוודא שהעתקת אותו לפני סגירת החלון.", "api_key_description": "הערך הזה יוצג רק פעם אחת. נא לוודא שהעתקת אותו לפני סגירת החלון.",
"api_key_empty": "מפתח ה-API שלך לא אמור להיות ריק", "api_key_empty": "מפתח ה-API שלך לא אמור להיות ריק",
"api_keys": "מפתחות API", "api_keys": "מפתחות API",
"app_architecture_variant": "וריאנט (ארכיטקטורה)",
"app_bar_signout_dialog_content": "האם את/ה בטוח/ה שברצונך להתנתק?", "app_bar_signout_dialog_content": "האם את/ה בטוח/ה שברצונך להתנתק?",
"app_bar_signout_dialog_ok": "כן", "app_bar_signout_dialog_ok": "כן",
"app_bar_signout_dialog_title": "התנתק", "app_bar_signout_dialog_title": "התנתק",
"app_download_links": "קישורים להורדת האפליקציה",
"app_settings": "הגדרות יישום", "app_settings": "הגדרות יישום",
"app_stores": "חנויות אפליקציה",
"app_update_available": "יש עדכון לאפליקציה",
"appears_in": "מופיע ב", "appears_in": "מופיע ב",
"apply_count": "החל ({count, number})", "apply_count": "החל ({count, number})",
"archive": "ארכיון", "archive": "ארכיון",
@@ -553,6 +570,7 @@
"backup_albums_sync": "סנכרון אלבומי גיבוי", "backup_albums_sync": "סנכרון אלבומי גיבוי",
"backup_all": "הכל", "backup_all": "הכל",
"backup_background_service_backup_failed_message": "נכשל בגיבוי תמונות. מנסה שוב…", "backup_background_service_backup_failed_message": "נכשל בגיבוי תמונות. מנסה שוב…",
"backup_background_service_complete_notification": "גיבוי הנכסים הושלם",
"backup_background_service_connection_failed_message": "נכשל בהתחברות לשרת. מנסה שוב…", "backup_background_service_connection_failed_message": "נכשל בהתחברות לשרת. מנסה שוב…",
"backup_background_service_current_upload_notification": "מעלה {filename}", "backup_background_service_current_upload_notification": "מעלה {filename}",
"backup_background_service_default_notification": "מחפש תמונות חדשות…", "backup_background_service_default_notification": "מחפש תמונות חדשות…",
@@ -662,6 +680,8 @@
"change_password_description": "זאת או הפעם הראשונה שהתחברת למערכת או שנעשתה בקשה לשינוי הסיסמה שלך. נא להזין את הסיסמה החדשה למטה.", "change_password_description": "זאת או הפעם הראשונה שהתחברת למערכת או שנעשתה בקשה לשינוי הסיסמה שלך. נא להזין את הסיסמה החדשה למטה.",
"change_password_form_confirm_password": "אשר סיסמה", "change_password_form_confirm_password": "אשר סיסמה",
"change_password_form_description": "הי {name},\n\nזאת או הפעם הראשונה שאת/ה מתחבר/ת למערכת או שנעשתה בקשה לשינוי הסיסמה שלך. נא להזין את הסיסמה החדשה למטה.", "change_password_form_description": "הי {name},\n\nזאת או הפעם הראשונה שאת/ה מתחבר/ת למערכת או שנעשתה בקשה לשינוי הסיסמה שלך. נא להזין את הסיסמה החדשה למטה.",
"change_password_form_log_out": "התנתק מכל שאר המכשירים",
"change_password_form_log_out_description": "מומלץ להתנתק מכל שאר הרכיבים",
"change_password_form_new_password": "סיסמה חדשה", "change_password_form_new_password": "סיסמה חדשה",
"change_password_form_password_mismatch": "סיסמאות לא תואמות", "change_password_form_password_mismatch": "סיסמאות לא תואמות",
"change_password_form_reenter_new_password": "הכנס שוב סיסמה חדשה", "change_password_form_reenter_new_password": "הכנס שוב סיסמה חדשה",
@@ -689,7 +709,7 @@
"client_cert_invalid_msg": "קובץ תעודה לא תקין או סיסמה שגויה", "client_cert_invalid_msg": "קובץ תעודה לא תקין או סיסמה שגויה",
"client_cert_remove_msg": "תעודת לקוח הוסרה", "client_cert_remove_msg": "תעודת לקוח הוסרה",
"client_cert_subtitle": "תומך בפורמט PKCS12 (.p12, .pfx) בלבד. ייבוא/הסרה של תעודה זמינה רק לפני התחברות", "client_cert_subtitle": "תומך בפורמט PKCS12 (.p12, .pfx) בלבד. ייבוא/הסרה של תעודה זמינה רק לפני התחברות",
"client_cert_title": "תעודת לקוח SSL", "client_cert_title": "תעודת לקוח SSL [ניסיוני]",
"clockwise": "עם כיוון השעון", "clockwise": "עם כיוון השעון",
"close": "סגור", "close": "סגור",
"collapse": "כווץ", "collapse": "כווץ",
@@ -739,6 +759,7 @@
"create": "צור", "create": "צור",
"create_album": "צור אלבום", "create_album": "צור אלבום",
"create_album_page_untitled": "ללא כותרת", "create_album_page_untitled": "ללא כותרת",
"create_api_key": "יצירת מפתח API",
"create_library": "צור ספרייה", "create_library": "צור ספרייה",
"create_link": "צור קישור", "create_link": "צור קישור",
"create_link_to_share": "צור קישור לשיתוף", "create_link_to_share": "צור קישור לשיתוף",
@@ -768,6 +789,7 @@
"daily_title_text_date_year": "E, MMM dd, yyyy", "daily_title_text_date_year": "E, MMM dd, yyyy",
"dark": "כהה", "dark": "כהה",
"dark_theme": "הפעל/כבה מצב כהה", "dark_theme": "הפעל/כבה מצב כהה",
"date": "תאריך",
"date_after": "תאריך אחרי", "date_after": "תאריך אחרי",
"date_and_time": "תאריך ושעה", "date_and_time": "תאריך ושעה",
"date_before": "תאריך לפני", "date_before": "תאריך לפני",
@@ -870,8 +892,6 @@
"edit_description_prompt": "אנא בחר תיאור חדש:", "edit_description_prompt": "אנא בחר תיאור חדש:",
"edit_exclusion_pattern": "ערוך דפוס החרגה", "edit_exclusion_pattern": "ערוך דפוס החרגה",
"edit_faces": "ערוך פנים", "edit_faces": "ערוך פנים",
"edit_import_path": "ערוך נתיב יבוא",
"edit_import_paths": "ערוך נתיבי ייבוא",
"edit_key": "ערוך מפתח", "edit_key": "ערוך מפתח",
"edit_link": "ערוך קישור", "edit_link": "ערוך קישור",
"edit_location": "ערוך מיקום", "edit_location": "ערוך מיקום",
@@ -943,7 +963,6 @@
"failed_to_stack_assets": "יצירת ערימת תמונות נכשלה", "failed_to_stack_assets": "יצירת ערימת תמונות נכשלה",
"failed_to_unstack_assets": "ביטול ערימת תמונות נכשלה", "failed_to_unstack_assets": "ביטול ערימת תמונות נכשלה",
"failed_to_update_notification_status": "שגיאה בעדכון ההתראה", "failed_to_update_notification_status": "שגיאה בעדכון ההתראה",
"import_path_already_exists": "נתיב הייבוא הזה כבר קיים.",
"incorrect_email_or_password": "דוא\"ל או סיסמה שגויים", "incorrect_email_or_password": "דוא\"ל או סיסמה שגויים",
"paths_validation_failed": "{paths, plural, one {נתיב # נכשל} other {# נתיבים נכשלו}} אימות", "paths_validation_failed": "{paths, plural, one {נתיב # נכשל} other {# נתיבים נכשלו}} אימות",
"profile_picture_transparent_pixels": "תמונות פרופיל אינן יכולות לכלול פיקסלים שקופים. נא להגדיל ו/או להזיז את התמונה.", "profile_picture_transparent_pixels": "תמונות פרופיל אינן יכולות לכלול פיקסלים שקופים. נא להגדיל ו/או להזיז את התמונה.",
@@ -953,7 +972,6 @@
"unable_to_add_assets_to_shared_link": "לא ניתן להוסיף תמונות לקישור משותף", "unable_to_add_assets_to_shared_link": "לא ניתן להוסיף תמונות לקישור משותף",
"unable_to_add_comment": "לא ניתן להוסיף תגובה", "unable_to_add_comment": "לא ניתן להוסיף תגובה",
"unable_to_add_exclusion_pattern": "לא ניתן להוסיף דפוס החרגה", "unable_to_add_exclusion_pattern": "לא ניתן להוסיף דפוס החרגה",
"unable_to_add_import_path": "לא ניתן להוסיף נתיב ייבוא",
"unable_to_add_partners": "לא ניתן להוסיף שותפים", "unable_to_add_partners": "לא ניתן להוסיף שותפים",
"unable_to_add_remove_archive": "לא ניתן {archived, select, true {להסיר תמונה מ} other {להוסיף תמונה ל}}ארכיון", "unable_to_add_remove_archive": "לא ניתן {archived, select, true {להסיר תמונה מ} other {להוסיף תמונה ל}}ארכיון",
"unable_to_add_remove_favorites": "לא ניתן {favorite, select, true {להוסיף תמונה ל} other {להסיר תמונה מ}}מועדפים", "unable_to_add_remove_favorites": "לא ניתן {favorite, select, true {להוסיף תמונה ל} other {להסיר תמונה מ}}מועדפים",
@@ -976,12 +994,10 @@
"unable_to_delete_asset": "לא ניתן למחוק את התמונה", "unable_to_delete_asset": "לא ניתן למחוק את התמונה",
"unable_to_delete_assets": "שגיאה במחיקת התמונות", "unable_to_delete_assets": "שגיאה במחיקת התמונות",
"unable_to_delete_exclusion_pattern": "לא ניתן למחוק דפוס החרגה", "unable_to_delete_exclusion_pattern": "לא ניתן למחוק דפוס החרגה",
"unable_to_delete_import_path": "לא ניתן למחוק את נתיב הייבוא",
"unable_to_delete_shared_link": "לא ניתן למחוק קישור משותף", "unable_to_delete_shared_link": "לא ניתן למחוק קישור משותף",
"unable_to_delete_user": "לא ניתן למחוק משתמש", "unable_to_delete_user": "לא ניתן למחוק משתמש",
"unable_to_download_files": "לא ניתן להוריד קבצים", "unable_to_download_files": "לא ניתן להוריד קבצים",
"unable_to_edit_exclusion_pattern": "לא ניתן לערוך דפוס החרגה", "unable_to_edit_exclusion_pattern": "לא ניתן לערוך דפוס החרגה",
"unable_to_edit_import_path": "לא ניתן לערוך את נתיב הייבוא",
"unable_to_empty_trash": "לא ניתן לרוקן אשפה", "unable_to_empty_trash": "לא ניתן לרוקן אשפה",
"unable_to_enter_fullscreen": "לא ניתן להיכנס למסך מלא", "unable_to_enter_fullscreen": "לא ניתן להיכנס למסך מלא",
"unable_to_exit_fullscreen": "לא ניתן לצאת ממסך מלא", "unable_to_exit_fullscreen": "לא ניתן לצאת ממסך מלא",
@@ -1037,6 +1053,7 @@
"exif_bottom_sheet_description_error": "שגיאה בעדכון התיאור", "exif_bottom_sheet_description_error": "שגיאה בעדכון התיאור",
"exif_bottom_sheet_details": "פרטים", "exif_bottom_sheet_details": "פרטים",
"exif_bottom_sheet_location": "מיקום", "exif_bottom_sheet_location": "מיקום",
"exif_bottom_sheet_no_description": "ללא תיאור",
"exif_bottom_sheet_people": "אנשים", "exif_bottom_sheet_people": "אנשים",
"exif_bottom_sheet_person_add_person": "הוסף שם", "exif_bottom_sheet_person_add_person": "הוסף שם",
"exit_slideshow": "צא ממצגת שקופיות", "exit_slideshow": "צא ממצגת שקופיות",
@@ -1075,6 +1092,7 @@
"features_setting_description": "ניהול תכונות היישום", "features_setting_description": "ניהול תכונות היישום",
"file_name": "שם הקובץ", "file_name": "שם הקובץ",
"file_name_or_extension": "שם קובץ או סיומת", "file_name_or_extension": "שם קובץ או סיומת",
"file_size": "גודל קובץ",
"filename": "שם קובץ", "filename": "שם קובץ",
"filetype": "סוג קובץ", "filetype": "סוג קובץ",
"filter": "סנן", "filter": "סנן",
@@ -1238,6 +1256,7 @@
"local_media_summary": "סיכום של מדיה מקומית", "local_media_summary": "סיכום של מדיה מקומית",
"local_network": "רשת מקומית", "local_network": "רשת מקומית",
"local_network_sheet_info": "היישום יתחבר לשרת דרך הכתובת הזאת כאשר משתמשים ברשת האינטרנט האלחוטי שמצוינת", "local_network_sheet_info": "היישום יתחבר לשרת דרך הכתובת הזאת כאשר משתמשים ברשת האינטרנט האלחוטי שמצוינת",
"location": "מיקום",
"location_permission": "הרשאת מיקום", "location_permission": "הרשאת מיקום",
"location_permission_content": "כדי להשתמש בתכונת ההחלפה האוטומטית, היישום צריך הרשאה למיקום מדויק על מנת לקרוא את השם של רשת האינטרנט האלחוטי", "location_permission_content": "כדי להשתמש בתכונת ההחלפה האוטומטית, היישום צריך הרשאה למיקום מדויק על מנת לקרוא את השם של רשת האינטרנט האלחוטי",
"location_picker_choose_on_map": "בחר על מפה", "location_picker_choose_on_map": "בחר על מפה",
@@ -1287,6 +1306,8 @@
"main_menu": "תפריט ראשי", "main_menu": "תפריט ראשי",
"make": "תוצרת", "make": "תוצרת",
"manage_geolocation": "נהל מיקום", "manage_geolocation": "נהל מיקום",
"manage_media_access_settings": "פתח הגדרות",
"manage_media_access_subtitle": "אפשר לאפליקציית Immich לנהל ולהזיז קבצי מדיה.",
"manage_shared_links": "ניהול קישורים משותפים", "manage_shared_links": "ניהול קישורים משותפים",
"manage_sharing_with_partners": "ניהול שיתוף עם שותפים", "manage_sharing_with_partners": "ניהול שיתוף עם שותפים",
"manage_the_app_settings": "ניהול הגדרות האפליקציה", "manage_the_app_settings": "ניהול הגדרות האפליקציה",
@@ -1342,6 +1363,8 @@
"minute": "דקה", "minute": "דקה",
"minutes": "דקות", "minutes": "דקות",
"missing": "חסרים", "missing": "חסרים",
"mobile_app": "אפליקציה לטלפון",
"mobile_app_download_onboarding_note": "הורד את האפליקציה המלווה באחת מהאפשרויות הבאות",
"model": "דגם", "model": "דגם",
"month": "חודש", "month": "חודש",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
@@ -1360,6 +1383,8 @@
"my_albums": "האלבומים שלי", "my_albums": "האלבומים שלי",
"name": "שם", "name": "שם",
"name_or_nickname": "שם או כינוי", "name_or_nickname": "שם או כינוי",
"navigate": "נווט",
"navigate_to_time": "נווט אל זמן",
"network_requirement_photos_upload": "השתמש בנתונים ניידים לגיבוי תמונות", "network_requirement_photos_upload": "השתמש בנתונים ניידים לגיבוי תמונות",
"network_requirement_videos_upload": "השתמש בנתונים ניידים לגיבוי סרטונים", "network_requirement_videos_upload": "השתמש בנתונים ניידים לגיבוי סרטונים",
"network_requirements": "דרישות רשת", "network_requirements": "דרישות רשת",
@@ -1369,11 +1394,13 @@
"never": "אף פעם", "never": "אף פעם",
"new_album": "אלבום חדש", "new_album": "אלבום חדש",
"new_api_key": "מפתח API חדש", "new_api_key": "מפתח API חדש",
"new_date_range": "טווח תאריך חדש",
"new_password": "סיסמה חדשה", "new_password": "סיסמה חדשה",
"new_person": "אדם חדש", "new_person": "אדם חדש",
"new_pin_code": "קוד PIN חדש", "new_pin_code": "קוד PIN חדש",
"new_pin_code_subtitle": "זאת הפעם הראשונה שנכנסת לתיקיה הנעולה. צור קוד PIN כדי לאבטח את הגישה לדף זה", "new_pin_code_subtitle": "זאת הפעם הראשונה שנכנסת לתיקיה הנעולה. צור קוד PIN כדי לאבטח את הגישה לדף זה",
"new_timeline": "ציר הזמן החדש", "new_timeline": "ציר הזמן החדש",
"new_update": "עדכון חדש",
"new_user_created": "משתמש חדש נוצר", "new_user_created": "משתמש חדש נוצר",
"new_version_available": "גרסה חדשה זמינה", "new_version_available": "גרסה חדשה זמינה",
"newest_first": "החדש ביותר ראשון", "newest_first": "החדש ביותר ראשון",
@@ -1419,6 +1446,9 @@
"notifications": "התראות", "notifications": "התראות",
"notifications_setting_description": "ניהול התראות", "notifications_setting_description": "ניהול התראות",
"oauth": "OAuth", "oauth": "OAuth",
"obtainium_configurator": "הגדרות Obtainium",
"obtainium_configurator_instructions": "השתמש ב-Obtainium כגדי להתקין ולעדכן את אפליקציית האנדרואיד ישירות לגרסאות הגיטהאב של Immich. צור מפתח API ובחר וריאנט כדי ליצור קישור קונפיגורציה עבור Obtainium",
"ocr": "OCR",
"official_immich_resources": "מקורות רשמיים של Immich", "official_immich_resources": "מקורות רשמיים של Immich",
"offline": "לא מקוון", "offline": "לא מקוון",
"offset": "קיזוז", "offset": "קיזוז",
@@ -1523,6 +1553,9 @@
"play_memories": "נגן זכרונות", "play_memories": "נגן זכרונות",
"play_motion_photo": "הפעל תמונה עם תנועה", "play_motion_photo": "הפעל תמונה עם תנועה",
"play_or_pause_video": "הפעל או השהה סרטון", "play_or_pause_video": "הפעל או השהה סרטון",
"play_original_video": "נגן את הווידיאו המקורי",
"play_original_video_setting_description": "העדף לנגן סרטונים המקוריים על פני סרטונים משועתקים. אם הסרטון המקורי אינו תואם הוא עלול להתנגן לא נכון.",
"play_transcoded_video": "נגן סרטון משועתק",
"please_auth_to_access": "אנא אמת את זהותך כדי לגשת", "please_auth_to_access": "אנא אמת את זהותך כדי לגשת",
"port": "יציאה", "port": "יציאה",
"preferences_settings_subtitle": "ניהול העדפות יישום", "preferences_settings_subtitle": "ניהול העדפות יישום",
@@ -1659,6 +1692,7 @@
"reset_sqlite_confirmation": "האם אתה בטוח שברצונך לאפס את מסד הנתונים SQLite? יהיה עליך להתנתק ולהתחבר מחדש כדי לסנכרן את הנתונים מחדש", "reset_sqlite_confirmation": "האם אתה בטוח שברצונך לאפס את מסד הנתונים SQLite? יהיה עליך להתנתק ולהתחבר מחדש כדי לסנכרן את הנתונים מחדש",
"reset_sqlite_success": "איפוס מסד הנתונים SQLite בוצע בהצלחה", "reset_sqlite_success": "איפוס מסד הנתונים SQLite בוצע בהצלחה",
"reset_to_default": "אפס לברירת מחדל", "reset_to_default": "אפס לברירת מחדל",
"resolution": "רזולוציה",
"resolve_duplicates": "פתור כפילויות", "resolve_duplicates": "פתור כפילויות",
"resolved_all_duplicates": "כל הכפילויות נפתרו", "resolved_all_duplicates": "כל הכפילויות נפתרו",
"restore": "שחזר", "restore": "שחזר",
@@ -1677,6 +1711,7 @@
"running": "פועל", "running": "פועל",
"save": "שמור", "save": "שמור",
"save_to_gallery": "שמור לגלריה", "save_to_gallery": "שמור לגלריה",
"saved": "נשמר",
"saved_api_key": "מפתח API שמור", "saved_api_key": "מפתח API שמור",
"saved_profile": "פרופיל שמור", "saved_profile": "פרופיל שמור",
"saved_settings": "הגדרות שמורות", "saved_settings": "הגדרות שמורות",
@@ -1693,6 +1728,9 @@
"search_by_description_example": "יום טיול בסאפה", "search_by_description_example": "יום טיול בסאפה",
"search_by_filename": "חיפוש לפי שם קובץ או סיומת", "search_by_filename": "חיפוש לפי שם קובץ או סיומת",
"search_by_filename_example": "לדוגמא IMG_1234.JPG או PNG", "search_by_filename_example": "לדוגמא IMG_1234.JPG או PNG",
"search_by_ocr": "חיפוש לפי OCR",
"search_by_ocr_example": "לאטה",
"search_camera_lens_model": "חיפוש סוג עדשה...",
"search_camera_make": "חיפוש תוצרת המצלמה...", "search_camera_make": "חיפוש תוצרת המצלמה...",
"search_camera_model": "חפש דגם המצלמה...", "search_camera_model": "חפש דגם המצלמה...",
"search_city": "חיפוש עיר...", "search_city": "חיפוש עיר...",
@@ -1709,6 +1747,7 @@
"search_filter_location_title": "בחר מיקום", "search_filter_location_title": "בחר מיקום",
"search_filter_media_type": "סוג מדיה", "search_filter_media_type": "סוג מדיה",
"search_filter_media_type_title": "בחר סוג מדיה", "search_filter_media_type_title": "בחר סוג מדיה",
"search_filter_ocr": "חיפוש לפי OCR",
"search_filter_people_title": "בחר אנשים", "search_filter_people_title": "בחר אנשים",
"search_for": "חיפוש", "search_for": "חיפוש",
"search_for_existing_person": "חיפוש אדם קיים", "search_for_existing_person": "חיפוש אדם קיים",
@@ -1771,6 +1810,7 @@
"server_online": "החיבור לשרת פעיל", "server_online": "החיבור לשרת פעיל",
"server_privacy": "פרטיות השרת", "server_privacy": "פרטיות השרת",
"server_stats": "סטטיסטיקות שרת", "server_stats": "סטטיסטיקות שרת",
"server_update_available": "עדכון שרת זמין",
"server_version": "גרסת שרת", "server_version": "גרסת שרת",
"set": "הגדר", "set": "הגדר",
"set_as_album_cover": "הגדר כעטיפת האלבום", "set_as_album_cover": "הגדר כעטיפת האלבום",
@@ -1799,6 +1839,8 @@
"setting_notifications_subtitle": "התאם את העדפות ההתראה שלך", "setting_notifications_subtitle": "התאם את העדפות ההתראה שלך",
"setting_notifications_total_progress_subtitle": "התקדמות העלאה כללית (בוצע/סה״כ תמונות)", "setting_notifications_total_progress_subtitle": "התקדמות העלאה כללית (בוצע/סה״כ תמונות)",
"setting_notifications_total_progress_title": "הראה סה״כ התקדמות גיבוי ברקע", "setting_notifications_total_progress_title": "הראה סה״כ התקדמות גיבוי ברקע",
"setting_video_viewer_auto_play_subtitle": "נגן סרטונים אוטומטית כשהם נפתחים",
"setting_video_viewer_auto_play_title": "נגן סרטונים אוטומטית",
"setting_video_viewer_looping_title": "הפעלה חוזרת", "setting_video_viewer_looping_title": "הפעלה חוזרת",
"setting_video_viewer_original_video_subtitle": "כאשר מזרימים סרטון מהשרת, נגן את המקורי אפילו כשהמרת קידוד זמינה. עלול להוביל לתקיעות. סרטונים זמינים מקומית מנוגנים באיכות מקורית ללא קשר להגדרה זו.", "setting_video_viewer_original_video_subtitle": "כאשר מזרימים סרטון מהשרת, נגן את המקורי אפילו כשהמרת קידוד זמינה. עלול להוביל לתקיעות. סרטונים זמינים מקומית מנוגנים באיכות מקורית ללא קשר להגדרה זו.",
"setting_video_viewer_original_video_title": "כפה סרטון מקורי", "setting_video_viewer_original_video_title": "כפה סרטון מקורי",
@@ -1978,6 +2020,7 @@
"theme_setting_three_stage_loading_title": "אפשר טעינה בשלושה שלבים", "theme_setting_three_stage_loading_title": "אפשר טעינה בשלושה שלבים",
"they_will_be_merged_together": "הם יתמזגו יחד", "they_will_be_merged_together": "הם יתמזגו יחד",
"third_party_resources": "משאבי צד שלישי", "third_party_resources": "משאבי צד שלישי",
"time": "זמן",
"time_based_memories": "זכרונות מבוססי זמן", "time_based_memories": "זכרונות מבוססי זמן",
"timeline": "ציר זמן", "timeline": "ציר זמן",
"timezone": "אזור זמן", "timezone": "אזור זמן",
@@ -2010,6 +2053,7 @@
"troubleshoot": "פתור בעיות", "troubleshoot": "פתור בעיות",
"type": "סוג", "type": "סוג",
"unable_to_change_pin_code": "לא ניתן לשנות את קוד ה PIN", "unable_to_change_pin_code": "לא ניתן לשנות את קוד ה PIN",
"unable_to_check_version": "לא ניתן לבדוק את גרסאת האפליקציה או השרת",
"unable_to_setup_pin_code": "לא ניתן להגדיר קוד PIN", "unable_to_setup_pin_code": "לא ניתן להגדיר קוד PIN",
"unarchive": "הוצא מארכיון", "unarchive": "הוצא מארכיון",
"unarchive_action_prompt": "{count} הוסרו מהארכיון", "unarchive_action_prompt": "{count} הוסרו מהארכיון",
+591 -24
View File
File diff suppressed because it is too large Load Diff
+170 -167
View File
@@ -1,5 +1,5 @@
{ {
"about": "O", "about": "Pojedinosti",
"account": "Račun", "account": "Račun",
"account_settings": "Postavke računa", "account_settings": "Postavke računa",
"acknowledge": "Potvrdi", "acknowledge": "Potvrdi",
@@ -17,7 +17,6 @@
"add_birthday": "Dodaj rođendan", "add_birthday": "Dodaj rođendan",
"add_endpoint": "Dodaj krajnju točku", "add_endpoint": "Dodaj krajnju točku",
"add_exclusion_pattern": "Dodaj uzorak izuzimanja", "add_exclusion_pattern": "Dodaj uzorak izuzimanja",
"add_import_path": "Dodaj putanju uvoza",
"add_location": "Dodaj lokaciju", "add_location": "Dodaj lokaciju",
"add_more_users": "Dodaj još korisnika", "add_more_users": "Dodaj još korisnika",
"add_partner": "Dodaj partnera", "add_partner": "Dodaj partnera",
@@ -76,7 +75,7 @@
"exclusion_pattern_description": "Uzorci izuzimanja omogućuju vam da ignorirate datoteke i mape prilikom skeniranja svoje biblioteke. Ovo je korisno ako imate mape koje sadrže datoteke koje ne želite uvesti, kao što su RAW datoteke.", "exclusion_pattern_description": "Uzorci izuzimanja omogućuju vam da ignorirate datoteke i mape prilikom skeniranja svoje biblioteke. Ovo je korisno ako imate mape koje sadrže datoteke koje ne želite uvesti, kao što su RAW datoteke.",
"external_library_management": "Upravljanje vanjskom bibliotekom", "external_library_management": "Upravljanje vanjskom bibliotekom",
"face_detection": "Detekcija lica", "face_detection": "Detekcija lica",
"face_detection_description": "Detektirajte lica u stavkama pomoću strojnog učenja. Za videozapise se uzima u obzir samo sličica. \"Osvježi\" (ponovno) obrađuje sve stavke. \"Poništi\" dodatno briše sve trenutne podatke o licu. \"Nedostaje\" stavlja u red čekanja stavke koje još nisu obrađene. Detektirana lica bit će stavljena u red čekanja za Prepoznavanje lica nakon što se dovrši Detekcija lica, grupirajući ih u postojeće ili nove osobe.", "face_detection_description": "Detektirajte lica u stavkama pomoću strojnog učenja. Za videozapise se uzima u obzir samo sličica. \"Osvježi\" (ponovno) obrađuje sve stavke. \"Poništi\" dodatno briše sve trenutne podatke o licu. \"Nedostaje\" stavlja u red čekanja stavke koje još nisu obrađene. Detektirana lica bit će stavljena u red čekanja za prepoznavanje lica nakon što se dovrši detekcija lica, grupirajući ih u postojeće ili nove osobe.",
"facial_recognition_job_description": "Grupirajte otkrivena lica u osobe. Ovaj korak se izvršava nakon što je Detekcija lica dovršena. \"Resetiraj\" (ponovno) grupira sva lica. \"Nedostaje\" stavlja u red lica kojima nije dodijeljena osoba.", "facial_recognition_job_description": "Grupirajte otkrivena lica u osobe. Ovaj korak se izvršava nakon što je Detekcija lica dovršena. \"Resetiraj\" (ponovno) grupira sva lica. \"Nedostaje\" stavlja u red lica kojima nije dodijeljena osoba.",
"failed_job_command": "Naredba {command} nije uspjela za posao: {job}", "failed_job_command": "Naredba {command} nije uspjela za posao: {job}",
"force_delete_user_warning": "UPOZORENJE: Ovo će odmah ukloniti korisnika i sve pripadajuće stavke. Ovo se ne može poništiti i datoteke se ne mogu vratiti.", "force_delete_user_warning": "UPOZORENJE: Ovo će odmah ukloniti korisnika i sve pripadajuće stavke. Ovo se ne može poništiti i datoteke se ne mogu vratiti.",
@@ -109,18 +108,17 @@
"job_settings_description": "Upravljajte istovremenošću poslova", "job_settings_description": "Upravljajte istovremenošću poslova",
"job_status": "Status posla", "job_status": "Status posla",
"jobs_delayed": "{jobCount, plural, other {# odgođenih}}", "jobs_delayed": "{jobCount, plural, other {# odgođenih}}",
"jobs_failed": "{jobCount, plural, other {# failed}}", "jobs_failed": "{jobCount, plural, one {# neuspješan} few {# neuspješna} other {# neuspješnih}}",
"library_created": "Stvorena biblioteka: {library}", "library_created": "Stvorena biblioteka: {library}",
"library_deleted": "Biblioteka izbrisana", "library_deleted": "Biblioteka izbrisana",
"library_import_path_description": "Navedite mapu za uvoz. Ova će se mapa, uključujući podmape, skenirati u potrazi za slikama i videozapisima.", "library_scanning": "Periodično skeniranje",
"library_scanning": "Periodično Skeniranje",
"library_scanning_description": "Konfigurirajte periodično skeniranje biblioteke", "library_scanning_description": "Konfigurirajte periodično skeniranje biblioteke",
"library_scanning_enable_description": "Omogući periodično skeniranje biblioteke", "library_scanning_enable_description": "Omogući periodično skeniranje biblioteke",
"library_settings": "Externa biblioteka", "library_settings": "Vanjska biblioteka",
"library_settings_description": "Upravljajte postavkama vanjske biblioteke", "library_settings_description": "Upravljajte postavkama vanjske biblioteke",
"library_tasks_description": "Skeniraj vanjske biblioteke za nove i/ili promijenjene stavke", "library_tasks_description": "Skeniraj vanjske biblioteke za nove i/ili promijenjene stavke",
"library_watching_enable_description": "Pratite vanjske biblioteke za promjena datoteke", "library_watching_enable_description": "Pratite vanjske biblioteke za promjena datoteke",
"library_watching_settings": "Gledanje biblioteke (EKSPERIMENTALNO)", "library_watching_settings": "Gledanje biblioteke [EKSPERIMENTALNO]",
"library_watching_settings_description": "Automatsko praćenje promijenjenih datoteke", "library_watching_settings_description": "Automatsko praćenje promijenjenih datoteke",
"logging_enable_description": "Omogući zapisivanje", "logging_enable_description": "Omogući zapisivanje",
"logging_level_description": "Kada je omogućeno, koju razinu zapisivanja koristiti.", "logging_level_description": "Kada je omogućeno, koju razinu zapisivanja koristiti.",
@@ -131,7 +129,7 @@
"machine_learning_availability_checks_interval_description": "Interval u milisekundama između provjera dostupnosti", "machine_learning_availability_checks_interval_description": "Interval u milisekundama između provjera dostupnosti",
"machine_learning_clip_model": "CLIP model", "machine_learning_clip_model": "CLIP model",
"machine_learning_clip_model_description": "Naziv CLIP modela navedenog <link>ovdje</link>. Imajte na umu da morate ponovno pokrenuti posao 'Pametno Pretraživanje' za sve slike nakon promjene modela.", "machine_learning_clip_model_description": "Naziv CLIP modela navedenog <link>ovdje</link>. Imajte na umu da morate ponovno pokrenuti posao 'Pametno Pretraživanje' za sve slike nakon promjene modela.",
"machine_learning_duplicate_detection": "Detekcija Duplikata", "machine_learning_duplicate_detection": "Detekcija duplikata",
"machine_learning_duplicate_detection_enabled": "Omogući detekciju duplikata", "machine_learning_duplicate_detection_enabled": "Omogući detekciju duplikata",
"machine_learning_duplicate_detection_enabled_description": "Ako je onemogućeno, potpuno identične stavke i dalje će biti deduplicirane.", "machine_learning_duplicate_detection_enabled_description": "Ako je onemogućeno, potpuno identične stavke i dalje će biti deduplicirane.",
"machine_learning_duplicate_detection_setting_description": "Upotrijebite CLIP ugradnje da biste pronašli vjerojatne duplikate", "machine_learning_duplicate_detection_setting_description": "Upotrijebite CLIP ugradnje da biste pronašli vjerojatne duplikate",
@@ -162,16 +160,16 @@
"manage_log_settings": "Upravljanje postavkama zapisivanje", "manage_log_settings": "Upravljanje postavkama zapisivanje",
"map_dark_style": "Tamni stil", "map_dark_style": "Tamni stil",
"map_enable_description": "Omogući značajke karte", "map_enable_description": "Omogući značajke karte",
"map_gps_settings": "Postavke Karte i GPS-a", "map_gps_settings": "Postavke karte i GPS-a",
"map_gps_settings_description": "Upravljajte Postavkama Karte i GPS-a (Obrnuto Geokodiranje)", "map_gps_settings_description": "Upravljajte postavkama karte i GPS-a (obrnutog geokodiranja)",
"map_implications": "Značajka karte se oslanja na vanjsku uslugu pločica (tiles.immich.cloud)", "map_implications": "Značajka karte se oslanja na vanjsku uslugu pločica (tiles.immich.cloud)",
"map_light_style": "Svijetli stil", "map_light_style": "Svijetli stil",
"map_manage_reverse_geocoding_settings": "Upravljajte postavkama <link>Obrnutog Geokodiranja</link>", "map_manage_reverse_geocoding_settings": "Upravljajte postavkama <link>Obrnutog geokodiranja</link>",
"map_reverse_geocoding": "Obrnuto Geokodiranje", "map_reverse_geocoding": "Obrnuto Geokodiranje",
"map_reverse_geocoding_enable_description": "Omogući obrnuto geokodiranje", "map_reverse_geocoding_enable_description": "Omogući obrnuto geokodiranje",
"map_reverse_geocoding_settings": "Postavke Obrnuto Geokodiranje", "map_reverse_geocoding_settings": "Postavke Obrnutog geokodiranja",
"map_settings": "Karta", "map_settings": "Karta",
"map_settings_description": "Upravljanje postavkama karte", "map_settings_description": "Upravljajte postavkama karte",
"map_style_description": "URL na style.json temu karte", "map_style_description": "URL na style.json temu karte",
"memory_cleanup_job": "Čišćenje memorije", "memory_cleanup_job": "Čišćenje memorije",
"memory_generate_job": "Generiranje memorije", "memory_generate_job": "Generiranje memorije",
@@ -179,7 +177,7 @@
"metadata_extraction_job_description": "Izdvojite metapodatke iz svake stavke, kao što su GPS, lica i rezolucija", "metadata_extraction_job_description": "Izdvojite metapodatke iz svake stavke, kao što su GPS, lica i rezolucija",
"metadata_faces_import_setting": "Omogući uvoz lica", "metadata_faces_import_setting": "Omogući uvoz lica",
"metadata_faces_import_setting_description": "Uvezite lica iz EXIF podataka slike i sidecar datoteka", "metadata_faces_import_setting_description": "Uvezite lica iz EXIF podataka slike i sidecar datoteka",
"metadata_settings": "Postavke Metapodataka", "metadata_settings": "Postavke metapodataka",
"metadata_settings_description": "Upravljanje postavkama metapodataka", "metadata_settings_description": "Upravljanje postavkama metapodataka",
"migration_job": "Migracija", "migration_job": "Migracija",
"migration_job_description": "Premjestite sličice za stavke i lica u najnoviju strukturu mapa", "migration_job_description": "Premjestite sličice za stavke i lica u najnoviju strukturu mapa",
@@ -199,7 +197,7 @@
"nightly_tasks_sync_quota_usage_setting_description": "Ažuriraj korisničku kvotu za pohranu na temelju trenutne potrošnje", "nightly_tasks_sync_quota_usage_setting_description": "Ažuriraj korisničku kvotu za pohranu na temelju trenutne potrošnje",
"no_paths_added": "Nema dodanih putanja", "no_paths_added": "Nema dodanih putanja",
"no_pattern_added": "Nije dodan uzorak", "no_pattern_added": "Nije dodan uzorak",
"note_apply_storage_label_previous_assets": "Napomena: Da biste primijenili Oznaku pohrane na prethodno prenesene stavke, pokrenite", "note_apply_storage_label_previous_assets": "Napomena: Da biste primijenili oznaku pohrane na prethodno prenesene stavke, pokrenite",
"note_cannot_be_changed_later": "NAPOMENA: Ovo se ne može promijeniti kasnije!", "note_cannot_be_changed_later": "NAPOMENA: Ovo se ne može promijeniti kasnije!",
"notification_email_from_address": "Od adrese", "notification_email_from_address": "Od adrese",
"notification_email_from_address_description": "E-mail adresa pošiljatelja, na primjer: \"Immich Photo Server <noreply@example.com>\". Obavezno koristite adresu s koje vam je dopušteno slanje e-pošte.", "notification_email_from_address_description": "E-mail adresa pošiljatelja, na primjer: \"Immich Photo Server <noreply@example.com>\". Obavezno koristite adresu s koje vam je dopušteno slanje e-pošte.",
@@ -217,7 +215,7 @@
"notification_email_test_email_sent": "Testna e-poruka poslana je na {email}. Provjerite svoju pristiglu poštu.", "notification_email_test_email_sent": "Testna e-poruka poslana je na {email}. Provjerite svoju pristiglu poštu.",
"notification_email_username_description": "Korisničko ime koje se koristi pri autentifikaciji s poslužiteljem e-pošte", "notification_email_username_description": "Korisničko ime koje se koristi pri autentifikaciji s poslužiteljem e-pošte",
"notification_enable_email_notifications": "Omogući obavijesti putem e-pošte", "notification_enable_email_notifications": "Omogući obavijesti putem e-pošte",
"notification_settings": "Postavke Obavijesti", "notification_settings": "Postavke obavijesti",
"notification_settings_description": "Upravljanje postavkama obavijesti, uključujući e-poštu", "notification_settings_description": "Upravljanje postavkama obavijesti, uključujući e-poštu",
"oauth_auto_launch": "Automatsko pokretanje", "oauth_auto_launch": "Automatsko pokretanje",
"oauth_auto_launch_description": "Automatski pokrenite OAuth prijavu nakon navigacije na stranicu za prijavu", "oauth_auto_launch_description": "Automatski pokrenite OAuth prijavu nakon navigacije na stranicu za prijavu",
@@ -239,7 +237,7 @@
"oauth_storage_quota_claim": "Zahtjev za kvotom pohrane", "oauth_storage_quota_claim": "Zahtjev za kvotom pohrane",
"oauth_storage_quota_claim_description": "Automatski postavite korisničku kvotu pohrane na vrijednost ovog zahtjeva.", "oauth_storage_quota_claim_description": "Automatski postavite korisničku kvotu pohrane na vrijednost ovog zahtjeva.",
"oauth_storage_quota_default": "Zadana kvota pohrane (GiB)", "oauth_storage_quota_default": "Zadana kvota pohrane (GiB)",
"oauth_storage_quota_default_description": "Kvota u GiB koja će se koristiti kada nema zahtjeva", "oauth_storage_quota_default_description": "Kvota u GiB koja će se koristiti kada nema zahtjeva.",
"oauth_timeout": "Istek vremena zahtjeva", "oauth_timeout": "Istek vremena zahtjeva",
"oauth_timeout_description": "Istek vremena zahtjeva je u milisekundama", "oauth_timeout_description": "Istek vremena zahtjeva je u milisekundama",
"password_enable_description": "Prijava s email adresom i zaporkom", "password_enable_description": "Prijava s email adresom i zaporkom",
@@ -268,7 +266,7 @@
"sidecar_job": "Sidecar metapodaci", "sidecar_job": "Sidecar metapodaci",
"sidecar_job_description": "Otkrijte ili sinkronizirajte sidecar metapodatke iz datotečnog sustava", "sidecar_job_description": "Otkrijte ili sinkronizirajte sidecar metapodatke iz datotečnog sustava",
"slideshow_duration_description": "Broj sekundi za prikaz svake slike", "slideshow_duration_description": "Broj sekundi za prikaz svake slike",
"smart_search_job_description": "Pokrenite strojno učenje na stavkama za korištenje Pametnog pretraživanja", "smart_search_job_description": "Pokrenite strojno učenje na stavkama za korištenje pametnog pretraživanja",
"storage_template_date_time_description": "Vremenska oznaka stvaranja stavke koristi se za informacije o datumu i vremenu", "storage_template_date_time_description": "Vremenska oznaka stvaranja stavke koristi se za informacije o datumu i vremenu",
"storage_template_date_time_sample": "Vrijeme uzorka {date}", "storage_template_date_time_sample": "Vrijeme uzorka {date}",
"storage_template_enable_description": "Omogući mehanizam predloška za pohranu", "storage_template_enable_description": "Omogući mehanizam predloška za pohranu",
@@ -276,7 +274,7 @@
"storage_template_hash_verification_enabled_description": "Omogućuje hash provjeru, nemojte je onemogućiti osim ako niste sigurni u implikacije", "storage_template_hash_verification_enabled_description": "Omogućuje hash provjeru, nemojte je onemogućiti osim ako niste sigurni u implikacije",
"storage_template_migration": "Migracija predloška za pohranu", "storage_template_migration": "Migracija predloška za pohranu",
"storage_template_migration_description": "Primijenite trenutni <link>{template}</link> na prethodno prenesene stavke", "storage_template_migration_description": "Primijenite trenutni <link>{template}</link> na prethodno prenesene stavke",
"storage_template_migration_info": "Predložak za pohranu pretvorit će sve datotečne nastavke u mala slova. Promjene predloška primijenit će se samo na nove stavke. Da biste retroaktivno primijenili predložak na prethodno prenesene stavke, pokrenite <link>{job}<link>.", "storage_template_migration_info": "Predložak za pohranu pretvorit će sve datotečne nastavke u mala slova. Promjene predloška primijenit će se samo na nove stavke. Da biste retroaktivno primijenili predložak na prethodno prenesene stavke, pokrenite <link>{job}</link>.",
"storage_template_migration_job": "Posao Migracije Predloška Pohrane", "storage_template_migration_job": "Posao Migracije Predloška Pohrane",
"storage_template_more_details": "Za više pojedinosti o ovoj značajci pogledajte <template-link>Predložak pohrane</template-link> i njegove <implications-link>implikacije</implications-link>", "storage_template_more_details": "Za više pojedinosti o ovoj značajci pogledajte <template-link>Predložak pohrane</template-link> i njegove <implications-link>implikacije</implications-link>",
"storage_template_onboarding_description_v2": "Kada je omogućena, ova će značajka automatski organizira datoteke prema predlošku koji je definirao korisnik. Za više informacija pogledajte <link>dokumentaciju</link>.", "storage_template_onboarding_description_v2": "Kada je omogućena, ova će značajka automatski organizira datoteke prema predlošku koji je definirao korisnik. Za više informacija pogledajte <link>dokumentaciju</link>.",
@@ -284,13 +282,13 @@
"storage_template_settings": "Predložak pohrane", "storage_template_settings": "Predložak pohrane",
"storage_template_settings_description": "Upravljajte strukturom mape i nazivom datoteke učitane stavke", "storage_template_settings_description": "Upravljajte strukturom mape i nazivom datoteke učitane stavke",
"storage_template_user_label": "<code>{label}</code> je korisnička oznaka za pohranu", "storage_template_user_label": "<code>{label}</code> je korisnička oznaka za pohranu",
"system_settings": "Postavke Sustava", "system_settings": "Postavke sustava",
"tag_cleanup_job": "Čišćenje oznaka", "tag_cleanup_job": "Čišćenje oznaka",
"template_email_available_tags": "Možete koristiti sljedeće varijable u vašem predlošku:{tags}", "template_email_available_tags": "Možete koristiti sljedeće varijable u vašem predlošku:{tags}",
"template_email_if_empty": "Ukoliko je predložak prazan, koristit će se zadana e-mail adresa.", "template_email_if_empty": "Ukoliko je predložak prazan, koristit će se zadana e-mail adresa.",
"template_email_invite_album": "Predložak za pozivnicu u album", "template_email_invite_album": "Predložak za pozivnicu u album",
"template_email_preview": "Pregled", "template_email_preview": "Pregled",
"template_email_settings": "E-mail Predlošci", "template_email_settings": "E-mail predlošci",
"template_email_update_album": "Ažuriraj Album Predložak", "template_email_update_album": "Ažuriraj Album Predložak",
"template_email_welcome": "Predložak e-maila dobrodošlice", "template_email_welcome": "Predložak e-maila dobrodošlice",
"template_settings": "Predložak Obavijesti", "template_settings": "Predložak Obavijesti",
@@ -323,20 +321,20 @@
"transcoding_constant_rate_factor": "Faktor konstantne stope (-crf)", "transcoding_constant_rate_factor": "Faktor konstantne stope (-crf)",
"transcoding_constant_rate_factor_description": "Razina kvalitete videa. Uobičajene vrijednosti su 23 za H.264, 28 za HEVC, 31 za VP9 i 35 za AV1. Niže je bolje, ali stvara veće datoteke.", "transcoding_constant_rate_factor_description": "Razina kvalitete videa. Uobičajene vrijednosti su 23 za H.264, 28 za HEVC, 31 za VP9 i 35 za AV1. Niže je bolje, ali stvara veće datoteke.",
"transcoding_disabled_description": "Nemojte transkodirati nijedan videozapis, može prekinuti reprodukciju na nekim klijentima", "transcoding_disabled_description": "Nemojte transkodirati nijedan videozapis, može prekinuti reprodukciju na nekim klijentima",
"transcoding_encoding_options": "Opcije Kodiranja", "transcoding_encoding_options": "Opcije kodiranja",
"transcoding_encoding_options_description": "Postavi kodeke, rezoluciju, kvalitetu i druge opcije za kodirane videje", "transcoding_encoding_options_description": "Postavi kodeke, rezoluciju, kvalitetu i druge opcije za kodirane videje",
"transcoding_hardware_acceleration": "Hardversko Ubrzanje", "transcoding_hardware_acceleration": "Hardversko ubrzanje",
"transcoding_hardware_acceleration_description": "Eksperimentalno: brže transkodiranje, ali može smanjiti kvalitetu pri istoj brzini prijenosa", "transcoding_hardware_acceleration_description": "Eksperimentalno: brže transkodiranje, ali može smanjiti kvalitetu pri istoj brzini prijenosa",
"transcoding_hardware_decoding": "Hardversko dekodiranje", "transcoding_hardware_decoding": "Hardversko dekodiranje",
"transcoding_hardware_decoding_setting_description": "Odnosi se samo na NVENC, QSV i RKMPP. Omogućuje ubrzanje s kraja na kraj umjesto samo ubrzavanja kodiranja. Možda neće raditi na svim videozapisima.", "transcoding_hardware_decoding_setting_description": "Odnosi se samo na NVENC, QSV i RKMPP. Omogućuje ubrzanje s kraja na kraj umjesto samo ubrzavanja kodiranja. Možda neće raditi na svim videozapisima.",
"transcoding_max_b_frames": "Maksimalni B-frameovi", "transcoding_max_b_frames": "Maksimalni B-frameovi",
"transcoding_max_b_frames_description": "Više vrijednosti poboljšavaju učinkovitost kompresije, ali usporavaju kodiranje. Možda nije kompatibilan s hardverskim ubrzanjem na starijim uređajima. 0 onemogućuje B-frameove, dok -1 automatski postavlja ovu vrijednost.", "transcoding_max_b_frames_description": "Više vrijednosti poboljšavaju učinkovitost kompresije, ali usporavaju kodiranje. Možda nije kompatibilan s hardverskim ubrzanjem na starijim uređajima. 0 onemogućuje B-frameove, dok -1 automatski postavlja ovu vrijednost.",
"transcoding_max_bitrate": "Maksimalne brzina prijenosa (bitrate)", "transcoding_max_bitrate": "Maksimalne brzina prijenosa (bitrate)",
"transcoding_max_bitrate_description": "Postavljanje maksimalne brzine prijenosa može učiniti veličine datoteka predvidljivijima uz manji trošak za kvalitetu. Pri 720p, tipične vrijednosti su 2600 kbit/s za VP9 ili HEVC ili 4500 kbit/s za H.264. Onemogućeno ako je postavljeno na 0.", "transcoding_max_bitrate_description": "Postavljanje maksimalne brzine prijenosa može učiniti veličine datoteka predvidljivijima uz manji gubitak kvalitete. Pri 720p, tipične vrijednosti su 2600 kbit/s za VP9 ili HEVC, te 4500 kbit/s za H.264. Onemogućeno ako je postavljeno na 0. Kada nije navedena mjerna jedinica, pretpostavlja se k (za kbit/s); stoga su 5000, 5000k i 5M (za Mbit/s) ekvivalentni.",
"transcoding_max_keyframe_interval": "Maksimalni interval ključnih sličica", "transcoding_max_keyframe_interval": "Maksimalni interval ključnih sličica",
"transcoding_max_keyframe_interval_description": "Postavlja maksimalnu udaljenost slika između ključnih kadrova. Niže vrijednosti pogoršavaju učinkovitost kompresije, ali poboljšavaju vrijeme traženja i mogu poboljšati kvalitetu u scenama s brzim kretanjem. 0 automatski postavlja ovu vrijednost.", "transcoding_max_keyframe_interval_description": "Postavlja maksimalnu udaljenost slika između ključnih kadrova. Niže vrijednosti pogoršavaju učinkovitost kompresije, ali poboljšavaju vrijeme traženja i mogu poboljšati kvalitetu u scenama s brzim kretanjem. 0 automatski postavlja ovu vrijednost.",
"transcoding_optimal_description": "Videozapisi koji su veći od ciljne rezolucije ili nisu u prihvatljivom formatu", "transcoding_optimal_description": "Videozapisi koji su veći od ciljne rezolucije ili nisu u prihvatljivom formatu",
"transcoding_policy": "Politika Transkodiranja", "transcoding_policy": "Pravila transkodiranja",
"transcoding_policy_description": "Postavi kada će video biti transkodiran", "transcoding_policy_description": "Postavi kada će video biti transkodiran",
"transcoding_preferred_hardware_device": "Preferirani hardverski uređaj", "transcoding_preferred_hardware_device": "Preferirani hardverski uređaj",
"transcoding_preferred_hardware_device_description": "Odnosi se samo na VAAPI i QSV. Postavlja dri node koji se koristi za hardversko transkodiranje.", "transcoding_preferred_hardware_device_description": "Odnosi se samo na VAAPI i QSV. Postavlja dri node koji se koristi za hardversko transkodiranje.",
@@ -345,12 +343,12 @@
"transcoding_reference_frames": "Referentne slike", "transcoding_reference_frames": "Referentne slike",
"transcoding_reference_frames_description": "Broj slika za referencu prilikom komprimiranja određene slike. Više vrijednosti poboljšavaju učinkovitost kompresije, ali usporavaju kodiranje. 0 automatski postavlja ovu vrijednost.", "transcoding_reference_frames_description": "Broj slika za referencu prilikom komprimiranja određene slike. Više vrijednosti poboljšavaju učinkovitost kompresije, ali usporavaju kodiranje. 0 automatski postavlja ovu vrijednost.",
"transcoding_required_description": "Samo videozapisi koji nisu u prihvaćenom formatu", "transcoding_required_description": "Samo videozapisi koji nisu u prihvaćenom formatu",
"transcoding_settings": "Postavke Video Transkodiranja", "transcoding_settings": "Postavke video transkodiranja",
"transcoding_settings_description": "Upravljaj koji videozapisi će se transkodirati i kako ih obraditi", "transcoding_settings_description": "Upravljaj koji videozapisi će se transkodirati i kako ih obraditi",
"transcoding_target_resolution": "Ciljana rezolucija", "transcoding_target_resolution": "Ciljana rezolucija",
"transcoding_target_resolution_description": "Veće razlučivosti mogu sačuvati više detalja, ali trebaju dulje za kodiranje, imaju veće veličine datoteka i mogu smanjiti odziv aplikacije.", "transcoding_target_resolution_description": "Veće razlučivosti mogu sačuvati više detalja, ali trebaju dulje za kodiranje, imaju veće veličine datoteka i mogu smanjiti odziv aplikacije.",
"transcoding_temporal_aq": "Vremenski AQ", "transcoding_temporal_aq": "Vremenski AQ",
"transcoding_temporal_aq_description": "Odnosi se samo na NVENC. Povećava kvalitetu scena s puno detalja i malo pokreta. Možda nije kompatibilan sa starijim uređajima.", "transcoding_temporal_aq_description": "Odnosi se samo na NVENC. Vremenska adaptivna kvantizacija povećava kvalitetu scena s mnogim detaljima i malo kretanja. Možda nije kompatibilno sa starijim uređajima.",
"transcoding_threads": "Sljedovi (Threads)", "transcoding_threads": "Sljedovi (Threads)",
"transcoding_threads_description": "Više vrijednosti dovode do bržeg kodiranja, ali ostavljaju manje prostora poslužitelju za obradu drugih zadataka dok je aktivan. Ova vrijednost ne smije biti veća od broja CPU jezgri. Maksimalno povećava iskorištenje ako je postavljeno na 0.", "transcoding_threads_description": "Više vrijednosti dovode do bržeg kodiranja, ali ostavljaju manje prostora poslužitelju za obradu drugih zadataka dok je aktivan. Ova vrijednost ne smije biti veća od broja CPU jezgri. Maksimalno povećava iskorištenje ako je postavljeno na 0.",
"transcoding_tone_mapping": "Tonsko preslikavanje", "transcoding_tone_mapping": "Tonsko preslikavanje",
@@ -361,10 +359,10 @@
"transcoding_two_pass_encoding_setting_description": "Transkodiranje u dva prolaza za proizvodnju bolje kodiranih videozapisa. Kada je omogućena maksimalna brzina prijenosa (potrebna za rad s H.264 i HEVC), ovaj način rada koristi raspon brzine prijenosa na temelju maksimalne brzine prijenosa i zanemaruje CRF. Za VP9, CRF se može koristiti ako je maksimalna brzina prijenosa onemogućena.", "transcoding_two_pass_encoding_setting_description": "Transkodiranje u dva prolaza za proizvodnju bolje kodiranih videozapisa. Kada je omogućena maksimalna brzina prijenosa (potrebna za rad s H.264 i HEVC), ovaj način rada koristi raspon brzine prijenosa na temelju maksimalne brzine prijenosa i zanemaruje CRF. Za VP9, CRF se može koristiti ako je maksimalna brzina prijenosa onemogućena.",
"transcoding_video_codec": "Video kodek", "transcoding_video_codec": "Video kodek",
"transcoding_video_codec_description": "VP9 ima visoku učinkovitost i web-kompatibilnost, ali treba dulje za transkodiranje. HEVC ima sličnu izvedbu, ali ima slabiju web kompatibilnost. H.264 široko je kompatibilan i brzo se transkodira, ali proizvodi mnogo veće datoteke. AV1 je najučinkovitiji kodek, ali nema podršku na starijim uređajima.", "transcoding_video_codec_description": "VP9 ima visoku učinkovitost i web-kompatibilnost, ali treba dulje za transkodiranje. HEVC ima sličnu izvedbu, ali ima slabiju web kompatibilnost. H.264 široko je kompatibilan i brzo se transkodira, ali proizvodi mnogo veće datoteke. AV1 je najučinkovitiji kodek, ali nema podršku na starijim uređajima.",
"trash_enabled_description": "Omogućite značajke Smeća", "trash_enabled_description": "Omogući značajke smeća",
"trash_number_of_days": "Broj dana", "trash_number_of_days": "Broj dana",
"trash_number_of_days_description": "Broj dana za čuvanje stavki u smeću prije njihovog trajnog uklanjanja", "trash_number_of_days_description": "Broj dana za čuvanje stavki u smeću prije njihovog trajnog uklanjanja",
"trash_settings": "Postavke Smeća", "trash_settings": "Postavke smeća",
"trash_settings_description": "Upravljanje postavkama smeća", "trash_settings_description": "Upravljanje postavkama smeća",
"unlink_all_oauth_accounts": "Odspoji sve OAuth račune", "unlink_all_oauth_accounts": "Odspoji sve OAuth račune",
"unlink_all_oauth_accounts_description": "Zapamtite da odspojite sve OAuth račune prije prelaska na novog pružatelja usluge.", "unlink_all_oauth_accounts_description": "Zapamtite da odspojite sve OAuth račune prije prelaska na novog pružatelja usluge.",
@@ -400,12 +398,12 @@
"advanced_settings_log_level_title": "Razina zapisivanja: {level}", "advanced_settings_log_level_title": "Razina zapisivanja: {level}",
"advanced_settings_prefer_remote_subtitle": "Neki uređaji sporo učitavaju sličice s lokalnih stavki. Aktivirajte ovu postavku kako biste umjesto toga učitali slike s udaljenih izvora.", "advanced_settings_prefer_remote_subtitle": "Neki uređaji sporo učitavaju sličice s lokalnih stavki. Aktivirajte ovu postavku kako biste umjesto toga učitali slike s udaljenih izvora.",
"advanced_settings_prefer_remote_title": "Preferiraj udaljene slike", "advanced_settings_prefer_remote_title": "Preferiraj udaljene slike",
"advanced_settings_proxy_headers_subtitle": "Definirajte zaglavlja posrednika koja Immich treba slati sa svakim mrežnim zahtjevom.", "advanced_settings_proxy_headers_subtitle": "Definirajte proxy zaglavlja koja Immich treba poslati sa svakim mrežnim zahtjevom",
"advanced_settings_proxy_headers_title": "Proxy zaglavlja", "advanced_settings_proxy_headers_title": "Prilagođeni proxy zaglavlja [EKSPERIMENTALNO]",
"advanced_settings_readonly_mode_subtitle": "Omogućuje read-only mod u kojem je moguće samo pregledavanje fotografija, radnje poput odabira više fotografija, dijeljenje, proiciranje i brisanje svih fotografija su onemogućene. Upali/ugasi read-only mod preko korisnickog avatara na glavnom ekranu.", "advanced_settings_readonly_mode_subtitle": "Omogućuje način rada za čitanje u kojem se fotografije mogu samo pregledavati, a stvari poput odabira više slika, dijeljenja, emitiranja i brisanja su onemogućene. Omogući/onemogući način rada za čitanje putem korisničkog avatara s glavnog zaslona",
"advanced_settings_readonly_mode_title": "Read-only mod", "advanced_settings_readonly_mode_title": "Read-only mod",
"advanced_settings_self_signed_ssl_subtitle": "Preskoči provjeru SSL certifikata za krajnju točku poslužitelja. Potrebno za samo-potpisane certifikate.", "advanced_settings_self_signed_ssl_subtitle": "Preskoči provjeru SSL certifikata za krajnju točku poslužitelja. Potrebno za samo-potpisane certifikate.",
"advanced_settings_self_signed_ssl_title": "Dopusti samo-potpisane SSL certifikate", "advanced_settings_self_signed_ssl_title": "Dopusti samopotpisane SSL certifikate [EKSPERIMENTALNO]",
"advanced_settings_sync_remote_deletions_subtitle": "Automatski izbriši ili obnovi stavku na ovom uređaju kada se ta radnja izvrši na webu", "advanced_settings_sync_remote_deletions_subtitle": "Automatski izbriši ili obnovi stavku na ovom uređaju kada se ta radnja izvrši na webu",
"advanced_settings_sync_remote_deletions_title": "Sinkroniziraj udaljena brisanja [EKSPERIMENTALNO]", "advanced_settings_sync_remote_deletions_title": "Sinkroniziraj udaljena brisanja [EKSPERIMENTALNO]",
"advanced_settings_tile_subtitle": "Postavke za napredne korisnike", "advanced_settings_tile_subtitle": "Postavke za napredne korisnike",
@@ -453,7 +451,7 @@
"albums_on_device_count": "Albumi na uređaju ({count})", "albums_on_device_count": "Albumi na uređaju ({count})",
"all": "Sve", "all": "Sve",
"all_albums": "Svi albumi", "all_albums": "Svi albumi",
"all_people": "Svi ljudi", "all_people": "Sve osobe",
"all_videos": "Svi videi", "all_videos": "Svi videi",
"allow_dark_mode": "Dozvoli tamni način", "allow_dark_mode": "Dozvoli tamni način",
"allow_edits": "Dozvoli izmjene", "allow_edits": "Dozvoli izmjene",
@@ -464,7 +462,7 @@
"api_key": "API Ključ", "api_key": "API Ključ",
"api_key_description": "Ova će vrijednost biti prikazana samo jednom. Obavezno ju kopirajte prije zatvaranja prozora.", "api_key_description": "Ova će vrijednost biti prikazana samo jednom. Obavezno ju kopirajte prije zatvaranja prozora.",
"api_key_empty": "Naziv vašeg API ključa ne smije biti prazan", "api_key_empty": "Naziv vašeg API ključa ne smije biti prazan",
"api_keys": "API Ključevi", "api_keys": "API ključevi",
"app_architecture_variant": "Varijanta(Arhitektura)", "app_architecture_variant": "Varijanta(Arhitektura)",
"app_bar_signout_dialog_content": "Jeste li sigurni da se želite odjaviti?", "app_bar_signout_dialog_content": "Jeste li sigurni da se želite odjaviti?",
"app_bar_signout_dialog_ok": "Da", "app_bar_signout_dialog_ok": "Da",
@@ -473,6 +471,7 @@
"app_settings": "Postavke aplikacije", "app_settings": "Postavke aplikacije",
"app_update_available": "Ažuriranje aplikacije je dostupno", "app_update_available": "Ažuriranje aplikacije je dostupno",
"appears_in": "Pojavljuje se u", "appears_in": "Pojavljuje se u",
"apply_count": "Primijeni ({count, number})",
"archive": "Arhiva", "archive": "Arhiva",
"archive_action_prompt": "{count} dodano u arhivu", "archive_action_prompt": "{count} dodano u arhivu",
"archive_or_unarchive_photo": "Arhivirajte ili dearhivirajte fotografiju", "archive_or_unarchive_photo": "Arhivirajte ili dearhivirajte fotografiju",
@@ -481,7 +480,7 @@
"archive_size": "Veličina arhive", "archive_size": "Veličina arhive",
"archive_size_description": "Konfigurirajte veličinu arhive za preuzimanja (u GiB)", "archive_size_description": "Konfigurirajte veličinu arhive za preuzimanja (u GiB)",
"archived": "Arhivirano", "archived": "Arhivirano",
"archived_count": "{count, plural, other {Archived #}}", "archived_count": "{count, plural, one {Arhivirana #} few {Arhivirane #} other {Arhivirano #}}",
"are_these_the_same_person": "Je li ovo ista osoba?", "are_these_the_same_person": "Je li ovo ista osoba?",
"are_you_sure_to_do_this": "Jeste li sigurni da to želite učiniti?", "are_you_sure_to_do_this": "Jeste li sigurni da to želite učiniti?",
"asset_action_delete_err_read_only": "Nije moguće izbrisati stavke samo za čitanje, preskakanje", "asset_action_delete_err_read_only": "Nije moguće izbrisati stavke samo za čitanje, preskakanje",
@@ -518,22 +517,22 @@
"assets_cannot_be_added_to_album_count": "{count, plural, one {Stavka se ne može} other {Stavke se ne mogu}} dodati u album", "assets_cannot_be_added_to_album_count": "{count, plural, one {Stavka se ne može} other {Stavke se ne mogu}} dodati u album",
"assets_cannot_be_added_to_albums": "{count, plural, one {Stavka se ne može} few {Stavke se ne mogu} other {Stavki se ne može}} dodati ni u jedan album", "assets_cannot_be_added_to_albums": "{count, plural, one {Stavka se ne može} few {Stavke se ne mogu} other {Stavki se ne može}} dodati ni u jedan album",
"assets_count": "{count, plural, one {# stavka} few {# stavke} other {# stavki}}", "assets_count": "{count, plural, one {# stavka} few {# stavke} other {# stavki}}",
"assets_deleted_permanently": "Trajno {count, plural, one {izbrisana # stavka} few {izbrisane # stavke} other {izbrisano # stavki}}", "assets_deleted_permanently": "{count, plural, one {# stavka trajno izbrisana} few {# stavke trajno izbrisane} other {# stavki trajno izbrisano}}",
"assets_deleted_permanently_from_server": "Trajno {count, plural, one {izbrisana # stavka} few {izbrisane # stavke} other {izbrisano # stavki}} s Immich servera", "assets_deleted_permanently_from_server": "Trajno {count, plural, one {izbrisana # stavka} few {izbrisane # stavke} other {izbrisano # stavki}} s Immich servera",
"assets_downloaded_failed": "{count, plural, one {Preuzeta # datoteka {error} datoteka nije uspjela} few {Preuzete # datoteke - {error} datoteke nisu uspjele} other {Preuzeto # datoteka {error} datoteke nisu uspjele}}", "assets_downloaded_failed": "{count, plural, one {Preuzeta # datoteka {error} datoteka nije uspjela} few {Preuzete # datoteke - {error} datoteke nisu uspjele} other {Preuzeto # datoteka {error} datoteke nisu uspjele}}",
"assets_downloaded_successfully": "{count, plural, one {Uspješno preuzeta # datoteka} few {Uspješno preuzete # datoteke} other {Uspješno preueto # datoteka}}", "assets_downloaded_successfully": "{count, plural, one {Uspješno preuzeta # datoteka} few {Uspješno preuzete # datoteke} other {Uspješno preueto # datoteka}}",
"assets_moved_to_trash_count": "{count, plural, one {# stavka premještena} few {# stavke premještene} other {# stavk premještenoi}} u smeće", "assets_moved_to_trash_count": "{count, plural, one {# stavka premještena} few {# stavke premještene} other {# stavk premještenoi}} u smeće",
"assets_permanently_deleted_count": "Trajno {count, plural, one {izbrisana # stavka} few {izbrisane # stavke} other {izbrisano # stavki}}", "assets_permanently_deleted_count": "Trajno {count, plural, one {izbrisana # stavka} few {izbrisane # stavke} other {izbrisano # stavki}}",
"assets_removed_count": "{count, plural, one {Uklonjena # stavka} few {Uklonjene # stavke} other {Uklonjeno # stavki}}", "assets_removed_count": "{count, plural, one {Uklonjena # stavka} few {Uklonjene # stavke} other {Uklonjeno # stavki}}",
"assets_removed_permanently_from_device": "{count} resurs(i) trajno uklonjen(i) s vašeg uređaja", "assets_removed_permanently_from_device": "{count, plural, one {# stavka trajno uklonjena} few {# stavke trajno uklonjene} other {# stavki trajno uklonjeno}} s vašeg uređaja",
"assets_restore_confirmation": "Jeste li sigurni da želite obnoviti sve svoje resurse bačene u otpad? Ne možete poništiti ovu radnju! Imajte na umu da se bilo koji izvanmrežni resursi ne mogu obnoviti na ovaj način.", "assets_restore_confirmation": "Jeste li sigurni da želite vratiti sve svoje izbrisane stavke? Ovu radnju ne možete poništiti! Imajte na umu da se na ovaj način ne mogu vratiti izvanmrežne stavke.",
"assets_restored_count": "Vraćeno {count, plural, one {# asset} other {# assets}}", "assets_restored_count": "{count, plural, one {Vraćena # stavka} few {Vraćene # stavke} other {Vraćeno # stavki}}",
"assets_restored_successfully": "{count} resurs(i) uspješno obnovljen(i)", "assets_restored_successfully": "{count, plural, one {# stavka uspješno obnovljena} few {# stavke uspješno obnovljene} other {# stavki uspješno obnovljeno}}",
"assets_trashed": "{count} resurs(i) premješten(i) u smeće", "assets_trashed": "{count, plural, one {# stavka premještena} few {# stavke premještene} other {# stavki premješteno}} u smeće",
"assets_trashed_count": "Bačeno u smeće {count, plural, one {# asset} other {# assets}}", "assets_trashed_count": "{count, plural, one {# stavka premještena} few {# stavke premještene} other {# stavki premješteno}} u smeće",
"assets_trashed_from_server": "{count} resurs(i) premješten(i) u smeće s Immich poslužitelja", "assets_trashed_from_server": "{count, plural, one {# stavka premještena} few {# stavke premještene} other {# stavki premješteno}} u smeće s Immich poslužitelja",
"assets_were_part_of_album_count": "{count, plural, one {Asset was} other {Assets were}} već dio albuma", "assets_were_part_of_album_count": "{count, plural, one {Stavka je već bila} other {Stavke su već bile}} dio albuma",
"assets_were_part_of_albums_count": "{count, plural, one {Datoteka je već bila dio albuma} few {Datoteke su već bile dio albuma} other {Datoteka je već bila dio albuma}}", "assets_were_part_of_albums_count": "{count, plural, one {Stavka je već bila} other {Stavke su već bile}} dio albuma",
"authorized_devices": "Ovlašteni uređaji", "authorized_devices": "Ovlašteni uređaji",
"automatic_endpoint_switching_subtitle": "Povežite se lokalno preko naznačene Wi-Fi mreže kada je dostupna i koristite alternativne veze na drugim lokacijama", "automatic_endpoint_switching_subtitle": "Povežite se lokalno preko naznačene Wi-Fi mreže kada je dostupna i koristite alternativne veze na drugim lokacijama",
"automatic_endpoint_switching_title": "Automatsko prebacivanje URL-a", "automatic_endpoint_switching_title": "Automatsko prebacivanje URL-a",
@@ -545,17 +544,18 @@
"backup": "Sigurnosna kopija", "backup": "Sigurnosna kopija",
"backup_album_selection_page_albums_device": "Albumi na uređaju ({count})", "backup_album_selection_page_albums_device": "Albumi na uređaju ({count})",
"backup_album_selection_page_albums_tap": "Dodirnite za uključivanje, dvostruki dodir za isključivanje", "backup_album_selection_page_albums_tap": "Dodirnite za uključivanje, dvostruki dodir za isključivanje",
"backup_album_selection_page_assets_scatter": "Resursi mogu biti raspoređeni u više albuma. Stoga, albumi mogu biti uključeni ili isključeni tijekom procesa sigurnosnog kopiranja.", "backup_album_selection_page_assets_scatter": "Stavke se mogu raspršiti po više albuma. Stoga se albumi mogu uključiti ili isključiti tijekom postupka sigurnosnog kopiranja.",
"backup_album_selection_page_select_albums": "Odabrani albumi", "backup_album_selection_page_select_albums": "Odabrani albumi",
"backup_album_selection_page_selection_info": "Informacije o odabiru", "backup_album_selection_page_selection_info": "Informacije o odabiru",
"backup_album_selection_page_total_assets": "Ukupan broj jedinstvenih resursa", "backup_album_selection_page_total_assets": "Ukupan broj jedinstvenih stavki",
"backup_all": "Sve", "backup_all": "Sve",
"backup_background_service_backup_failed_message": "Neuspješno sigurnosno kopiranje resursa. Pokušavam ponovo…", "backup_background_service_backup_failed_message": "Neuspješno sigurnosno kopiranje stavki. Ponovno pokušavanje…",
"backup_background_service_complete_notification": "Sigurnosno kopiranje stavki dovršeno",
"backup_background_service_connection_failed_message": "Neuspješno povezivanje s poslužiteljem. Pokušavam ponovo…", "backup_background_service_connection_failed_message": "Neuspješno povezivanje s poslužiteljem. Pokušavam ponovo…",
"backup_background_service_current_upload_notification": "Šaljem {filename}", "backup_background_service_current_upload_notification": "Šaljem {filename}",
"backup_background_service_default_notification": "Provjera novih resursa…", "backup_background_service_default_notification": "Provjera novih stavki…",
"backup_background_service_error_title": "Pogreška pri sigurnosnom kopiranju", "backup_background_service_error_title": "Pogreška pri sigurnosnom kopiranju",
"backup_background_service_in_progress_notification": "Sigurnosno kopiranje vaših resursa…", "backup_background_service_in_progress_notification": "Sigurnosno kopiranje vaših stavki…",
"backup_background_service_upload_failure_notification": "Neuspješno slanje {filename}", "backup_background_service_upload_failure_notification": "Neuspješno slanje {filename}",
"backup_controller_page_albums": "Sigurnosno kopiranje albuma", "backup_controller_page_albums": "Sigurnosno kopiranje albuma",
"backup_controller_page_background_app_refresh_disabled_content": "Omogućite osvježavanje aplikacije u pozadini u Postavke > Opće Postavke > Osvježavanje Aplikacija u Pozadini kako biste koristili sigurnosno kopiranje u pozadini.", "backup_controller_page_background_app_refresh_disabled_content": "Omogućite osvježavanje aplikacije u pozadini u Postavke > Opće Postavke > Osvježavanje Aplikacija u Pozadini kako biste koristili sigurnosno kopiranje u pozadini.",
@@ -567,8 +567,8 @@
"backup_controller_page_background_battery_info_title": "Optimizacije baterije", "backup_controller_page_background_battery_info_title": "Optimizacije baterije",
"backup_controller_page_background_charging": "Samo tijekom punjenja", "backup_controller_page_background_charging": "Samo tijekom punjenja",
"backup_controller_page_background_configure_error": "Neuspješno konfiguriranje pozadinske usluge", "backup_controller_page_background_configure_error": "Neuspješno konfiguriranje pozadinske usluge",
"backup_controller_page_background_delay": "Odgođeno sigurnosno kopiranje novih resursa: {duration}", "backup_controller_page_background_delay": "Odgoda sigurnosnog kopiranja novih stavki: {duration}",
"backup_controller_page_background_description": "Uključite pozadinsku uslugu kako biste automatski sigurnosno kopirali nove resurse bez potrebe za otvaranjem aplikacije", "backup_controller_page_background_description": "Uključite pozadinsku uslugu za automatsko sigurnosno kopiranje svih novih stavki bez potrebe za otvaranjem aplikacije",
"backup_controller_page_background_is_off": "Automatsko sigurnosno kopiranje u pozadini je isključeno", "backup_controller_page_background_is_off": "Automatsko sigurnosno kopiranje u pozadini je isključeno",
"backup_controller_page_background_is_on": "Automatsko sigurnosno kopiranje u pozadini je uključeno", "backup_controller_page_background_is_on": "Automatsko sigurnosno kopiranje u pozadini je uključeno",
"backup_controller_page_background_turn_off": "Isključite pozadinsku uslugu", "backup_controller_page_background_turn_off": "Isključite pozadinsku uslugu",
@@ -578,7 +578,7 @@
"backup_controller_page_backup_selected": "Odabrani: ", "backup_controller_page_backup_selected": "Odabrani: ",
"backup_controller_page_backup_sub": "Sigurnosno kopirane fotografije i videozapisi", "backup_controller_page_backup_sub": "Sigurnosno kopirane fotografije i videozapisi",
"backup_controller_page_created": "Kreirano: {date}", "backup_controller_page_created": "Kreirano: {date}",
"backup_controller_page_desc_backup": "Uključite sigurnosno kopiranje u prvom planu kako biste automatski prenijeli nove resurse na poslužitelj prilikom otvaranja aplikacije.", "backup_controller_page_desc_backup": "Uključite sigurnosno kopiranje u prvom planu kako biste automatski prenijeli nove stavke na poslužitelj prilikom otvaranja aplikacije.",
"backup_controller_page_excluded": "Izuzeto: ", "backup_controller_page_excluded": "Izuzeto: ",
"backup_controller_page_failed": "Neuspješno ({count})", "backup_controller_page_failed": "Neuspješno ({count})",
"backup_controller_page_filename": "Naziv datoteke: {filename} [{size}]", "backup_controller_page_filename": "Naziv datoteke: {filename} [{size}]",
@@ -598,7 +598,7 @@
"backup_controller_page_turn_on": "Uključite sigurnosno kopiranje u prvom planu", "backup_controller_page_turn_on": "Uključite sigurnosno kopiranje u prvom planu",
"backup_controller_page_uploading_file_info": "Slanje informacija o datoteci", "backup_controller_page_uploading_file_info": "Slanje informacija o datoteci",
"backup_err_only_album": "Nije moguće ukloniti jedini album", "backup_err_only_album": "Nije moguće ukloniti jedini album",
"backup_info_card_assets": "resursi", "backup_info_card_assets": "stavke",
"backup_manual_cancelled": "Otkazano", "backup_manual_cancelled": "Otkazano",
"backup_manual_in_progress": "Slanje već u tijeku. Pokšuajte nakon nekog vremena", "backup_manual_in_progress": "Slanje već u tijeku. Pokšuajte nakon nekog vremena",
"backup_manual_success": "Uspijeh", "backup_manual_success": "Uspijeh",
@@ -618,15 +618,15 @@
"bugs_and_feature_requests": "Bugovi i zahtjevi za značajke", "bugs_and_feature_requests": "Bugovi i zahtjevi za značajke",
"build": "Sagradi (Build)", "build": "Sagradi (Build)",
"build_image": "Sagradi (Build) Image", "build_image": "Sagradi (Build) Image",
"bulk_delete_duplicates_confirmation": "Jeste li sigurni da želite skupno izbrisati {count, plural, one {# duplicate asset} other {# duplicate asset}}? Ovo će zadržati najveće sredstvo svake grupe i trajno izbrisati sve druge duplikate. Ne možete poništiti ovu radnju!", "bulk_delete_duplicates_confirmation": "Jeste li sigurni da želite skupno izbrisati {count, plural, one {# dupliciranu stavku} few {# duplicirane stavke} other {# dupliciranih stavki}}? Ovo će zadržati najveću stavku svake grupe i trajno izbrisati sve druge duplikate. Ne možete poništiti ovu radnju!",
"bulk_keep_duplicates_confirmation": "Jeste li sigurni da želite zadržati {count, plural, one {# duplicate asset} other {# duplicate asset}}? Ovo će riješiti sve duplicirane grupe bez brisanja ičega.", "bulk_keep_duplicates_confirmation": "Jeste li sigurni da želite zadržati {count, plural, one {# duplicate asset} other {# duplicate asset}}? Ovo će riješiti sve duplicirane grupe bez brisanja ičega.",
"bulk_trash_duplicates_confirmation": "Jeste li sigurni da želite na veliko baciti u smeće {count, plural, one {# duplicate asset} other {# duplicate asset}}? Ovo će zadržati najveće sredstvo svake grupe i baciti sve ostale duplikate u smeće.", "bulk_trash_duplicates_confirmation": "Jeste li sigurni da želite skupno u smeće premjestiti {count, plural, one {# dupliciranu stavku} few {# duplicirane stavke} other {# dupliciranih stavki}}? Ovo će zadržati najveću stavku svake grupe i premjestiti sve ostale duplikate u smeće.",
"buy": "Kupi Immich", "buy": "Kupi Immich",
"cache_settings_clear_cache_button": "Očisti predmemoriju", "cache_settings_clear_cache_button": "Očisti predmemoriju",
"cache_settings_clear_cache_button_title": "Briše predmemoriju aplikacije. Ovo će značajno utjecati na performanse aplikacije dok se predmemorija ponovno ne izgradi.", "cache_settings_clear_cache_button_title": "Briše predmemoriju aplikacije. Ovo će značajno utjecati na performanse aplikacije dok se predmemorija ponovno ne izgradi.",
"cache_settings_duplicated_assets_clear_button": "OČISTI", "cache_settings_duplicated_assets_clear_button": "OČISTI",
"cache_settings_duplicated_assets_subtitle": "Fotografije i videozapisi koje je aplikacija ignorira", "cache_settings_duplicated_assets_subtitle": "Fotografije i videozapisi koje aplikacija ignorira",
"cache_settings_duplicated_assets_title": "Duplicirani resursi ({count})", "cache_settings_duplicated_assets_title": "Duplicirane stavke ({count})",
"cache_settings_statistics_album": "Sličice biblioteke", "cache_settings_statistics_album": "Sličice biblioteke",
"cache_settings_statistics_full": "Pune slike", "cache_settings_statistics_full": "Pune slike",
"cache_settings_statistics_shared": "Sličice dijeljenih albuma", "cache_settings_statistics_shared": "Sličice dijeljenih albuma",
@@ -683,8 +683,8 @@
"client_cert_import_success_msg": "Klijentski certifikat je uvezen", "client_cert_import_success_msg": "Klijentski certifikat je uvezen",
"client_cert_invalid_msg": "Neispravna datoteka certifikata ili pogrešna lozinka", "client_cert_invalid_msg": "Neispravna datoteka certifikata ili pogrešna lozinka",
"client_cert_remove_msg": "Klijentski certifikat je uklonjen", "client_cert_remove_msg": "Klijentski certifikat je uklonjen",
"client_cert_subtitle": "Podržava samo PKCS12 (.p12, .pfx) format. Uvoz/uklanjanje certifikata moguće je samo prije prijave", "client_cert_subtitle": "Podržava samo PKCS12 (.p12, .pfx) format. Uvoz/uklanjanje certifikata dostupno je samo prije prijave",
"client_cert_title": "SSL klijentski certifikat", "client_cert_title": "SSL klijentski certifikat [EKSPERIMENTALNO]",
"clockwise": "U smjeru kazaljke na satu", "clockwise": "U smjeru kazaljke na satu",
"close": "Zatvori", "close": "Zatvori",
"collapse": "Sažmi", "collapse": "Sažmi",
@@ -699,9 +699,9 @@
"completed": "Dovršeno", "completed": "Dovršeno",
"confirm": "Potvrdi", "confirm": "Potvrdi",
"confirm_admin_password": "Potvrdite lozinku administratora", "confirm_admin_password": "Potvrdite lozinku administratora",
"confirm_delete_face": "Jeste li sigurni da želite izbrisati lice {name} iz resursa?", "confirm_delete_face": "Jeste li sigurni da želite izbrisati lice {name} iz stavke?",
"confirm_delete_shared_link": "Jeste li sigurni da želite izbrisati ovu zajedničku vezu?", "confirm_delete_shared_link": "Jeste li sigurni da želite izbrisati ovu zajedničku vezu?",
"confirm_keep_this_delete_others": "Sva druga sredstva u nizu bit će izbrisana osim ovog sredstva. Jeste li sigurni da želite nastaviti?", "confirm_keep_this_delete_others": "Sve druge stavke u stogu bit će izbrisane osim ove stavke. Jeste li sigurni da želite nastaviti?",
"confirm_new_pin_code": "Potvrdi novi PIN kod", "confirm_new_pin_code": "Potvrdi novi PIN kod",
"confirm_password": "Potvrdite lozinku", "confirm_password": "Potvrdite lozinku",
"confirm_tag_face": "Želite li označiti ovo lice kao {name}?", "confirm_tag_face": "Želite li označiti ovo lice kao {name}?",
@@ -717,7 +717,7 @@
"control_bottom_app_bar_edit_location": "Uredi lokaciju", "control_bottom_app_bar_edit_location": "Uredi lokaciju",
"control_bottom_app_bar_edit_time": "Uredi datum i vrijeme", "control_bottom_app_bar_edit_time": "Uredi datum i vrijeme",
"control_bottom_app_bar_share_link": "Podijeli poveznicu", "control_bottom_app_bar_share_link": "Podijeli poveznicu",
"control_bottom_app_bar_share_to": "Podijeli s...", "control_bottom_app_bar_share_to": "Dijeli s",
"control_bottom_app_bar_trash_from_immich": "Premjesti u smeće", "control_bottom_app_bar_trash_from_immich": "Premjesti u smeće",
"copied_image_to_clipboard": "Slika je kopirana u međuspremnik.", "copied_image_to_clipboard": "Slika je kopirana u međuspremnik.",
"copied_to_clipboard": "Kopirano u međuspremnik!", "copied_to_clipboard": "Kopirano u međuspremnik!",
@@ -740,7 +740,7 @@
"create_link_to_share_description": "Dopusti svakome s vezom da vidi odabrane fotografije", "create_link_to_share_description": "Dopusti svakome s vezom da vidi odabrane fotografije",
"create_new": "KREIRAJ NOVO", "create_new": "KREIRAJ NOVO",
"create_new_person": "Stvorite novu osobu", "create_new_person": "Stvorite novu osobu",
"create_new_person_hint": "Dodijelite odabrana sredstva novoj osobi", "create_new_person_hint": "Dodijelite odabrane stavke novoj osobi",
"create_new_user": "Kreiraj novog korisnika", "create_new_user": "Kreiraj novog korisnika",
"create_shared_album_page_share_add_assets": "DODAJ STAVKE", "create_shared_album_page_share_add_assets": "DODAJ STAVKE",
"create_shared_album_page_share_select_photos": "Odaberi fotografije", "create_shared_album_page_share_select_photos": "Odaberi fotografije",
@@ -778,7 +778,7 @@
"default_locale": "Zadana lokalizacija", "default_locale": "Zadana lokalizacija",
"default_locale_description": "Oblikujte datume i brojeve na temelju jezika preglednika", "default_locale_description": "Oblikujte datume i brojeve na temelju jezika preglednika",
"delete": "Izbriši", "delete": "Izbriši",
"delete_action_confirmation_message": "Jeste li sigurni da želite izbrisati ovaj sadržaj? Ova radnja će premjestiti sadržaj u smeće na poslužitelju i upitat će vas želite li ga izbrisati i lokalno", "delete_action_confirmation_message": "Jeste li sigurni da želite izbrisati ovu stavku? Ova radnja će premjestiti stavku u smeće poslužitelja i pitati vas želite li ju izbrisati lokalno",
"delete_action_prompt": "{count} izbrisano", "delete_action_prompt": "{count} izbrisano",
"delete_album": "Izbriši album", "delete_album": "Izbriši album",
"delete_api_key_prompt": "Jeste li sigurni da želite izbrisati ovaj API ključ?", "delete_api_key_prompt": "Jeste li sigurni da želite izbrisati ovaj API ključ?",
@@ -805,7 +805,7 @@
"delete_tag_confirmation_prompt": "Jeste li sigurni da želite izbrisati oznaku {tagName}?", "delete_tag_confirmation_prompt": "Jeste li sigurni da želite izbrisati oznaku {tagName}?",
"delete_user": "Izbriši korisnika", "delete_user": "Izbriši korisnika",
"deleted_shared_link": "Izbrisana dijeljena poveznica", "deleted_shared_link": "Izbrisana dijeljena poveznica",
"deletes_missing_assets": "Briše sredstva koja nedostaju s diska", "deletes_missing_assets": "Briše stavke koje nedostaju na disku",
"description": "Opis", "description": "Opis",
"description_input_hint_text": "Dodaj opis...", "description_input_hint_text": "Dodaj opis...",
"description_input_submit_error": "Pogreška pri ažuriranju opisa, provjerite zapisnik za više detalja", "description_input_submit_error": "Pogreška pri ažuriranju opisa, provjerite zapisnik za više detalja",
@@ -822,12 +822,12 @@
"display_options": "Mogućnosti prikaza", "display_options": "Mogućnosti prikaza",
"display_order": "Redoslijed prikaza", "display_order": "Redoslijed prikaza",
"display_original_photos": "Prikaz originalnih fotografija", "display_original_photos": "Prikaz originalnih fotografija",
"display_original_photos_setting_description": "Radije prikažite izvornu fotografiju kada gledate materijal umjesto sličica kada je izvorni materijal kompatibilan s webom. To može rezultirati sporijim brzinama prikaza fotografija.", "display_original_photos_setting_description": "Radije prikažite izvornu fotografiju kada gledate stavku umjesto sličica kada je izvorna stavka kompatibilna s webom. To može rezultirati sporijim brzinama prikaza fotografija.",
"do_not_show_again": "Ne prikazuj više ovu poruku", "do_not_show_again": "Ne prikazuj više ovu poruku",
"documentation": "Dokumentacija", "documentation": "Dokumentacija",
"done": "Gotovo", "done": "Gotovo",
"download": "Preuzmi", "download": "Preuzmi",
"download_action_prompt": "Preuzimanje {count} sadržaja", "download_action_prompt": "Preuzimanje {count, plural, one {# stavke} few {# stavke} other {# stavki}}",
"download_canceled": "Preuzimanje otkazano", "download_canceled": "Preuzimanje otkazano",
"download_complete": "Preuzimanje završeno", "download_complete": "Preuzimanje završeno",
"download_enqueue": "Preuzimanje dodano u red", "download_enqueue": "Preuzimanje dodano u red",
@@ -839,13 +839,13 @@
"download_notfound": "Preuzimanje nije pronađeno", "download_notfound": "Preuzimanje nije pronađeno",
"download_paused": "Preuzimanje pauzirano", "download_paused": "Preuzimanje pauzirano",
"download_settings": "Preuzmi", "download_settings": "Preuzmi",
"download_settings_description": "Upravljajte postavkama koje se odnose na preuzimanje sredstava", "download_settings_description": "Upravljajte postavkama vezanim uz preuzimanje stavki",
"download_started": "Preuzimanje započeto", "download_started": "Preuzimanje započeto",
"download_sucess": "Preuzimanje uspješno", "download_sucess": "Preuzimanje uspješno",
"download_sucess_android": "Medij je preuzet u DCIM/Immich", "download_sucess_android": "Medij je preuzet u DCIM/Immich",
"download_waiting_to_retry": "Čeka se ponovni pokušaj", "download_waiting_to_retry": "Čeka se ponovni pokušaj",
"downloading": "Preuzimanje", "downloading": "Preuzimanje",
"downloading_asset_filename": "Preuzimanje materijala {filename}", "downloading_asset_filename": "Preuzimanje stavke {filename}",
"downloading_media": "Preuzimanje medija", "downloading_media": "Preuzimanje medija",
"drop_files_to_upload": "Ispustite datoteke bilo gdje za prijenos", "drop_files_to_upload": "Ispustite datoteke bilo gdje za prijenos",
"duplicates": "Duplikati", "duplicates": "Duplikati",
@@ -864,8 +864,6 @@
"edit_description_prompt": "Molimo odaberite novi opis:", "edit_description_prompt": "Molimo odaberite novi opis:",
"edit_exclusion_pattern": "Uredi uzorak izuzimanja", "edit_exclusion_pattern": "Uredi uzorak izuzimanja",
"edit_faces": "Uređivanje lica", "edit_faces": "Uređivanje lica",
"edit_import_path": "Uredi put uvoza",
"edit_import_paths": "Uredi Uvozne Putanje",
"edit_key": "Ključ za uređivanje", "edit_key": "Ključ za uređivanje",
"edit_link": "Uredi poveznicu", "edit_link": "Uredi poveznicu",
"edit_location": "Uredi lokaciju", "edit_location": "Uredi lokaciju",
@@ -885,7 +883,7 @@
"email_notifications": "Obavijesti putem e-maila", "email_notifications": "Obavijesti putem e-maila",
"empty_folder": "Ova mapa je prazna", "empty_folder": "Ova mapa je prazna",
"empty_trash": "Isprazni smeće", "empty_trash": "Isprazni smeće",
"empty_trash_confirmation": "Jeste li sigurni da želite isprazniti smeće? Time će se iz Immicha trajno ukloniti sva sredstva u otpadu.\nNe možete poništiti ovu radnju!", "empty_trash_confirmation": "Jeste li sigurni da želite isprazniti smeće? Time će se iz Immicha trajno ukloniti sve stavke u smeću.\nNe možete poništiti ovu radnju!",
"enable": "Omogući", "enable": "Omogući",
"enable_backup": "Omogući sigurnosnu kopiju", "enable_backup": "Omogući sigurnosnu kopiju",
"enable_biometric_auth_description": "Unesite svoj PIN kod za omogućavanje biometrijske autentikacije", "enable_biometric_auth_description": "Unesite svoj PIN kod za omogućavanje biometrijske autentikacije",
@@ -903,57 +901,55 @@
"error_tag_face_bounding_box": "Pogreška pri označavanju lica nije moguće dohvatiti koordinate granica (bounding box)", "error_tag_face_bounding_box": "Pogreška pri označavanju lica nije moguće dohvatiti koordinate granica (bounding box)",
"error_title": "Greška - Nešto je pošlo krivo", "error_title": "Greška - Nešto je pošlo krivo",
"errors": { "errors": {
"cannot_navigate_next_asset": "Nije moguće prijeći na sljedeći materijal", "cannot_navigate_next_asset": "Nije moguće prijeći na sljedeću stavku",
"cannot_navigate_previous_asset": "Nije moguće prijeći na prethodni materijal", "cannot_navigate_previous_asset": "Nije moguće prijeći na prethodnu stavku",
"cant_apply_changes": "Nije moguće primijeniti promjene", "cant_apply_changes": "Nije moguće primijeniti promjene",
"cant_change_activity": "Nije moguće {enabled, select, true {onemogućiti} other {omogućiti}} aktivnost", "cant_change_activity": "Nije moguće {enabled, select, true {onemogućiti} other {omogućiti}} aktivnost",
"cant_change_asset_favorite": "Nije moguće promijeniti favorita za sredstvo", "cant_change_asset_favorite": "Nije moguće promijeniti favorita za stavku",
"cant_change_metadata_assets_count": "Nije moguće promijeniti metapodatke {count, plural, one {# asset} other {# assets}}", "cant_change_metadata_assets_count": "Nije moguće promijeniti metapodatke {count, plural, one {# stavke} few {# stavke} other {# stavki}}",
"cant_get_faces": "Ne mogu dobiti lica", "cant_get_faces": "Ne mogu dobiti lica",
"cant_get_number_of_comments": "Ne mogu dobiti broj komentara", "cant_get_number_of_comments": "Ne mogu dobiti broj komentara",
"cant_search_people": "Ne mogu pretraživati ljude", "cant_search_people": "Ne mogu pretraživati ljude",
"cant_search_places": "Ne mogu pretraživati mjesta", "cant_search_places": "Ne mogu pretraživati mjesta",
"error_adding_assets_to_album": "Pogreška pri dodavanju materijala u album", "error_adding_assets_to_album": "Pogreška pri dodavanju stavki u album",
"error_adding_users_to_album": "Pogreška pri dodavanju korisnika u album", "error_adding_users_to_album": "Pogreška pri dodavanju korisnika u album",
"error_deleting_shared_user": "Pogreška pri brisanju dijeljenog korisnika", "error_deleting_shared_user": "Pogreška pri brisanju dijeljenog korisnika",
"error_downloading": "Pogreška pri preuzimanju {filename}", "error_downloading": "Pogreška pri preuzimanju {filename}",
"error_hiding_buy_button": "Pogreška pri skrivanju gumba za kupnju", "error_hiding_buy_button": "Pogreška pri skrivanju gumba za kupnju",
"error_removing_assets_from_album": "Pogreška prilikom uklanjanja materijala iz albuma, provjerite konzolu za više pojedinosti", "error_removing_assets_from_album": "Pogreška prilikom uklanjanja stavki iz albuma, provjerite konzolu za više detalja",
"error_selecting_all_assets": "Pogreška pri odabiru svih sredstava", "error_selecting_all_assets": "Pogreška pri odabiru svih stavki",
"exclusion_pattern_already_exists": "Ovaj uzorak izuzimanja već postoji.", "exclusion_pattern_already_exists": "Ovaj uzorak izuzimanja već postoji.",
"failed_to_create_album": "Izrada albuma nije uspjela", "failed_to_create_album": "Izrada albuma nije uspjela",
"failed_to_create_shared_link": "Stvaranje dijeljene veze nije uspjelo", "failed_to_create_shared_link": "Stvaranje dijeljene veze nije uspjelo",
"failed_to_edit_shared_link": "Nije uspjelo uređivanje dijeljene poveznice", "failed_to_edit_shared_link": "Nije uspjelo uređivanje dijeljene poveznice",
"failed_to_get_people": "Dohvaćanje ljudi nije uspjelo", "failed_to_get_people": "Dohvaćanje osoba nije uspjelo",
"failed_to_keep_this_delete_others": "Zadržavanje ovog sredstva i brisanje ostalih sredstava nije uspjelo", "failed_to_keep_this_delete_others": "Zadržavanje ove stavke i brisanje ostalih stavki nije uspjelo",
"failed_to_load_asset": "Učitavanje sredstva nije uspjelo", "failed_to_load_asset": "Učitavanje stavke nije uspjelo",
"failed_to_load_assets": "Učitavanje sredstava nije uspjelo", "failed_to_load_assets": "Učitavanje stavki nije uspjelo",
"failed_to_load_notifications": "Neuspješno učitavanje obavijesti", "failed_to_load_notifications": "Neuspješno učitavanje obavijesti",
"failed_to_load_people": "Učitavanje ljudi nije uspjelo", "failed_to_load_people": "Učitavanje osoba nije uspjelo",
"failed_to_remove_product_key": "Uklanjanje ključa proizvoda nije uspjelo", "failed_to_remove_product_key": "Uklanjanje ključa proizvoda nije uspjelo",
"failed_to_reset_pin_code": "Neuspješno resetiranje PIN koda", "failed_to_reset_pin_code": "Neuspješno resetiranje PIN koda",
"failed_to_stack_assets": "Slaganje sredstava nije uspjelo", "failed_to_stack_assets": "Slaganje stavki nije uspjelo",
"failed_to_unstack_assets": "Nije uspjelo uklanjanje snopa sredstava", "failed_to_unstack_assets": "Razdvajanje stavki nije uspjelo",
"failed_to_update_notification_status": "Neuspješno ažuriranje statusa obavijesti", "failed_to_update_notification_status": "Neuspješno ažuriranje statusa obavijesti",
"import_path_already_exists": "Ovaj uvozni put već postoji.",
"incorrect_email_or_password": "Netočna adresa e-pošte ili lozinka", "incorrect_email_or_password": "Netočna adresa e-pošte ili lozinka",
"paths_validation_failed": "{paths, plural, one {# putanja nije prošla} other {# putanje nisu prošle}} provjeru valjanosti", "paths_validation_failed": "{paths, plural, one {# putanja nije prošla} other {# putanje nisu prošle}} provjeru valjanosti",
"profile_picture_transparent_pixels": "Profilne slike ne smiju imati prozirne piksele. Povećajte i/ili pomaknite sliku.", "profile_picture_transparent_pixels": "Profilne slike ne smiju imati prozirne piksele. Povećajte i/ili pomaknite sliku.",
"quota_higher_than_disk_size": "Postavili ste kvotu veću od veličine diska", "quota_higher_than_disk_size": "Postavili ste kvotu veću od veličine diska",
"something_went_wrong": "Nešto je pošlo po zlu", "something_went_wrong": "Nešto je pošlo po zlu",
"unable_to_add_album_users": "Nije moguće dodati korisnike u album", "unable_to_add_album_users": "Nije moguće dodati korisnike u album",
"unable_to_add_assets_to_shared_link": "Nije moguće dodati sredstva na dijeljenu poveznicu", "unable_to_add_assets_to_shared_link": "Nije moguće dodati stavke u dijeljenu vezu",
"unable_to_add_comment": "Nije moguće dodati komentar", "unable_to_add_comment": "Nije moguće dodati komentar",
"unable_to_add_exclusion_pattern": "Nije moguće dodati uzorak izuzimanja", "unable_to_add_exclusion_pattern": "Nije moguće dodati uzorak izuzimanja",
"unable_to_add_import_path": "Nije moguće dodati putanju uvoza",
"unable_to_add_partners": "Nije moguće dodati partnere", "unable_to_add_partners": "Nije moguće dodati partnere",
"unable_to_add_remove_archive": "Nije moguće {archived, select, true {ukloniti resurs iz} other {dodati resurs u}} arhivu", "unable_to_add_remove_archive": "Nije moguće {archived, select, true {ukloniti stavku iz} other {dodati stavku u}} arhivu",
"unable_to_add_remove_favorites": "Nije moguće {favorite, select, true {add asset to} other {remove asset from}} favorite", "unable_to_add_remove_favorites": "Nije moguće {favorite, select, true {add asset to} other {remove asset from}} favorite",
"unable_to_archive_unarchive": "Nije moguće {archived, select, true {arhivirati} other {dearhivirati}}", "unable_to_archive_unarchive": "Nije moguće {archived, select, true {arhivirati} other {dearhivirati}}",
"unable_to_change_album_user_role": "Nije moguće promijeniti ulogu korisnika albuma", "unable_to_change_album_user_role": "Nije moguće promijeniti ulogu korisnika albuma",
"unable_to_change_date": "Nije moguće promijeniti datum", "unable_to_change_date": "Nije moguće promijeniti datum",
"unable_to_change_description": "Nije moguće promijeniti opis", "unable_to_change_description": "Nije moguće promijeniti opis",
"unable_to_change_favorite": "Nije moguće promijeniti favorita za sredstvo", "unable_to_change_favorite": "Nije moguće promijeniti favorita za stavku",
"unable_to_change_location": "Nije moguće promijeniti lokaciju", "unable_to_change_location": "Nije moguće promijeniti lokaciju",
"unable_to_change_password": "Nije moguće promijeniti lozinku", "unable_to_change_password": "Nije moguće promijeniti lozinku",
"unable_to_change_visibility": "Nije moguće promijeniti vidljivost za {count, plural, one {# osobu} other {# osobe}}", "unable_to_change_visibility": "Nije moguće promijeniti vidljivost za {count, plural, one {# osobu} other {# osobe}}",
@@ -965,15 +961,13 @@
"unable_to_create_library": "Nije moguće stvoriti biblioteku", "unable_to_create_library": "Nije moguće stvoriti biblioteku",
"unable_to_create_user": "Nije moguće stvoriti korisnika", "unable_to_create_user": "Nije moguće stvoriti korisnika",
"unable_to_delete_album": "Nije moguće izbrisati album", "unable_to_delete_album": "Nije moguće izbrisati album",
"unable_to_delete_asset": "Nije moguće izbrisati sredstvo", "unable_to_delete_asset": "Nije moguće izbrisati stavku",
"unable_to_delete_assets": "Pogreška pri brisanju sredstava", "unable_to_delete_assets": "Pogreška pri brisanju stavki",
"unable_to_delete_exclusion_pattern": "Nije moguće izbrisati uzorak izuzimanja", "unable_to_delete_exclusion_pattern": "Nije moguće izbrisati uzorak izuzimanja",
"unable_to_delete_import_path": "Nije moguće izbrisati put uvoza",
"unable_to_delete_shared_link": "Nije moguće izbrisati dijeljenu poveznicu", "unable_to_delete_shared_link": "Nije moguće izbrisati dijeljenu poveznicu",
"unable_to_delete_user": "Nije moguće izbrisati korisnika", "unable_to_delete_user": "Nije moguće izbrisati korisnika",
"unable_to_download_files": "Nije moguće preuzeti datoteke", "unable_to_download_files": "Nije moguće preuzeti datoteke",
"unable_to_edit_exclusion_pattern": "Nije moguće urediti uzorak izuzimanja", "unable_to_edit_exclusion_pattern": "Nije moguće urediti uzorak izuzimanja",
"unable_to_edit_import_path": "Nije moguće urediti put uvoza",
"unable_to_empty_trash": "Nije moguće isprazniti otpad", "unable_to_empty_trash": "Nije moguće isprazniti otpad",
"unable_to_enter_fullscreen": "Nije moguće otvoriti cijeli zaslon", "unable_to_enter_fullscreen": "Nije moguće otvoriti cijeli zaslon",
"unable_to_exit_fullscreen": "Nije moguće izaći iz cijelog zaslona", "unable_to_exit_fullscreen": "Nije moguće izaći iz cijelog zaslona",
@@ -986,19 +980,19 @@
"unable_to_log_out_device": "Nije moguće odjaviti uređaj", "unable_to_log_out_device": "Nije moguće odjaviti uređaj",
"unable_to_login_with_oauth": "Nije moguće prijaviti se pomoću OAutha", "unable_to_login_with_oauth": "Nije moguće prijaviti se pomoću OAutha",
"unable_to_play_video": "Nije moguće reproducirati video", "unable_to_play_video": "Nije moguće reproducirati video",
"unable_to_reassign_assets_existing_person": "Nije moguće ponovno dodijeliti imovinu na {name, select, null {postojeću osobu} other {{name}}}", "unable_to_reassign_assets_existing_person": "Nije moguće ponovno dodijeliti stavke {name, select, null {postojećoj osobi} other {{name}}}",
"unable_to_reassign_assets_new_person": "Nije moguće ponovno dodijeliti imovinu novoj osobi", "unable_to_reassign_assets_new_person": "Nije moguće ponovno dodijeliti stavke novoj osobi",
"unable_to_refresh_user": "Nije moguće osvježiti korisnika", "unable_to_refresh_user": "Nije moguće osvježiti korisnika",
"unable_to_remove_album_users": "Nije moguće ukloniti korisnike iz albuma", "unable_to_remove_album_users": "Nije moguće ukloniti korisnike iz albuma",
"unable_to_remove_api_key": "Nije moguće ukloniti API ključ", "unable_to_remove_api_key": "Nije moguće ukloniti API ključ",
"unable_to_remove_assets_from_shared_link": "Nije moguće ukloniti sredstva iz dijeljene poveznice", "unable_to_remove_assets_from_shared_link": "Nije moguće ukloniti stavke iz dijeljene veze",
"unable_to_remove_library": "Nije moguće ukloniti biblioteku", "unable_to_remove_library": "Nije moguće ukloniti biblioteku",
"unable_to_remove_partner": "Nije moguće ukloniti partnera", "unable_to_remove_partner": "Nije moguće ukloniti partnera",
"unable_to_remove_reaction": "Nije moguće ukloniti reakciju", "unable_to_remove_reaction": "Nije moguće ukloniti reakciju",
"unable_to_reset_password": "Nije moguće ponovno postaviti lozinku", "unable_to_reset_password": "Nije moguće ponovno postaviti lozinku",
"unable_to_reset_pin_code": "Nije moguće poništiti PIN kod", "unable_to_reset_pin_code": "Nije moguće poništiti PIN kod",
"unable_to_resolve_duplicate": "Nije moguće razriješiti duplikat", "unable_to_resolve_duplicate": "Nije moguće razriješiti duplikat",
"unable_to_restore_assets": "Nije moguće vratiti imovinu", "unable_to_restore_assets": "Nije moguće vratiti stavke",
"unable_to_restore_trash": "Nije moguće vratiti otpad", "unable_to_restore_trash": "Nije moguće vratiti otpad",
"unable_to_restore_user": "Nije moguće vratiti korisnika", "unable_to_restore_user": "Nije moguće vratiti korisnika",
"unable_to_save_album": "Nije moguće spremiti album", "unable_to_save_album": "Nije moguće spremiti album",
@@ -1012,7 +1006,7 @@
"unable_to_set_feature_photo": "Nije moguće postaviti istaknutu fotografiju", "unable_to_set_feature_photo": "Nije moguće postaviti istaknutu fotografiju",
"unable_to_set_profile_picture": "Nije moguće postaviti profilnu sliku", "unable_to_set_profile_picture": "Nije moguće postaviti profilnu sliku",
"unable_to_submit_job": "Nije moguće poslati posao", "unable_to_submit_job": "Nije moguće poslati posao",
"unable_to_trash_asset": "Nije moguće baciti sredstvo u smeće", "unable_to_trash_asset": "Nije moguće premjestiti stavku u smeće",
"unable_to_unlink_account": "Nije moguće prekinuti vezu računa", "unable_to_unlink_account": "Nije moguće prekinuti vezu računa",
"unable_to_unlink_motion_video": "Nije moguće prekinuti vezu videozapisa pokreta", "unable_to_unlink_motion_video": "Nije moguće prekinuti vezu videozapisa pokreta",
"unable_to_update_album_cover": "Nije moguće ažurirati omot albuma", "unable_to_update_album_cover": "Nije moguće ažurirati omot albuma",
@@ -1054,13 +1048,13 @@
"face_unassigned": "Nedodijeljeno", "face_unassigned": "Nedodijeljeno",
"failed": "Neuspješno", "failed": "Neuspješno",
"failed_to_authenticate": "Neuspješna autentikacija", "failed_to_authenticate": "Neuspješna autentikacija",
"failed_to_load_assets": "Neuspjelo učitavanje stavki", "failed_to_load_assets": "Učitavanje stavki nije uspjelo",
"failed_to_load_folder": "Neuspjelo učitavanje mape", "failed_to_load_folder": "Neuspjelo učitavanje mape",
"favorite": "Omiljeno", "favorite": "Omiljeno",
"favorite_action_prompt": "{count} dodano u Omiljeno", "favorite_action_prompt": "{count} dodano u Omiljeno",
"favorite_or_unfavorite_photo": "Omiljena ili neomiljena fotografija", "favorite_or_unfavorite_photo": "Omiljena ili neomiljena fotografija",
"favorites": "Omiljene", "favorites": "Omiljene",
"favorites_page_no_favorites": "Nema pronađenih omiljenih stavki", "favorites_page_no_favorites": "Nema pronađenih favorita",
"feature_photo_updated": "Istaknuta fotografija ažurirana", "feature_photo_updated": "Istaknuta fotografija ažurirana",
"features": "Značajke", "features": "Značajke",
"features_setting_description": "Upravljajte značajkama aplikacije", "features_setting_description": "Upravljajte značajkama aplikacije",
@@ -1081,8 +1075,9 @@
"forgot_pin_code_question": "Zaboravili ste svoj PIN?", "forgot_pin_code_question": "Zaboravili ste svoj PIN?",
"forward": "Naprijed", "forward": "Naprijed",
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Ova značajka učitava vanjske resurse s Googlea kako bi radila.", "gcast_enabled_description": "Ova značajka učitava vanjske stavke s Googlea kako bi radila.",
"general": "Općenito", "general": "Općenito",
"geolocation_instruction_location": "Kliknite na stavku s GPS koordinatama da biste koristili njezinu lokaciju ili odaberite lokaciju izravno s karte",
"get_help": "Potražite pomoć", "get_help": "Potražite pomoć",
"get_wifiname_error": "Nije moguće dohvatiti naziv Wi-Fi mreže. Provjerite imate li potrebna dopuštenja i jeste li povezani na Wi-Fi mrežu", "get_wifiname_error": "Nije moguće dohvatiti naziv Wi-Fi mreže. Provjerite imate li potrebna dopuštenja i jeste li povezani na Wi-Fi mrežu",
"getting_started": "Početak Rada", "getting_started": "Početak Rada",
@@ -1099,8 +1094,8 @@
"haptic_feedback_switch": "Omogući haptičku povratnu informaciju", "haptic_feedback_switch": "Omogući haptičku povratnu informaciju",
"haptic_feedback_title": "Haptička povratna informacija", "haptic_feedback_title": "Haptička povratna informacija",
"has_quota": "Ima kvotu", "has_quota": "Ima kvotu",
"hash_asset": "Hash sadržaja", "hash_asset": "Hashiraj stavku",
"hashed_assets": "Hashirani sadržaji", "hashed_assets": "Hashirane stavke",
"hashing": "Hashiranje", "hashing": "Hashiranje",
"header_settings_add_header_tip": "Dodaj zaglavlje", "header_settings_add_header_tip": "Dodaj zaglavlje",
"header_settings_field_validator_msg": "Vrijednost ne može biti prazna", "header_settings_field_validator_msg": "Vrijednost ne može biti prazna",
@@ -1115,21 +1110,21 @@
"hide_person": "Sakrij osobu", "hide_person": "Sakrij osobu",
"hide_unnamed_people": "Sakrij neimenovane osobe", "hide_unnamed_people": "Sakrij neimenovane osobe",
"home_page_add_to_album_conflicts": "Dodano {added} stavki u album {album}. {failed} stavki je već u albumu.", "home_page_add_to_album_conflicts": "Dodano {added} stavki u album {album}. {failed} stavki je već u albumu.",
"home_page_add_to_album_err_local": "Lokalne stavke još nije moguće dodati u albume, preskačem", "home_page_add_to_album_err_local": "Lokalne stavke još nije moguće dodati u albume, preskakanje",
"home_page_add_to_album_success": "Dodano {added} stavki u album {album}.", "home_page_add_to_album_success": "Dodano {added} stavki u album {album}.",
"home_page_album_err_partner": "Još nije moguće dodati partnerske stavke u album, preskačem", "home_page_album_err_partner": "Još nije moguće dodati partnerove stavke u album, preskakanje",
"home_page_archive_err_local": "Lokalne stavke još nije moguće arhivirati, preskačem", "home_page_archive_err_local": "Lokalne stavke još nije moguće arhivirati, preskakanje",
"home_page_archive_err_partner": "Partnerske stavke nije moguće arhivirati, preskačem", "home_page_archive_err_partner": "Partnerove stavke nije moguće arhivirati, preskakanje",
"home_page_building_timeline": "Izrada vremenske crte", "home_page_building_timeline": "Izrada vremenske crte",
"home_page_delete_err_partner": "Nije moguće izbrisati partnerske stavke, preskačem", "home_page_delete_err_partner": "Nije moguće izbrisati partnerove stavke, preskakanje",
"home_page_delete_remote_err_local": "Lokalne stavke su u odabiru za udaljeno brisanje, preskačem", "home_page_delete_remote_err_local": "Lokalne stavke su u odabiru za udaljeno brisanje, preskakanje",
"home_page_favorite_err_local": "Lokalne stavke još nije moguće označiti kao omiljene, preskačem", "home_page_favorite_err_local": "Lokalne stavke još nije moguće označiti kao favorite, preskakanje",
"home_page_favorite_err_partner": "Partnerske stavke još nije moguće označiti kao omiljene, preskačem", "home_page_favorite_err_partner": "Partnerove stavke još nije moguće označiti kao favorite, preskakanje",
"home_page_first_time_notice": "Ako prvi put koristite aplikaciju, svakako odaberite album za sigurnosnu kopiju kako bi vremenska crta mogla prikazati fotografije i videozapise", "home_page_first_time_notice": "Ako prvi put koristite aplikaciju, svakako odaberite album za sigurnosnu kopiju kako bi vremenska crta mogla prikazati fotografije i videozapise",
"home_page_locked_error_local": "Nije moguće premjestiti lokalne resurse u zaključanu mapu, preskačem", "home_page_locked_error_local": "Nije moguće premjestiti lokalne stavke u zaključanu mapu, preskakanje",
"home_page_locked_error_partner": "Nije moguće premjestiti partnerske resurse u zaključanu mapu, preskačem", "home_page_locked_error_partner": "Nije moguće premjestiti partnerove stavke u zaključanu mapu, preskakanje",
"home_page_share_err_local": "Lokalne stavke nije moguće dijeliti putem poveznice, preskačem", "home_page_share_err_local": "Lokalne stavke nije moguće dijeliti putem poveznice, preskakanje",
"home_page_upload_err_limit": "Moguće je prenijeti najviše 30 stavki odjednom, preskačem", "home_page_upload_err_limit": "Moguće je prenijeti najviše 30 stavki odjednom, preskakanje",
"host": "Domaćin", "host": "Domaćin",
"hour": "Sat", "hour": "Sat",
"hours": "Sati", "hours": "Sati",
@@ -1160,7 +1155,7 @@
"in_archive": "U arhivi", "in_archive": "U arhivi",
"include_archived": "Uključi arhivirano", "include_archived": "Uključi arhivirano",
"include_shared_albums": "Uključi dijeljene albume", "include_shared_albums": "Uključi dijeljene albume",
"include_shared_partner_assets": "Uključite zajedničku imovinu partnera", "include_shared_partner_assets": "Uključi zajedničke stavke partnera",
"individual_share": "Pojedinačni udio", "individual_share": "Pojedinačni udio",
"individual_shares": "Pojedinačna dijeljenja", "individual_shares": "Pojedinačna dijeljenja",
"info": "Informacije", "info": "Informacije",
@@ -1185,7 +1180,7 @@
"keep": "Zadrži", "keep": "Zadrži",
"keep_all": "Zadrži Sve", "keep_all": "Zadrži Sve",
"keep_this_delete_others": "Zadrži ovo, izbriši ostale", "keep_this_delete_others": "Zadrži ovo, izbriši ostale",
"kept_this_deleted_others": "Zadržana je ova datoteka i izbrisano {count, plural, one {# datoteka} other {# datoteka}}", "kept_this_deleted_others": "Zadržana je ova stavka i {count, plural, one {izbrisana # datoteka} few {izbrisane # datoteke} other {izbrisano # datoteka}}",
"keyboard_shortcuts": "Prečaci tipkovnice", "keyboard_shortcuts": "Prečaci tipkovnice",
"language": "Jezik", "language": "Jezik",
"language_no_results_subtitle": "Pokušajte prilagoditi pojam za pretraživanje", "language_no_results_subtitle": "Pokušajte prilagoditi pojam za pretraživanje",
@@ -1206,7 +1201,7 @@
"library_options": "Mogućnosti biblioteke", "library_options": "Mogućnosti biblioteke",
"library_page_device_albums": "Albumi na uređaju", "library_page_device_albums": "Albumi na uređaju",
"library_page_new_album": "Novi album", "library_page_new_album": "Novi album",
"library_page_sort_asset_count": "Broj resursa", "library_page_sort_asset_count": "Broj stavki",
"library_page_sort_created": "Datum kreiranja", "library_page_sort_created": "Datum kreiranja",
"library_page_sort_last_modified": "Zadnja izmjena", "library_page_sort_last_modified": "Zadnja izmjena",
"library_page_sort_title": "Naslov albuma", "library_page_sort_title": "Naslov albuma",
@@ -1221,8 +1216,8 @@
"loading": "Učitavanje", "loading": "Učitavanje",
"loading_search_results_failed": "Učitavanje rezultata pretraživanja nije uspjelo", "loading_search_results_failed": "Učitavanje rezultata pretraživanja nije uspjelo",
"local": "Lokalno", "local": "Lokalno",
"local_asset_cast_failed": "Nije moguće reproducirati sadržaj koji nije prenesen na poslužitelj", "local_asset_cast_failed": "Nije moguće emitirati stavku koja nije prenesena na poslužitelj",
"local_assets": "Lokalni sadržaji", "local_assets": "Lokalne stavke",
"local_network": "Lokalna mreža", "local_network": "Lokalna mreža",
"local_network_sheet_info": "Aplikacija će se povezati s poslužiteljem putem ovog URL-a kada koristi određenu Wi-Fi mrežu", "local_network_sheet_info": "Aplikacija će se povezati s poslužiteljem putem ovog URL-a kada koristi određenu Wi-Fi mrežu",
"location_permission": "Dozvola za lokaciju", "location_permission": "Dozvola za lokaciju",
@@ -1279,7 +1274,7 @@
"manage_your_devices": "Upravljajte uređajima na kojima ste prijavljeni", "manage_your_devices": "Upravljajte uređajima na kojima ste prijavljeni",
"manage_your_oauth_connection": "Upravljajte svojom OAuth vezom", "manage_your_oauth_connection": "Upravljajte svojom OAuth vezom",
"map": "Karta", "map": "Karta",
"map_assets_in_bounds": "{count, plural, =0 {Nema fotografija na ovom području} one {# fotografija} few {#fotografije} other {# fotografija}}", "map_assets_in_bounds": "{count, plural, =0 {Nema fotografija na ovom području} one {# fotografija} few {# fotografije} other {# fotografija}}",
"map_cannot_get_user_location": "Nije moguće dohvatiti lokaciju korisnika", "map_cannot_get_user_location": "Nije moguće dohvatiti lokaciju korisnika",
"map_location_dialog_yes": "Da", "map_location_dialog_yes": "Da",
"map_location_picker_page_use_location": "Koristi ovu lokaciju", "map_location_picker_page_use_location": "Koristi ovu lokaciju",
@@ -1305,6 +1300,7 @@
"mark_as_read": "Označi kao pročitano", "mark_as_read": "Označi kao pročitano",
"marked_all_as_read": "Označeno sve kao pročitano", "marked_all_as_read": "Označeno sve kao pročitano",
"matches": "Podudaranja", "matches": "Podudaranja",
"matching_assets": "Odgovarajuće stavke",
"media_type": "Vrsta medija", "media_type": "Vrsta medija",
"memories": "Sjećanja", "memories": "Sjećanja",
"memories_all_caught_up": "Sve ste pregledali", "memories_all_caught_up": "Sve ste pregledali",
@@ -1316,10 +1312,10 @@
"memory_lane_title": "Traka sjećanja {title}", "memory_lane_title": "Traka sjećanja {title}",
"menu": "Izbornik", "menu": "Izbornik",
"merge": "Spoji", "merge": "Spoji",
"merge_people": "Spajanje ljudi", "merge_people": "Spoji osobe",
"merge_people_limit": "Možete spojiti najviše 5 lica odjednom", "merge_people_limit": "Možete spojiti najviše 5 lica odjednom",
"merge_people_prompt": "Želite li spojiti ove ljude? Ova radnja je nepovratna.", "merge_people_prompt": "Želite li spojiti ove ljude? Ova radnja je nepovratna.",
"merge_people_successfully": "Uspješno spajanje ljudi", "merge_people_successfully": "Uspješno spajanje osoba",
"merged_people_count": "{count, plural, one {# Spojena osoba} other {# Spojene osobe}}", "merged_people_count": "{count, plural, one {# Spojena osoba} other {# Spojene osobe}}",
"minimize": "Minimiziraj", "minimize": "Minimiziraj",
"minute": "Minuta", "minute": "Minuta",
@@ -1334,11 +1330,11 @@
"move_to_lock_folder_action_prompt": "{count} dodano u zaključanu mapu", "move_to_lock_folder_action_prompt": "{count} dodano u zaključanu mapu",
"move_to_locked_folder": "Premjesti u zaključanu mapu", "move_to_locked_folder": "Premjesti u zaključanu mapu",
"move_to_locked_folder_confirmation": "Ove fotografije i videozapis bit će uklonjeni iz svih albuma i bit će vidljivi samo iz zaključane mape", "move_to_locked_folder_confirmation": "Ove fotografije i videozapis bit će uklonjeni iz svih albuma i bit će vidljivi samo iz zaključane mape",
"moved_to_archive": "Premješteno {count, plural, one {# resurs} other {# resursa}} u arhivu", "moved_to_archive": "{count, plural, one {Premještena # stavka} few {Premještene # stavke} other {Premješteno # stavki}} u arhivu",
"moved_to_library": "Premješteno {count, plural, one {# resurs} other {# resursa}} u biblioteku", "moved_to_library": "{count, plural, one {Premještena # stavka} few {Premještene # stavke} other {Premješteno # stavki}} u biblioteku",
"moved_to_trash": "Premješteno u smeće", "moved_to_trash": "Premješteno u smeće",
"multiselect_grid_edit_date_time_err_read_only": "Nije moguće urediti datum stavki samo za čitanje, preskačem", "multiselect_grid_edit_date_time_err_read_only": "Nije moguće urediti datum stavki označenih kao samo za čitanje, preskakanje",
"multiselect_grid_edit_gps_err_read_only": "Nije moguće urediti lokaciju stavki samo za čitanje, preskačem", "multiselect_grid_edit_gps_err_read_only": "Nije moguće urediti lokaciju stavki označenih kao samo za čitanje, preskakanje",
"mute_memories": "Isključi uspomene", "mute_memories": "Isključi uspomene",
"my_albums": "Moji albumi", "my_albums": "Moji albumi",
"name": "Ime", "name": "Ime",
@@ -1368,23 +1364,27 @@
"no_assets_message": "KLIKNITE DA PRENESETE SVOJU PRVU FOTOGRAFIJU", "no_assets_message": "KLIKNITE DA PRENESETE SVOJU PRVU FOTOGRAFIJU",
"no_assets_to_show": "Nema stavki za prikaz", "no_assets_to_show": "Nema stavki za prikaz",
"no_cast_devices_found": "Nisu pronađeni uređaji za reprodukciju", "no_cast_devices_found": "Nisu pronađeni uređaji za reprodukciju",
"no_checksum_local": "Nema dostupnog kontrolnog zbroja - nije moguće dohvatiti lokalne stavke",
"no_checksum_remote": "Nema dostupnog kontrolnog zbroja - nije moguće dohvatiti udaljenu stavku",
"no_duplicates_found": "Nisu pronađeni duplikati.", "no_duplicates_found": "Nisu pronađeni duplikati.",
"no_exif_info_available": "Nema dostupnih exif podataka", "no_exif_info_available": "Nema dostupnih exif podataka",
"no_explore_results_message": "Prenesite više fotografija da istražite svoju zbirku.", "no_explore_results_message": "Prenesite više fotografija da istražite svoju zbirku.",
"no_favorites_message": "Dodajte favorite kako biste brzo pronašli svoje najbolje slike i videozapise", "no_favorites_message": "Dodajte favorite kako biste brzo pronašli svoje najbolje slike i videozapise",
"no_libraries_message": "Stvorite vanjsku biblioteku za pregled svojih fotografija i videozapisa", "no_libraries_message": "Stvorite vanjsku biblioteku za pregled svojih fotografija i videozapisa",
"no_local_assets_found": "Nisu pronađene lokalne stavke s ovim kontrolnim zbrojem",
"no_locked_photos_message": "Fotografije i videozapisi u zaključanoj mapi su skriveni i neće se prikazivati dok pregledavate ili pretražujete svoju biblioteku.", "no_locked_photos_message": "Fotografije i videozapisi u zaključanoj mapi su skriveni i neće se prikazivati dok pregledavate ili pretražujete svoju biblioteku.",
"no_name": "Bez imena", "no_name": "Bez imena",
"no_notifications": "Nema notifikacija", "no_notifications": "Nema notifikacija",
"no_people_found": "Nema pronađenih odgovarajućih osoba", "no_people_found": "Nema pronađenih odgovarajućih osoba",
"no_places": "Nema mjesta", "no_places": "Nema mjesta",
"no_remote_assets_found": "Nisu pronađene udaljene stavke s ovim kontrolnim zbrojem",
"no_results": "Nema rezultata", "no_results": "Nema rezultata",
"no_results_description": "Pokušajte sa sinonimom ili općenitijom ključnom riječi", "no_results_description": "Pokušajte sa sinonimom ili općenitijom ključnom riječi",
"no_shared_albums_message": "Stvorite album za dijeljenje fotografija i videozapisa s osobama u svojoj mreži", "no_shared_albums_message": "Stvorite album za dijeljenje fotografija i videozapisa s osobama u svojoj mreži",
"no_uploads_in_progress": "Nema aktivnih prijenosa", "no_uploads_in_progress": "Nema aktivnih prijenosa",
"not_in_any_album": "Ni u jednom albumu", "not_in_any_album": "Ni u jednom albumu",
"not_selected": "Nije odabrano", "not_selected": "Nije odabrano",
"note_apply_storage_label_to_previously_uploaded assets": "Napomena: Da biste primijenili Oznaku za skladištenje na prethodno prenesena sredstva, pokrenite", "note_apply_storage_label_to_previously_uploaded assets": "Napomena: Da biste primijenili oznaku pohrane na prethodno prenesene stavke, pokrenite",
"notes": "Bilješke", "notes": "Bilješke",
"nothing_here_yet": "Ovdje još nema ničega", "nothing_here_yet": "Ovdje još nema ničega",
"notification_permission_dialog_content": "Da biste omogućili obavijesti, idite u Postavke i odaberite dopusti.", "notification_permission_dialog_content": "Da biste omogućili obavijesti, idite u Postavke i odaberite dopusti.",
@@ -1426,7 +1426,7 @@
"owner": "Vlasnik", "owner": "Vlasnik",
"partner": "Partner", "partner": "Partner",
"partner_can_access": "{partner} može pristupiti", "partner_can_access": "{partner} može pristupiti",
"partner_can_access_assets": "Sve vaše fotografije i videi osim onih u arhivi i smeću", "partner_can_access_assets": "Sve vaše fotografije i videozapisi osim onih u arhivi i smeću",
"partner_can_access_location": "Mjesto otkuda je slika otkinuta", "partner_can_access_location": "Mjesto otkuda je slika otkinuta",
"partner_list_user_photos": "{user} fotografije", "partner_list_user_photos": "{user} fotografije",
"partner_list_view_all": "Prikaži sve", "partner_list_view_all": "Prikaži sve",
@@ -1453,17 +1453,17 @@
"pause_memories": "Pauziraj sjećanja", "pause_memories": "Pauziraj sjećanja",
"paused": "Pauzirano", "paused": "Pauzirano",
"pending": "Na čekanju", "pending": "Na čekanju",
"people": "Ljudi", "people": "Osobe",
"people_edits_count": "Izmjenjeno {count, plural, one {# osoba} other {# osobe}}", "people_edits_count": "Izmjenjeno {count, plural, one {# osoba} other {# osobe}}",
"people_feature_description": "Pregledavanje fotografija i videozapisa grupiranih po osobama", "people_feature_description": "Pregledavanje fotografija i videozapisa grupiranih po osobama",
"people_sidebar_description": "Prikažite poveznicu na Osobe na bočnoj traci", "people_sidebar_description": "Prikažite poveznicu na Osobe na bočnoj traci",
"permanent_deletion_warning": "Upozorenje za nepovratno brisanje", "permanent_deletion_warning": "Upozorenje za nepovratno brisanje",
"permanent_deletion_warning_setting_description": "Prikaži upozorenje prilikom trajnog brisanja sredstava", "permanent_deletion_warning_setting_description": "Prikaži upozorenje prilikom trajnog brisanja stavki",
"permanently_delete": "Nepovratno obriši", "permanently_delete": "Nepovratno obriši",
"permanently_delete_assets_count": "Trajno izbriši {count, plural, one {datoteku} other {datoteke}}", "permanently_delete_assets_count": "Trajno izbriši {count, plural, one {datoteku} other {datoteke}}",
"permanently_delete_assets_prompt": "Da li ste sigurni da želite trajni izbrisati {count, plural, one {ovu datoteku?} other {ove <b>#</b> datoteke?}}Ovo će ih također ukloniti {count, plural, one {iz njihovog} other {iz njihovih}} albuma.", "permanently_delete_assets_prompt": "Jeste li sigurni da želite trajno izbrisati {count, plural, one {ovu stavku?} other {ove <b>#</b> stavke?}} Ovo će {count, plural, one {ju također ukloniti iz njezinog} other {ih također ukloniti iz njihovih}} albuma.",
"permanently_deleted_asset": "Trajno izbrisano sredstvo", "permanently_deleted_asset": "Trajno izbrisana stavka",
"permanently_deleted_assets_count": "Trajno izbrisano {count, plural, one {# datoteka} other {# datoteke}}", "permanently_deleted_assets_count": "Trajno {count, plural, one {izbrisana # stavka} few {izbrisane # stavke} other {izbisano # stavki}}",
"permission": "Dozvola", "permission": "Dozvola",
"permission_empty": "Vaša dozvola ne smije biti prazna", "permission_empty": "Vaša dozvola ne smije biti prazna",
"permission_onboarding_back": "Natrag", "permission_onboarding_back": "Natrag",
@@ -1497,6 +1497,7 @@
"play_memories": "Pokreni sjećanja", "play_memories": "Pokreni sjećanja",
"play_motion_photo": "Reproduciraj Pokretnu fotografiju", "play_motion_photo": "Reproduciraj Pokretnu fotografiju",
"play_or_pause_video": "Reproducirajte ili pauzirajte video", "play_or_pause_video": "Reproducirajte ili pauzirajte video",
"play_original_video_setting_description": "Preferirajte reprodukciju originalnih videozapisa umjesto transkodiranih videozapisa. Ako originalna stavka nije kompatibilna, možda se neće ispravno reproducirati.",
"please_auth_to_access": "Molimo autentificirajte se za pristup", "please_auth_to_access": "Molimo autentificirajte se za pristup",
"port": "Port", "port": "Port",
"preferences_settings_subtitle": "Upravljajte postavkama aplikacije", "preferences_settings_subtitle": "Upravljajte postavkama aplikacije",
@@ -1551,6 +1552,7 @@
"purchase_server_description_2": "Status podupiratelja", "purchase_server_description_2": "Status podupiratelja",
"purchase_server_title": "Poslužitelj (Server)", "purchase_server_title": "Poslužitelj (Server)",
"purchase_settings_server_activated": "Ključem proizvoda poslužitelja upravlja administrator", "purchase_settings_server_activated": "Ključem proizvoda poslužitelja upravlja administrator",
"query_asset_id": "Ispitaj ID stavke",
"queue_status": "Stavljanje u red {count}/{total}", "queue_status": "Stavljanje u red {count}/{total}",
"rating": "Broj zvjezdica", "rating": "Broj zvjezdica",
"rating_clear": "Obriši ocjenu", "rating_clear": "Obriši ocjenu",
@@ -1559,9 +1561,9 @@
"reaction_options": "Mogućnosti reakcije", "reaction_options": "Mogućnosti reakcije",
"read_changelog": "Pročitajte Dnevnik promjena", "read_changelog": "Pročitajte Dnevnik promjena",
"reassign": "Ponovno dodijeli", "reassign": "Ponovno dodijeli",
"reassigned_assets_to_existing_person": "Ponovo dodijeljeno{count, plural, one {# datoteka} other {# datoteke}} postojećoj {name, select, null {osobi} other {{name}}}", "reassigned_assets_to_existing_person": "Ponovno dodijeljeno {count, plural, one {# stavka} few {# stavke} other {# stavki}} {name, select, null {postojećoj osobi} other {{name}}}",
"reassigned_assets_to_new_person": "Ponovo dodijeljeno {count, plural, one {# datoteka} other {# datoteke}} novoj osobi", "reassigned_assets_to_new_person": "{count, plural, one {# stavka ponovno dodijeljena} few {# stavke ponovno dodijeljene} other {# stavki ponovno dodijeljeno}} novoj osobi",
"reassing_hint": "Dodijelite odabrane datoteke postojećoj osobi", "reassing_hint": "Dodijelite odabrane stavke postojećoj osobi",
"recent": "Nedavno", "recent": "Nedavno",
"recent-albums": "Nedavni albumi", "recent-albums": "Nedavni albumi",
"recent_searches": "Nedavne pretrage", "recent_searches": "Nedavne pretrage",
@@ -1581,13 +1583,13 @@
"refreshing_metadata": "Osvježavanje metapodataka", "refreshing_metadata": "Osvježavanje metapodataka",
"regenerating_thumbnails": "Obnavljanje sličica", "regenerating_thumbnails": "Obnavljanje sličica",
"remote": "Udaljeno", "remote": "Udaljeno",
"remote_assets": "Udaljeni sadržaji", "remote_assets": "Udaljene stavke",
"remove": "Ukloni", "remove": "Ukloni",
"remove_assets_album_confirmation": "Jeste li sigurni da želite ukloniti {count, plural, one {# datoteku} other {# datoteke}} iz albuma?", "remove_assets_album_confirmation": "Jeste li sigurni da želite ukloniti {count, plural, one {# stavku} few {# stavke} other {# stavki}} iz albuma?",
"remove_assets_shared_link_confirmation": "Jeste li sigurni da želite ukloniti {count, plural, one {# datoteku} other {# datoteke}} iz ove dijeljene veze?", "remove_assets_shared_link_confirmation": "Jeste li sigurni da želite ukloniti {count, plural, one {# stavku} few {# stavke} other {# stavki}} iz ove dijeljene veze?",
"remove_assets_title": "Ukloniti datoteke?", "remove_assets_title": "Ukloniti stavke?",
"remove_custom_date_range": "Ukloni prilagođeni datumski raspon", "remove_custom_date_range": "Ukloni prilagođeni datumski raspon",
"remove_deleted_assets": "Ukloni izbrisana sredstva", "remove_deleted_assets": "Ukloni izbrisane stavke",
"remove_from_album": "Ukloni iz albuma", "remove_from_album": "Ukloni iz albuma",
"remove_from_album_action_prompt": "{count} uklonjeno iz albuma", "remove_from_album_action_prompt": "{count} uklonjeno iz albuma",
"remove_from_favorites": "Ukloni iz favorita", "remove_from_favorites": "Ukloni iz favorita",
@@ -1606,7 +1608,7 @@
"removed_from_favorites_count": "{count, plural, other {Uklonjeno #}} iz omiljenih", "removed_from_favorites_count": "{count, plural, other {Uklonjeno #}} iz omiljenih",
"removed_memory": "Uklonjena uspomena", "removed_memory": "Uklonjena uspomena",
"removed_photo_from_memory": "Uklonjena fotografija iz uspomene", "removed_photo_from_memory": "Uklonjena fotografija iz uspomene",
"removed_tagged_assets": "Uklonjena oznaka iz {count, plural, one {# datoteke} other {# datoteka}}", "removed_tagged_assets": "Uklonjena oznaka iz {count, plural, one {# stavke} few {# stavke} other {# stavki}}",
"rename": "Preimenuj", "rename": "Preimenuj",
"repair": "Popravi", "repair": "Popravi",
"repair_no_results_message": "Nepraćene datoteke i datoteke koje nedostaju pojavit će se ovdje", "repair_no_results_message": "Nepraćene datoteke i datoteke koje nedostaju pojavit će se ovdje",
@@ -1617,7 +1619,7 @@
"rescan": "Ponovno skeniraj", "rescan": "Ponovno skeniraj",
"reset": "Resetiraj", "reset": "Resetiraj",
"reset_password": "Resetiraj lozinku", "reset_password": "Resetiraj lozinku",
"reset_people_visibility": "Poništi vidljivost ljudi", "reset_people_visibility": "Poništi vidljivost osoba",
"reset_pin_code": "Resetiraj PIN kod", "reset_pin_code": "Resetiraj PIN kod",
"reset_pin_code_description": "Ako ste zaboravili svoj PIN kod, možete kontaktirati administratora poslužitelja da ga resetira", "reset_pin_code_description": "Ako ste zaboravili svoj PIN kod, možete kontaktirati administratora poslužitelja da ga resetira",
"reset_pin_code_success": "PIN kod je uspješno resetiran", "reset_pin_code_success": "PIN kod je uspješno resetiran",
@@ -1632,7 +1634,7 @@
"restore_all": "Oporavi sve", "restore_all": "Oporavi sve",
"restore_trash_action_prompt": "{count} vraćeno iz smeća", "restore_trash_action_prompt": "{count} vraćeno iz smeća",
"restore_user": "Vrati korisnika", "restore_user": "Vrati korisnika",
"restored_asset": "Obnovljena datoteka", "restored_asset": "Obnovljena stavka",
"resume": "Nastavi", "resume": "Nastavi",
"retry_upload": "Ponovi prijenos", "retry_upload": "Ponovi prijenos",
"review_duplicates": "Pregledajte duplikate", "review_duplicates": "Pregledajte duplikate",
@@ -1679,7 +1681,7 @@
"search_for": "Traži", "search_for": "Traži",
"search_for_existing_person": "Potražite postojeću osobu", "search_for_existing_person": "Potražite postojeću osobu",
"search_no_more_result": "Nema više rezultata", "search_no_more_result": "Nema više rezultata",
"search_no_people": "Nema ljudi", "search_no_people": "Nema osoba",
"search_no_people_named": "Nema osoba s imenom \"{name}\"", "search_no_people_named": "Nema osoba s imenom \"{name}\"",
"search_no_result": "Nema rezultata, pokušajte s drugim pojmom za pretraživanje ili kombinacijom", "search_no_result": "Nema rezultata, pokušajte s drugim pojmom za pretraživanje ili kombinacijom",
"search_options": "Opcije pretraživanja", "search_options": "Opcije pretraživanja",
@@ -1703,7 +1705,7 @@
"search_suggestion_list_smart_search_hint_1": "Pametna pretraga je omogućena prema zadanim postavkama, za pretraživanje metapodataka koristite sintaksu ", "search_suggestion_list_smart_search_hint_1": "Pametna pretraga je omogućena prema zadanim postavkama, za pretraživanje metapodataka koristite sintaksu ",
"search_suggestion_list_smart_search_hint_2": "m:vaš-pojam-pretrage", "search_suggestion_list_smart_search_hint_2": "m:vaš-pojam-pretrage",
"search_tags": "Traži oznake...", "search_tags": "Traži oznake...",
"search_timezone": "Pretraži vremenske zone", "search_timezone": "Pretraživanje vremenske zone...",
"search_type": "Vrsta pretraživanja", "search_type": "Vrsta pretraživanja",
"search_your_photos": "Pretražite svoje fotografije", "search_your_photos": "Pretražite svoje fotografije",
"searching_locales": "Traženje lokaliteta...", "searching_locales": "Traženje lokaliteta...",
@@ -1744,7 +1746,7 @@
"set_date_of_birth": "Postavi datum rođenja", "set_date_of_birth": "Postavi datum rođenja",
"set_profile_picture": "Postavi profilnu sliku", "set_profile_picture": "Postavi profilnu sliku",
"set_slideshow_to_fullscreen": "Postavi prezentaciju na cijeli zaslon", "set_slideshow_to_fullscreen": "Postavi prezentaciju na cijeli zaslon",
"set_stack_primary_asset": "Postavi kao glavni sadržaj", "set_stack_primary_asset": "Postavi kao glavnu stavku",
"setting_image_viewer_help": "Preglednik detalja prvo učitava malu sličicu, zatim učitava pregled srednje veličine (ako je omogućen), te na kraju učitava original (ako je omogućen).", "setting_image_viewer_help": "Preglednik detalja prvo učitava malu sličicu, zatim učitava pregled srednje veličine (ako je omogućen), te na kraju učitava original (ako je omogućen).",
"setting_image_viewer_original_subtitle": "Omogućite za učitavanje originalne slike pune rezolucije (velika!). Onemogućite za smanjenje potrošnje podataka (i mrežne i na predmemoriji uređaja).", "setting_image_viewer_original_subtitle": "Omogućite za učitavanje originalne slike pune rezolucije (velika!). Onemogućite za smanjenje potrošnje podataka (i mrežne i na predmemoriji uređaja).",
"setting_image_viewer_original_title": "Učitaj originalnu sliku", "setting_image_viewer_original_title": "Učitaj originalnu sliku",
@@ -1759,10 +1761,10 @@
"setting_notifications_notify_minutes": "{count} minuta", "setting_notifications_notify_minutes": "{count} minuta",
"setting_notifications_notify_never": "nikad", "setting_notifications_notify_never": "nikad",
"setting_notifications_notify_seconds": "{count} sekundi", "setting_notifications_notify_seconds": "{count} sekundi",
"setting_notifications_single_progress_subtitle": "Detaljne informacije o napretku prijenosa po stavci", "setting_notifications_single_progress_subtitle": "Detaljne informacije o napretku prijenosa po stavki",
"setting_notifications_single_progress_title": "Prikaži detaljni napredak sigurnosnog kopiranja u pozadini", "setting_notifications_single_progress_title": "Prikaži detaljni napredak sigurnosnog kopiranja u pozadini",
"setting_notifications_subtitle": "Prilagodite postavke obavijesti", "setting_notifications_subtitle": "Prilagodite postavke obavijesti",
"setting_notifications_total_progress_subtitle": "Ukupni napredak prijenosa (završeno/ukupno stavki)", "setting_notifications_total_progress_subtitle": "Ukupni napredak prijenosa (završeno/ukupan broj stavki)",
"setting_notifications_total_progress_title": "Prikaži ukupni napredak sigurnosnog kopiranja u pozadini", "setting_notifications_total_progress_title": "Prikaži ukupni napredak sigurnosnog kopiranja u pozadini",
"setting_video_viewer_looping_title": "Ponavljanje", "setting_video_viewer_looping_title": "Ponavljanje",
"setting_video_viewer_original_video_subtitle": "Prilikom strujanja videozapisa s poslužitelja, reproducirajte original čak i kada je dostupna transkodirana verzija. Može doći do međuspremanja. Videozapisi dostupni lokalno reproduciraju se u originalnoj kvaliteti bez obzira na ovu postavku.", "setting_video_viewer_original_video_subtitle": "Prilikom strujanja videozapisa s poslužitelja, reproducirajte original čak i kada je dostupna transkodirana verzija. Može doći do međuspremanja. Videozapisi dostupni lokalno reproduciraju se u originalnoj kvaliteti bez obzira na ovu postavku.",
@@ -1772,9 +1774,9 @@
"settings_saved": "Postavke su spremljene", "settings_saved": "Postavke su spremljene",
"setup_pin_code": "Postavi PIN kod", "setup_pin_code": "Postavi PIN kod",
"share": "Podijeli", "share": "Podijeli",
"share_action_prompt": "Podijeljeno {count} sadržaja", "share_action_prompt": "{count, plural, one {Podijeljena # stavka} few {Podijeljene # stavke} other {Podijeljeno # stavki}}",
"share_add_photos": "Dodaj fotografije", "share_add_photos": "Dodaj fotografije",
"share_assets_selected": "{count} odabrano", "share_assets_selected": "{count, plural, one {# odabran} few {# odabrana} other {# odabrano}}",
"share_dialog_preparing": "Priprema...", "share_dialog_preparing": "Priprema...",
"share_link": "Podijeli Link", "share_link": "Podijeli Link",
"shared": "Podijeljeno", "shared": "Podijeljeno",
@@ -1823,7 +1825,7 @@
"shared_link_password_description": "Zahtjevaj loziku za pristup ovom dijeljenom linku", "shared_link_password_description": "Zahtjevaj loziku za pristup ovom dijeljenom linku",
"shared_links": "Dijeljene poveznice", "shared_links": "Dijeljene poveznice",
"shared_links_description": "Podijelite fotografije i videozapise putem poveznice", "shared_links_description": "Podijelite fotografije i videozapise putem poveznice",
"shared_photos_and_videos_count": "{assetCount, plural, =1 {# podijeljena fotografija ili videozapis.} few {# podijeljene fotografije i videozapisa.} other {# podijeljenih fotografija i videozapisa.}}", "shared_photos_and_videos_count": "{assetCount, plural, one {# podijeljena fotografija ili videozapis.} few {# podijeljene fotografije i videozapisa.} other {# podijeljenih fotografija i videozapisa.}}",
"shared_with_me": "Podijeljeno sa mnom", "shared_with_me": "Podijeljeno sa mnom",
"shared_with_partner": "Podijeljeno s {partner}", "shared_with_partner": "Podijeljeno s {partner}",
"sharing": "Dijeljenje", "sharing": "Dijeljenje",
@@ -1881,7 +1883,7 @@
"stack_duplicates": "Složi duplikate", "stack_duplicates": "Složi duplikate",
"stack_select_one_photo": "Odaberi jednu glavnu fotografiju za slaganje", "stack_select_one_photo": "Odaberi jednu glavnu fotografiju za slaganje",
"stack_selected_photos": "Složi odabrane fotografije", "stack_selected_photos": "Složi odabrane fotografije",
"stacked_assets_count": "Složeno {count, plural, =1 {# stavka} few {# stavke} other {# stavki}}", "stacked_assets_count": "{count, plural, one {Složena # stavka} few {Složene # stavke} other {Složeno # stavki}}",
"stacktrace": "Pracenje stoga", "stacktrace": "Pracenje stoga",
"start": "Početak", "start": "Početak",
"start_date": "Datum početka", "start_date": "Datum početka",
@@ -1919,7 +1921,7 @@
"tag_not_found_question": "Nije moguće pronaći oznaku? <link>Napravite novu oznaku.</link>", "tag_not_found_question": "Nije moguće pronaći oznaku? <link>Napravite novu oznaku.</link>",
"tag_people": "Označi osobe", "tag_people": "Označi osobe",
"tag_updated": "Ažurirana oznaka: {tag}", "tag_updated": "Ažurirana oznaka: {tag}",
"tagged_assets": "Označena {count, plural, =1 {# stavka} few {# stavke} other {# stavki}}", "tagged_assets": "{count, plural, =1 {Označena # stavka} few {Označene # stavke} other {Označeno # stavki}}",
"tags": "Oznake", "tags": "Oznake",
"tap_to_run_job": "Dodirnite za pokretanje zadatka", "tap_to_run_job": "Dodirnite za pokretanje zadatka",
"template": "Predložak", "template": "Predložak",
@@ -1961,7 +1963,7 @@
"trash_emptied": "Ispražnjeno smeće", "trash_emptied": "Ispražnjeno smeće",
"trash_no_results_message": "Ovdje će se prikazati bačene fotografije i videozapisi.", "trash_no_results_message": "Ovdje će se prikazati bačene fotografije i videozapisi.",
"trash_page_delete_all": "Izbriši sve", "trash_page_delete_all": "Izbriši sve",
"trash_page_empty_trash_dialog_content": "Želite li isprazniti svoje stavke u smeću? Ove stavke bit će trajno uklonjene iz Immicha", "trash_page_empty_trash_dialog_content": "Želite li isprazniti svoje stavke u smeću? Ove stavke će biti trajno uklonjene iz Immicha",
"trash_page_info": "Stavke u smeću bit će trajno izbrisane nakon {days} dana", "trash_page_info": "Stavke u smeću bit će trajno izbrisane nakon {days} dana",
"trash_page_no_assets": "Nema stavki u smeću", "trash_page_no_assets": "Nema stavki u smeću",
"trash_page_restore_all": "Vrati sve", "trash_page_restore_all": "Vrati sve",
@@ -1995,21 +1997,22 @@
"unselect_all_in": "Poništi odabir svih u {group}", "unselect_all_in": "Poništi odabir svih u {group}",
"unstack": "Razdvoji", "unstack": "Razdvoji",
"unstack_action_prompt": "{count} razloženo", "unstack_action_prompt": "{count} razloženo",
"unstacked_assets_count": "Razdvojena {count, plural, =1 {# stavka} few {# stavke} other {# stavki}}", "unstacked_assets_count": "{count, plural, one {Razdvojena # stavka} few {Razvdvojene # stavke} other {Razdvojeno # stavki}}",
"untagged": "Bez oznaka", "untagged": "Bez oznaka",
"up_next": "Sljedeće", "up_next": "Sljedeće",
"update_location_action_prompt": "Ažuriraj lokaciju ({count, plural, one {# odabrane stavke} few {# odabrane stavke} other {# odabranih stavki}}) s:",
"updated_at": "Ažurirano", "updated_at": "Ažurirano",
"updated_password": "Lozinka ažurirana", "updated_password": "Lozinka ažurirana",
"upload": "Prijenos", "upload": "Prijenos",
"upload_action_prompt": "{count} u redu za prijenos", "upload_action_prompt": "{count} u redu za prijenos",
"upload_concurrency": "Istovremeni prijenosi", "upload_concurrency": "Istovremeni prijenosi",
"upload_details": "Detalji prijenosa", "upload_details": "Detalji prijenosa",
"upload_dialog_info": "Želite li sigurnosno kopirati odabranu stavku(e) na poslužitelj?", "upload_dialog_info": "Želite li sigurnosno kopirati odabrane stavke na poslužitelj?",
"upload_dialog_title": "Prenesi stavku", "upload_dialog_title": "Prenesi stavku",
"upload_errors": "Prijenos završen s {count, plural, =1 {# greškom} few {# greške} other {# grešaka}}, osvježite stranicu da biste vidjeli nove prenesene stavke.", "upload_errors": "Prijenos završen s {count, plural, one {# greškom} few {# greške} other {# grešaka}}, osvježite stranicu da biste vidjeli nove prenesene stavke.",
"upload_finished": "Prijenos završen", "upload_finished": "Prijenos završen",
"upload_progress": "Preostalo {remaining, number} - Obrađeno {processed, number}/{total, number}", "upload_progress": "Preostalo {remaining, number} - Obrađeno {processed, number}/{total, number}",
"upload_skipped_duplicates": "Preskočena {count, plural, =1 {# duplicirana stavka} few {# duplicirane stavke} other {# dupliciranih stavki}}", "upload_skipped_duplicates": "Preskočena {count, plural, one {# duplicirana stavka} few {# duplicirane stavke} other {# dupliciranih stavki}}",
"upload_status_duplicates": "Duplikati", "upload_status_duplicates": "Duplikati",
"upload_status_errors": "Greške", "upload_status_errors": "Greške",
"upload_status_uploaded": "Preneseno", "upload_status_uploaded": "Preneseno",
@@ -2025,7 +2028,7 @@
"user": "Korisnik", "user": "Korisnik",
"user_has_been_deleted": "Ovaj korisnik je izbrisan.", "user_has_been_deleted": "Ovaj korisnik je izbrisan.",
"user_id": "ID korisnika", "user_id": "ID korisnika",
"user_liked": "{user} je označio/la sviđa mi se {type, select, photo {ovu fotografiju} video {ovaj videozapis} asset {ovu stavku} other {to}}", "user_liked": "{user} je lajkao/la {type, select, photo {ovu fotografiju} video {ovaj videozapis} asset {ovu stavku} other {to}}",
"user_pin_code_settings": "PIN kod", "user_pin_code_settings": "PIN kod",
"user_pin_code_settings_description": "Upravljajte svojim PIN kodom", "user_pin_code_settings_description": "Upravljajte svojim PIN kodom",
"user_privacy": "Privatnost korisnika", "user_privacy": "Privatnost korisnika",
@@ -2037,7 +2040,7 @@
"user_usage_stats_description": "Pregledajte statistiku korištenja računa", "user_usage_stats_description": "Pregledajte statistiku korištenja računa",
"username": "Korisničko ime", "username": "Korisničko ime",
"users": "Korisnici", "users": "Korisnici",
"users_added_to_album_count": "Dodan{o/a} {count, plural, one {# korisnik} few {# korisnika} other {# korisnika}} u album", "users_added_to_album_count": "{count, plural, one {Dodan # korisnik} few {Dodana # korisnika} other {Dodano # korisnika}} u album",
"utilities": "Alati", "utilities": "Alati",
"validate": "Provjeri valjanost", "validate": "Provjeri valjanost",
"validate_endpoint_error": "Molimo unesite valjanu URL adresu", "validate_endpoint_error": "Molimo unesite valjanu URL adresu",
-8
View File
@@ -17,7 +17,6 @@
"add_birthday": "Születésnap hozzáadása", "add_birthday": "Születésnap hozzáadása",
"add_endpoint": "Végpont megadása", "add_endpoint": "Végpont megadása",
"add_exclusion_pattern": "Kihagyási minta (pattern) hozzáadása", "add_exclusion_pattern": "Kihagyási minta (pattern) hozzáadása",
"add_import_path": "Importálási útvonal hozzáadása",
"add_location": "Helyszín megadása", "add_location": "Helyszín megadása",
"add_more_users": "További felhasználók hozzáadása", "add_more_users": "További felhasználók hozzáadása",
"add_partner": "Partner hozzáadása", "add_partner": "Partner hozzáadása",
@@ -112,7 +111,6 @@
"jobs_failed": "{jobCount, plural, other {# sikertelen}}", "jobs_failed": "{jobCount, plural, other {# sikertelen}}",
"library_created": "Képtár létrehozva: {library}", "library_created": "Képtár létrehozva: {library}",
"library_deleted": "Képtár törölve", "library_deleted": "Képtár törölve",
"library_import_path_description": "Add meg az importálandó mappát. A rendszer ebben a mappában és összes almappájában fog képeket és videókat keresni.",
"library_scanning": "Időszakos Átfésülés", "library_scanning": "Időszakos Átfésülés",
"library_scanning_description": "A képtár időszakos átfésülésének beállítása", "library_scanning_description": "A képtár időszakos átfésülésének beállítása",
"library_scanning_enable_description": "Képtár időszakos átfésülésének engedélyezése", "library_scanning_enable_description": "Képtár időszakos átfésülésének engedélyezése",
@@ -894,8 +892,6 @@
"edit_description_prompt": "Kérlek válassz egy új leírást:", "edit_description_prompt": "Kérlek válassz egy új leírást:",
"edit_exclusion_pattern": "Kizárási minta (pattern) módosítása", "edit_exclusion_pattern": "Kizárási minta (pattern) módosítása",
"edit_faces": "Arcok módosítása", "edit_faces": "Arcok módosítása",
"edit_import_path": "Importálási útvonal módosítása",
"edit_import_paths": "Importálási Útvonalak Módosítása",
"edit_key": "Kulcs módosítása", "edit_key": "Kulcs módosítása",
"edit_link": "Link módosítása", "edit_link": "Link módosítása",
"edit_location": "Hely módosítása", "edit_location": "Hely módosítása",
@@ -967,7 +963,6 @@
"failed_to_stack_assets": "Elemek csoportosítása sikertelen", "failed_to_stack_assets": "Elemek csoportosítása sikertelen",
"failed_to_unstack_assets": "Csoportosított elemek szétszedése sikertelen", "failed_to_unstack_assets": "Csoportosított elemek szétszedése sikertelen",
"failed_to_update_notification_status": "Értesítés státusz frissítése sikertelen", "failed_to_update_notification_status": "Értesítés státusz frissítése sikertelen",
"import_path_already_exists": "Ez az importálási útvonal már létezik.",
"incorrect_email_or_password": "Helytelen email vagy jelszó", "incorrect_email_or_password": "Helytelen email vagy jelszó",
"paths_validation_failed": "A(z) {paths, plural, one {# elérési útvonal} other {# elérési útvonal}} érvényesítése sikertelen", "paths_validation_failed": "A(z) {paths, plural, one {# elérési útvonal} other {# elérési útvonal}} érvényesítése sikertelen",
"profile_picture_transparent_pixels": "Profilképek nem tartalmazhatnak átlátszó pixeleket. Közelíts rá és/vagy mozgasd a képet.", "profile_picture_transparent_pixels": "Profilképek nem tartalmazhatnak átlátszó pixeleket. Közelíts rá és/vagy mozgasd a képet.",
@@ -977,7 +972,6 @@
"unable_to_add_assets_to_shared_link": "Elemeket megosztott linkhez adása sikertelen", "unable_to_add_assets_to_shared_link": "Elemeket megosztott linkhez adása sikertelen",
"unable_to_add_comment": "Hozzászólás sikertelen", "unable_to_add_comment": "Hozzászólás sikertelen",
"unable_to_add_exclusion_pattern": "Kivétel minta (pattern) hozzáadása sikertelen", "unable_to_add_exclusion_pattern": "Kivétel minta (pattern) hozzáadása sikertelen",
"unable_to_add_import_path": "Importálási útvonal hozzáadása sikertelen",
"unable_to_add_partners": "Partnerek hozzáadása sikertelen", "unable_to_add_partners": "Partnerek hozzáadása sikertelen",
"unable_to_add_remove_archive": "Az elem {archived, select, true {eltávolítása at Archívumból} other {hozzáadása Archívumhoz}} sikertelen", "unable_to_add_remove_archive": "Az elem {archived, select, true {eltávolítása at Archívumból} other {hozzáadása Archívumhoz}} sikertelen",
"unable_to_add_remove_favorites": "Az elem {favorite, select, true {eltávolítása a Kedvencekből} other {hozzáadása a Kedvencekhez}} sikertelen", "unable_to_add_remove_favorites": "Az elem {favorite, select, true {eltávolítása a Kedvencekből} other {hozzáadása a Kedvencekhez}} sikertelen",
@@ -1000,12 +994,10 @@
"unable_to_delete_asset": "Elem törlése sikertelen", "unable_to_delete_asset": "Elem törlése sikertelen",
"unable_to_delete_assets": "Hiba az elemek törlésekor", "unable_to_delete_assets": "Hiba az elemek törlésekor",
"unable_to_delete_exclusion_pattern": "Kizárási minta (pattern) törlése sikertelen", "unable_to_delete_exclusion_pattern": "Kizárási minta (pattern) törlése sikertelen",
"unable_to_delete_import_path": "Import útvonal törlése sikertelen",
"unable_to_delete_shared_link": "Megosztott link törlése sikertelen", "unable_to_delete_shared_link": "Megosztott link törlése sikertelen",
"unable_to_delete_user": "Felhasználó törlése sikertelen", "unable_to_delete_user": "Felhasználó törlése sikertelen",
"unable_to_download_files": "Fájlok letöltése sikertelen", "unable_to_download_files": "Fájlok letöltése sikertelen",
"unable_to_edit_exclusion_pattern": "Kizárási minta (pattern) módosítása sikertelen", "unable_to_edit_exclusion_pattern": "Kizárási minta (pattern) módosítása sikertelen",
"unable_to_edit_import_path": "Import útvonal módosítása sikertelen",
"unable_to_empty_trash": "Lomtár ürítése sikertelen", "unable_to_empty_trash": "Lomtár ürítése sikertelen",
"unable_to_enter_fullscreen": "Teljes képernyőre váltás sikertelen", "unable_to_enter_fullscreen": "Teljes képernyőre váltás sikertelen",
"unable_to_exit_fullscreen": "Kilépés a teljes képernyős módból sikertelen", "unable_to_exit_fullscreen": "Kilépés a teljes képernyős módból sikertelen",
+46 -10
View File
@@ -17,7 +17,6 @@
"add_birthday": "Tambahkan Tanggal Lahir", "add_birthday": "Tambahkan Tanggal Lahir",
"add_endpoint": "Tambahkan titik akhir", "add_endpoint": "Tambahkan titik akhir",
"add_exclusion_pattern": "Tambahkan pola pengecualian", "add_exclusion_pattern": "Tambahkan pola pengecualian",
"add_import_path": "Tambahkan jalur impor",
"add_location": "Tambahkan lokasi", "add_location": "Tambahkan lokasi",
"add_more_users": "Tambahkan lebih banyak pengguna", "add_more_users": "Tambahkan lebih banyak pengguna",
"add_partner": "Tambahkan partner", "add_partner": "Tambahkan partner",
@@ -112,7 +111,6 @@
"jobs_failed": "{jobCount, plural, other {# gagal}}", "jobs_failed": "{jobCount, plural, other {# gagal}}",
"library_created": "Pustaka dibuat: {library}", "library_created": "Pustaka dibuat: {library}",
"library_deleted": "Pustaka dihapus", "library_deleted": "Pustaka dihapus",
"library_import_path_description": "Tentukan folder untuk diimpor. Folder ini, termasuk subfolder, akan dipindai gambar dan videonya.",
"library_scanning": "Pemindaian Berkala", "library_scanning": "Pemindaian Berkala",
"library_scanning_description": "Atur pemindaian pustaka berkala", "library_scanning_description": "Atur pemindaian pustaka berkala",
"library_scanning_enable_description": "Aktifkan pemindaian pustaka berkala", "library_scanning_enable_description": "Aktifkan pemindaian pustaka berkala",
@@ -159,8 +157,15 @@
"machine_learning_ocr_enabled": "Aktfikan OCR", "machine_learning_ocr_enabled": "Aktfikan OCR",
"machine_learning_ocr_enabled_description": "Jika dinonaktifkan, gambar-gambar tidak akan mengalami pengenalan teks.", "machine_learning_ocr_enabled_description": "Jika dinonaktifkan, gambar-gambar tidak akan mengalami pengenalan teks.",
"machine_learning_ocr_max_resolution": "Resolusi maksimum", "machine_learning_ocr_max_resolution": "Resolusi maksimum",
"machine_learning_settings": "Pengaturan Pembelajaran Mesin", "machine_learning_ocr_max_resolution_description": "Pratinjau di atas resolusi ini akan disesuaikan ukurannya sambil mempertahankan aspek rasio. Nilai yang lebih tinggi lebih akurat, tetapi membutuhkan waktu yang lama untuk memproses dan membutuhkan memori lebih banyak.",
"machine_learning_settings_description": "Keola fitur dan pengaturan pembelajaran mesin", "machine_learning_ocr_min_detection_score": "Skor deteksi minimum",
"machine_learning_ocr_min_detection_score_description": "Skor kepercayaan minimum untuk teks yang akan dideteksi berkisar antara 0-1. Nilai yang lebih rendah akan mendeteksi teks yang lebih banyak, tetapi dapat menyebabkan hasil yang positif palsu.",
"machine_learning_ocr_min_recognition_score": "Skor pengenalan minimum",
"machine_learning_ocr_min_score_recognition_description": "Skor kepercayaan minimum untuk teks yang akan dideteksi berkisar antara 0-1. Nilai yang lebih rendah akan mendeteksi teks yang lebih banyak, tetapi dapat menyebabkan hasil yang positif palsu.",
"machine_learning_ocr_model": "Model OCR",
"machine_learning_ocr_model_description": "Model server lebih akurat daripada model mobile, tetapi membutuhkan waktu yang lebih lama untuk memproses dan menggunakan memori yang lebih banyak.",
"machine_learning_settings": "Pengaturan Mesin Pembelajaran",
"machine_learning_settings_description": "Kelola fitur dan pengaturan mesin pembelajaran",
"machine_learning_smart_search": "Pencarian Pintar", "machine_learning_smart_search": "Pencarian Pintar",
"machine_learning_smart_search_description": "Cari gambar secara semantik menggunakan penyematan CLIP", "machine_learning_smart_search_description": "Cari gambar secara semantik menggunakan penyematan CLIP",
"machine_learning_smart_search_enabled": "Aktifkan pencarian pintar", "machine_learning_smart_search_enabled": "Aktifkan pencarian pintar",
@@ -216,6 +221,8 @@
"notification_email_ignore_certificate_errors_description": "Abaikan eror validasi sertifikat TLS (tidak disarankan)", "notification_email_ignore_certificate_errors_description": "Abaikan eror validasi sertifikat TLS (tidak disarankan)",
"notification_email_password_description": "Kata sandi yang digunakan ketika mengautentikasi dengan server surel", "notification_email_password_description": "Kata sandi yang digunakan ketika mengautentikasi dengan server surel",
"notification_email_port_description": "Porta server surel (mis. 25, 465, atau 587)", "notification_email_port_description": "Porta server surel (mis. 25, 465, atau 587)",
"notification_email_secure": "SMTPS",
"notification_email_secure_description": "Gunakan SMTPS (SMTP melalui TLS)",
"notification_email_sent_test_email_button": "Kirim surel uji coba dan simpan", "notification_email_sent_test_email_button": "Kirim surel uji coba dan simpan",
"notification_email_setting_description": "Pengaturan pengiriman notifikasi surel", "notification_email_setting_description": "Pengaturan pengiriman notifikasi surel",
"notification_email_test_email": "Kirim surel uji coba", "notification_email_test_email": "Kirim surel uji coba",
@@ -248,6 +255,7 @@
"oauth_storage_quota_default_description": "Kuota dalam GiB akan digunakan jika tidak ada klaim yang diberikan.", "oauth_storage_quota_default_description": "Kuota dalam GiB akan digunakan jika tidak ada klaim yang diberikan.",
"oauth_timeout": "Waktu Permintaan Habis", "oauth_timeout": "Waktu Permintaan Habis",
"oauth_timeout_description": "Waktu habis untuk permintaan dalam milidetik", "oauth_timeout_description": "Waktu habis untuk permintaan dalam milidetik",
"ocr_job_description": "Gunakan mesin pembelajaran untuk mengenali teks di dalam gambar",
"password_enable_description": "Masuk dengan surel dan kata sandi", "password_enable_description": "Masuk dengan surel dan kata sandi",
"password_settings": "Log Masuk Kata Sandi", "password_settings": "Log Masuk Kata Sandi",
"password_settings_description": "Kelola pengaturan log masuk kata sandi", "password_settings_description": "Kelola pengaturan log masuk kata sandi",
@@ -471,10 +479,14 @@
"api_key_description": "Nilai ini hanya akan ditampilkan sekali. Pastikan untuk menyalin sebelum menutup jendela ini.", "api_key_description": "Nilai ini hanya akan ditampilkan sekali. Pastikan untuk menyalin sebelum menutup jendela ini.",
"api_key_empty": "Nama Kunci API Anda seharusnya jangan kosong", "api_key_empty": "Nama Kunci API Anda seharusnya jangan kosong",
"api_keys": "Kunci API", "api_keys": "Kunci API",
"app_architecture_variant": "Varian (Arsitektur)",
"app_bar_signout_dialog_content": "Apakah kamu yakin ingin keluar akun?", "app_bar_signout_dialog_content": "Apakah kamu yakin ingin keluar akun?",
"app_bar_signout_dialog_ok": "Ya", "app_bar_signout_dialog_ok": "Ya",
"app_bar_signout_dialog_title": "Keluar akun", "app_bar_signout_dialog_title": "Keluar akun",
"app_download_links": "Link Download Aplikasi",
"app_settings": "Pengaturan Aplikasi", "app_settings": "Pengaturan Aplikasi",
"app_stores": "App Stores",
"app_update_available": "Pembaruan aplikasi tersedia",
"appears_in": "Muncul dalam", "appears_in": "Muncul dalam",
"apply_count": "Terapkan ({count, number})", "apply_count": "Terapkan ({count, number})",
"archive": "Arsip", "archive": "Arsip",
@@ -558,6 +570,7 @@
"backup_albums_sync": "Sinkronisasi cadangan album", "backup_albums_sync": "Sinkronisasi cadangan album",
"backup_all": "Semua", "backup_all": "Semua",
"backup_background_service_backup_failed_message": "Gagal mencadangkan aset. Mencoba lagi…", "backup_background_service_backup_failed_message": "Gagal mencadangkan aset. Mencoba lagi…",
"backup_background_service_complete_notification": "Pencadangan aset selesai",
"backup_background_service_connection_failed_message": "Koneksi ke server gagal. Mencoba ulang…", "backup_background_service_connection_failed_message": "Koneksi ke server gagal. Mencoba ulang…",
"backup_background_service_current_upload_notification": "Mengunggah {filename}", "backup_background_service_current_upload_notification": "Mengunggah {filename}",
"backup_background_service_default_notification": "Memeriksa aset baru…", "backup_background_service_default_notification": "Memeriksa aset baru…",
@@ -667,6 +680,8 @@
"change_password_description": "Ini merupakan pertama kali Anda masuk ke sistem atau ada permintaan untuk mengubah kata sandi Anda. Silakan masukkan kata sandi baru di bawah.", "change_password_description": "Ini merupakan pertama kali Anda masuk ke sistem atau ada permintaan untuk mengubah kata sandi Anda. Silakan masukkan kata sandi baru di bawah.",
"change_password_form_confirm_password": "Konfirmasi Sandi", "change_password_form_confirm_password": "Konfirmasi Sandi",
"change_password_form_description": "Halo {name},\n\nIni pertama kali anda masuk ke dalam sistem atau terdapat permintaan penggantian kata sandi. Harap masukkan password baru.", "change_password_form_description": "Halo {name},\n\nIni pertama kali anda masuk ke dalam sistem atau terdapat permintaan penggantian kata sandi. Harap masukkan password baru.",
"change_password_form_log_out": "Keluar dari semua perangkat lain",
"change_password_form_log_out_description": "Disarankan untuk keluar dari semua perangkat lain",
"change_password_form_new_password": "Sandi Baru", "change_password_form_new_password": "Sandi Baru",
"change_password_form_password_mismatch": "Sandi tidak cocok", "change_password_form_password_mismatch": "Sandi tidak cocok",
"change_password_form_reenter_new_password": "Masukkan Ulang Sandi Baru", "change_password_form_reenter_new_password": "Masukkan Ulang Sandi Baru",
@@ -744,6 +759,7 @@
"create": "Buat", "create": "Buat",
"create_album": "Buat album", "create_album": "Buat album",
"create_album_page_untitled": "Tak berjudul", "create_album_page_untitled": "Tak berjudul",
"create_api_key": "Buat kunci API",
"create_library": "Buat Pustaka", "create_library": "Buat Pustaka",
"create_link": "Buat tautan", "create_link": "Buat tautan",
"create_link_to_share": "Buat tautan untuk dibagikan", "create_link_to_share": "Buat tautan untuk dibagikan",
@@ -773,6 +789,7 @@
"daily_title_text_date_year": "E, dd MMM yyyy", "daily_title_text_date_year": "E, dd MMM yyyy",
"dark": "Gelap", "dark": "Gelap",
"dark_theme": "Nyalakan mode gelap", "dark_theme": "Nyalakan mode gelap",
"date": "Tanggal",
"date_after": "Tanggal setelah", "date_after": "Tanggal setelah",
"date_and_time": "Tanggal dan Waktu", "date_and_time": "Tanggal dan Waktu",
"date_before": "Tanggal sebelum", "date_before": "Tanggal sebelum",
@@ -875,8 +892,6 @@
"edit_description_prompt": "Silakan pilih deskripsi baru:", "edit_description_prompt": "Silakan pilih deskripsi baru:",
"edit_exclusion_pattern": "Sunting pola pengecualian", "edit_exclusion_pattern": "Sunting pola pengecualian",
"edit_faces": "Sunting wajah", "edit_faces": "Sunting wajah",
"edit_import_path": "Sunting jalur pengimporan",
"edit_import_paths": "Sunting Jalur Pengimporan",
"edit_key": "Sunting kunci", "edit_key": "Sunting kunci",
"edit_link": "Sunting tautan", "edit_link": "Sunting tautan",
"edit_location": "Sunting lokasi", "edit_location": "Sunting lokasi",
@@ -948,7 +963,6 @@
"failed_to_stack_assets": "Gagal menumpuk aset", "failed_to_stack_assets": "Gagal menumpuk aset",
"failed_to_unstack_assets": "Gagal membatalkan penumpukan aset", "failed_to_unstack_assets": "Gagal membatalkan penumpukan aset",
"failed_to_update_notification_status": "Gagal membarui status notifikasi", "failed_to_update_notification_status": "Gagal membarui status notifikasi",
"import_path_already_exists": "Jalur pengimporan ini sudah ada.",
"incorrect_email_or_password": "Surel atau kata sandi tidak benar", "incorrect_email_or_password": "Surel atau kata sandi tidak benar",
"paths_validation_failed": "{paths, plural, one {# jalur} other {# jalur}} gagal validasi", "paths_validation_failed": "{paths, plural, one {# jalur} other {# jalur}} gagal validasi",
"profile_picture_transparent_pixels": "Foto profil tidak dapat memiliki piksel transparan. Silakan perbesar dan/atau pindah posisi gambar.", "profile_picture_transparent_pixels": "Foto profil tidak dapat memiliki piksel transparan. Silakan perbesar dan/atau pindah posisi gambar.",
@@ -958,7 +972,6 @@
"unable_to_add_assets_to_shared_link": "Tidak dapat menambahkan aset ke tautan terbagi", "unable_to_add_assets_to_shared_link": "Tidak dapat menambahkan aset ke tautan terbagi",
"unable_to_add_comment": "Tidak dapat menambahkan komentar", "unable_to_add_comment": "Tidak dapat menambahkan komentar",
"unable_to_add_exclusion_pattern": "Tidak dapat menambahkan pola pengecualian", "unable_to_add_exclusion_pattern": "Tidak dapat menambahkan pola pengecualian",
"unable_to_add_import_path": "Tidak dapat menambahkan jalur pengimporan",
"unable_to_add_partners": "Tidak dapat menambahkan partner", "unable_to_add_partners": "Tidak dapat menambahkan partner",
"unable_to_add_remove_archive": "Tidak dapat {archived, select, true {menghapus aset dari} other {menambahkan aset ke}} arsip", "unable_to_add_remove_archive": "Tidak dapat {archived, select, true {menghapus aset dari} other {menambahkan aset ke}} arsip",
"unable_to_add_remove_favorites": "Tidak dapat {favorite, select, true {menambahkan aset ke} other {menghapus aset dari}} favorit", "unable_to_add_remove_favorites": "Tidak dapat {favorite, select, true {menambahkan aset ke} other {menghapus aset dari}} favorit",
@@ -981,12 +994,10 @@
"unable_to_delete_asset": "Tidak dapat menghapus aset", "unable_to_delete_asset": "Tidak dapat menghapus aset",
"unable_to_delete_assets": "Terjadi eror menghapus aset", "unable_to_delete_assets": "Terjadi eror menghapus aset",
"unable_to_delete_exclusion_pattern": "Tidak dapat menghapus pola pengecualian", "unable_to_delete_exclusion_pattern": "Tidak dapat menghapus pola pengecualian",
"unable_to_delete_import_path": "Tidak dapat menghapus jalur pengimporan",
"unable_to_delete_shared_link": "Tidak dapat menghapus tautan terbagi", "unable_to_delete_shared_link": "Tidak dapat menghapus tautan terbagi",
"unable_to_delete_user": "Tidak dapat menghapus pengguna", "unable_to_delete_user": "Tidak dapat menghapus pengguna",
"unable_to_download_files": "Tidak dapat mengunduh berkas", "unable_to_download_files": "Tidak dapat mengunduh berkas",
"unable_to_edit_exclusion_pattern": "Tidak dapat menyunting pola pengecualian", "unable_to_edit_exclusion_pattern": "Tidak dapat menyunting pola pengecualian",
"unable_to_edit_import_path": "Tidak dapat menyunting jalur pengimporan",
"unable_to_empty_trash": "Tidak dapat menghapus sampah", "unable_to_empty_trash": "Tidak dapat menghapus sampah",
"unable_to_enter_fullscreen": "Tidak dapat memasuki layar penuh", "unable_to_enter_fullscreen": "Tidak dapat memasuki layar penuh",
"unable_to_exit_fullscreen": "Tidak dapat keluar dari layar penuh", "unable_to_exit_fullscreen": "Tidak dapat keluar dari layar penuh",
@@ -1042,6 +1053,7 @@
"exif_bottom_sheet_description_error": "Galat saat memperbaharui deskripsi", "exif_bottom_sheet_description_error": "Galat saat memperbaharui deskripsi",
"exif_bottom_sheet_details": "RINCIAN", "exif_bottom_sheet_details": "RINCIAN",
"exif_bottom_sheet_location": "LOKASI", "exif_bottom_sheet_location": "LOKASI",
"exif_bottom_sheet_no_description": "Tidak ada deskripsi",
"exif_bottom_sheet_people": "ORANG", "exif_bottom_sheet_people": "ORANG",
"exif_bottom_sheet_person_add_person": "Tambah nama", "exif_bottom_sheet_person_add_person": "Tambah nama",
"exit_slideshow": "Keluar dari Salindia", "exit_slideshow": "Keluar dari Salindia",
@@ -1080,6 +1092,7 @@
"features_setting_description": "Kelola fitur aplikasi", "features_setting_description": "Kelola fitur aplikasi",
"file_name": "Nama berkas", "file_name": "Nama berkas",
"file_name_or_extension": "Nama berkas atau ekstensi", "file_name_or_extension": "Nama berkas atau ekstensi",
"file_size": "Ukuran berkas",
"filename": "Nama berkas", "filename": "Nama berkas",
"filetype": "Jenis berkas", "filetype": "Jenis berkas",
"filter": "Filter", "filter": "Filter",
@@ -1243,6 +1256,7 @@
"local_media_summary": "Ringkasan Media Lokal", "local_media_summary": "Ringkasan Media Lokal",
"local_network": "Jaringan Lokal", "local_network": "Jaringan Lokal",
"local_network_sheet_info": "Aplikasi akan terhubung ke server melalui URL ini saat menggunakan jaringan Wi-Fi yang ditentukan", "local_network_sheet_info": "Aplikasi akan terhubung ke server melalui URL ini saat menggunakan jaringan Wi-Fi yang ditentukan",
"location": "Lokasi",
"location_permission": "Izin lokasi", "location_permission": "Izin lokasi",
"location_permission_content": "Untuk menggunakan fitur pengalihan otomatis, Immich memerlukan izin lokasi yang akurat agar dapat membaca nama jaringan Wi-Fi saat ini", "location_permission_content": "Untuk menggunakan fitur pengalihan otomatis, Immich memerlukan izin lokasi yang akurat agar dapat membaca nama jaringan Wi-Fi saat ini",
"location_picker_choose_on_map": "Pilih di peta", "location_picker_choose_on_map": "Pilih di peta",
@@ -1347,6 +1361,8 @@
"minute": "Menit", "minute": "Menit",
"minutes": "Menit", "minutes": "Menit",
"missing": "Hilang", "missing": "Hilang",
"mobile_app": "Aplikasi Seluler",
"mobile_app_download_onboarding_note": "Unduh aplikasi seluler pendamping dengan menggunakan opsi berikut",
"model": "Model", "model": "Model",
"month": "Bulan", "month": "Bulan",
"monthly_title_text_date_format": "BBBB t", "monthly_title_text_date_format": "BBBB t",
@@ -1365,6 +1381,8 @@
"my_albums": "Album saya", "my_albums": "Album saya",
"name": "Nama", "name": "Nama",
"name_or_nickname": "Nama atau nama panggilan", "name_or_nickname": "Nama atau nama panggilan",
"navigate": "Navigasi",
"navigate_to_time": "Navigasi ke Waktu",
"network_requirement_photos_upload": "Gunakan data seluler untuk cadangkan foto", "network_requirement_photos_upload": "Gunakan data seluler untuk cadangkan foto",
"network_requirement_videos_upload": "Gunakan data seluler untuk cadangkan video", "network_requirement_videos_upload": "Gunakan data seluler untuk cadangkan video",
"network_requirements": "Persyaratan Jaringan", "network_requirements": "Persyaratan Jaringan",
@@ -1374,6 +1392,7 @@
"never": "Tidak pernah", "never": "Tidak pernah",
"new_album": "Album baru", "new_album": "Album baru",
"new_api_key": "Kunci API Baru", "new_api_key": "Kunci API Baru",
"new_date_range": "Rentang tanggal baru",
"new_password": "Kata sandi baru", "new_password": "Kata sandi baru",
"new_person": "Orang baru", "new_person": "Orang baru",
"new_pin_code": "Kode PIN baru", "new_pin_code": "Kode PIN baru",
@@ -1424,6 +1443,9 @@
"notifications": "Notifikasi", "notifications": "Notifikasi",
"notifications_setting_description": "Kelola notifikasi", "notifications_setting_description": "Kelola notifikasi",
"oauth": "OAuth", "oauth": "OAuth",
"obtainium_configurator": "Konfigurator Obtainium",
"obtainium_configurator_instructions": "Gunakan Obtainium untuk menginstal dan memperbarui aplikasi Android secara langsung dari rilis GitHub Immich. Buat kunci API dan pilih varian untuk membuat tautan konfigurasi Obtainium anda",
"ocr": "OCR",
"official_immich_resources": "Sumber Daya Immich Resmi", "official_immich_resources": "Sumber Daya Immich Resmi",
"offline": "Luring", "offline": "Luring",
"offset": "Ofset", "offset": "Ofset",
@@ -1528,6 +1550,9 @@
"play_memories": "Putar kenangan", "play_memories": "Putar kenangan",
"play_motion_photo": "Putar Foto Gerak", "play_motion_photo": "Putar Foto Gerak",
"play_or_pause_video": "Putar atau jeda video", "play_or_pause_video": "Putar atau jeda video",
"play_original_video": "Putar video asli",
"play_original_video_setting_description": "Lebih menyukai memutar video asli daripada video yang telah dikonversi. Jika aset asli tidak kompatibel, video mungkin tidak dapat diputar dengan benar.",
"play_transcoded_video": "Putar video yang telah dikonversi",
"please_auth_to_access": "Silakan autentikasi untuk mengakses", "please_auth_to_access": "Silakan autentikasi untuk mengakses",
"port": "Porta", "port": "Porta",
"preferences_settings_subtitle": "Kelola preferensi aplikasi", "preferences_settings_subtitle": "Kelola preferensi aplikasi",
@@ -1664,6 +1689,7 @@
"reset_sqlite_confirmation": "Apakah Anda yakin ingin mengatur ulang basis data SQLite? Setelah tindakan ini, Anda harus keluar lalu masuk kembali untuk melakukan sinkronisasi ulang data", "reset_sqlite_confirmation": "Apakah Anda yakin ingin mengatur ulang basis data SQLite? Setelah tindakan ini, Anda harus keluar lalu masuk kembali untuk melakukan sinkronisasi ulang data",
"reset_sqlite_success": "Berhasil mengatur ulang basis data SQLite", "reset_sqlite_success": "Berhasil mengatur ulang basis data SQLite",
"reset_to_default": "Atur ulang ke bawaan", "reset_to_default": "Atur ulang ke bawaan",
"resolution": "Resolusi",
"resolve_duplicates": "Mengatasi duplikat", "resolve_duplicates": "Mengatasi duplikat",
"resolved_all_duplicates": "Semua duplikat terselesaikan", "resolved_all_duplicates": "Semua duplikat terselesaikan",
"restore": "Pulihkan", "restore": "Pulihkan",
@@ -1682,6 +1708,7 @@
"running": "Berjalan", "running": "Berjalan",
"save": "Simpan", "save": "Simpan",
"save_to_gallery": "Simpan ke galeri", "save_to_gallery": "Simpan ke galeri",
"saved": "Disimpan",
"saved_api_key": "Kunci API Tersimpan", "saved_api_key": "Kunci API Tersimpan",
"saved_profile": "Profil disimpan", "saved_profile": "Profil disimpan",
"saved_settings": "Pengaturan disimpan", "saved_settings": "Pengaturan disimpan",
@@ -1698,6 +1725,9 @@
"search_by_description_example": "Hari mendaki di Sapa", "search_by_description_example": "Hari mendaki di Sapa",
"search_by_filename": "Cari berdasarkan nama berkas atau ekstensi", "search_by_filename": "Cari berdasarkan nama berkas atau ekstensi",
"search_by_filename_example": "mis. IMG_1234.JPG atau PNG", "search_by_filename_example": "mis. IMG_1234.JPG atau PNG",
"search_by_ocr": "Cari dengan OCR",
"search_by_ocr_example": "Latte",
"search_camera_lens_model": "Pencarian model lensa...",
"search_camera_make": "Cari merek kamera...", "search_camera_make": "Cari merek kamera...",
"search_camera_model": "Cari model kamera...", "search_camera_model": "Cari model kamera...",
"search_city": "Cari kota...", "search_city": "Cari kota...",
@@ -1714,6 +1744,7 @@
"search_filter_location_title": "Pilih Lokasi", "search_filter_location_title": "Pilih Lokasi",
"search_filter_media_type": "Tipe Media", "search_filter_media_type": "Tipe Media",
"search_filter_media_type_title": "Pilih jenis media", "search_filter_media_type_title": "Pilih jenis media",
"search_filter_ocr": "Cari dengan OCR",
"search_filter_people_title": "Pilih orang", "search_filter_people_title": "Pilih orang",
"search_for": "Cari", "search_for": "Cari",
"search_for_existing_person": "Cari orang yang sudah ada", "search_for_existing_person": "Cari orang yang sudah ada",
@@ -1776,6 +1807,7 @@
"server_online": "Server Daring", "server_online": "Server Daring",
"server_privacy": "Privasi server", "server_privacy": "Privasi server",
"server_stats": "Statistik Server", "server_stats": "Statistik Server",
"server_update_available": "Pembaruan server tersedia",
"server_version": "Versi Server", "server_version": "Versi Server",
"set": "Atur", "set": "Atur",
"set_as_album_cover": "Atur sebagai kover album", "set_as_album_cover": "Atur sebagai kover album",
@@ -1804,6 +1836,8 @@
"setting_notifications_subtitle": "Atur setelan notifikasi", "setting_notifications_subtitle": "Atur setelan notifikasi",
"setting_notifications_total_progress_subtitle": "Progres keseluruhan unggahan (selesai/total aset)", "setting_notifications_total_progress_subtitle": "Progres keseluruhan unggahan (selesai/total aset)",
"setting_notifications_total_progress_title": "Tampilkan progres total pencadangan latar belakang", "setting_notifications_total_progress_title": "Tampilkan progres total pencadangan latar belakang",
"setting_video_viewer_auto_play_subtitle": "Otomatis memutar video saat dibuka",
"setting_video_viewer_auto_play_title": "Putar video secara otomatis",
"setting_video_viewer_looping_title": "Ulangi", "setting_video_viewer_looping_title": "Ulangi",
"setting_video_viewer_original_video_subtitle": "Ketika melakukan streaming video dari server, sistem akan memutar versi asli meskipun tersedia hasil transkode. Pengaturan ini dapat menyebabkan terjadinya buffering. Video yang tersedia secara lokal akan selalu diputar dalam kualitas asli tanpa terpengaruh oleh pengaturan ini.", "setting_video_viewer_original_video_subtitle": "Ketika melakukan streaming video dari server, sistem akan memutar versi asli meskipun tersedia hasil transkode. Pengaturan ini dapat menyebabkan terjadinya buffering. Video yang tersedia secara lokal akan selalu diputar dalam kualitas asli tanpa terpengaruh oleh pengaturan ini.",
"setting_video_viewer_original_video_title": "Paksa video asli", "setting_video_viewer_original_video_title": "Paksa video asli",
@@ -1983,6 +2017,7 @@
"theme_setting_three_stage_loading_title": "Aktifkan pemuatan tiga tahap", "theme_setting_three_stage_loading_title": "Aktifkan pemuatan tiga tahap",
"they_will_be_merged_together": "Mereka akan digabungkan bersama", "they_will_be_merged_together": "Mereka akan digabungkan bersama",
"third_party_resources": "Sumber Daya Pihak Ketiga", "third_party_resources": "Sumber Daya Pihak Ketiga",
"time": "Waktu",
"time_based_memories": "Kenangan berbasis waktu", "time_based_memories": "Kenangan berbasis waktu",
"timeline": "Lini masa", "timeline": "Lini masa",
"timezone": "Zona waktu", "timezone": "Zona waktu",
@@ -2015,6 +2050,7 @@
"troubleshoot": "Pemecahan Masalah", "troubleshoot": "Pemecahan Masalah",
"type": "Jenis", "type": "Jenis",
"unable_to_change_pin_code": "Tidak dapat mengubah kode PIN", "unable_to_change_pin_code": "Tidak dapat mengubah kode PIN",
"unable_to_check_version": "Tidak dapat memeriksa versi aplikasi atau server",
"unable_to_setup_pin_code": "Tidak dapat memasang kode PIN", "unable_to_setup_pin_code": "Tidak dapat memasang kode PIN",
"unarchive": "Keluarkan dari arsip", "unarchive": "Keluarkan dari arsip",
"unarchive_action_prompt": "Sebanyak {count} item telah dihapus dari Arsip", "unarchive_action_prompt": "Sebanyak {count} item telah dihapus dari Arsip",

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