Compare commits

...

304 Commits

Author SHA1 Message Date
mertalev b803a35bdc preserve file extension 2025-04-01 16:37:06 -04:00
mertalev 0da1c3b279 add empty array fallback just in case for now 2025-04-01 15:58:32 -04:00
mertalev 33c9ea1c9c update tests 2025-04-01 15:51:08 -04:00
mertalev e7503ce3dc fix file path logic 2025-04-01 15:51:08 -04:00
Daimolean e4b0c00885 fix(web): select all button displays incorrectly (#17305)
* fix(web): select all show incorrectly

* fix: lint

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-04-01 19:00:48 +00:00
Alex 946507231d fix(web): blank locale cause blank timeline to render (#17284)
* fix(web): blank locale cause blank timeline to render

* correct fix

* newline

* pr feedback
2025-04-01 18:58:11 +00:00
Alex 20ba800a50 fix(web): date time change reactivity (#17306)
* fix(web): date time change reactivity

* remove logs
2025-04-01 18:57:53 +00:00
Alex f434e858ed fix(mobile): getAllByRemoteId return all assets on empty arguments value (#17263)
* chore: post release tasks

* fix(mobile): getAllByRemoteId return all assets if ids is empty
2025-04-01 08:59:21 -05:00
bo0tzz 3e03c47fbf fix: strip extra metadata when transcoding (#17297) 2025-04-01 08:58:59 -05:00
github-actions 9aa3850769 chore: version v1.131.2 2025-04-01 11:41:56 +00:00
renovate[bot] 628dcdeebf fix(deps): update typescript-projects (#17294)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-01 10:58:55 +00:00
renovate[bot] 11bfde2aa8 chore(deps): update github-actions (#17282)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-01 11:49:11 +01:00
renovate[bot] 69b1ac47ea fix(deps): update typescript-projects (#17287)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-01 12:32:09 +02:00
renovate[bot] 4f81265694 chore(deps): update dependency @types/node to ^22.13.14 (#17283)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-01 12:30:41 +02:00
renovate[bot] 3428a876c7 chore(deps): update dependency vite to v6.2.4 [security] (#17259)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-01 00:36:54 +01:00
Alex bd822657d3 chore: post release tasks (#17262) 2025-04-01 00:36:18 +01:00
Mert 9e7744a9ab fix(ml): healthcheck (#17274) 2025-03-31 19:23:40 -04:00
github-actions 7729fe80fa chore: version v1.131.1 2025-03-31 20:36:48 +00:00
martin 68e24ad168 fix: posix compliant command (#17264) 2025-03-31 16:35:02 -04:00
Jason Rasmussen 186c573565 fix: missing migration folder broke non-root setups (#17266) 2025-03-31 20:18:13 +00:00
github-actions 5b63b9fc8b chore: version v1.131.0 2025-03-31 18:41:13 +00:00
Eli Gao 5c80e8734b feat: original-sized previews for non-web-friendly images (#14446)
* feat(server): extract full-size previews from RAW images

* feat(web): load fullsize preview for RAW images when zoomed in

* refactor: tweaks for code review

* refactor: rename "converted" preview/assets to "fullsize"

* feat(web/server): fullsize preview for non-web-friendly images

* feat: tweaks for code review

* feat(server): require ASSET_DOWNLOAD premission for fullsize previews

* test: fix types and interfaces

* chore: gen open-api

* feat(server): keep only essential exif in fullsize preview

* chore: regen openapi

* test: revert unnecessary timeout

* feat: move full-size preview config to standalone entry

* feat(i18n): update en texts

* fix: don't return fullsizePath when disabled

* test: full-size previews

* test(web): full-size previews

* chore: make open-api

* feat(server): redirect to preview/original URL when fullsize thumbnail not available

* fix(server): delete fullsize preview image on thumbnail regen after fullsize preview turned off

* refactor(server): AssetRepository.deleteFiles with Kysely

* fix(server): type of MediaRepository.writeExif

* minor simplification

* minor styling changes and condensed wording

* simplify

* chore: reuild open-api

* test(server): fix media.service tests

* test(web): fix photo-viewer test

* fix(server):  use fullsize image when requested

* fix file path extension

* formatting

* use fullsize when zooming back out or when "display original photos" is enabled

* simplify condition

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-03-31 13:24:28 -04:00
bo0tzz a5093a9434 docs: separate upgrading page (#17257)
* docs: separate upgrading page

* chore: move "setup optional features" into postinstall

* docs: stronger backup warning in postinstall

* chore: link to upgrading page

* docs: reiterate breaking changes in upgrade doc

* chore: fix formatting

---------

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-31 11:43:14 -05:00
Mert 637ad1fdcb docs: minor typo (#17258)
three -> two
2025-03-31 18:34:29 +02:00
Mert 6789c2ac19 feat(ml): better multilingual search with nllb models (#13567) 2025-03-31 11:06:57 -04:00
PathToLife 838a8dd9a6 feat(web): increase album collapse click area (#17213) 2025-03-31 09:45:30 -05:00
Brandon Wees d71c5602c3 fix(server): Postgres error pretty printing (#17204)
* add patch-package to dev dependencies

this allows us to patch upstream packages without waiting for PRs to be merged (or not!). Patch-package does a pretty good job of notifying if upstream does a change to invalidate the patch (its a git patch under the hood).

* Patch implementation of https://github.com/porsager/postgres/pull/944

This PR has not been merged by upstream and helps produce verbose error messages when postgres fails to connect (usually incorrect credentials). This is in contrast to error messages such as

`TypeError: Cannot read properties of undefined (reading 'replace'), stack: TypeError: Cannot read properties of undefined (reading 'replace')`

* have postinstall only run when not installing a global package (such as immich-cli in the Docker build)
2025-03-31 09:34:43 -05:00
Mert 8c50e3e80e feat(server): consider JpgFromRaw2 tag for embedded previews (#17123)
* add jpgfromraw2

* unused catch
2025-03-31 09:17:57 -05:00
Jonathan Jogenfors efcb1129ce fix(server): don't sync null date assets (#17247) 2025-03-31 09:16:53 -05:00
Jonathan Jogenfors faabda4446 fix(server): multiple exclusion patterns (#17221) 2025-03-31 09:16:30 -05:00
Alex b8b2898c87 fix(server): double extension when filename has uppercase extension (#17226)
* fix(server): double extension when filename has uppercase extension

* Proper tests
2025-03-31 09:16:04 -05:00
Ben McCann b25914c2a5 chore: use writable derived in more places (#17248)
chore(web): use writable derived in more places
2025-03-31 09:15:52 -05:00
Zack Pollard d613f15606 test: fix flaky user handle delete check medium test (#17253)
we can't run specifically the handleUserDeleteCheck tests concurrently due to one of the tests modifying the config in the shared database
if run concurrently you can get race conditions where the other tests pick up the change, even with resetting the config in the beforeEach
therefore the test that checks a delete actually happens, fails
there are many ways to solve this, disabling concurrency for the suite, forcing sequential tests for just handleUserDeleteCheck, increasing the delete test deletedAt to more than the custom duration tests deleteDelay
I applied all three of these. You could also force all the user tests to run in their own databases, but that feels overkill
2025-03-31 13:19:57 +01:00
hwang a831876fdc fix: MAX_PARAMETERS_EXCEEDED error during person cleanup job (#17222)
* add batch size in sql delete,fix person cleanup error: ERROR [Microservices:{}] Unable to run job handler (backgroundTask/person-cleanup): Error: MAX_PARAMETERS_EXCEEDED: Max number of parameters (65534) exceeded

* add chunked decorator to delete

* chore: prettier formatting fixes

---------

Co-authored-by: hwang3419 <тАЬhwang.iit@gmail.comтАЭ>
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
2025-03-31 11:30:56 +00:00
PathToLife 09f4476f97 feat: improve performance for GET /api/album & /api/album/:id (#17124)
* fix(server) optimize number of sql calls for GET /api/albums

remove unnecessary join for getMetadataForIds
remove separate call to getLastUpdatedAssetForAlbumId

* fix(server) remove unnecessary getLastUpdatedAssetForAlbumId call for GET /api/album/:id

also remove getLastUpdatedAssetForAlbumId query as it is no longer referenced

* fix(server): correct lastModifiedAssetTimestamp return type + formatting and typing

* chore(server): address type issue with tests found via npm:check

tests & lint still pass before this commit.
2025-03-31 11:28:41 +00:00
Daniel Dietzler 238c151ac3 chore: finish migrating eslint config files; bump unicorn (#17200) 2025-03-31 12:18:25 +01:00
bo0tzz e4f83680d9 feat: use my.immich.app for externalDomain fallback (#17209)
* feat: use my.immich.app for externalDomain fallback

This is probably more useful than localhost.

* chore: remove port param

* fix: update expected value in tests

* fix: update expected value in e2e
2025-03-31 12:08:41 +01:00
Daniel Dietzler 74f7fd4b53 chore: add language requests from weblate (#17236) 2025-03-31 10:48:41 +01:00
Weblate (bot) f4dbfd856e chore(web): update translations (#17115)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hu/
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/lv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/te/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translation: Immich/immich

Co-authored-by: Abhijeet Viswam <abhijeetviswam@gmail.com>
Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: C D <chinnidiwakar5@gmail.com>
Co-authored-by: Henrik Sommerfeld <henrik@sommerfeld.nu>
Co-authored-by: Karsten Dambekalns <karsten@dambekalns.de>
Co-authored-by: Miro R├╜zek <miroslav.ryzek@gmail.com>
Co-authored-by: Mohd Nader <mohd.nader@gmail.com>
Co-authored-by: M─Бrti┼Ж┼б Bru┼Жenieks <martinsb@gmail.com>
Co-authored-by: Nergis <me@nergis.dev>
Co-authored-by: Utkarsh Prajapati <utkarshprap@gmail.com>
Co-authored-by: Yamagishi Kazutoshi <ykzts@desire.sh>
Co-authored-by: grgergo <gergo_g@proton.me>
2025-03-31 09:47:08 +00:00
Jason Rasmussen 55a3c30664 feat: kysely migrations (#17198) 2025-03-29 09:26:24 -04:00
renovate[bot] 6fa0cb534a fix(deps): update dependency @opentelemetry/context-async-hooks to v2 (#17031)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-28 20:51:01 +01:00
Ben McCann 9f0dbfc150 chore(web): update to newer persisted store package name (#17094) 2025-03-28 20:40:57 +01:00
Saschl 6419ac74af fix: update renderlist after asset deleted (#16786) 2025-03-28 18:34:19 +00:00
Yaros d2bcf5d716 fix(mobile): pause background video play (#17032)
* fix(mobile): prevent background video playback

* fix: logic for tracking app state

* chore: move lifecycle handler in separate file

* chore: replace useState with useRef

* chore: useOnAppLifecycleStateChange

* fix: removed print statement
2025-03-28 10:32:25 -05:00
shenlong c8331f111f fix(mobile): prefer remote orientation (#17177)
* fix(mobile): prefer remote orientation

* pr feedback

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-28 10:24:31 -05:00
Jason Rasmussen 4b4bcd23f4 feat: schema diff sql tools (#17116) 2025-03-28 10:40:09 -04:00
Ben McCann 3fde5a8328 feat: map globe view, style hot reloading and load lag fixed (#17079)
* chore: upgrade svelte-maplibre and enforce runes

* feat: maplibre-gl 5, globe view, style hot reloading, fast map markers

* fix: remove location-pin class that wasn't being used

---------

Co-authored-by: Zack Pollard <zackpollard@ymail.com>
2025-03-28 14:08:54 +00:00
Joren Guillaume cc3ea32cd2 docs: update folder support for app in README.md (#17191)
Update folder support for app in README.md
2025-03-28 09:35:36 +00:00
Ben McCann 431cf281da chore(web): update typescript-eslint (#17093) 2025-03-28 00:04:31 -04:00
Alex 8f786fd7dd fix(web): form reactivity (#17183) 2025-03-27 19:58:49 -05:00
Alex 3e73765375 fix(web): don't show newly uploaded asset in inapplicable views (#17184) 2025-03-27 19:45:50 -04:00
Alex 411521b21d chore: post release tasks (#17179) 2025-03-27 19:41:22 -04:00
renovate[bot] e163808348 fix(deps): update typescript-projects (#17080)
* fix(deps): update typescript-projects

* fix: otel

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-03-27 22:33:58 +00:00
Ben McCann 411772123f chore(web): remove unused props (#17141) 2025-03-27 23:12:14 +01:00
Mert 84c35e35d6 chore(ml): installable package (#17153)
* app -> immich_ml

* fix test ci

* omit file name

* add new line

* add new line
2025-03-27 19:49:09 +00:00
Mert f7d730eb05 chore(ml): remove exporter (#17182)
* remove exporter code

* update gha
2025-03-27 14:48:02 -04:00
Mert 16e0166d22 docs: evaluate models on xtd-10 and flickr30k (#17159)
update docs
2025-03-27 11:30:51 -05:00
github-actions 43f8f473e9 chore: version v1.130.3 2025-03-27 15:54:30 +00:00
shenlong cc393b2b7b fix(mobile): oauth-mobile-first-login (#17173)
invalidate ref

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-27 15:49:55 +00:00
Alex 6341962de4 fix(web): better touch device detection (#17144)
* fix(web): better touch device detection

* variable name
2025-03-27 10:43:56 -05:00
Min Idzelis c26b28f6a4 fix: bug with svelte gestures (#17154)
* fix: bug with svelte gestures

* lint
2025-03-27 08:51:52 -05:00
shenlong c72c82c401 fix(mobile): faster device album refresh after initial sync (#17170)
fix(mobile): faster device album refresh after fresh sync

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-27 08:47:05 -05:00
Alex fecf3809a6 fix(server): album count does not account for assets without exif (#17150)
* fix(server): album count doesn't accounted for assets without exif

* sql
2025-03-26 21:24:22 -05:00
Mert 619bd72de9 docs: mention rknn among image options (#17156)
mention rknn
2025-03-26 19:05:48 -04:00
Jason Rasmussen fd4a5f71b5 fix: broken album page (#17149) 2025-03-26 18:59:23 -04:00
github-actions 2f8725c66f chore: version v1.130.2 2025-03-26 15:34:54 +00:00
Jonathan Jogenfors 9fbd6369b9 fix(server): check asset against multiple import paths (#17128)
* fix sql logic

* refactor: map import paths into not or sql statements

---------

Co-authored-by: Zack Pollard <zackpollard@ymail.com>
2025-03-26 10:10:53 -05:00
Snowknight26 c547d849d9 fix(web): prevent comb box dropdowns from staying open when clicking on labels (#17119)
fix(web): prevent combobox dropdowns from staying open when clicking on label
2025-03-26 08:58:00 -05:00
renovate[bot] 6ba94ac2f2 fix(deps): update machine-learning (#17078)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-26 02:04:41 +00:00
Alex dfb0626c91 fix(web): default search to context (#17118)
* fix(web): default search to context

* one liner

* Refactor
2025-03-25 17:57:12 -05:00
Alex 392ce7deb2 fix(web): albums display order again (#17117) 2025-03-25 22:14:00 +00:00
Mert 75df8fc10e refactor(server): bulk update exif (#17109)
* bulk update exif

* update sql

* update tests

* check job queeuing in test
2025-03-25 21:24:24 +00:00
github-actions 4cf7c55680 chore: version v1.130.1 2025-03-25 20:25:01 +00:00
Alex b8ff93a3c9 chore: post release tasks (#17097) 2025-03-25 21:22:30 +01:00
Alex 37eb70c1eb fix(web): albums display order (#17106)
* fix(web): albums display order

* ergonomic

* perf ergonomic

* miss 1
2025-03-25 20:21:38 +00:00
renovate[bot] aa4d6405f4 chore(deps): update base-image to v202503251114 (major) (#17085)
* chore(deps): update base-image to v202503251114

* fix: geocoding changes

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-03-25 20:15:02 +00:00
Alex ae447542a4 fix(web): asset navigation (#17104) 2025-03-25 15:00:30 -05:00
renovate[bot] 90f21d9047 chore(deps): pin dependencies (#17077)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-25 18:07:59 +00:00
renovate[bot] 567a92fe77 chore(deps): update dependency vite to v6.2.3 [security] (#17092)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-25 18:07:25 +00:00
Weblate (bot) 8d6f5a2da9 chore(web): update translations (#16807)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/af/
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/el/
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/fr/
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/hu/
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/lv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Cyrl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Latn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/te/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/th/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ur/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich

Co-authored-by: -J- <heyj0e@tuta.io>
Co-authored-by: Agostino Pit <scheccia@gmail.com>
Co-authored-by: Andreas Johansen <andreas@josern.com>
Co-authored-by: Andreas Resch <weblate@resch.io>
Co-authored-by: Basilis Pantelis <bpantelis10@gmail.com>
Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: Bonov <bonov@mail.ru>
Co-authored-by: C D <chinnidiwakar5@gmail.com>
Co-authored-by: Dawider10 <dawider110@gmail.com>
Co-authored-by: Denis Pacquier <denis.pacquier@gmail.com>
Co-authored-by: Fjuro <fjuro@users.noreply.hosted.weblate.org>
Co-authored-by: Focron <eliaelmas55@gmail.com>
Co-authored-by: Hurricane-32 <rodrigorimo@hotmail.com>
Co-authored-by: Indrek Haav <IndrekHaav@users.noreply.hosted.weblate.org>
Co-authored-by: Jean-Philippe Jodoin <jpjodoin@gmail.com>
Co-authored-by: Johan Ohly <johanohly@gmail.com>
Co-authored-by: J├╕rgen N├жss Berge <jorgen.n.berge@gmail.com>
Co-authored-by: KecskeTech <teonyitas@gmail.com>
Co-authored-by: Knud Bachmann R├╕n <knudbachmannron@proton.me>
Co-authored-by: Leo Bottaro <github@leobottaro.com>
Co-authored-by: Linerly <linerly@proton.me>
Co-authored-by: MSDNicrosoft <wang3311835119@hotmail.com>
Co-authored-by: Matja┼╛ T <matjaz@moj-svet.si>
Co-authored-by: Miki Mrvos <medolino2009@gmail.com>
Co-authored-by: M─Бrti┼Ж┼б Bru┼Жenieks <martinsb@gmail.com>
Co-authored-by: Nicol├бs McCarthy <nicomcc24@gmail.com>
Co-authored-by: Runskrift <anders@rimfrost.nu>
Co-authored-by: Ryan Gleeson <gleeson.ryanj@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: Tomas Svec <svec.tomas@gmail.com>
Co-authored-by: Umesh Verma <umesh.verma236@gmail.com>
Co-authored-by: User 123456789 <w0g-1es-5qq@cld3.com>
Co-authored-by: Xo <xocodokie@users.noreply.hosted.weblate.org>
Co-authored-by: beckett <beckett.blakey@proton.me>
Co-authored-by: johnwoo_nl <pb@lunenburg-productions.nl>
Co-authored-by: millallo <millallo@tiscali.it>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: xuars <yago.rana.gayoso@gmail.com>
Co-authored-by: yousaf465 <yousaf465@gmail.com>
Co-authored-by: чБпчм╝ <gh_denglong@163.com>
2025-03-25 18:05:23 +00:00
bo0tzz 69662e1ab4 chore: shared renovate configuration (#16903)
* chore: shared renovate configuration

dep: https://github.com/immich-app/.github/pull/2

* chore: move typescript-projects and schedule to shared config

---------

Co-authored-by: Zack Pollard <zackpollard@ymail.com>
2025-03-25 14:56:54 +00:00
github-actions 42b1efb679 chore: version v1.130.0 2025-03-25 13:48:45 +00:00
Snowknight26 b8bc11b0d9 fix(web): fix escape key not closing video player after seeking (#16860)
Co-authored-by: Yaros <thedj.launchpadder.dmx512@gmail.com>
2025-03-25 13:42:23 +00:00
Ben McCann 91065db3ff chore: migrate previously missed file to Svelte 5 (#17074) 2025-03-24 19:44:05 -04:00
Alex c14668bdd4 chore(mobile): translation (#17073)
chore(mobile): translation update
2025-03-24 22:16:10 +00:00
Yaros 9757f70064 fix(web): not autoplay after moving playhead on paused video (#17038)
fix(web): prevent autoplay after moving playhead
2025-03-24 16:55:46 -05:00
Min Idzelis 4a0045db44 feat(web): support long-press selection on mobile web (#16906)
* feat(web): max grid row height responsive

* also gallery-viewer

* lint

* feat(web): support long-press selection on mobile web

* use svelte-gestures

* fix test

* Bug fix

* globalThis

* format

* revert generator

* Testing

* bad merge

* Fix typo/tap on thumbnail

* feat: shrink header on small screens (#16909)

* feat(web): shrink header on small screens

* fix test

* test

* Fix test

* Revert user-page-layout chagne

* Restore icons sizes, make consistent, improve logo responsiveness

* remove 4 more pix, lint

* lint

* chore

---------

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

* Revert "Testing"

This reverts commit 442f11c9e1.

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-03-24 16:36:36 -05:00
Yaros a651a4bf0e chore(mobile): search field in separate widget (#16977)
* chore(mobile): search field in separate widget

* fix: removed unnecessary use of context

* chore: minor styling tweak

* fix: controller not bound

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-24 14:40:33 -05:00
Alex 8bc80076bb fix(mobile): show new local assets in offline mode (#16817)
fix: show new local assets in offline mode
2025-03-24 16:56:18 +00:00
Luigi311 89656472ef fix(mobile): fallback authentication client model/type to unknown (#17059)
mobile: fallback authentication client model/type to unknown

Add fallback for client model/type if device is not ios or android

Signed-off-by: Luis Garcia <git@luigi311.com>
2025-03-24 11:26:05 -05:00
Yaros d9c6ec06e5 chore(mobile): suffix to app name on debug builds (#17044) 2025-03-24 11:23:07 -05:00
Mert 4bfef2460a docs: model benchmarks (#17036)
* model benchmarks

* minor fixes

* formatting

* docs build

* maybe fix reference

* clarify optimal

* use emojis

* wording

* wording

* clarify optimal wording

* bolding

* more detailed instructions

* clarify edge case fix

* early exit in dim loop
2025-03-24 12:02:33 -04:00
shenlong ad151130f9 chore: rename user api interface (#17062)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-24 11:00:08 -05:00
Damiano Ferrari a77608e36b fix(mobile): selectedIcon not set when the device is landscape (#17027) 2025-03-24 10:50:49 -05:00
Nicholas Flamy 9e015c7f97 feat: lint workflow files and others files in .github (#16914)
* add npm prettier dep and format script to .github folder

* initial work on prettier formatting test

* attempt index notation

* change name of .github job to be valid

* another use of index notation

this is getting overcomplicated

* Change job ID to `github-files-formatting` and chane the name to `.github Files Checks`

* Change job name to `.github Files Formatting`

* Update Makefile with .github module and `filter-out`s

* run prettier formatting as added in this PR
2025-03-24 10:49:18 -05:00
Damiano Ferrari df8ba21b7d fix(mobile): Make icons consistent (all outlined) (#17028)
* fix(mobile): Make icons consistent (all outlined)

* fix(mobile): make `date_range` icon outlined
2025-03-24 10:10:15 -05:00
Yaros a285b1898e fix(mobile): platform-dependent share icons & label (#17034)
fix: platform-dependant icons
2025-03-24 08:36:15 -05:00
Mert 6a8e38042d fix(ml): add librknnrt.so in rknn image (#17022)
add librknnrt.so
2025-03-21 16:57:14 -04:00
Min Idzelis 55b52ecbec feat: mobile-web improvements - scrubber (#16856)
* feat: mobile-web improvements - scrubber

* lint

* cruft

* lint

* fix: thumb style

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-03-21 18:00:24 +00:00
Alex b5d5c40c69 fix(web): update stack state in timeline (#17021)
* fix(web): update stack state in timeline

* js docs

* fix: handle state update from unstack action from gallery viewer

* use navigate in View Stack notification

---------

Co-authored-by: Snowknight26 <Snowknight26@users.noreply.github.com>
2025-03-21 12:42:36 -05:00
Snowknight26 b00da18e84 fix(web): timeline renders nothing with an invalid asset scroll target (#16994)
* fix(web): fix asset grid showing nothing with an invalid asset target

* Deduplicate

* Scroll to position where appropriate

* a bit cleaner

* fix: lint

---------

Co-authored-by: Min Idzelis <min123@gmail.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-21 08:40:57 -05:00
Ben 3c87341902 fix(web): clicking away closes context menu (#16989)
* fix(web): clicking away closes context menu

* fix: use pointerdown event instead

* Revert "fix: use pointerdown event instead"

This reverts commit 0d2cf47194.
2025-03-21 08:39:41 -05:00
Alex bcd9248b43 fix(web): timeline regression 2 (#16982)
* fix(web): timeline renders nothing after archiving in asset viewer

* fix(web): timeline renders nothing after archiving in asset viewer

* fix: ensure geometry updated when performing bulk action on all

* fix: album assets selection
2025-03-20 22:30:27 -05:00
Alex dbc279f843 fix: gallery viewer sliding window offload assets (#17016)
* fix: gallery viewer sliding window offload assets

* fix: update bottom sliding window

* do not use negative

* Calculate offset before gallery

---------

Co-authored-by: Min Idzelis <min123@gmail.com>
2025-03-20 22:30:01 -05:00
Alex 21954939cf chore: remove limit in memory generation (#16920)
* chore: remove limit in memory generation

* generate sql

* chore: assets limit
2025-03-20 13:31:51 -05:00
renovate[bot] d537f2c2d1 chore(deps): update github-actions (#16965)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-20 13:17:36 -05:00
Snowknight26 1820c0aa0d fix(web): fix View in Timeline not working for stacked assets (#16993)
Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
2025-03-20 13:17:14 -05:00
Yaros 0d805a1f5b fix(web): removed merge person with itself (#16987)
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-20 15:25:42 +00:00
Alex f5e6042eb1 fix: extend e2e test cookie expiration date (#17007)
fix: extend e2e test cookie
2025-03-20 16:17:55 +01:00
renovate[bot] 8de71ddaf3 chore(deps): update dependency flutter to v3.29.2 (#16963)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-19 10:58:57 -05:00
Min Idzelis 7075c5b393 feat(web): make asset grid row height responsive (#16970)
* feat(web): max grid row height responsive

* also gallery-viewer

* lint
2025-03-19 10:57:44 -05:00
Min Idzelis 9398b0d4b3 fix: regression in select-all (#16969)
* bug: select-all

* set->[] in interaction store, clear select-all on cancel

* feedback

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-03-19 15:55:50 +00:00
renovate[bot] 1a0a9ef36c chore(deps): update base-image to v202503182202 (major) (#16968)
chore(deps): update base-image to v202503182202

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-19 00:28:32 -04:00
Dmitry Vakhnenko ce456709b5 fix(web): reset selection state when adding assets to a album (#16880)
* fix(web): cancel multiselect before adding assets to album

* chore: format with prettier

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-19 00:11:58 +00:00
renovate[bot] bc90678276 fix(deps): update machine-learning (#16966) 2025-03-18 23:07:21 +00:00
renovate[bot] 217a90bf61 chore(deps): update actions/download-artifact digest to b14cf4c (#16934)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18 17:10:19 -05:00
Yaros 62ba8c3e71 fix(web): date alignment on timeline (#16961) 2025-03-18 21:55:36 +00:00
renovate[bot] 564724b398 fix(deps): update machine-learning (#16960)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18 20:55:43 +00:00
renovate[bot] cedeba8723 chore(deps): update prom/prometheus docker digest to 502ad90 (#16956)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18 16:48:52 -04:00
bo0tzz 1d994333a6 fix: duplicated steps in docker workflow (#16952)
Not sure how that happened, maybe a bad merge conflict resolution?
2025-03-18 16:39:30 -04:00
renovate[bot] db8155f738 fix(deps): update typescript-projects (#16945)
* fix(deps): update typescript-projects

* fix: very weird variables

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-03-18 20:29:21 +00:00
renovate[bot] 4d723f4b56 chore(deps): update dependency types-setuptools to v76 (#16949)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18 15:02:25 -04:00
renovate[bot] 898b3e75c2 fix(deps): update machine-learning (#16935)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18 17:09:46 +00:00
bo0tzz 8c2d02c362 chore: run docs and cli builds on all PRs (#16954)
All the other workflows already do this.
2025-03-18 11:55:18 -05:00
Dmitry Vakhnenko d7a6e78bf0 fix(server): /api/stacks does not handles primaryAssetId query param (#16868)
fix(server): add missing validation decorator
2025-03-18 11:54:50 -05:00
Viharm 8723f585e0 chore(docs): clarify missing ':ro' tag in volume mount as a warning (#16877)
ЁЯУЭ Clarify missing ':ro' tag in volume mount as a warning

Changed description in comment of example docker compose file to clarify it as a warning that Immich may delete it, instead of sounding as if it is ok to delete.

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-18 16:50:59 +00:00
Mert 9f46ba8eb4 fix(server): set pixel format when scaling and not tonemapping (#16932)
set pixel format when scaling and not tonemapping
2025-03-18 11:42:09 -05:00
Andreas fe19f9ba84 fix(web): asset selection on memories page is broken (#16759)
* 16712: Proper intialisation of the memory store to avoid loading up duplicate object refs of the same asset.

* 16712: Add auth to memory mapping so isFavorite is actually return correctly from the server.

* 16712: Move logic that belongs in the store into the store.

* 16712: Cleanup.

* 16712: Fix init behaviour.

* 16712: Add comment.

* 16712: Make method private.

* 16712: Fix import.

* 16712: Fix format.

* 16712: Cleaner if/else and fix typo.

* fix: icon size mismatch

* 16712: Fixed up state machine managing memory playback:
* Updated to `Tween` (`tweened` was deprecated)
* Removed `resetPromise`. Setting progressController to 0 had the same effect, so not really sure why it was there?
* Removed the many duplicate places the `handleAction` method was called. Now we just called it on `afterNavigate` as well as when `galleryInView` or `$isViewing` state changes.

* 16712: Add aria tag.

* 16712: Fix memory player duplicate invocation bugs. Now we should only call 'reset' and 'play' once, after navigate/page load. This should hopefully fix all the various bugs around playback.

* 16712: Cleanup

* 16712: Cleanup

* 16712: Cleanup

* 16712: Cleanup

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-03-18 11:34:09 -05:00
renovate[bot] b609f35841 chore(deps): update base-image to v20250318 (major) (#16950)
* chore(deps): update base-image to v20250318

* chore

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-18 11:07:11 -05:00
shenlong 9cf3b88f80 refactor(mobile): remove int user id (#16814)
* refactor: user entity

* chore: rebase fixes

* refactor: remove int user Id

* refactor: migrate store userId from int to string

* refactor: rename uid to id

* fix: migration

* pr feedback

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-18 11:05:37 -05:00
Min Idzelis e96ffd43e7 feat: timeline performance (#16446)
* Squash - feature complete

* remove need to init assetstore

* More optimizations. No need to init. Fix tests

* lint

* add missing selector for e2e

* e2e selectors again

* Update: fully reactive store, some transitions, bugfixes

* merge fallout

* Test fallout

* safari quirk

* security

* lint

* lint

* Bug fixes

* lint/format

* accidental commit

* lock

* null check, more throttle

* revert long duration

* Fix intersection bounds

* Fix bugs in intersection calculation

* lint, tweak scrubber ui a tiny bit

* bugfix - deselecting asset doesnt work

* fix not loading bucket, scroll off-by-1 error, jsdoc, naming
2025-03-18 09:14:46 -05:00
shenlong dd263b010c refactor(mobile): use user service methods (#16783)
* refactor: user entity

* chore: rebase fixes

* refactor(mobile): refactor to use user service methods

* fix: late init error

* fix: lint

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-18 08:32:33 -05:00
renovate[bot] 6c2985df26 chore(deps): update dependency @types/node to ^22.13.10 (#16944)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18 12:15:07 +01:00
Mert 2b37caba03 feat(ml): rocm (#16613)
* feat(ml): introduce support of onnxruntime-rocm for AMD GPU

* try mutex for algo cache

use OrtMutex

* bump versions, run on mich

use 3.12

use 1.19.2

* acquire lock before any changes can be made

guard algo benchmark results

mark mutex as mutable

re-add /bin/sh (?)

use 3.10

use 6.1.2

* use composite cache key

1.19.2

fix variable name

fix variable reference

aaaaaaaaaaaaaaaaaaaa

* bump deps

* disable algo caching

* fix gha

* try ubuntu runner

* actually fix the gha

* update patch

* skip mimalloc preload for rocm

* increase build threads

* increase timeout for rocm

* Revert "increase timeout for rocm"

This reverts commit 2c4452f5d132198ed381a7b262b4a5cab5114b5f.

* attempt migraphx

* set migraphx_home

* Revert "set migraphx_home"

This reverts commit c121d3e48754b3bce100636f8d666deec58a44b7.

* Revert "attempt migraphx"

This reverts commit 521f9fb72dbe506dc6cb8faeb6494817d87265c6.

* migraphx, take two

* bump rocm

* allow cpu

* try only targeting migraphx

* skip tests

* migraph тЭМ

* known issues

* target gfx900 and gfx1102

* mention `HSA_USE_SVM`

* update lock

* set device id for rocm

---------

Co-authored-by: Mehdi GHESH <mehdi.ghesh@hotmail.fr>
2025-03-17 21:08:19 +00:00
Jason Rasmussen 6a40aa83b7 refactor: better types for getList and getDeletedAfter (#16926) 2025-03-17 15:32:12 -04:00
Yaros 93907a89d8 fix(mobile): age calculation & formatting (#16833) 2025-03-17 13:51:17 -05:00
renovate[bot] 3ce8608662 chore(deps): update mcr.microsoft.com/devcontainers/typescript-node:22 docker digest to 2ef2373 (#16925)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-17 14:07:09 -04:00
Abhinav Valecha d0e283f687 feat(server): version command for immich-admin #9611 (#16924)
* feat(server): Add version command for immich-admin #9611

* chore: clean up

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-03-17 17:57:59 +00:00
Yaros f8b40188e2 fix(mobile): change share icons for consistency (#16904) 2025-03-17 12:34:58 -05:00
renovate[bot] 9105e696bf chore(deps): pin github action dependencies (#16923)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-17 17:25:14 +00:00
bo0tzz 0a8135dde4 fix: docker workflow for rknn (#16922)
* fix: specify gha runner for rknn

* fix: remove s from platforms

* fix: merge job for rknn
2025-03-17 18:13:43 +01:00
Jason Rasmussen 0bb95544e5 chore: pin github action digests (#16875) 2025-03-17 11:30:13 -05:00
Yoni Yang 14c3b99c0f feat(ml): ML on Rockchip NPUs (#15241) 2025-03-17 12:04:08 -04:00
shenlong 1e184a70f1 refactor: cleanup background service (#16855)
refactor: background service

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-17 08:48:22 -05:00
Jason Rasmussen 9a4495eb5b refactor: use more immich ui buttons (#16840) 2025-03-14 09:38:06 -04:00
Jason Rasmussen 8ad95b368b feat: use immich ui components for dialog component (#16839) 2025-03-14 09:37:56 -04:00
shenlong b778a86c99 refactor(mobile): move user service to domain (#16782)
* refactor: user entity

* chore: rebase fixes

* refactor(mobile): move user service to domain

* fix: timeline not visible on album selection page

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-13 22:20:26 -05:00
Jason Rasmussen a65ce2ac55 refactor: immich logo assets (#16850) 2025-03-13 18:05:08 -04:00
Jason Rasmussen f69d7e7bad chore: web cleanup (#16849) 2025-03-13 18:04:21 -04:00
ExceptionsOccur 858d1e9d9b fix(mobile): back gesture in asset selection page from an album (#16449)
* fix(mobile): the page for adding photos to the album cannot be navigated back using gestures #16409

* First-time return gesture adds the feature to cancel all current selections

---------

Co-authored-by: ExceptionsOccur <yuyu.tao@foxmail.com>
2025-03-13 11:37:05 +05:30
renovate[bot] a1a61f19eb chore(deps): update typescript-projects (#16795)
* chore(deps): update typescript-projects

* fix: aria

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-03-12 23:20:26 +01:00
Jason Rasmussen 996ffed5eb fix: immich ui toggles and switches (#16834)
* fix: immich ui toggles and switches

* Update web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte

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

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-12 16:25:27 -05:00
Jason Rasmussen 2d7a94ce23 feat: better library rename UX (#16837) 2025-03-12 16:00:16 -05:00
Jason Rasmussen 72a7be26c0 refactor: use immich/ui button component in user settings (#16836) 2025-03-12 15:56:55 -05:00
shenlong 77fad86b82 chore(mobile): bump dependency versions (#16823)
* chore(mobile): bump dep version

* reorganize files

* sort

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-12 14:33:11 +00:00
Yaros 52d90a8280 fix(web): fixed formatting of video length (#16829)
* fix(web): fixed formatting of video time

* shortened the condition
2025-03-12 09:18:43 -05:00
shenlong d1c8fe5303 refactor: user entity (#16655)
* refactor: user entity

* fix: add users to album & user profile url

* chore: rebase fixes

* generate files

* fix(mobile): timeline not reset on login

* fix: test stub

* refactor: rename user model (#16813)

* refactor: rename user model

* simplify import

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>

* chore: generate files

* fix: use getAllAccessible instead of getAll

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-12 08:56:56 -05:00
Snowknight26 a75718ce99 fix(web): update search results when searching from info panel (#16729)
* fix(web): update search results when searching from info panel

* Prevent double search when using search bar

* Format/lint

* Fix infinite loading on intersect

* Remove redundant function
2025-03-11 17:23:25 -05:00
Nicholas Flamy d72d715f6b fix(docs): logo not loading dark theme variant in production (#16820)
fix logo not loading dark theme variant in production
2025-03-11 17:13:25 -05:00
Jason Rasmussen 16fd19994b refactor: use factory and kysely types for partner repository (#16812) 2025-03-11 16:29:56 -04:00
Mert 83ed03920e fix(ml): dev environment dependencies (#16815)
use /opt/venv
2025-03-11 13:39:33 -05:00
bo0tzz 9c825e15de fix: run preview label remove job on PR close (#16811)
ЁЯдж
2025-03-11 15:26:09 +00:00
Andreas b8acae2f21 feat(web): Add keyboard shortcut selection on grid (#16713)
* 15712: Added keyboard shortcuts for opening add to album modal and highlighting/selecting an album to add to.

* 15712: Re-factored logic from template code into script. Extracted new album button into separate cmponent.

* 15712: Document new keyboard shortucts now that they work everywhere.

* 15712: Extract some constants/helper functions.

* 15712: Missing comma.

* 15712: Pulled logic out into separate unit testable class.

* 15712: Added a unit test.

* 15712: Move the modal back up to keep the github PR happy.

* 15712: PR feedback - renamed typescript files and switch to class bind directive.

* 15712:Move selection modal into correct package.

* 15712: Better naming of module and files.

* 15712: Add asset highlight using arrow keys.

* 15172: Add escape behaviour everywhere.

* 15712: Don't allow highlighting past start or end.

* 15712: Clear the highlight on changes to the component state.

* 15712: Use focus to track highlighted element.

* 15712: Rename highlight -> focussed.

* 15712: Better naming.

* 15712: Cleanup.

* 15712: Cleanup & simplify.

* 15712: bugfix for clicking on button.

* 15712: Cleanup.

* 15712: Rollback unnecessary changes.

* 15712: Add unit test.

* 15712: Add thumbnail unit test.

* 15712: Prettier.

* 15712: Fix merge issue.

* 15712: Add shortcut info.

* 15712: Fix linter.
2025-03-11 10:18:14 -05:00
Alex c80afea468 feat(web): better person naming interface (#16631)
* feat(web): better person naming interface

* feat(web): better person naming interface

* feat(web): better person naming interface

* feat(web): better person naming interface

* feat(web): better person naming interface

* feat(web): better person naming interface

* feat(web): better person naming interface
2025-03-11 10:08:52 -05:00
shenlong 6caa11d079 chore(mobile): use path provider foundation (#16804)
* chore(mobile): use path provider foundation

* chore: update podfile

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-11 09:26:43 -05:00
shenlong 653fa3f0b1 chore(mobile): add orientation tests for exif (#16806)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-11 09:25:46 -05:00
Alex 2be8b6c16d chore: ignore correct build folder (#16808) 2025-03-11 14:22:05 +00:00
Jonathan Jogenfors 6bb0aa217c fix(server): set unit test timezone to UTC (#16805) 2025-03-11 10:19:33 -04:00
bo0tzz 04fd83d9da chore: shared suffix for docker tags (#16727) 2025-03-11 12:25:10 +00:00
renovate[bot] ba9e3715f0 chore(deps): update base-image to v20250311 (major) (#16803)
chore(deps): update base-image to v20250311

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-11 12:24:31 +00:00
shenlong ac1b2d2fab chore(mobile): generated files and ci check (#16798)
* chore(mobile): more generated files

* ci: verify generated files in mobile are up-to-date

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-11 12:22:31 +00:00
Lorenzo Montanari d7e0f0e70e feat(web): exposed a job to manually trigger database backup procedures (#16622)
* feat(web): exposed a new job to create a manual database backup

* chore(server): added a new test case

* chore(server): moved job to backup db into the create job popup

* remove irrelevant change

* openapi

* chore: formatting

* docs: trigger backup documentation

---------

Co-authored-by: Lorenzo Montanari <13736036+l0ll098@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Co-authored-by: Zack Pollard <zack@futo.org>
2025-03-11 11:30:43 +00:00
Snowknight26 decc878267 feat(web): show full date when hovering over photos date groups (#16561)
* fix(web): Update asset grid date group titles to show full date

* Fix formatting
2025-03-11 11:18:29 +00:00
Zack Pollard e0a09f2ea0 fix: weblate pre-job not running (#16802)
* chore: add debug step to weblate pre-job

* fix: weblate enforce lock missing needs for pre-job
2025-03-11 11:10:00 +00:00
sarunas-zilinskas b9ecdf9286 chore: change k which stood for 1000 to more understandable notation of kbit/s (#16734) 2025-03-11 10:54:42 +00:00
Weblate (bot) 4c719cc3bb chore(web): update translations (#16252)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/af/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/bg/
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/el/
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/fi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/
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/hu/
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/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/nn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Cyrl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Latn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/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/ur/
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: -J- <heyj0e@tuta.io>
Co-authored-by: Ahmad Amin <ahmadamindev@gmail.com>
Co-authored-by: Andreas Johansen <andreas@josern.com>
Co-authored-by: Aniruddha <aniruddha@aniruddhas.com>
Co-authored-by: Bader Alqahtani <baq100@gmail.com>
Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: Bj├╢rn Bostr├╢m <weblate@boztrom.com>
Co-authored-by: Bonov <bonov@mail.ru>
Co-authored-by: Bora At─▒c─▒ <boratici.acc@gmail.com>
Co-authored-by: Carlo_Mava <carlomavaracchio@gmail.com>
Co-authored-by: Cem TURKER <forumcemturker@gmail.com>
Co-authored-by: Cohinem <twitch9ofe@gmail.com>
Co-authored-by: ConfusedAlex <alex@confusedalex.dev>
Co-authored-by: Damian Krysta <damian@krysta.dev>
Co-authored-by: Daniel A <aquino.daniel1994@ikmail.com>
Co-authored-by: Eric Lehmann Llevat <lemmi93@googlemail.com>
Co-authored-by: Eskuero <3skuero@gmail.com>
Co-authored-by: Etienne-Bdt <etienne.bardet@gmail.com>
Co-authored-by: FarSniper <ozmatlik@gmail.com>
Co-authored-by: Felipe Sim├╡es <felipebouabci@gmail.com>
Co-authored-by: Filip <fjokovic0@gmail.com>
Co-authored-by: Fjuro <fjuro@users.noreply.hosted.weblate.org>
Co-authored-by: Florian Ostertag <florian.kuepper@gmail.com>
Co-authored-by: Georgi Iliev <georgi.iliev533@outlook.com>
Co-authored-by: Hoi <Hoihoi@users.noreply.hosted.weblate.org>
Co-authored-by: Hurricane-32 <rodrigorimo@hotmail.com>
Co-authored-by: H├йctor Mart├нnez Juste <hectorzin@hotmail.com>
Co-authored-by: Indrek Haav <IndrekHaav@users.noreply.hosted.weblate.org>
Co-authored-by: JohannesBoanerges <jb@johannes-boanerges.de>
Co-authored-by: Jonathan Jogenfors <jonathan@jogenfors.se>
Co-authored-by: Jordy H <jordy@hoebergen.net>
Co-authored-by: Juan Palacios <mastergeek.juan@gmail.com>
Co-authored-by: Julius969 <juliusdjorup@proton.me>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: Leo Bottaro <github@leobottaro.com>
Co-authored-by: Leonardo Patti <leonardo.patti90@gmail.com>
Co-authored-by: Linerly <linerly@proton.me>
Co-authored-by: Macgyver <macgyver@users.noreply.hosted.weblate.org>
Co-authored-by: MaliciousSpark <fijalkowskikonras@gmail.com>
Co-authored-by: Marius Kavoliunas <kavoliunas.m@gmail.com>
Co-authored-by: Mateusz <account.srrr3@slmail.me>
Co-authored-by: Matja┼╛ T <matjaz@moj-svet.si>
Co-authored-by: Medallyon <mbups98@gmail.com>
Co-authored-by: Miki Mrvos <medolino2009@gmail.com>
Co-authored-by: M─Бrti┼Ж┼б Bru┼Жenieks <martinsb@gmail.com>
Co-authored-by: Nir Cohen <nir10146@gmail.com>
Co-authored-by: PPNplus <ppnplus@protonmail.com>
Co-authored-by: Pavol Valko <xpaulos2@gmail.com>
Co-authored-by: Philipp Burndorfer <phi.bur@gmx.at>
Co-authored-by: Pixiii <imapixel00@gmail.com>
Co-authored-by: Runskrift <anders@rimfrost.nu>
Co-authored-by: Sandro <account@donner-nsu.de>
Co-authored-by: Santiago <santiwever@hotmail.com>
Co-authored-by: Shawn <xiaxinx@gmail.com>
Co-authored-by: Sheridan Jegels <sheridanjegels@gmail.com>
Co-authored-by: Stijn <gielisstijn@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: Toine Rademacher <hi@toine.zip>
Co-authored-by: Torin Wu <xuan329269@gmail.com>
Co-authored-by: Vesa Jylh├д <vesa.jylha@gmail.com>
Co-authored-by: Vladimir <vladimir.stoev1015@gmail.com>
Co-authored-by: Xo <xocodokie@users.noreply.hosted.weblate.org>
Co-authored-by: Yaros <thedj.launchpadder.dmx512@gmail.com>
Co-authored-by: anton garcias <isaga.percompartir@gmail.com>
Co-authored-by: atsza661 <ats.altmets@gmail.com>
Co-authored-by: chamdim <chamdim@protonmail.com>
Co-authored-by: chapvic <victor@chapaev.org>
Co-authored-by: francesco stigliano <fra.stigliano@gmail.com>
Co-authored-by: icerocker <icerocker@users.noreply.hosted.weblate.org>
Co-authored-by: mattix7771 <mattione7@gmail.com>
Co-authored-by: pierrebengtsson <pierre.bengtsson@gmail.com>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: qtm <qtm@users.noreply.hosted.weblate.org>
Co-authored-by: szelek <janek.szelewicz@gmail.com>
Co-authored-by: thehijacker <thehijacker@gmail.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: xuars <yago.rana.gayoso@gmail.com>
Co-authored-by: ├Шyvind Hovden <oyvhov@gmail.com>
Co-authored-by: ╨Т╤П╤З╨╡╤Б╨╗╨░╨▓ ╨Ы╤Г╨║╤М╤П╨╜╨╡╨╜╨║╨╛ <madeinchuguev@gmail.com>
2025-03-11 10:48:34 +00:00
shenlong 81df812f56 fix(mobile): calculate isFlipped for exif from db (#16797)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-11 10:41:47 +00:00
Nicholas Flamy f0f0056fe3 feat(docs): highlight active version in version switcher (#16790)
* docs: highlight active version in version switcher

* Add comment explaining workaround
2025-03-11 10:41:12 +00:00
renovate[bot] 48dddb78d4 chore(deps): update docker/setup-qemu-action action to v3.6.0 (#16794)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-11 10:37:36 +00:00
Nicholas Flamy 5d86e6d2d3 fix(web): update old discord logo to new one (#16789)
* fix: update discord svg path and add viewbox

* fix formatting
2025-03-10 22:46:32 -05:00
Alex 75fa305e98 chore: flutter 3.29.1 (#16730)
* update dependencies

* update flutter version reference

* update flutter version reference

* update AndroidManifest with flutter_web_auth_2

* chore: lock file flutter version

* fix: ios build
2025-03-10 21:46:36 -05:00
renovate[bot] 8cd5aec4c5 chore(deps): update dependency @types/node to ^22.13.9 (#16792)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-10 22:43:16 -04:00
renovate[bot] cb489a1aa9 chore(deps): pin ghcr.io/astral-sh/uv docker tag to 562193a (#16791) 2025-03-10 22:23:50 -04:00
Jason Rasmussen 1382b27349 refactor: repository mocks (#16785) 2025-03-10 16:52:44 -04:00
Jason Rasmussen 1b35400043 chore: remove unused package (#16777) 2025-03-10 14:50:32 -04:00
Jason Rasmussen a96bba4b26 feat: sync assets, partner assets, exif, and partner exif (#16658)
* feat: sync assets, partner assets, exif, and partner exif

Co-authored-by: Zack Pollard <zack@futo.org>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>

* refactor: remove duplicate where clause and orderBy statements in sync queries

* fix: asset deletes not filtering by ownerId

---------

Co-authored-by: Zack Pollard <zack@futo.org>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
2025-03-10 12:05:39 -04:00
Jason Rasmussen e97df503f2 refactor: api key spec to use factories (#16776) 2025-03-10 12:04:35 -04:00
renovate[bot] fe959b2f05 fix(deps): update machine-learning (#16594) 2025-03-10 14:48:53 +00:00
Yaros f794c3e0df feat(web): show birthdate on person page (#16772)
* feat(web): show birthdate on person page

* shorten null check

Co-authored-by: Jason Rasmussen <jason@rasm.me>

* directly use birthDate

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-10 14:47:44 +00:00
Alex 57272904d6 chore(mobile): upgrade maplibre (#16739)
* chore(mobile): upgrade maplibre

* chore(mobile): upgrade maplibre

* color
2025-03-10 09:41:43 -05:00
Jensen H 2496bd7514 docs: update unraid installation steps (#16766)
Update unraid.md

Current steps omit this key step, which results in the postgresql docker complaining about the data folder not being empty. (It tries to use the `/mnt/user/appdata` folder as its application data folder.
2025-03-10 08:56:42 +00:00
Nicholas Flamy c6ede48e59 fix(server): set the dev server restart policy of the dev server container to match the other containers (#16753)
set the restart policy of the dev server container to match the other containers
2025-03-09 22:25:03 -05:00
Adam O'neill 70a08707d2 feat(web): remember search context (#16614)
* Retain search context in LocalStorage.

* Remove debug logging

* Prettier

* Added QueryType and VALID_QUERY_TYPES to $lib/constants

* Prettier

* Renamed VALID_QUERY_TYPES to fit the codestyle.

Ran prettier

* show current search type on search bar

* fix: linting

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-03-09 22:20:25 -05:00
Snowknight26 2f8e89c7ec feat(server): read Android and Sony video camera make/model (#16678)
* feat(server): read Android and Sony video camera exif data

* Remove a logger line
2025-03-09 22:20:11 -05:00
David Bourgault 9870ad9687 fix(server): adjust type of person.birthDate (#16628)
The API currently does not respect the documentation when returning a
person's birthDate. The doc/swagger says it will be of "YYYY-MM-DD"
format but the string is a full ISO8601-with-tz string. This causes
issue #16216 because the <input> tag is strict about supported value
formats.

I believe this was introduced by #15242 which switched some queries from
TypeORM to Kysely for the person repository. TypeORM does not parse
date, but our Kysely configuration does (explicitely).

This commits updates the types to represent both possibilities and ensure
the API always returns the correct format.
2025-03-09 21:32:05 -05:00
Lukas 097749d872 fix(web): add labels to memory lane buttons (#16664)
* fix(web): add labels to memory lane buttons

* use generic button labels
2025-03-09 21:31:55 -05:00
Yaros bdabea4030 feat(mobile): locate in timeline (#16722)
* feat(mobile): view in timeline

* fix: throwing error on scroll

* only show option if not in photos tab
2025-03-09 21:31:34 -05:00
Mert 6da77600e5 chore(ml): uv (#16725)
* poetry to uv

* update ci

* remove caching

* add typeshed to dev

* no need for `--non-interactive`

* move backends to extras

* oopsie

* update ci
2025-03-09 21:30:16 -05:00
Daniel Dietzler 573d9a7733 fix: ЁЯНк packages confusion (#16735)
fix: cookie packages confusion
2025-03-09 21:03:10 -05:00
Corentin Hatte 2aac679185 fix(web): Update people-card favorite position (#16746)
Update people-card favorite position

Move heart icon a bit more inward to mak it more visible
2025-03-10 01:32:32 +00:00
Alex 82624b0979 chore(mobile): upgrade riverpod (#16742) 2025-03-09 20:30:58 -05:00
Alex 17c5094719 chore(mobile): upgrade flutter_web_auth_2 (#16741)
* chore(mobile): upgrade flutter_web_auth_2

* pod file
2025-03-09 20:26:37 -05:00
Matthew Momjian 051431b757 fix(docs): edge case when restoring dump that is unreadable as current user (#16758)
* new gunzip setup

* windows
2025-03-09 20:26:00 -05:00
Yaros 6c5f99c47a feat(mobile): person age on photo properties (#16728)
* feat(mobile): person age on photo properties

* switch to using placeholder
2025-03-08 23:02:40 +01:00
Jason Rasmussen 1e127ae3a1 refactor: migrate library spec to factories (#16711) 2025-03-08 13:44:36 -05:00
Jason Rasmussen fd46d43726 chore: remove unused file (#16707) 2025-03-07 22:47:27 -06:00
Yaros 5252c013ec fix(mobile): fix notification icon not displaying properly (#16710) 2025-03-07 19:08:53 -06:00
Jason Rasmussen 3f06a494a9 refactor: queue asset deletes via stream (#16706) 2025-03-07 22:22:57 +00:00
renovate[bot] 086d8a448a fix(deps): update typescript-projects (#16597)
* fix(deps): update typescript-projects

* chore: update server lock file

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2025-03-07 21:20:45 +00:00
bo0tzz 8ace44fb95 feat: log before running migrations (#16703)
* feat: log before running migrations

* fix: it's called log not info

It should be called info...

* chore: fix formatting

---------

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-07 21:15:06 +00:00
Jason Rasmussen ce74f765b1 refactor: memory stub (#16704) 2025-03-07 16:03:34 -05:00
Yaros b0bf4e4fff feat(mobile): search on people page (#16696) 2025-03-07 14:43:32 -06:00
Jason Rasmussen 2d106755f6 refactor: convert activity stub to a factory (#16702) 2025-03-07 15:20:04 -05:00
Jason Rasmussen f82786a297 feat: use stream for template migrations (#16700) 2025-03-07 14:30:01 -05:00
Yaros c12986d38c fix(mobile): remain on albums tab after album deletion (#16698)
fix(mobile): remain on albums after album deletion
2025-03-07 13:25:07 -06:00
Matthew Momjian 19c40e3be9 fix(docs): remove /api from README (#16692)
* no api

* change internationalized
2025-03-07 08:58:18 -05:00
Jonathan Jogenfors 9959755dda refactor(server): use constant for external library batch size (#16685) 2025-03-07 11:29:06 +00:00
Lukas fdf2331c82 fix(web): hide scroll right button when scrolled to the right in memory lane (#16656)
fix(web): hide scroll right button when scrolled to the right
2025-03-06 20:50:56 -06:00
Lukas e03d7f888e fix(web): remove margin on last memory item (#16665) 2025-03-07 02:50:16 +00:00
Matthew Momjian 2eeed6524f fix(github): consistent folder format for PR template (#16669)
consistent formatting for folders
2025-03-06 20:32:10 -05:00
Jason Rasmussen d45fa491ce refactor: stream asset ids for library queue jobs (#16666) 2025-03-06 20:22:17 -05:00
Matthew Momjian 5c82c485d7 feat(server): normalize extensions in storage template (#16667)
* normalize and lowercase extensions

* un const

* do not change ext before stripping off old one

* braces
2025-03-06 18:02:28 -05:00
Sergey Katsubo feb65bf5a7 docs: reading existing face tag metadata is supported currently (#16662)
Fix FAQ: reading existing face tag metadata is supported currently
2025-03-06 20:42:14 +00:00
Jason Rasmussen 2cdbb0a37c refactor: database repository (#16593)
* refactor: database repository

* fix error reindex check

* chore: remove WIP code

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-03-06 13:33:24 -05:00
shenlong fe931faf17 refactor: exif entity (#16621)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-06 11:58:24 -06:00
Arno 4ebc25c754 feat(mobile): Folder View for mobile (#15047)
* very rough prototype for folder navigation without assets

* fix: refactored data model and tried to implement asset loading

* fix: openapi generator shadowing query param in /view/folder

* add simple alphanumeric sorting for folders

* basic asset viewing in folders

* rudimentary switch sorting order

* fixed reactivity when toggling sort order

* Fixed trailing comma

* Fixed bad merge conflict resolution

* Regenerated open-api

* Added rudimentary breadcrumbs

* Fixed linting problems

* feat: cleanup

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-06 17:27:43 +00:00
Mert deb399ea15 refactor(server): use exiftool for file date metadata (#16453)
* use exiftool for file date metadata

* handle tag not existing in exifinfo (?)

* update medium tests

* fix typo

* set file size too

* set file size only if undefined
2025-03-06 16:47:12 +00:00
Yaros d01b7a0d67 feat(web): aspect ratio of memory cards (#16652)
Fix aspect ratio of memory cards
2025-03-06 15:24:01 +00:00
Jonathan Jogenfors 3af26ee94a feat(server): library refresh go brrr (#14456)
* feat: brr

---------
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-03-06 16:00:18 +01:00
Mert bc61497461 refactor(server): group async calls in metadata extraction (#16450)
* group async calls

use debugFn

no need to change mock

* check call count in tests
2025-03-06 08:56:35 -06:00
Alex 1ed1a0a1fc feat(mobile): new sync (#16556)
* feat(mobile): new sync

* refactor

* refactor

* refactor

* refactor

* refactor

* refactor

* update analysis option

* remove database operation

* pr feedback
2025-03-06 08:44:28 -06:00
Lukas 2875303b4c feat(web): allow horizontal scrolling in memory lane (#16647) 2025-03-06 08:37:11 -06:00
rrrockey d84009648e refactor(server): replace switch statement in sendFile with Record lookup (#16630)
* refactor cache control handling in server/utils/file.ts

* add ability to null CacheControl.NONE

* Cache control handling comment

* Added comment to file.ts

This comment provides a better understanding of what the cacheControlHeader is doing.

* Update file.ts

Added comments

* Update server/src/utils/file.ts

* fix comments in file.ts

* run prettier with --write to fix formatting

---------

Co-authored-by: pnleguizamo <pnleguizamo@gmail.com>
Co-authored-by: drew-kearns <dkearns@iastate.edu>
Co-authored-by: Sierra (Izumi) Brown <119357873+SierraIBrown@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-06 12:46:37 +01:00
Nick Huang fc2df05190 docs: fix png extension typo in supported formats table (#16636)
Update supported-formats.md
2025-03-06 11:44:06 +00:00
Savely Krasovsky 69b5365965 feat: enable PMTiles protocol support (#16629)
This patch enables PMTiles protocol for MapLibre-GL. Protocol allows to fetch tiles from a single file.  This drastically simplifies the process to self-host own tiles.
2025-03-06 10:50:14 +00:00
Alex c110c9b00e chore(mobile): post release task (#16623) 2025-03-05 14:54:56 -06:00
Yaros b241a80339 feat(mobile): Navigate back on memories (#16545)
* Navigate back on memories

* Fixes crash on navigating back
2025-03-05 14:42:43 -06:00
github-actions 31dd15ce8a chore: version v1.129.0 2025-03-05 19:47:50 +00:00
Alex 6108587c8b fix(web): show tags timeline (#16617)
* fix(web): show tags timeline

* fix(web): show tags timeline
2025-03-05 13:36:56 -06:00
Alex 3e50f668d9 feat(mobile): add catalan i18n (#16616)
* feat(mobile): Add Catalan

* refactor

* fix: load correct file

* chore: remove unused language files
2025-03-05 11:47:31 -06:00
Daniel Dietzler 9b82617e22 docs: 60k stars! тнР (#16618)
60k stars! тнР
2025-03-05 11:40:45 -06:00
Alex 76cb32d8d0 chore(mobile): translations update (#16615)
chore(mobile): translation update
2025-03-05 16:33:41 +00:00
Yaros e8f3348833 fix(mobile): Fixed zh-Hans not persisting (#16608)
Fixed zh-Hans not persisting
2025-03-05 09:56:00 -06:00
Zack Pollard 9922c8de59 fix: storage template failure after re-upload and previous fail (#16611)
fix: storage template breaks when files are re-uploaded after a move failure
2025-03-05 15:00:37 +00:00
shenlong 3f4bbab4eb fix: isar crash on resume from app detach (#16599)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-05 08:28:40 -06:00
Jason Rasmussen 2da9e3152b refactor: download service (#16600) 2025-03-05 08:38:23 -05:00
Min Idzelis 56b85f7479 fix(web): fix lost scrollpos on deep link to timeline asset, scrub stop (#16305)
* Work in progress - super quick asset store->state

* bugfix: deep linking to timeline, on scrub stop

* format, remove stale

* disable test, todo: fix test

* remove unused import

* Fix merge

* lint

* lint

* lint

* Default to non-wasm layout

* lint

* intobs fix

* fix rejected promise

* Review comments, static import wasm

* Back to dynamic

* try top-level-await

* back to the first solution, with more finesse

* comment out wasm for now

* back out the wasm/thumbhash/thumbnail changes

* lint

* Fully remove wasm

* lockfile

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-03-04 20:34:53 -06:00
waclaw66 8b43066632 fix(mobile): .well-known usage (#16577)
fix: .well-known

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-04 20:25:57 -06:00
bo0tzz 20acdcd884 chore: run docker workflow on non-main PRs (#16582) 2025-03-05 02:15:17 +00:00
Jonathan Jogenfors 22d348beca feat(server): e2e for missing jobs (#15910)
* feat: test face detection

* Add duplicate and smart search fixes and tests

* do e2e instead

* Remove ML e2e jobs
2025-03-04 20:44:31 -05:00
shenlong 3b0af1c8a9 fix(mobile): do not pause audio on app start (#16596)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-04 16:00:01 -06:00
Mert 61c8237a4d fix(ml): set face detection threshold correctly in locust (#13419)
* set minScore correctly

* cleanup

* remove outdated tag score
2025-03-04 20:52:07 +00:00
Jason Rasmussen d740f0283a chore: no more immortal PRs (#16595) 2025-03-04 15:06:41 -05:00
Jonathan Jogenfors 4ada28ac99 fix(server): check updateLibraryIndex for zero (#16585)
* fix(server): check updateLibraryIndex for zero

* Update web/src/routes/admin/library-management/+page.svelte

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-03-04 20:00:10 +00:00
Jason Rasmussen 63c01b78e2 refactor: test utils (#16588) 2025-03-04 16:15:41 +00:00
renovate[bot] 1423cfd53c chore(deps): update ghcr.io/immich-app/base-server-dev docker tag to v20250304 (#16580)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-04 15:39:34 +00:00
Snowknight26 867eec86f5 fix(web): Update menu titles to be more consistent (#16558) 2025-03-04 12:55:54 +00:00
Alex 86e8effd8e fix(mobile): incorrect memories with timezone (#16562) 2025-03-04 12:54:54 +00:00
Jonathan Jogenfors 49d393216a fix(server): fix import path truthiness check (#16570) 2025-03-04 12:54:12 +00:00
renovate[bot] 75c9f63757 chore(deps): update typescript-projects (#16573)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-04 12:53:28 +00:00
Kofi 63984890df docs: clean up environment variables formatting & grammar (#16555)
docs: clean up environment variables formatting & grammar - Just going through the docs and noticed some inconsistent capitalization and minor grammar issues. Fixed them up while having my Monday coffee :) Nothing major, but makes the docs a bit more polished.
2025-03-04 05:00:27 +00:00
Jason Rasmussen 1356468c38 fix: reset/regenerate memories (#16548)
fix: reset memories
2025-03-03 23:48:05 -05:00
renovate[bot] c23c53bf6f fix(deps): update machine-learning (#16560) 2025-03-04 01:42:35 +00:00
renovate[bot] 0dcfc43461 chore(deps): update node (#16538)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 14:31:34 -05:00
Jason Rasmussen d1fd0076cc refactor: migration tag repository to kysely (#16398) 2025-03-03 18:41:19 +00:00
Zack Pollard ff19502035 feat: qr code for new shared link (#16543) 2025-03-03 13:40:41 -05:00
renovate[bot] 6ef069b537 chore(deps): update github-actions (#16539)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 18:39:15 +00:00
Matthew Momjian a03e999bde fix(docs): info on preloading ML models (#16452)
info on preload
2025-03-03 18:39:02 +00:00
aviv926 ad1ba4be5f docs: better facial recognition cluster guide (#14911)
* Better Facial Recognition Clusters

* Add information about the guide

* Update docs/docs/features/facial-recognition.md

Co-authored-by: Felix B├╝hler <Stunkymonkey@users.noreply.github.com>

* PR Feedback

---------

Co-authored-by: Felix B├╝hler <Stunkymonkey@users.noreply.github.com>
2025-03-03 18:33:32 +00:00
Alessandro Baroni f89e74181b fix(web): delete action closes asset viewer in asset view (#15469)
fixes #14647
2025-03-03 18:24:37 +00:00
Eli Gao e2c34f17ba feat(cli): watch paths for auto uploading daemon (#14923)
* feat(cli): watch paths for auto uploading daemon

* chore: update package-lock

* test(cli): Batcher util calss

* feat(cli): expose batcher params from startWatch()

* test(cli): startWatch() for `--watch`

* refactor(cli): more reliable watcher

* feat(cli): disable progress bar on --no-progress or --watch

* fix(cli): extensions match when upload with watch

* feat(cli): basic logs without progress on upload

* feat(cli): hide progress in uploadFiles()

* refactor(cli): use promise-based setTimeout() instead of hand crafted sleep()

* refactor(cli): unexport UPLOAD_WATCH consts

* refactor(cli): rename fsWatchListener() to onFile()

* test(cli): prefix dot to mocked getSupportedMediaTypes()

* test(cli): add tests for ignored patterns/ unsupported exts

* refactor(cli): minor changes for code reviews

* feat(cli): disable onFile logs when progress bar is enabled
2025-03-03 13:05:32 -05:00
Zack Pollard 23b1256592 ci: weblate checks should always run, should skip on en.json (#16544) 2025-03-03 17:12:26 +00:00
Yaros 7bbc1d9f68 feat(web): Video memories on web (#16500)
* Video memories on web

* switched mixed up strings
2025-03-03 09:54:26 -06:00
renovate[bot] 8b24c31d20 fix(deps): update typescript-projects (#16540)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 09:38:24 -06:00
shenlong 7f61ac6983 chore(mobile): fix store.put type def (#16517)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-03 09:11:13 -06:00
shenlong 4db8f0c666 refactor(mobile): move timeline methods to timeline repo (#16526)
* refactor: move timeline calls to timeline repo

* refactor: review changes

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-03 09:10:09 -06:00
renovate[bot] 3d6a6f77a8 chore(deps): update dependency eslint-plugin-svelte to v3 (#16532)
* chore(deps): update dependency eslint-plugin-svelte to v3

* chore: linting

* chore: rebase

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
2025-03-03 14:24:26 +00:00
Mert 5698f446f7 refactor(server): link live photos as part of metadata extraction instead of queueing job (#16390)
* link live photos helper instead of job

* update test

* queue storage template migration

* queue in onDone

* remove link live photos job
2025-03-03 09:19:36 -05:00
renovate[bot] eb74fafb00 chore(deps): update dependency globals to v16 (#16534)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 14:11:44 +00:00
Zack Pollard 24da25dbbf ci: don't check weblate lock on chore/translations and add success job (#16533) 2025-03-03 13:22:33 +01:00
renovate[bot] 9b842d4cca chore(deps): update tensorchord/pgvecto-rs:pg14-v0.2.0 docker digest to 739cdd6 (#16530)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 12:13:38 +00:00
renovate[bot] a99bd94717 fix(deps): update dependency ua-parser-js to v2 (#14301)
* fix(deps): update dependency ua-parser-js to v2

* fix: breaking changes from ua-parsed-js major update

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
2025-03-03 12:01:40 +00:00
renovate[bot] 4b568dcbb3 chore(deps): update dependency black to v25 (#16033)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 11:57:46 +00:00
renovate[bot] 12ab56c885 chore(deps): update prom/prometheus docker digest to 6927e09 (#16529)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 11:52:22 +00:00
renovate[bot] eed6465b41 chore(deps): update grafana/grafana docker tag to v11.5.2 (#16301)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 11:51:44 +00:00
renovate[bot] 5f6c16080b chore(deps): update docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0 docker digest to 739cdd6 (#16528)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 11:51:13 +00:00
Alex a2aab1f373 fix: don't use public keyword in migration query (#16514)
Co-authored-by: Zack Pollard <zack@futo.org>
2025-03-03 11:40:14 +00:00
bo0tzz 8e076ecfe4 feat: weblate checks workflow (#16251) 2025-03-03 11:39:53 +00:00
Zack Pollard fe702ba6d7 feat: partner sync (#16424)
feat: partner CUD sync
2025-03-03 11:05:30 +00:00
Jonathan Jogenfors 869839f642 feat(server): library cleanup from ui (#16226)
* feat(server,web): scan all libraries from frontend

* feat(server,web): scan all libraries from frontend

* Add button text
2025-03-02 21:29:02 -06:00
Justin Cichra 8885e3105e chore: reword backup_manual_in_progress (#16513)
fix(i18n): reword backup_manual_in_progress

Split "sometime" into "some time".
2025-03-03 03:27:20 +00:00
bo0tzz 6e51c4ec71 chore: add extra note to no-dupes checkbox (#16499) 2025-03-02 21:02:36 -06:00
knechtandreas 6bf2e8dbcb feat: add album keyboard shortcuts (#16442)
* 15712: Added keyboard shortcuts for opening add to album modal and highlighting/selecting an album to add to.

* 15712: Re-factored logic from template code into script. Extracted new album button into separate cmponent.

* 15712: Document new keyboard shortucts now that they work everywhere.

* 15712: Extract some constants/helper functions.

* 15712: Missing comma.

* 15712: Pulled logic out into separate unit testable class.

* 15712: Added a unit test.

* 15712: Move the modal back up to keep the github PR happy.

* 15712: PR feedback - renamed typescript files and switch to class bind directive.

* 15712:Move selection modal into correct package.

* 15712: Better naming of module and files.
2025-03-02 13:15:00 +00:00
Yaros 366f23774a fix(web): Default to context search on web (#16485)
Default to context search on web
2025-03-02 13:06:15 +00:00
Yaros fd5e931617 fix(mobile): Updated formatting of server address in networking (#16483)
* Updated formatting of server address in networking

* fallback for undefined endpoint
2025-03-02 06:58:05 -06:00
shenlong d8d87bb565 chore(mobile): rename log enum to lowercase (#16476)
* chore(mobile): rename log enum to lowercase

* chore(mobile): do not abbreviate

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-03-02 06:30:48 -06:00
Lukas Jost 6cc1978b2d fix(web): Open huggingface.co link on settings page in new tab (#16470)
fix(web): Open huggingface on settings page in new tab
2025-03-01 23:02:56 +00:00
luzpaz 506d2d0f81 fix(web): fix typos (#16466)
Found via codespell
2025-03-01 16:51:50 -06:00
Yaros f13d13b2ea fix(web): Fixed people list overflowing in advanced search (#16457)
* Fixed people list overflowing in search

* styling: better fix

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-03-01 20:34:57 +00:00
Thomas Laroche 2510684bf7 fix(web): unable to download live photo as anonymous user (#16455) 2025-03-01 14:07:19 -06:00
luzpaz c8eef5ad4d fix(mobile): fix typos (#16456)
Found via codespell
2025-03-01 20:06:47 +00:00
bo0tzz 0cb3dc6211 chore: add 'not duplicate' checkbox to issue template (#16462) 2025-03-01 14:05:36 -06:00
Alex f11080cc2d chore(mobile): post release task (#16437) 2025-02-28 21:09:09 -06:00
Matthew Momjian efcf773ea0 feat(server): Shortened asset ID in storage template (#16433)
* Update storage-template.service.ts

* Update supported-variables-panel.svelte

* docs example

* Update storage-template-settings.svelte
2025-02-28 16:04:34 -05:00
1072 changed files with 41262 additions and 29202 deletions
+2 -2
View File
@@ -1,10 +1,10 @@
ARG BASEIMAGE=mcr.microsoft.com/devcontainers/typescript-node:22@sha256:9791f4aa527774bc370c6bd2f6705ce5a686f1e6f204badd8dfaacce28c631ae
ARG BASEIMAGE=mcr.microsoft.com/devcontainers/typescript-node:22@sha256:2ef23730ec68d8511ec8e6e0b82550ca728b256805d81f60ed890f3bfb21cfb9
FROM ${BASEIMAGE}
# Flutter SDK
# https://flutter.dev/docs/development/tools/sdk/releases?tab=linux
ENV FLUTTER_CHANNEL="stable"
ENV FLUTTER_VERSION="3.24.5"
ENV FLUTTER_VERSION="3.29.1"
ENV FLUTTER_HOME=/flutter
ENV PATH=${PATH}:${FLUTTER_HOME}/bin
+1
View File
@@ -0,0 +1 @@
22.14.0
@@ -1,5 +1,5 @@
title: "[Feature] feature-name-goes-here"
labels: ["feature"]
title: '[Feature] feature-name-goes-here'
labels: ['feature']
body:
- type: markdown
@@ -11,9 +11,9 @@ body:
- type: checkboxes
attributes:
label: I have searched the existing feature requests to make sure this is not a duplicate request.
label: I have searched the existing feature requests, both open and closed, to make sure this is not a duplicate request.
options:
- label: "Yes"
- label: 'Yes'
required: true
- type: textarea
+10 -2
View File
@@ -1,6 +1,13 @@
name: Report an issue with Immich
description: Report an issue with Immich
body:
- type: checkboxes
attributes:
label: I have searched the existing issues, both open and closed, to make sure this is not a duplicate report.
options:
- label: 'Yes'
required: true
- type: markdown
attributes:
value: |
@@ -77,7 +84,7 @@ body:
id: repro
attributes:
label: Reproduction steps
description: "How do you trigger this bug? Please walk us through it step by step."
description: 'How do you trigger this bug? Please walk us through it step by step.'
value: |
1.
2.
@@ -90,7 +97,8 @@ body:
id: logs
attributes:
label: Relevant log output
description: Please copy and paste any relevant logs below. (code formatting is
description:
Please copy and paste any relevant logs below. (code formatting is
enabled, no need for backticks)
render: shell
validations:
+28
View File
@@ -0,0 +1,28 @@
{
"name": ".github",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"devDependencies": {
"prettier": "^3.5.3"
}
},
"node_modules/prettier": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
"dev": true,
"license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
}
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"scripts": {
"format": "prettier --check .",
"format:fix": "prettier --write ."
},
"devDependencies": {
"prettier": "^3.5.3"
}
}
+2 -2
View File
@@ -32,5 +32,5 @@ The `/api/something` endpoint is now `/api/something-else`
- [ ] 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`)
- [ ] 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/`)
+6 -6
View File
@@ -22,9 +22,9 @@ jobs:
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- id: found_paths
uses: dorny/paths-filter@v3
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
with:
filters: |
mobile:
@@ -51,18 +51,18 @@ jobs:
ref="${input_ref:-$github_ref}"
echo "ref=$ref" >> $GITHUB_OUTPUT
- uses: actions/checkout@v4
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
ref: ${{ steps.get-ref.outputs.ref }}
- uses: actions/setup-java@v4
- uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
with:
distribution: 'zulu'
java-version: '17'
cache: 'gradle'
- name: Setup Flutter SDK
uses: subosito/flutter-action@v2
uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 # v2
with:
channel: 'stable'
flutter-version-file: ./mobile/pubspec.yaml
@@ -89,7 +89,7 @@ jobs:
flutter build apk --release --split-per-abi --target-platform android-arm,android-arm64,android-x64
- name: Publish Android Artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: release-apk-signed
path: mobile/build/app/outputs/flutter-apk/*.apk
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Cleanup
run: |
+8 -9
View File
@@ -6,7 +6,6 @@ on:
- 'cli/**'
- '.github/workflows/cli.yml'
pull_request:
branches: [main]
paths:
- 'cli/**'
- '.github/workflows/cli.yml'
@@ -29,9 +28,9 @@ jobs:
working-directory: ./cli
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
# Setup .npmrc file to publish to npm
- uses: actions/setup-node@v4
- uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './cli/.nvmrc'
registry-url: 'https://registry.npmjs.org'
@@ -53,16 +52,16 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3.4.0
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.9.0
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
if: ${{ !github.event.pull_request.head.repo.fork }}
with:
registry: ghcr.io
@@ -77,7 +76,7 @@ jobs:
- name: Generate docker image tags
id: metadata
uses: docker/metadata-action@v5
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
with:
flavor: |
latest=false
@@ -88,7 +87,7 @@ jobs:
type=raw,value=latest,enable=${{ github.event_name == 'release' }}
- name: Build and push image
uses: docker/build-push-action@v6.13.0
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
with:
file: cli/Dockerfile
platforms: linux/amd64,linux/arm64
+31 -32
View File
@@ -9,14 +9,14 @@
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
name: 'CodeQL'
on:
push:
branches: [ "main" ]
branches: ['main']
pull_request:
# The branches below must be a subset of the branches above
branches: [ "main" ]
branches: ['main']
schedule:
- cron: '20 13 * * 1'
@@ -36,43 +36,42 @@ jobs:
strategy:
fail-fast: false
matrix:
language: [ 'javascript', 'python' ]
language: ['javascript', 'python']
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v3
# тД╣я╕П 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
# тД╣я╕П 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
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{matrix.language}}"
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3
with:
category: '/language:${{matrix.language}}'
+68 -53
View File
@@ -5,7 +5,6 @@ on:
push:
branches: [main]
pull_request:
branches: [main]
release:
types: [published]
@@ -24,9 +23,9 @@ jobs:
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- id: found_paths
uses: dorny/paths-filter@v3
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
with:
filters: |
server:
@@ -50,23 +49,23 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
suffix: ["", "-cuda", "-openvino", "-armnn"]
suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn']
steps:
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Re-tag image
run: |
REGISTRY_NAME="ghcr.io"
REPOSITORY=${{ github.repository_owner }}/immich-machine-learning
TAG_OLD=main${{ matrix.suffix }}
TAG_PR=${{ github.event.number == 0 && github.ref_name || format('pr-{0}', github.event.number) }}${{ matrix.suffix }}
TAG_COMMIT=commit-${{ github.event_name != 'pull_request' && github.sha || github.event.pull_request.head.sha }}${{ matrix.suffix }}
docker buildx imagetools create -t $REGISTRY_NAME/$REPOSITORY:$TAG_PR $REGISTRY_NAME/$REPOSITORY:$TAG_OLD
docker buildx imagetools create -t $REGISTRY_NAME/$REPOSITORY:$TAG_COMMIT $REGISTRY_NAME/$REPOSITORY:$TAG_OLD
- name: Login to GitHub Container Registry
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Re-tag image
run: |
REGISTRY_NAME="ghcr.io"
REPOSITORY=${{ github.repository_owner }}/immich-machine-learning
TAG_OLD=main${{ matrix.suffix }}
TAG_PR=${{ github.event.number == 0 && github.ref_name || format('pr-{0}', github.event.number) }}${{ matrix.suffix }}
TAG_COMMIT=commit-${{ github.event_name != 'pull_request' && github.sha || github.event.pull_request.head.sha }}${{ matrix.suffix }}
docker buildx imagetools create -t $REGISTRY_NAME/$REPOSITORY:$TAG_PR $REGISTRY_NAME/$REPOSITORY:$TAG_OLD
docker buildx imagetools create -t $REGISTRY_NAME/$REPOSITORY:$TAG_COMMIT $REGISTRY_NAME/$REPOSITORY:$TAG_OLD
retag_server:
name: Re-Tag Server
@@ -75,10 +74,10 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
suffix: [""]
suffix: ['']
steps:
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@@ -121,6 +120,11 @@ jobs:
device: cuda
suffix: -cuda
- platform: linux/amd64
runner: mich
device: rocm
suffix: -rocm
- platform: linux/amd64
runner: ubuntu-latest
device: openvino
@@ -131,6 +135,11 @@ jobs:
device: armnn
suffix: -armnn
- platform: linux/arm64
runner: ubuntu-24.04-arm
device: rknn
suffix: -rknn
steps:
- name: Prepare
run: |
@@ -138,13 +147,13 @@ jobs:
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.9.0
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
if: ${{ !github.event.pull_request.head.repo.fork }}
with:
registry: ghcr.io
@@ -171,7 +180,7 @@ jobs:
- name: Build and push image
id: build
uses: docker/build-push-action@v6.13.0
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
with:
context: ${{ env.context }}
file: ${{ env.file }}
@@ -196,7 +205,7 @@ jobs:
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: ml-digests-${{ matrix.device }}-${{ env.PLATFORM_PAIR }}
path: ${{ runner.temp }}/digests/*
@@ -216,15 +225,19 @@ jobs:
- device: cpu
- device: cuda
suffix: -cuda
- device: rocm
suffix: -rocm
- device: openvino
suffix: -openvino
- device: armnn
suffix: -armnn
- device: rknn
suffix: -rknn
needs:
- build_and_push_ml
steps:
- name: Download digests
uses: actions/download-artifact@v4
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
path: ${{ runner.temp }}/digests
pattern: ml-digests-${{ matrix.device }}-*
@@ -232,43 +245,44 @@ jobs:
- name: Login to Docker Hub
if: ${{ github.event_name == 'release' }}
uses: docker/login-action@v3
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GHCR
uses: docker/login-action@v3
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
- name: Generate docker image tags
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
env:
DOCKER_METADATA_PR_HEAD_SHA: "true"
DOCKER_METADATA_PR_HEAD_SHA: 'true'
with:
flavor: |
# Disable latest tag
latest=false
suffix=${{ matrix.suffix }}
images: |
name=${{ env.GHCR_REPO }}
name=${{ env.DOCKER_REPO }},enable=${{ github.event_name == 'release' }}
tags: |
# Tag with branch name
type=ref,event=branch,suffix=${{ matrix.suffix }}
type=ref,event=branch
# Tag with pr-number
type=ref,event=pr,suffix=${{ matrix.suffix }}
type=ref,event=pr
# Tag with long commit sha hash
type=sha,format=long,prefix=commit-,suffix=${{ matrix.suffix }}
type=sha,format=long,prefix=commit-
# Tag with git tag on release
type=ref,event=tag,suffix=${{ matrix.suffix }}
type=raw,value=release,enable=${{ github.event_name == 'release' }},suffix=${{ matrix.suffix }}
type=ref,event=tag
type=raw,value=release,enable=${{ github.event_name == 'release' }}
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
@@ -301,13 +315,13 @@ jobs:
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
if: ${{ !github.event.pull_request.head.repo.fork }}
with:
registry: ghcr.io
@@ -334,7 +348,7 @@ jobs:
- name: Build and push image
id: build
uses: docker/build-push-action@v6.13.0
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
with:
context: ${{ env.context }}
file: ${{ env.file }}
@@ -359,7 +373,7 @@ jobs:
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: server-digests-${{ env.PLATFORM_PAIR }}
path: ${{ runner.temp }}/digests/*
@@ -377,7 +391,7 @@ jobs:
- build_and_push_server
steps:
- name: Download digests
uses: actions/download-artifact@v4
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
path: ${{ runner.temp }}/digests
pattern: server-digests-*
@@ -385,43 +399,44 @@ jobs:
- name: Login to Docker Hub
if: ${{ github.event_name == 'release' }}
uses: docker/login-action@v3
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GHCR
uses: docker/login-action@v3
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
- name: Generate docker image tags
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
env:
DOCKER_METADATA_PR_HEAD_SHA: "true"
DOCKER_METADATA_PR_HEAD_SHA: 'true'
with:
flavor: |
# Disable latest tag
latest=false
suffix=${{ matrix.suffix }}
images: |
name=${{ env.GHCR_REPO }}
name=${{ env.DOCKER_REPO }},enable=${{ github.event_name == 'release' }}
tags: |
# Tag with branch name
type=ref,event=branch,suffix=${{ matrix.suffix }}
type=ref,event=branch
# Tag with pr-number
type=ref,event=pr,suffix=${{ matrix.suffix }}
type=ref,event=pr
# Tag with long commit sha hash
type=sha,format=long,prefix=commit-,suffix=${{ matrix.suffix }}
type=sha,format=long,prefix=commit-
# Tag with git tag on release
type=ref,event=tag,suffix=${{ matrix.suffix }}
type=raw,value=release,enable=${{ github.event_name == 'release' }},suffix=${{ matrix.suffix }}
type=ref,event=tag
type=raw,value=release,enable=${{ github.event_name == 'release' }}
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
+5 -6
View File
@@ -3,7 +3,6 @@ on:
push:
branches: [main]
pull_request:
branches: [main]
release:
types: [published]
@@ -18,9 +17,9 @@ jobs:
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.should_force.outputs.should_force == 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- id: found_paths
uses: dorny/paths-filter@v3
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
with:
filters: |
docs:
@@ -42,10 +41,10 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './docs/.nvmrc'
@@ -59,7 +58,7 @@ jobs:
run: npm run build
- name: Upload build output
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: docs-build-output
path: docs/build/
+21 -21
View File
@@ -1,7 +1,7 @@
name: Docs deploy
on:
workflow_run:
workflows: ["Docs build"]
workflows: ['Docs build']
types:
- completed
@@ -17,7 +17,7 @@ jobs:
run: echo 'The triggering workflow did not succeed' && exit 1
- name: Get artifact
id: get-artifact
uses: actions/github-script@v7
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
with:
script: |
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
@@ -35,7 +35,7 @@ jobs:
return { found: true, id: matchArtifact.id };
- name: Determine deploy parameters
id: parameters
uses: actions/github-script@v7
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
with:
script: |
const eventType = context.payload.workflow_run.event;
@@ -98,11 +98,11 @@ jobs:
if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }}
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Load parameters
id: parameters
uses: actions/github-script@v7
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
with:
script: |
const json = `${{ needs.checks.outputs.parameters }}`;
@@ -115,7 +115,7 @@ jobs:
echo "Starting docs deployment for ${{ steps.parameters.outputs.event }} ${{ steps.parameters.outputs.name }}"
- name: Download artifact
uses: actions/github-script@v7
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
with:
script: |
let artifact = ${{ needs.checks.outputs.artifact }};
@@ -138,12 +138,12 @@ jobs:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }}
uses: gruntwork-io/terragrunt-action@v2
uses: gruntwork-io/terragrunt-action@9559e51d05873b0ea467c42bbabcb5c067642ccc # v2
with:
tg_version: "0.58.12"
tofu_version: "1.7.1"
tg_dir: "deployment/modules/cloudflare/docs"
tg_command: "apply"
tg_version: '0.58.12'
tofu_version: '1.7.1'
tg_dir: 'deployment/modules/cloudflare/docs'
tg_command: 'apply'
- name: Deploy Docs Subdomain Output
id: docs-output
@@ -153,12 +153,12 @@ jobs:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }}
uses: gruntwork-io/terragrunt-action@v2
uses: gruntwork-io/terragrunt-action@9559e51d05873b0ea467c42bbabcb5c067642ccc # v2
with:
tg_version: "0.58.12"
tofu_version: "1.7.1"
tg_dir: "deployment/modules/cloudflare/docs"
tg_command: "output -json"
tg_version: '0.58.12'
tofu_version: '1.7.1'
tg_dir: 'deployment/modules/cloudflare/docs'
tg_command: 'output -json'
- name: Output Cleaning
id: clean
@@ -167,13 +167,13 @@ jobs:
echo "output=$TG_OUT" >> $GITHUB_OUTPUT
- name: Publish to Cloudflare Pages
uses: cloudflare/pages-action@v1
uses: cloudflare/pages-action@f0a1cd58cd66095dee69bfa18fa5efd1dde93bca # v1
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN_PAGES_UPLOAD }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: ${{ fromJson(steps.clean.outputs.output).pages_project_name.value }}
workingDirectory: "docs"
directory: "build"
workingDirectory: 'docs'
directory: 'build'
branch: ${{ steps.parameters.outputs.name }}
wranglerVersion: '3'
@@ -184,7 +184,7 @@ jobs:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }}
uses: gruntwork-io/terragrunt-action@v2
uses: gruntwork-io/terragrunt-action@9559e51d05873b0ea467c42bbabcb5c067642ccc # v2
with:
tg_version: '0.58.12'
tofu_version: '1.7.1'
@@ -192,7 +192,7 @@ jobs:
tg_command: 'apply'
- name: Comment
uses: actions-cool/maintain-one-comment@v3
uses: actions-cool/maintain-one-comment@4b2dbf086015f892dcb5e8c1106f5fccd6c1476b # v3
if: ${{ steps.parameters.outputs.event == 'pr' }}
with:
number: ${{ fromJson(needs.checks.outputs.parameters).pr_number }}
+9 -9
View File
@@ -9,24 +9,24 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Destroy Docs Subdomain
env:
TF_VAR_prefix_name: "pr-${{ github.event.number }}"
TF_VAR_prefix_event_type: "pr"
TF_VAR_prefix_name: 'pr-${{ github.event.number }}'
TF_VAR_prefix_event_type: 'pr'
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
TF_STATE_POSTGRES_CONN_STR: ${{ secrets.TF_STATE_POSTGRES_CONN_STR }}
uses: gruntwork-io/terragrunt-action@v2
uses: gruntwork-io/terragrunt-action@9559e51d05873b0ea467c42bbabcb5c067642ccc # v2
with:
tg_version: "0.58.12"
tofu_version: "1.7.1"
tg_dir: "deployment/modules/cloudflare/docs"
tg_command: "destroy -refresh=false"
tg_version: '0.58.12'
tofu_version: '1.7.1'
tg_dir: 'deployment/modules/cloudflare/docs'
tg_command: 'destroy -refresh=false'
- name: Comment
uses: actions-cool/maintain-one-comment@v3
uses: actions-cool/maintain-one-comment@4b2dbf086015f892dcb5e8c1106f5fccd6c1476b # v3
with:
number: ${{ github.event.number }}
delete: true
+5 -6
View File
@@ -13,19 +13,19 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@v1
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: 'Checkout'
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ steps.generate-token.outputs.token }}
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './server/.nvmrc'
@@ -33,13 +33,13 @@ jobs:
run: make install-all && make format-all
- name: Commit and push
uses: EndBug/add-and-commit@v9
uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9
with:
default_author: github_actions
message: 'chore: fix formatting'
- name: Remove label
uses: actions/github-script@v7
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
if: always()
with:
script: |
@@ -49,4 +49,3 @@ jobs:
repo: context.repo.repo,
name: 'fix:formatting'
})
+3 -3
View File
@@ -12,11 +12,11 @@ jobs:
pull-requests: write
steps:
- name: Require PR to have a changelog label
uses: mheap/github-action-required-labels@v5
uses: mheap/github-action-required-labels@388fd6af37b34cdfe5a23b37060e763217e58b03 # v5
with:
mode: exactly
count: 1
use_regex: true
labels: "changelog:.*"
labels: 'changelog:.*'
add_comment: true
message: "Label error. Requires {{errorString}} {{count}} of: {{ provided }}. Found: {{ applied }}. A maintainer will add the required label."
message: 'Label error. Requires {{errorString}} {{count}} of: {{ provided }}. Found: {{ applied }}. A maintainer will add the required label.'
+3 -3
View File
@@ -1,6 +1,6 @@
name: "Pull Request Labeler"
name: 'Pull Request Labeler'
on:
- pull_request_target
- pull_request_target
jobs:
labeler:
@@ -9,4 +9,4 @@ jobs:
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v5
- uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5
@@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: PR Conventional Commit Validation
uses: ytanikin/PRConventionalCommits@1.3.0
uses: ytanikin/PRConventionalCommits@b628c5a234cc32513014b7bfdd1e47b532124d98 # 1.3.0
with:
task_types: '["feat","fix","docs","test","ci","refactor","perf","chore","revert"]'
add_label: 'false'
+9 -9
View File
@@ -31,25 +31,25 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@v1
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
token: ${{ steps.generate-token.outputs.token }}
- name: Install Poetry
run: pipx install poetry
- name: Install uv
uses: astral-sh/setup-uv@0c5e2b8115b80b4c7c5ddf6ffdd634974642d182 # v5
- name: Bump version
run: misc/release/pump-version.sh -s "${{ inputs.serverBump }}" -m "${{ inputs.mobileBump }}"
- name: Commit and tag
id: push-tag
uses: EndBug/add-and-commit@v9
uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9
with:
default_author: github_actions
message: 'chore: version ${{ env.IMMICH_VERSION }}'
@@ -70,23 +70,23 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@v1
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
token: ${{ steps.generate-token.outputs.token }}
- name: Download APK
uses: actions/download-artifact@v4
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
name: release-apk-signed
- name: Create draft release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2
with:
draft: true
tag_name: ${{ env.IMMICH_VERSION }}
+5 -5
View File
@@ -2,7 +2,7 @@ name: Preview label
on:
pull_request:
types: [labeled]
types: [labeled, closed]
jobs:
comment-status:
@@ -11,10 +11,10 @@ jobs:
permissions:
pull-requests: write
steps:
- uses: mshick/add-pr-comment@v2
- uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2
with:
message-id: "preview-status"
message: "Deploying preview environment to https://pr-${{ github.event.pull_request.number }}.preview.internal.immich.cloud/"
message-id: 'preview-status'
message: 'Deploying preview environment to https://pr-${{ github.event.pull_request.number }}.preview.internal.immich.cloud/'
remove-label:
runs-on: ubuntu-latest
@@ -22,7 +22,7 @@ jobs:
permissions:
pull-requests: write
steps:
- uses: actions/github-script@v7
- uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
with:
script: |
github.rest.issues.removeLabel({
+2 -2
View File
@@ -15,9 +15,9 @@ jobs:
run:
working-directory: ./open-api/typescript-sdk
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
# Setup .npmrc file to publish to npm
- uses: actions/setup-node@v4
- uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './open-api/typescript-sdk/.nvmrc'
registry-url: 'https://registry.npmjs.org'
+24 -9
View File
@@ -16,9 +16,9 @@ jobs:
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- id: found_paths
uses: dorny/paths-filter@v3
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
with:
filters: |
mobile:
@@ -38,10 +38,10 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Flutter SDK
uses: subosito/flutter-action@v2
uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 # v2
with:
channel: 'stable'
flutter-version-file: ./mobile/pubspec.yaml
@@ -50,6 +50,26 @@ jobs:
run: dart pub get
working-directory: ./mobile
- name: Run Build Runner
run: make build
working-directory: ./mobile
- name: Find file changes
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20
id: verify-changed-files
with:
files: |
mobile/**/*.g.dart
mobile/**/*.gr.dart
mobile/**/*.drift.dart
- name: Verify files have not changed
if: steps.verify-changed-files.outputs.files_changed == 'true'
run: |
echo "ERROR: Generated files not up to date! Run make_build inside the mobile directory"
echo "Changed files: ${{ steps.verify-changed-files.outputs.changed_files }}"
exit 1
- name: Run dart analyze
run: dart analyze --fatal-infos
working-directory: ./mobile
@@ -61,8 +81,3 @@ jobs:
- name: Run dart custom_lint
run: dart run custom_lint
working-directory: ./mobile
# Enable after riverpod generator migration is completed
# - name: Run dart custom lint
# run: dart run custom_lint
# working-directory: ./mobile
+72 -43
View File
@@ -21,11 +21,12 @@ jobs:
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e_web: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e_server_cli: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.server == 'true' || steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_.github: ${{ steps.found_paths.outputs['.github'] == 'true' || steps.should_force.outputs.should_force == 'true' }} # redundant to have should_force but if someone changes the trigger then this won't have to be changed
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- id: found_paths
uses: dorny/paths-filter@v3
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
with:
filters: |
web:
@@ -45,6 +46,8 @@ jobs:
- 'machine-learning/**'
workflow:
- '.github/workflows/test.yml'
.github:
- '.github/**'
- name: Check if we should force jobs to run
id: should_force
@@ -61,10 +64,10 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './server/.nvmrc'
@@ -98,10 +101,10 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './cli/.nvmrc'
@@ -139,10 +142,10 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './cli/.nvmrc'
@@ -173,10 +176,10 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './web/.nvmrc'
@@ -218,10 +221,10 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './e2e/.nvmrc'
@@ -257,10 +260,10 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './server/.nvmrc'
@@ -282,12 +285,12 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
submodules: 'recursive'
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './e2e/.nvmrc'
@@ -324,12 +327,12 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
submodules: 'recursive'
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './e2e/.nvmrc'
@@ -360,9 +363,9 @@ jobs:
if: ${{ needs.pre-job.outputs.should_run_mobile == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Flutter SDK
uses: subosito/flutter-action@v2
uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 # v2
with:
channel: 'stable'
flutter-version-file: ./mobile/pubspec.yaml
@@ -379,34 +382,60 @@ jobs:
run:
working-directory: ./machine-learning
steps:
- uses: actions/checkout@v4
- name: Install poetry
run: pipx install poetry
- uses: actions/setup-python@v5
with:
python-version: 3.11
cache: 'poetry'
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Install uv
uses: astral-sh/setup-uv@0c5e2b8115b80b4c7c5ddf6ffdd634974642d182 # v5
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # v5
# TODO: add caching when supported (https://github.com/actions/setup-python/pull/818)
# with:
# python-version: 3.11
# cache: 'uv'
- name: Install dependencies
run: |
poetry install --with dev --with cpu
uv sync --extra cpu
- name: Lint with ruff
run: |
poetry run ruff check --output-format=github app export
uv run ruff check --output-format=github immich_ml
- name: Check black formatting
run: |
poetry run black --check app export
uv run black --check immich_ml
- name: Run mypy type checking
run: |
poetry run mypy --install-types --non-interactive --strict app/
uv run mypy --strict immich_ml/
- name: Run tests and coverage
run: |
poetry run pytest app --cov=app --cov-report term-missing
uv run pytest --cov=immich_ml --cov-report term-missing
github-files-formatting:
name: .github Files Formatting
needs: pre-job
if: ${{ needs.pre-job.outputs['should_run_.github'] == 'true' }}
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./.github
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Node
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './.github/.nvmrc'
- name: Run npm install
run: npm ci
- name: Run formatter
run: npm run format
if: ${{ !cancelled() }}
shellcheck:
name: ShellCheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Run ShellCheck
uses: ludeeus/action-shellcheck@master
with:
@@ -420,10 +449,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './server/.nvmrc'
@@ -437,7 +466,7 @@ jobs:
run: make open-api
- name: Find file changes
uses: tj-actions/verify-changed-files@v20
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20
id: verify-changed-files
with:
files: |
@@ -457,7 +486,7 @@ jobs:
runs-on: ubuntu-latest
services:
postgres:
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
env:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
@@ -475,10 +504,10 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: './server/.nvmrc'
@@ -496,10 +525,10 @@ jobs:
- name: Generate new migrations
continue-on-error: true
run: npm run typeorm:migrations:generate ./src/migrations/TestMigration
run: npm run migrations:generate TestMigration
- name: Find file changes
uses: tj-actions/verify-changed-files@v20
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20
id: verify-changed-files
with:
files: |
@@ -509,7 +538,7 @@ jobs:
run: |
echo "ERROR: Generated migration files not up to date!"
echo "Changed files: ${{ steps.verify-changed-files.outputs.changed_files }}"
cat ./src/migrations/*-TestMigration.ts
cat ./src/*-TestMigration.ts
exit 1
- name: Run SQL generation
@@ -518,7 +547,7 @@ jobs:
DB_URL: postgres://postgres:postgres@localhost:5432/immich
- name: Find file changes
uses: tj-actions/verify-changed-files@v20
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20
id: verify-changed-sql-files
with:
files: |
+57
View File
@@ -0,0 +1,57 @@
name: Weblate checks
on:
pull_request:
branches: [main]
jobs:
pre-job:
runs-on: ubuntu-latest
outputs:
should_run: ${{ steps.found_paths.outputs.i18n == 'true' && github.head_ref != 'chore/translations'}}
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3
with:
filters: |
i18n:
- 'i18n/!(en)**\.json'
- name: Debug
run: |
echo "Should run: ${{ steps.found_paths.outputs.i18n == 'true' && github.head_ref != 'chore/translations'}}"
echo "Found i18n paths: ${{ steps.found_paths.outputs.i18n }}"
echo "Head ref: ${{ github.head_ref }}"
enforce-lock:
name: Check Weblate Lock
needs: [pre-job]
runs-on: ubuntu-latest
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
steps:
- name: Check weblate lock
run: |
if [[ "false" = $(curl https://hosted.weblate.org/api/components/immich/immich/lock/ | jq .locked) ]]; then
exit 1
fi
- name: Find Pull Request
uses: juliangruber/find-pull-request-action@48b6133aa6c826f267ebd33aa2d29470f9d9e7d0 # v1
id: find-pr
with:
branch: chore/translations
- name: Fail if existing weblate PR
if: ${{ steps.find-pr.outputs.number }}
run: exit 1
success-check-lock:
name: Weblate Lock Check Success
needs: [enforce-lock]
runs-on: ubuntu-latest
if: always()
steps:
- name: Any jobs failed?
if: ${{ contains(needs.*.result, 'failure') }}
run: exit 1
- name: All jobs passed or skipped
if: ${{ !(contains(needs.*.result, 'failure')) }}
run: echo "All jobs passed or skipped" && echo "${{ toJSON(needs.*.result) }}"
+5 -5
View File
@@ -39,7 +39,7 @@ attach-server:
renovate:
LOG_LEVEL=debug npx renovate --platform=local --repository-cache=reset
MODULES = e2e server web cli sdk docs
MODULES = e2e server web cli sdk docs .github
audit-%:
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) audit fix
@@ -77,14 +77,14 @@ test-medium:
test-medium-dev:
docker exec -it immich_server /bin/sh -c "npm run test:medium"
build-all: $(foreach M,$(filter-out e2e,$(MODULES)),build-$M) ;
build-all: $(foreach M,$(filter-out e2e .github,$(MODULES)),build-$M) ;
install-all: $(foreach M,$(MODULES),install-$M) ;
check-all: $(foreach M,$(filter-out sdk cli docs,$(MODULES)),check-$M) ;
lint-all: $(foreach M,$(filter-out sdk docs,$(MODULES)),lint-$M) ;
check-all: $(foreach M,$(filter-out sdk cli docs .github,$(MODULES)),check-$M) ;
lint-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),lint-$M) ;
format-all: $(foreach M,$(filter-out sdk,$(MODULES)),format-$M) ;
audit-all: $(foreach M,$(MODULES),audit-$M) ;
hygiene-all: lint-all format-all check-all sql audit-all;
test-all: $(foreach M,$(filter-out sdk docs,$(MODULES)),test-$M) ;
test-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),test-$M) ;
clean:
find . -name "node_modules" -type d -prune -exec rm -rf '{}' +
+2 -2
View File
@@ -63,7 +63,7 @@
Access the demo [here](https://demo.immich.app). The demo is running on a Free-tier Oracle VM in Amsterdam with a 2.4Ghz quad-core ARM64 CPU and 24GB RAM.
For the mobile app, you can use `https://demo.immich.app/api` for the `Server Endpoint URL`
For the mobile app, you can use `https://demo.immich.app` for the `Server Endpoint URL`
### Login credentials
@@ -104,7 +104,7 @@ For the mobile app, you can use `https://demo.immich.app/api` for the `Server En
| Read-only gallery | Yes | Yes |
| Stacked Photos | Yes | Yes |
| Tags | No | Yes |
| Folder View | No | Yes |
| Folder View | Yes | Yes |
## Translations
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:22.13.1-alpine3.20@sha256:c52e20859a92b3eccbd3a36c5e1a90adc20617d8d421d65e8a622e87b5dac963 AS core
FROM node:22.14.0-alpine3.20@sha256:40be979442621049f40b1d51a26b55e281246b5de4e5f51a18da7beb6e17e3f9 AS core
WORKDIR /usr/src/open-api/typescript-sdk
COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./
+10 -20
View File
@@ -1,39 +1,29 @@
import { FlatCompat } from '@eslint/eslintrc';
import js from '@eslint/js';
import typescriptEslint from '@typescript-eslint/eslint-plugin';
import tsParser from '@typescript-eslint/parser';
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
import eslintPluginUnicorn from 'eslint-plugin-unicorn';
import globals from 'globals';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import typescriptEslint from 'typescript-eslint';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
});
export default [
export default typescriptEslint.config([
eslintPluginUnicorn.configs.recommended,
eslintPluginPrettierRecommended,
js.configs.recommended,
typescriptEslint.configs.recommended,
{
ignores: ['eslint.config.mjs', 'dist'],
},
...compat.extends(
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
'plugin:unicorn/recommended',
),
{
plugins: {
'@typescript-eslint': typescriptEslint,
},
languageOptions: {
globals: {
...globals.node,
},
parser: tsParser,
parser: typescriptEslint.parser,
ecmaVersion: 5,
sourceType: 'module',
@@ -58,4 +48,4 @@ export default [
'object-shorthand': ['error', 'always'],
},
},
];
]);
+627 -784
View File
File diff suppressed because it is too large Load Diff
+9 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@immich/cli",
"version": "2.2.52",
"version": "2.2.60",
"description": "Command Line Interface (CLI) for Immich",
"type": "module",
"exports": "./dist/index.js",
@@ -19,10 +19,9 @@
"@types/byte-size": "^8.1.0",
"@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12",
"@types/micromatch": "^4.0.9",
"@types/mock-fs": "^4.13.1",
"@types/node": "^22.13.4",
"@typescript-eslint/eslint-plugin": "^8.15.0",
"@typescript-eslint/parser": "^8.15.0",
"@types/node": "^22.13.14",
"@vitest/coverage-v8": "^3.0.0",
"byte-size": "^9.0.0",
"cli-progress": "^3.12.0",
@@ -30,12 +29,13 @@
"eslint": "^9.14.0",
"eslint-config-prettier": "^10.0.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^56.0.1",
"globals": "^15.9.0",
"eslint-plugin-unicorn": "^57.0.0",
"globals": "^16.0.0",
"mock-fs": "^5.2.0",
"prettier": "^3.2.5",
"prettier-plugin-organize-imports": "^4.0.0",
"typescript": "^5.3.3",
"typescript-eslint": "^8.28.0",
"vite": "^6.0.0",
"vite-tsconfig-paths": "^5.0.0",
"vitest": "^3.0.0",
@@ -62,9 +62,11 @@
"node": ">=20.0.0"
},
"dependencies": {
"chokidar": "^4.0.3",
"fast-glob": "^3.3.2",
"fastq": "^1.17.1",
"lodash-es": "^4.17.21"
"lodash-es": "^4.17.21",
"micromatch": "^4.0.8"
},
"volta": {
"node": "22.14.0"
+113 -3
View File
@@ -1,12 +1,13 @@
import * as fs from 'node:fs';
import * as os from 'node:os';
import * as path from 'node:path';
import { describe, expect, it, vi } from 'vitest';
import { setTimeout as sleep } from 'node:timers/promises';
import { describe, expect, it, MockedFunction, vi } from 'vitest';
import { Action, checkBulkUpload, defaults, Reason } from '@immich/sdk';
import { Action, checkBulkUpload, defaults, getSupportedMediaTypes, Reason } from '@immich/sdk';
import createFetchMock from 'vitest-fetch-mock';
import { checkForDuplicates, getAlbumName, uploadFiles, UploadOptionsDto } from './asset';
import { checkForDuplicates, getAlbumName, startWatch, uploadFiles, UploadOptionsDto } from 'src/commands/asset';
vi.mock('@immich/sdk');
@@ -199,3 +200,112 @@ describe('checkForDuplicates', () => {
});
});
});
describe('startWatch', () => {
let testFolder: string;
let checkBulkUploadMocked: MockedFunction<typeof checkBulkUpload>;
beforeEach(async () => {
vi.restoreAllMocks();
vi.mocked(getSupportedMediaTypes).mockResolvedValue({
image: ['.jpg'],
sidecar: ['.xmp'],
video: ['.mp4'],
});
testFolder = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'test-startWatch-'));
checkBulkUploadMocked = vi.mocked(checkBulkUpload);
checkBulkUploadMocked.mockResolvedValue({
results: [],
});
});
it('should start watching a directory and upload new files', async () => {
const testFilePath = path.join(testFolder, 'test.jpg');
await startWatch([testFolder], { concurrency: 1 }, { batchSize: 1, debounceTimeMs: 10 });
await sleep(100); // to debounce the watcher from considering the test file as a existing file
await fs.promises.writeFile(testFilePath, 'testjpg');
await vi.waitUntil(() => checkBulkUploadMocked.mock.calls.length > 0, 3000);
expect(checkBulkUpload).toHaveBeenCalledWith({
assetBulkUploadCheckDto: {
assets: [
expect.objectContaining({
id: testFilePath,
}),
],
},
});
});
it('should filter out unsupported files', async () => {
const testFilePath = path.join(testFolder, 'test.jpg');
const unsupportedFilePath = path.join(testFolder, 'test.txt');
await startWatch([testFolder], { concurrency: 1 }, { batchSize: 1, debounceTimeMs: 10 });
await sleep(100); // to debounce the watcher from considering the test file as a existing file
await fs.promises.writeFile(testFilePath, 'testjpg');
await fs.promises.writeFile(unsupportedFilePath, 'testtxt');
await vi.waitUntil(() => checkBulkUploadMocked.mock.calls.length > 0, 3000);
expect(checkBulkUpload).toHaveBeenCalledWith({
assetBulkUploadCheckDto: {
assets: expect.arrayContaining([
expect.objectContaining({
id: testFilePath,
}),
]),
},
});
expect(checkBulkUpload).not.toHaveBeenCalledWith({
assetBulkUploadCheckDto: {
assets: expect.arrayContaining([
expect.objectContaining({
id: unsupportedFilePath,
}),
]),
},
});
});
it('should filger out ignored patterns', async () => {
const testFilePath = path.join(testFolder, 'test.jpg');
const ignoredPattern = 'ignored';
const ignoredFolder = path.join(testFolder, ignoredPattern);
await fs.promises.mkdir(ignoredFolder, { recursive: true });
const ignoredFilePath = path.join(ignoredFolder, 'ignored.jpg');
await startWatch([testFolder], { concurrency: 1, ignore: ignoredPattern }, { batchSize: 1, debounceTimeMs: 10 });
await sleep(100); // to debounce the watcher from considering the test file as a existing file
await fs.promises.writeFile(testFilePath, 'testjpg');
await fs.promises.writeFile(ignoredFilePath, 'ignoredjpg');
await vi.waitUntil(() => checkBulkUploadMocked.mock.calls.length > 0, 3000);
expect(checkBulkUpload).toHaveBeenCalledWith({
assetBulkUploadCheckDto: {
assets: expect.arrayContaining([
expect.objectContaining({
id: testFilePath,
}),
]),
},
});
expect(checkBulkUpload).not.toHaveBeenCalledWith({
assetBulkUploadCheckDto: {
assets: expect.arrayContaining([
expect.objectContaining({
id: ignoredFilePath,
}),
]),
},
});
});
afterEach(async () => {
await fs.promises.rm(testFolder, { recursive: true, force: true });
});
});
+125 -26
View File
@@ -12,13 +12,18 @@ import {
getSupportedMediaTypes,
} from '@immich/sdk';
import byteSize from 'byte-size';
import { Matcher, watch as watchFs } from 'chokidar';
import { MultiBar, Presets, SingleBar } from 'cli-progress';
import { chunk } from 'lodash-es';
import micromatch from 'micromatch';
import { Stats, createReadStream } from 'node:fs';
import { stat, unlink } from 'node:fs/promises';
import path, { basename } from 'node:path';
import { Queue } from 'src/queue';
import { BaseOptions, authenticate, crawl, sha1 } from 'src/utils';
import { BaseOptions, Batcher, authenticate, crawl, sha1 } from 'src/utils';
const UPLOAD_WATCH_BATCH_SIZE = 100;
const UPLOAD_WATCH_DEBOUNCE_TIME_MS = 10_000;
const s = (count: number) => (count === 1 ? '' : 's');
@@ -36,6 +41,8 @@ export interface UploadOptionsDto {
albumName?: string;
includeHidden?: boolean;
concurrency: number;
progress?: boolean;
watch?: boolean;
}
class UploadFile extends File {
@@ -55,19 +62,94 @@ class UploadFile extends File {
}
}
const uploadBatch = async (files: string[], options: UploadOptionsDto) => {
const { newFiles, duplicates } = await checkForDuplicates(files, options);
const newAssets = await uploadFiles(newFiles, options);
await updateAlbums([...newAssets, ...duplicates], options);
await deleteFiles(newFiles, options);
};
export const startWatch = async (
paths: string[],
options: UploadOptionsDto,
{
batchSize = UPLOAD_WATCH_BATCH_SIZE,
debounceTimeMs = UPLOAD_WATCH_DEBOUNCE_TIME_MS,
}: { batchSize?: number; debounceTimeMs?: number } = {},
) => {
const watcherIgnored: Matcher[] = [];
const { image, video } = await getSupportedMediaTypes();
const extensions = new Set([...image, ...video]);
if (options.ignore) {
watcherIgnored.push((path) => micromatch.contains(path, `**/${options.ignore}`));
}
const pathsBatcher = new Batcher<string>({
batchSize,
debounceTimeMs,
onBatch: async (paths: string[]) => {
const uniquePaths = [...new Set(paths)];
await uploadBatch(uniquePaths, options);
},
});
const onFile = async (path: string, stats?: Stats) => {
if (stats?.isDirectory()) {
return;
}
const ext = '.' + path.split('.').pop()?.toLowerCase();
if (!ext || !extensions.has(ext)) {
return;
}
if (!options.progress) {
// logging when progress is disabled as it can cause issues with the progress bar rendering
console.log(`Change detected: ${path}`);
}
pathsBatcher.add(path);
};
const fsWatcher = watchFs(paths, {
ignoreInitial: true,
ignored: watcherIgnored,
alwaysStat: true,
awaitWriteFinish: true,
depth: options.recursive ? undefined : 1,
persistent: true,
})
.on('add', onFile)
.on('change', onFile)
.on('error', (error) => console.error(`Watcher error: ${error}`));
process.on('SIGINT', async () => {
console.log('Exiting...');
await fsWatcher.close();
process.exit();
});
};
export const upload = async (paths: string[], baseOptions: BaseOptions, options: UploadOptionsDto) => {
await authenticate(baseOptions);
const scanFiles = await scan(paths, options);
if (scanFiles.length === 0) {
console.log('No files found, exiting');
return;
if (options.watch) {
console.log('No files found initially.');
} else {
console.log('No files found, exiting');
return;
}
}
const { newFiles, duplicates } = await checkForDuplicates(scanFiles, options);
const newAssets = await uploadFiles(newFiles, options);
await updateAlbums([...newAssets, ...duplicates], options);
await deleteFiles(newFiles, options);
if (options.watch) {
console.log('Watching for changes...');
await startWatch(paths, options);
// watcher does not handle the initial scan
// as the scan() is a more efficient quick start with batched results
}
await uploadBatch(scanFiles, options);
};
const scan = async (pathsToCrawl: string[], options: UploadOptionsDto) => {
@@ -85,19 +167,25 @@ const scan = async (pathsToCrawl: string[], options: UploadOptionsDto) => {
return files;
};
export const checkForDuplicates = async (files: string[], { concurrency, skipHash }: UploadOptionsDto) => {
export const checkForDuplicates = async (files: string[], { concurrency, skipHash, progress }: UploadOptionsDto) => {
if (skipHash) {
console.log('Skipping hash check, assuming all files are new');
return { newFiles: files, duplicates: [] };
}
const multiBar = new MultiBar(
{ format: '{message} | {bar} | {percentage}% | ETA: {eta}s | {value}/{total} assets' },
Presets.shades_classic,
);
let multiBar: MultiBar | undefined;
const hashProgressBar = multiBar.create(files.length, 0, { message: 'Hashing files ' });
const checkProgressBar = multiBar.create(files.length, 0, { message: 'Checking for duplicates' });
if (progress) {
multiBar = new MultiBar(
{ format: '{message} | {bar} | {percentage}% | ETA: {eta}s | {value}/{total} assets' },
Presets.shades_classic,
);
} else {
console.log(`Received ${files.length} files, hashing...`);
}
const hashProgressBar = multiBar?.create(files.length, 0, { message: 'Hashing files ' });
const checkProgressBar = multiBar?.create(files.length, 0, { message: 'Checking for duplicates' });
const newFiles: string[] = [];
const duplicates: Asset[] = [];
@@ -117,7 +205,7 @@ export const checkForDuplicates = async (files: string[], { concurrency, skipHas
}
}
checkProgressBar.increment(assets.length);
checkProgressBar?.increment(assets.length);
},
{ concurrency, retry: 3 },
);
@@ -137,7 +225,7 @@ export const checkForDuplicates = async (files: string[], { concurrency, skipHas
void checkBulkUploadQueue.push(batch);
}
hashProgressBar.increment();
hashProgressBar?.increment();
return results;
},
{ concurrency, retry: 3 },
@@ -155,7 +243,7 @@ export const checkForDuplicates = async (files: string[], { concurrency, skipHas
await checkBulkUploadQueue.drained();
multiBar.stop();
multiBar?.stop();
console.log(`Found ${newFiles.length} new files and ${duplicates.length} duplicate${s(duplicates.length)}`);
@@ -171,7 +259,10 @@ export const checkForDuplicates = async (files: string[], { concurrency, skipHas
return { newFiles, duplicates };
};
export const uploadFiles = async (files: string[], { dryRun, concurrency }: UploadOptionsDto): Promise<Asset[]> => {
export const uploadFiles = async (
files: string[],
{ dryRun, concurrency, progress }: UploadOptionsDto,
): Promise<Asset[]> => {
if (files.length === 0) {
console.log('All assets were already uploaded, nothing to do.');
return [];
@@ -191,12 +282,20 @@ export const uploadFiles = async (files: string[], { dryRun, concurrency }: Uplo
return files.map((filepath) => ({ id: '', filepath }));
}
const uploadProgress = new SingleBar(
{ format: 'Uploading assets | {bar} | {percentage}% | ETA: {eta_formatted} | {value_formatted}/{total_formatted}' },
Presets.shades_classic,
);
uploadProgress.start(totalSize, 0);
uploadProgress.update({ value_formatted: 0, total_formatted: byteSize(totalSize) });
let uploadProgress: SingleBar | undefined;
if (progress) {
uploadProgress = new SingleBar(
{
format: 'Uploading assets | {bar} | {percentage}% | ETA: {eta_formatted} | {value_formatted}/{total_formatted}',
},
Presets.shades_classic,
);
} else {
console.log(`Uploading ${files.length} asset${s(files.length)} (${byteSize(totalSize)})`);
}
uploadProgress?.start(totalSize, 0);
uploadProgress?.update({ value_formatted: 0, total_formatted: byteSize(totalSize) });
let duplicateCount = 0;
let duplicateSize = 0;
@@ -222,7 +321,7 @@ export const uploadFiles = async (files: string[], { dryRun, concurrency }: Uplo
successSize += stats.size ?? 0;
}
uploadProgress.update(successSize, { value_formatted: byteSize(successSize + duplicateSize) });
uploadProgress?.update(successSize, { value_formatted: byteSize(successSize + duplicateSize) });
return response;
},
@@ -235,7 +334,7 @@ export const uploadFiles = async (files: string[], { dryRun, concurrency }: Uplo
await queue.drained();
uploadProgress.stop();
uploadProgress?.stop();
console.log(`Successfully uploaded ${successCount} new asset${s(successCount)} (${byteSize(successSize)})`);
if (duplicateCount > 0) {
+7
View File
@@ -69,6 +69,13 @@ program
.default(4),
)
.addOption(new Option('--delete', 'Delete local assets after upload').env('IMMICH_DELETE_ASSETS'))
.addOption(new Option('--no-progress', 'Hide progress bars').env('IMMICH_PROGRESS_BAR').default(true))
.addOption(
new Option('--watch', 'Watch for changes and upload automatically')
.env('IMMICH_WATCH_CHANGES')
.default(false)
.implies({ progress: false }),
)
.argument('[paths...]', 'One or more paths to assets to be uploaded')
.action((paths, options) => upload(paths, program.opts(), options));
+37 -1
View File
@@ -1,6 +1,7 @@
import mockfs from 'mock-fs';
import { readFileSync } from 'node:fs';
import { CrawlOptions, crawl } from 'src/utils';
import { Batcher, CrawlOptions, crawl } from 'src/utils';
import { Mock } from 'vitest';
interface Test {
test: string;
@@ -303,3 +304,38 @@ describe('crawl', () => {
}
});
});
describe('Batcher', () => {
let batcher: Batcher;
let onBatch: Mock;
beforeEach(() => {
onBatch = vi.fn();
batcher = new Batcher({ batchSize: 2, onBatch });
});
it('should trigger onBatch() when a batch limit is reached', async () => {
batcher.add('a');
batcher.add('b');
batcher.add('c');
expect(onBatch).toHaveBeenCalledOnce();
expect(onBatch).toHaveBeenCalledWith(['a', 'b']);
});
it('should trigger onBatch() when flush() is called', async () => {
batcher.add('a');
batcher.flush();
expect(onBatch).toHaveBeenCalledOnce();
expect(onBatch).toHaveBeenCalledWith(['a']);
});
it('should trigger onBatch() when debounce time reached', async () => {
vi.useFakeTimers();
batcher = new Batcher({ batchSize: 2, debounceTimeMs: 100, onBatch });
batcher.add('a');
expect(onBatch).not.toHaveBeenCalled();
vi.advanceTimersByTime(200);
expect(onBatch).toHaveBeenCalledOnce();
expect(onBatch).toHaveBeenCalledWith(['a']);
vi.useRealTimers();
});
});
+61
View File
@@ -172,3 +172,64 @@ export const sha1 = (filepath: string) => {
rs.on('end', () => resolve(hash.digest('hex')));
});
};
/**
* Batches items and calls onBatch to process them
* when the batch size is reached or the debounce time has passed.
*/
export class Batcher<T = unknown> {
private items: T[] = [];
private readonly batchSize: number;
private readonly debounceTimeMs?: number;
private readonly onBatch: (items: T[]) => void;
private debounceTimer?: NodeJS.Timeout;
constructor({
batchSize,
debounceTimeMs,
onBatch,
}: {
batchSize: number;
debounceTimeMs?: number;
onBatch: (items: T[]) => Promise<void>;
}) {
this.batchSize = batchSize;
this.debounceTimeMs = debounceTimeMs;
this.onBatch = onBatch;
}
private setDebounceTimer() {
if (this.debounceTimer) {
clearTimeout(this.debounceTimer);
}
if (this.debounceTimeMs) {
this.debounceTimer = setTimeout(() => this.flush(), this.debounceTimeMs);
}
}
private clearDebounceTimer() {
if (this.debounceTimer) {
clearTimeout(this.debounceTimer);
this.debounceTimer = undefined;
}
}
add(item: T) {
this.items.push(item);
this.setDebounceTimer();
if (this.items.length >= this.batchSize) {
this.flush();
}
}
flush() {
this.clearDebounceTimer();
if (this.items.length === 0) {
return;
}
this.onBatch(this.items);
this.items = [];
}
}
+4 -4
View File
@@ -25,7 +25,7 @@ services:
context: ../
dockerfile: server/Dockerfile
target: dev
restart: always
restart: unless-stopped
volumes:
- ../server:/usr/src/app
- ../open-api:/usr/src/open-api
@@ -95,12 +95,12 @@ services:
image: immich-machine-learning-dev:latest
# extends:
# file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference
build:
context: ../machine-learning
dockerfile: Dockerfile
args:
- DEVICE=cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference
- DEVICE=cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference
ports:
- 3003:3003
volumes:
@@ -122,7 +122,7 @@ services:
database:
container_name: immich_postgres
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
env_file:
- .env
environment:
+8 -18
View File
@@ -38,12 +38,12 @@ services:
image: immich-machine-learning:latest
# extends:
# file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference
build:
context: ../machine-learning
dockerfile: Dockerfile
args:
- DEVICE=cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference
- DEVICE=cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference
ports:
- 3003:3003
volumes:
@@ -63,7 +63,7 @@ services:
database:
container_name: immich_postgres
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
env_file:
- .env
environment:
@@ -77,22 +77,12 @@ services:
- 5432:5432
healthcheck:
test: >-
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align
--command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
echo "checksum failure count is $$Chksum";
[ "$$Chksum" = '0' ] || exit 1
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1; Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
interval: 5m
start_interval: 30s
start_period: 5m
command: >-
postgres
-c shared_preload_libraries=vectors.so
-c 'search_path="$$user", public, vectors'
-c logging_collector=on
-c max_wal_size=2GB
-c shared_buffers=512MB
-c wal_compression=on
postgres -c shared_preload_libraries=vectors.so -c 'search_path="$$user", public, vectors' -c logging_collector=on -c max_wal_size=2GB -c shared_buffers=512MB -c wal_compression=on
restart: always
# set IMMICH_TELEMETRY_INCLUDE=all in .env to enable metrics
@@ -100,7 +90,7 @@ services:
container_name: immich_prometheus
ports:
- 9090:9090
image: prom/prometheus@sha256:5888c188cf09e3f7eebc97369c3b2ce713e844cdbd88ccf36f5047c958aea120
image: prom/prometheus@sha256:502ad90314c7485892ce696cb14a99fceab9fc27af29f4b427f41bd39701a199
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
@@ -109,10 +99,10 @@ services:
# add data source for http://immich-prometheus:9090 to get started
immich-grafana:
container_name: immich_grafana
command: ['./run.sh', '-disable-reporting']
command: [ './run.sh', '-disable-reporting' ]
ports:
- 3000:3000
image: grafana/grafana:11.5.1-ubuntu@sha256:9a4ab78cec1a2ec7d1ca5dfd5aacec6412706a1bc9e971fc7184e2f6696a63f5
image: grafana/grafana:11.5.2-ubuntu@sha256:8b5858c447e06fd7a89006b562ba7bba7c4d5813600c7982374c41852adefaeb
volumes:
- grafana-data:/var/lib/grafana
+5 -15
View File
@@ -33,12 +33,12 @@ services:
immich-machine-learning:
container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
# Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
# extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
# file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- model-cache:/cache
env_file:
@@ -56,7 +56,7 @@ services:
database:
container_name: immich_postgres
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
@@ -67,22 +67,12 @@ services:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
healthcheck:
test: >-
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align
--command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
echo "checksum failure count is $$Chksum";
[ "$$Chksum" = '0' ] || exit 1
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1; Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
interval: 5m
start_interval: 30s
start_period: 5m
command: >-
postgres
-c shared_preload_libraries=vectors.so
-c 'search_path="$$user", public, vectors'
-c logging_collector=on
-c max_wal_size=2GB
-c shared_buffers=512MB
-c wal_compression=on
postgres -c shared_preload_libraries=vectors.so -c 'search_path="$$user", public, vectors' -c logging_collector=on -c max_wal_size=2GB -c shared_buffers=512MB -c wal_compression=on
restart: always
volumes:
+14
View File
@@ -14,6 +14,13 @@ services:
- /lib/firmware/mali_csffw.bin:/lib/firmware/mali_csffw.bin:ro # Mali firmware for your chipset (not always required depending on the driver)
- /usr/lib/libmali.so:/usr/lib/libmali.so:ro # Mali driver for your chipset (always required)
rknn:
security_opt:
- systempaths=unconfined
- apparmor=unconfined
devices:
- /dev/dri:/dev/dri
cpu: {}
cuda:
@@ -26,6 +33,13 @@ services:
capabilities:
- gpu
rocm:
group_add:
- video
devices:
- /dev/dri:/dev/dri
- /dev/kfd:/dev/kfd
openvino:
device_cgroup_rules:
- 'c 189:* rmw'
+2 -2
View File
@@ -117,7 +117,7 @@ See [Backup and Restore](/docs/administration/backup-and-restore.md).
### Does Immich support reading existing face tag metadata?
No, it currently does not. There is an [open feature request on GitHub](https://github.com/immich-app/immich/discussions/4348).
Yes, it creates new faces and persons from the imported asset metadata. For details see the [feature request #4348](https://github.com/immich-app/immich/discussions/4348) and [PR #6455](https://github.com/immich-app/immich/pull/6455).
### Does Immich support the filtering of NSFW images?
@@ -262,7 +262,7 @@ No, this is not supported. Only models listed in the [Hugging Face][huggingface]
### I want to be able to search in other languages besides English. How can I do that?
You can change to a multilingual CLIP model. See [here](/docs/features/searching#clip-model) for instructions.
You can change to a multilingual CLIP model. See [here](/docs/features/searching#clip-models) for instructions.
### Does Immich support Facial Recognition for videos?
+10 -3
View File
@@ -30,6 +30,13 @@ As mentioned above, you should make your own backup of these together with the a
You can adjust the schedule and amount of kept backups in the [admin settings](http://my.immich.app/admin/system-settings?isOpen=backup).
By default, Immich will keep the last 14 backups and create a new backup every day at 2:00 AM.
#### Trigger Backup
You are able to trigger a backup in the [admin job status page](http://my.immich.app/admin/jobs-status).
Visit the page, open the "Create job" modal from the top right, select "Backup Database" and click "Confirm".
A job will run and trigger a backup, you can verify this worked correctly by checking the logs or the backup folder.
This backup will count towards the last X backups that will be kept based on your settings.
#### Restoring
We hope to make restoring simpler in future versions, for now you can find the backups in the `UPLOAD_LOCATION/backups` folder on your host.
@@ -53,7 +60,7 @@ docker compose create # Create Docker containers for Immich apps witho
docker start immich_postgres # Start Postgres server
sleep 10 # Wait for Postgres server to start up
# Check the database user if you deviated from the default
gunzip < "/path/to/backup/dump.sql.gz" \
gunzip --stdout "/path/to/backup/dump.sql.gz" \
| sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" \
| docker exec -i immich_postgres psql --dbname=postgres --username=<DB_USERNAME> # Restore Backup
docker compose up -d # Start remainder of Immich apps
@@ -76,8 +83,8 @@ docker compose create # Create Docker containers for
docker start immich_postgres # Start Postgres server
sleep 10 # Wait for Postgres server to start up
docker exec -it immich_postgres bash # Enter the Docker shell and run the following command
# Check the database user if you deviated from the default. If your backup ends in `.gz`, replace `cat` with `gunzip`
cat < "/dump.sql" | sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" | psql --dbname=postgres --username=<DB_USERNAME>
# Check the database user if you deviated from the default. If your backup ends in `.gz`, replace `cat` with `gunzip --stdout`
cat "/dump.sql" | sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" | psql --dbname=postgres --username=<DB_USERNAME>
exit # Exit the Docker shell
docker compose up -d # Start remainder of Immich apps
```
@@ -11,6 +11,7 @@ The `immich-server` docker image comes preinstalled with an administrative CLI (
| `enable-oauth-login` | Enable OAuth login |
| `disable-oauth-login` | Disable OAuth login |
| `list-users` | List Immich users |
| `version` | Print Immich version |
## How to run a command
@@ -80,3 +81,10 @@ immich-admin list-users
}
]
```
Print Immich Version
```
immich-admin version
v1.129.0
```
+2
View File
@@ -69,6 +69,8 @@ Navigating to Administration > Settings > Machine Learning Settings > Facial Rec
:::tip
It's better to only tweak the parameters here than to set them to something very different unless you're ready to test a variety of options. If you do need to set a parameter to a strict setting, relaxing other settings can be a good option to compensate, and vice versa.
You can learn how the tune the result in this [Guide](/docs/guides/better-facial-clusters)
:::
### Facial recognition model

Before

Width:  |  Height:  |  Size: 4.9 MiB

After

Width:  |  Height:  |  Size: 4.9 MiB

+8 -4
View File
@@ -37,7 +37,7 @@ To validate that Immich can reach your external library, start a shell inside th
### Exclusion Patterns
By default, all files in the import paths will be added to the library. If there are files that should not be added, exclusion patterns can be used to exclude them. Exclusion patterns are glob patterns are matched against the full file path. If a file matches an exclusion pattern, it will not be added to the library. Exclusion patterns can be added in the Scan Settings page for each library. Under the hood, Immich uses the [glob](https://www.npmjs.com/package/glob) package to match patterns, so please refer to [their documentation](https://github.com/isaacs/node-glob#glob-primer) to see what patterns are supported.
By default, all files in the import paths will be added to the library. If there are files that should not be added, exclusion patterns can be used to exclude them. Exclusion patterns are glob patterns are matched against the full file path. If a file matches an exclusion pattern, it will not be added to the library. Exclusion patterns can be added in the Scan Settings page for each library.
Some basic examples:
@@ -48,7 +48,11 @@ Some basic examples:
Special characters such as @ should be escaped, for instance:
- `**/\@eadir/**` will exclude all files in any directory named `@eadir`
- `**/\@eaDir/**` will exclude all files in any directory named `@eaDir`
:::info
Internally, Immich uses the [glob](https://www.npmjs.com/package/glob) package to process exclusion patterns, and sometimes those patterns are translated into [Postgres LIKE patterns](https://www.postgresql.org/docs/current/functions-matching.html). The intention is to support basic folder exclusions but we recommend against advanced usage since those can't reliably be translated to the Postgres syntax. Please refer to the [glob documentation](https://github.com/isaacs/node-glob#glob-primer) for a basic overview on glob patterns.
:::
### Automatic watching (EXPERIMENTAL)
@@ -68,7 +72,7 @@ In rare cases, the library watcher can hang, preventing Immich from starting up.
### Nightly job
There is an automatic scan job that is scheduled to run once a day. This job also cleans up any libraries stuck in deletion.
There is an automatic scan job that is scheduled to run once a day. This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library managment page.
## Usage
@@ -91,7 +95,7 @@ The `immich-server` container will need access to the gallery. Modify your docke
+ - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro
+ - /home/user/old-pics:/mnt/media/old-pics:ro
+ - /mnt/media/videos:/mnt/media/videos:ro
+ - /mnt/media/videos2:/mnt/media/videos2 # the files in this folder can be deleted, as it does not end with :ro
+ - /mnt/media/videos2:/mnt/media/videos2 # WARNING: Immich will be able to delete the files in this folder, as it does not end with :ro
+ - "C:/Users/user_name/Desktop/my media:/mnt/media/my-media:ro" # import path in Windows system.
```
+31 -2
View File
@@ -11,7 +11,9 @@ You do not need to redo any machine learning jobs after enabling hardware accele
- ARM NN (Mali)
- CUDA (NVIDIA GPUs with [compute capability](https://developer.nvidia.com/cuda-gpus) 5.2 or higher)
- ROCm (AMD GPUs)
- OpenVINO (Intel GPUs such as Iris Xe and Arc)
- RKNN (Rockchip)
## Limitations
@@ -19,6 +21,7 @@ You do not need to redo any machine learning jobs after enabling hardware accele
- Only Linux and Windows (through WSL2) servers are supported.
- ARM NN is only supported on devices with Mali GPUs. Other Arm devices are not supported.
- Some models may not be compatible with certain backends. CUDA is the most reliable.
- Search latency isn't improved by ARM NN due to model compatibility issues preventing its use. However, smart search jobs do make use of ARM NN.
## Prerequisites
@@ -33,6 +36,7 @@ You do not need to redo any machine learning jobs after enabling hardware accele
- The `hwaccel.ml.yml` file assumes the path to it is `/usr/lib/libmali.so`, so update accordingly if it is elsewhere
- The `hwaccel.ml.yml` file assumes an additional file `/lib/firmware/mali_csffw.bin`, so update accordingly if your device's driver does not require this file
- Optional: Configure your `.env` file, see [environment variables](/docs/install/environment-variables) for ARM NN specific settings
- In particular, the `MACHINE_LEARNING_ANN_FP16_TURBO` can significantly improve performance at the cost of very slightly lower accuracy
#### CUDA
@@ -41,22 +45,38 @@ You do not need to redo any machine learning jobs after enabling hardware accele
- The installed driver must be >= 535 (it must support CUDA 12.2).
- On Linux (except for WSL2), you also need to have [NVIDIA Container Toolkit][nvct] installed.
#### ROCm
- The GPU must be supported by ROCm. If it isn't officially supported, you can attempt to use the `HSA_OVERRIDE_GFX_VERSION` environmental variable: `HSA_OVERRIDE_GFX_VERSION=<a supported version, e.g. 10.3.0>`. If this doesn't work, you might need to also set `HSA_USE_SVM=0`.
- The ROCm image is quite large and requires at least 35GiB of free disk space. However, pulling later updates to the service through Docker will generally only amount to a few hundred megabytes as the rest will be cached.
- This backend is new and may experience some issues. For example, GPU power consumption can be higher than usual after running inference, even if the machine learning service is idle. In this case, it will only go back to normal after being idle for 5 minutes (configurable with the [MACHINE_LEARNING_MODEL_TTL](/docs/install/environment-variables) setting).
#### OpenVINO
- Integrated GPUs are more likely to experience issues than discrete GPUs, especially for older processors or servers with low RAM.
- Ensure the server's kernel version is new enough to use the device for hardware accceleration.
- Expect higher RAM usage when using OpenVINO compared to CPU processing.
#### RKNN
- You must have a supported Rockchip SoC: only RK3566, RK3568, RK3576 and RK3588 are supported at this moment.
- Make sure you have the appropriate linux kernel driver installed
- This is usually pre-installed on the device vendor's Linux images
- RKNPU driver V0.9.8 or later must be available in the host server
- You may confirm this by running `cat /sys/kernel/debug/rknpu/version` to check the version
- Optional: Configure your `.env` file, see [environment variables](/docs/install/environment-variables) for RKNN specific settings
- In particular, setting `MACHINE_LEARNING_RKNN_THREADS` to 2 or 3 can _dramatically_ improve performance for RK3576 and RK3588 compared to the default of 1, at the expense of multiplying the amount of RAM each model uses by that amount.
## Setup
1. If you do not already have it, download the latest [`hwaccel.ml.yml`][hw-file] file and ensure it's in the same folder as the `docker-compose.yml`.
2. In the `docker-compose.yml` under `immich-machine-learning`, uncomment the `extends` section and change `cpu` to the appropriate backend.
3. Still in `immich-machine-learning`, add one of -[armnn, cuda, openvino] to the `image` section's tag at the end of the line.
3. Still in `immich-machine-learning`, add one of -[armnn, cuda, rocm, openvino, rknn] to the `image` section's tag at the end of the line.
4. Redeploy the `immich-machine-learning` container with these updated settings.
### Confirming Device Usage
You can confirm the device is being recognized and used by checking its utilization. There are many tools to display this, such as `nvtop` for NVIDIA or Intel and `intel_gpu_top` for Intel.
You can confirm the device is being recognized and used by checking its utilization. There are many tools to display this, such as `nvtop` for NVIDIA or Intel, `intel_gpu_top` for Intel, and `radeontop` for AMD.
You can also check the logs of the `immich-machine-learning` container. When a Smart Search or Face Detection job begins, or when you search with text in Immich, you should either see a log for `Available ORT providers` containing the relevant provider (e.g. `CUDAExecutionProvider` in the case of CUDA), or a `Loaded ANN model` log entry without errors in the case of ARM NN.
@@ -127,3 +147,12 @@ Note that you should increase job concurrencies to increase overall utilization
- If you encounter an error when a model is running, try a different model to see if the issue is model-specific.
- You may want to increase concurrency past the default for higher utilization. However, keep in mind that this will also increase VRAM consumption.
- Larger models benefit more from hardware acceleration, if you have the VRAM for them.
- Compared to ARM NN, RKNPU has:
- Wider model support (including for search, which ARM NN does not accelerate)
- Less heat generation
- Very slightly lower accuracy (RKNPU always uses FP16, while ARM NN by default uses higher precision FP32 unless `MACHINE_LEARNING_ANN_FP16_TURBO` is enabled)
- Varying speed (tested on RK3588):
- If `MACHINE_LEARNING_RKNN_THREADS` is at the default of 1, RKNPU will have substantially lower throughput for ML jobs than ARM NN in most cases, but similar latency (such as when searching)
- If `MACHINE_LEARNING_RKNN_THREADS` is set to 3, it will be somewhat faster than ARM NN at FP32, but somewhat slower than ARM NN if `MACHINE_LEARNING_ANN_FP16_TURBO` is enabled
- When other tasks also use the GPU (like transcoding), RKNPU has a significant advantage over ARM NN as it uses the otherwise idle NPU instead of competing for GPU usage
- Lower RAM usage if `MACHINE_LEARNING_RKNN_THREADS` is at the default of 1, but significantly higher if greater than 1 (which is necessary for it to fully utilize the NPU and hence be comparable in speed to ARM NN)
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -18,7 +18,7 @@ For the full list, refer to the [Immich source code](https://github.com/immich-a
| `JPEG 2000` | `.jp2` | :white_check_mark: | |
| `JPEG` | `.webp` `.jpg` `.jpe` `.insp` | :white_check_mark: | |
| `JPEG XL` | `.jxl` | :white_check_mark: | |
| `PNG` | `.webp` | :white_check_mark: | |
| `PNG` | `.png` | :white_check_mark: | |
| `PSD` | `.psd` | :white_check_mark: | Adobe Photoshop |
| `RAW` | `.raw` | :white_check_mark: | |
| `RW2` | `.rw2` | :white_check_mark: | |
@@ -0,0 +1,72 @@
# Better Facial Recognition Clusters
## Purpose
This guide explains how to optimize facial recognition in systems with large image libraries. By following these steps, you'll achieve better clustering of faces, reducing the need for manual merging.
---
## Important Notes
- **Best Suited For:** Large image libraries after importing a significant number of images.
- **Warning:** This method deletes all previously assigned names.
- **Tip:** **Always take a [backup](/docs/administration/backup-and-restore#database) before proceeding!**
---
## Step-by-Step Instructions
### Objective
To enhance face clustering and ensure the model effectively identifies faces using qualitative initial data.
---
### Steps
#### 1. Adjust Machine Learning Settings
Navigate to:
**Admin тЖТ Administration тЖТ Settings тЖТ Machine Learning Settings**
Make the following changes:
- **Maximum recognition distance (Optional):**
Lower this value, e.g., to **0.4**, if the library contains people with similar facial features.
- **Minimum recognized faces:**
Set this to a **high value** (e.g., 20 For libraries with a large amount of assets (~100K+), and 10 for libraries with medium amount of assets (~40K+)).
> A high value ensures clusters only include faces that appear at least 20/`value` times in the library, improving the initial clustering process.
---
#### 2. Run Reset Jobs
Go to:
**Admin тЖТ Administration тЖТ Settings тЖТ Jobs**
Perform the following:
1. **FACIAL RECOGNITION тЖТ Reset**
> These reset jobs rebuild the recognition model based on the new settings.
---
#### 3. Refine Recognition with Lower Thresholds
Once the reset jobs are complete, refine the recognition as follows:
- **Step 1:**
Return to **Minimum recognized faces** in Machine Learning Settings and lower the value to **10** (In medium libraries we will lower the value from 10 to 5).
> Run the job: **FACIAL RECOGNITION тЖТ MISSING Mode**
- **Step 2:**
Lower the value again to **3**.
> Run the job: **FACIAL RECOGNITION тЖТ MISSING Mode**
:::tip try different values
For certain libraries with a larger or smaller amount of assets, other settings will be better or worse. It is recommended to try different values **тАЛтАЛbefore assigning names** and see which settings work best for your library.
:::
---
+4
View File
@@ -31,6 +31,10 @@ SELECT * FROM "assets" WHERE "originalPath" LIKE 'upload/library/admin/2023/%';
SELECT * FROM "assets" WHERE "id" = '9f94e60f-65b6-47b7-ae44-a4df7b57f0e9';
```
```sql title="Find by partial ID"
SELECT * FROM "assets" WHERE "id"::text LIKE '%ab431d3a%';
```
:::note
You can calculate the checksum for a particular file by using the command `sha1sum <filename>`.
:::
+2 -2
View File
@@ -23,12 +23,12 @@ name: immich_remote_ml
services:
immich-machine-learning:
container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
# Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
# extends:
# file: hwaccel.ml.yml
# service: # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
# service: # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- model-cache:/cache
restart: always
+4
View File
@@ -1,3 +1,7 @@
---
sidebar_position: 100
---
# Config File
A config file can be provided as an alternative to the UI configuration.
+1 -36
View File
@@ -69,39 +69,4 @@ If you get an error `can't set healthcheck.start_interval as feature require Doc
## Next Steps
Read the [Post Installation](/docs/install/post-install.mdx) steps or setup optional features below.
### Setting up optional features
- [External Libraries](/docs/features/libraries.md): Adding your existing photo library to Immich
- [Hardware Transcoding](/docs/features/hardware-transcoding.md): Speeding up video transcoding
- [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md): Speeding up various machine learning tasks in Immich
### Upgrading
:::danger Read the release notes
Immich is currently under heavy development, which means you can expect [breaking changes][breaking] and bugs. Therefore, we recommend reading the release notes prior to updating and to take special care when using automated tools like [Watchtower][watchtower].
You can see versions that had breaking changes [here][breaking].
:::
If `IMMICH_VERSION` is set, it will need to be updated to the latest or desired version.
When a new version of Immich is [released][releases], the application can be upgraded and restarted with the following commands, run in the directory with the `docker-compose.yml` file:
```bash title="Upgrade and restart Immich"
docker compose pull && docker compose up -d
```
To clean up disk space, the old version's obsolete container images can be deleted with the following command:
```bash title="Clean up unused Docker images"
docker image prune
```
[compose-file]: https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
[env-file]: https://github.com/immich-app/immich/releases/latest/download/example.env
[watchtower]: https://containrrr.dev/watchtower/
[breaking]: https://github.com/immich-app/immich/discussions?discussions_q=label%3Achangelog%3Abreaking-change+sort%3Adate_created
[container-auth]: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-to-the-container-registry
[releases]: https://github.com/immich-app/immich/releases
Read the [Post Installation](/docs/install/post-install.mdx) steps and [upgrade instructions](/docs/install/upgrading.md).
+29 -23
View File
@@ -11,7 +11,7 @@ Just restarting the containers does not replace the environment within the conta
In order to recreate the container using docker compose, run `docker compose up -d`.
In most cases docker will recognize that the `.env` file has changed and recreate the affected containers.
If this should not work, try running `docker compose up -d --force-recreate`.
If this does not work, try running `docker compose up -d --force-recreate`.
:::
@@ -20,8 +20,8 @@ If this should not work, try running `docker compose up -d --force-recreate`.
| Variable | Description | Default | Containers |
| :----------------- | :------------------------------ | :-------: | :----------------------- |
| `IMMICH_VERSION` | Image tags | `release` | server, machine learning |
| `UPLOAD_LOCATION` | Host Path for uploads | | server |
| `DB_DATA_LOCATION` | Host Path for Postgres database | | database |
| `UPLOAD_LOCATION` | Host path for uploads | | server |
| `DB_DATA_LOCATION` | Host path for Postgres database | | database |
:::tip
These environment variables are used by the `docker-compose.yml` file and do **NOT** affect the containers directly.
@@ -33,15 +33,15 @@ These environment variables are used by the `docker-compose.yml` file and do **N
| :---------------------------------- | :---------------------------------------------------------------------------------------- | :--------------------------: | :----------------------- | :----------------- |
| `TZ` | Timezone | <sup>\*1</sup> | server | microservices |
| `IMMICH_ENV` | Environment (production, development) | `production` | server, machine learning | api, microservices |
| `IMMICH_LOG_LEVEL` | Log Level (verbose, debug, log, warn, error) | `log` | server, machine learning | api, microservices |
| `IMMICH_MEDIA_LOCATION` | Media Location inside the container тЪая╕П**You probably shouldn't set this**<sup>\*2</sup>тЪая╕П | `./upload`<sup>\*3</sup> | server | api, microservices |
| `IMMICH_LOG_LEVEL` | Log level (verbose, debug, log, warn, error) | `log` | server, machine learning | api, microservices |
| `IMMICH_MEDIA_LOCATION` | Media location inside the container тЪая╕П**You probably shouldn't set this**<sup>\*2</sup>тЪая╕П | `./upload`<sup>\*3</sup> | server | api, microservices |
| `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices |
| `NO_COLOR` | Set to `true` to disable color-coded log output | `false` | server, machine learning | |
| `CPU_CORES` | Amount of cores available to the immich server | auto-detected cpu core count | server | |
| `CPU_CORES` | Number of cores available to the Immich server | auto-detected CPU core count | server | |
| `IMMICH_API_METRICS_PORT` | Port for the OTEL metrics | `8081` | server | api |
| `IMMICH_MICROSERVICES_METRICS_PORT` | Port for the OTEL metrics | `8082` | server | microservices |
| `IMMICH_PROCESS_INVALID_IMAGES` | When `true`, generate thumbnails for invalid images | | server | microservices |
| `IMMICH_TRUSTED_PROXIES` | List of comma separated IPs set as trusted proxies | | server | api |
| `IMMICH_TRUSTED_PROXIES` | List of comma-separated IPs set as trusted proxies | | server | api |
| `IMMICH_IGNORE_MOUNT_CHECK_ERRORS` | See [System Integrity](/docs/administration/system-integrity) | | server | api, microservices |
\*1: `TZ` should be set to a `TZ identifier` from [this list][tz-list]. For example, `TZ="Etc/UTC"`.
@@ -50,7 +50,7 @@ These environment variables are used by the `docker-compose.yml` file and do **N
\*2: This path is where the Immich code looks for the files, which is internal to the docker container. Setting it to a path on your host will certainly break things, you should use the `UPLOAD_LOCATION` variable instead.
\*3: With the default `WORKDIR` of `/usr/src/app`, this path will resolve to `/usr/src/app/upload`.
It only need to be set if the Immich deployment method is changing.
It only needs to be set if the Immich deployment method is changing.
## Workers
@@ -75,12 +75,12 @@ Information on the current workers can be found [here](/docs/administration/jobs
| Variable | Description | Default | Containers |
| :---------------------------------- | :----------------------------------------------------------------------- | :----------: | :----------------------------- |
| `DB_URL` | Database URL | | server |
| `DB_HOSTNAME` | Database Host | `database` | server |
| `DB_PORT` | Database Port | `5432` | server |
| `DB_USERNAME` | Database User | `postgres` | server, database<sup>\*1</sup> |
| `DB_PASSWORD` | Database Password | `postgres` | server, database<sup>\*1</sup> |
| `DB_DATABASE_NAME` | Database Name | `immich` | server, database<sup>\*1</sup> |
| `DB_VECTOR_EXTENSION`<sup>\*2</sup> | Database Vector Extension (one of [`pgvector`, `pgvecto.rs`]) | `pgvecto.rs` | server |
| `DB_HOSTNAME` | Database host | `database` | server |
| `DB_PORT` | Database port | `5432` | server |
| `DB_USERNAME` | Database user | `postgres` | server, database<sup>\*1</sup> |
| `DB_PASSWORD` | Database password | `postgres` | server, database<sup>\*1</sup> |
| `DB_DATABASE_NAME` | Database name | `immich` | server, database<sup>\*1</sup> |
| `DB_VECTOR_EXTENSION`<sup>\*2</sup> | Database vector extension (one of [`pgvector`, `pgvecto.rs`]) | `pgvecto.rs` | server |
| `DB_SKIP_MIGRATIONS` | Whether to skip running migrations on startup (one of [`true`, `false`]) | `false` | server |
\*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`.
@@ -103,18 +103,18 @@ When `DB_URL` is defined, the `DB_HOSTNAME`, `DB_PORT`, `DB_USERNAME`, `DB_PASSW
| Variable | Description | Default | Containers |
| :--------------- | :------------- | :-----: | :--------- |
| `REDIS_URL` | Redis URL | | server |
| `REDIS_SOCKET` | Redis Socket | | server |
| `REDIS_HOSTNAME` | Redis Host | `redis` | server |
| `REDIS_PORT` | Redis Port | `6379` | server |
| `REDIS_USERNAME` | Redis Username | | server |
| `REDIS_PASSWORD` | Redis Password | | server |
| `REDIS_DBINDEX` | Redis DB Index | `0` | server |
| `REDIS_SOCKET` | Redis socket | | server |
| `REDIS_HOSTNAME` | Redis host | `redis` | server |
| `REDIS_PORT` | Redis port | `6379` | server |
| `REDIS_USERNAME` | Redis username | | server |
| `REDIS_PASSWORD` | Redis password | | server |
| `REDIS_DBINDEX` | Redis DB index | `0` | server |
:::info
All `REDIS_` variables must be provided to all Immich workers, including `api` and `microservices`.
`REDIS_URL` must start with `ioredis://` and then include a `base64` encoded JSON string for the configuration.
More info can be found in the upstream [ioredis] documentation.
More information can be found in the upstream [ioredis] documentation.
When `REDIS_URL` or `REDIS_SOCKET` are defined, the `REDIS_HOSTNAME`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD`, and `REDIS_DBINDEX` variables are ignored.
:::
@@ -170,6 +170,8 @@ Redis (Sentinel) URL example JSON before encoding:
| `MACHINE_LEARNING_MAX_BATCH_SIZE__FACIAL_RECOGNITION` | Set the maximum number of faces that will be processed at once by the facial recognition model | None (`1` if using OpenVINO) | machine learning |
| `MACHINE_LEARNING_PING_TIMEOUT` | How long (ms) to wait for a PING response when checking if an ML server is available | `2000` | server |
| `MACHINE_LEARNING_AVAILABILITY_BACKOFF_TIME` | How long to ignore ML servers that are offline before trying again | `30000` | server |
| `MACHINE_LEARNING_RKNN` | Enable RKNN hardware acceleration if supported | `True` | machine learning |
| `MACHINE_LEARNING_RKNN_THREADS` | How many threads of RKNN runtime should be spinned up while inferencing. | `1` | machine learning |
\*1: It is recommended to begin with this parameter when changing the concurrency levels of the machine learning service and then tune the other ones.
@@ -181,7 +183,11 @@ Redis (Sentinel) URL example JSON before encoding:
:::info
Other machine learning parameters can be tuned from the admin UI.
While the `textual` model is the only one required for smart search, some users may experience slow first searches
due to backups triggering loading of the other models into memory, which blocks other requests until completed.
To avoid this, you can preload the other models (`visual`, `recognition`, and `detection`) if you have enough RAM to do so.
Additional machine learning parameters can be tuned from the admin UI.
:::
@@ -212,7 +218,7 @@ the `_FILE` variable should be set to the path of a file containing the variable
details on how to use Docker Secrets in the Postgres image.
\*2: See [this comment][docker-secrets-example] for an example of how
to use use a Docker secret for the password in the Redis container.
to use a Docker secret for the password in the Redis container.
[tz-list]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
[docker-secrets-example]: https://github.com/docker-library/redis/issues/46#issuecomment-335326234
+6
View File
@@ -41,3 +41,9 @@ A list of common steps to take after installing Immich include:
## Step 7 - Setup Server Backups
<ServerBackup />
## Setting up optional features
- [External Libraries](/docs/features/libraries.md): Adding your existing photo library to Immich
- [Hardware Transcoding](/docs/features/hardware-transcoding.md): Speeding up video transcoding
- [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md): Speeding up various machine learning tasks in Immich
+1 -7
View File
@@ -67,10 +67,4 @@ Click "**Edit Rules**" and add the following firewall rules:
## Next Steps
Read the [Post Installation](/docs/install/post-install.mdx) steps or setup optional features below.
### Setting up optional features
- [External Libraries](/docs/features/libraries.md): Adding your existing photo library to Immich
- [Hardware Transcoding](/docs/features/hardware-transcoding.md): Speeding up video transcoding
- [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md): Speeding up various machine learning tasks in Immich
Read the [Post Installation](/docs/install/post-install.mdx) steps and [upgrade instructions](/docs/install/upgrading.md).
+4
View File
@@ -247,6 +247,10 @@ Some examples are: `IMMICH_VERSION`, `UPLOAD_LOCATION`, `DB_DATA_LOCATION`, `TZ`
## Updating the App
:::danger
Make sure to read the general [upgrade instructions](/docs/install/upgrading.md).
:::
When updates become available, SCALE alerts and provides easy updates.
To update the app to the latest version:
+5 -1
View File
@@ -77,7 +77,7 @@ alt="Select Plugins > Compose.Manager > Add New Stack > Label it Immich"
7. Paste the entire contents of the [Immich example.env](https://github.com/immich-app/immich/releases/latest/download/example.env) file into the Unraid editor, then **before saving** edit the following:
- `UPLOAD_LOCATION`: Create a folder in your Images Unraid share and place the **absolute** location here > For example my _"images"_ share has a folder within it called _"immich"_. If I browse to this directory in the terminal and type `pwd` the output is `/mnt/user/images/immich`. This is the exact value I need to enter as my `UPLOAD_LOCATION`
- `DB_DATA_LOCATION`: Change this to use an Unraid share (preferably a cache pool, e.g. `/mnt/user/appdata`). If left at default it will try to use Unraid's `/boot/config/plugins/compose.manager/projects/[stack_name]/postgres` folder which it doesn't have permissions to, resulting in this container continuously restarting.
- `DB_DATA_LOCATION`: Change this to use an Unraid share (preferably a cache pool, e.g. `/mnt/user/appdata/postgresql/data`). This uses the `appdata` share. Do also create the `postgresql` folder, by running `mkdir /mnt/user/{share_location}/postgresql/data`. If left at default it will try to use Unraid's `/boot/config/plugins/compose.manager/projects/[stack_name]/postgres` folder which it doesn't have permissions to, resulting in this container continuously restarting.
<img
src={require('./img/unraid05.webp').default}
@@ -131,6 +131,10 @@ For more information on how to use the application once installed, please refer
## Updating Steps
:::danger
Make sure to read the general [upgrade instructions](/docs/install/upgrading.md).
:::
Updating is extremely easy however it's important to be aware that containers managed via the Docker Compose Manager plugin do not integrate with Unraid's native dockerman UI, the label "_update ready_" will always be present on containers installed via the Docker Compose Manager.
<img
+32
View File
@@ -0,0 +1,32 @@
---
sidebar_position: 95
---
# Upgrading
:::danger Read the release notes
Immich is currently under heavy development, which means you can expect [breaking changes][breaking] and bugs. You should read the release notes prior to updating and take special care when using automated tools like [Watchtower][watchtower].
You can see versions that had breaking changes [here][breaking].
:::
When a new version of Immich is [released][releases], you should read the release notes and account for any breaking changes noted (as mentioned above).
If you use `IMMICH_VERSION` in your `.env` file, it will need to be updated to the latest or desired version.
After that, the application can be upgraded and restarted with the following commands, run in the directory with the `docker-compose.yml` file:
```bash title="Upgrade and restart Immich"
docker compose pull && docker compose up -d
```
To clean up disk space, the old version's obsolete container images can be deleted with the following command:
```bash title="Clean up unused Docker images"
docker image prune
```
[compose-file]: https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
[env-file]: https://github.com/immich-app/immich/releases/latest/download/example.env
[watchtower]: https://containrrr.dev/watchtower/
[breaking]: https://github.com/immich-app/immich/discussions?discussions_q=label%3Achangelog%3Abreaking-change+sort%3Adate_created
[container-auth]: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-to-the-container-registry
[releases]: https://github.com/immich-app/immich/releases
+5
View File
@@ -1,2 +1,7 @@
Now that you have imported some pictures, you should setup server backups to preserve your memories.
You can do so by following our [backup guide](/docs/administration/backup-and-restore.md).
:::danger
Immich is still under heavy development _and_ handles very important data.
It is essential that you set up good backups, and test them.
:::
+18 -18
View File
@@ -5308,9 +5308,9 @@
}
},
"node_modules/autoprefixer": {
"version": "10.4.20",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
"integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
"version": "10.4.21",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
"integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
"funding": [
{
"type": "opencollective",
@@ -5327,11 +5327,11 @@
],
"license": "MIT",
"dependencies": {
"browserslist": "^4.23.3",
"caniuse-lite": "^1.0.30001646",
"browserslist": "^4.24.4",
"caniuse-lite": "^1.0.30001702",
"fraction.js": "^4.3.7",
"normalize-range": "^0.1.2",
"picocolors": "^1.0.1",
"picocolors": "^1.1.1",
"postcss-value-parser": "^4.2.0"
},
"bin": {
@@ -5781,9 +5781,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001695",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz",
"integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==",
"version": "1.0.30001706",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz",
"integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==",
"funding": [
{
"type": "opencollective",
@@ -14070,9 +14070,9 @@
}
},
"node_modules/postcss": {
"version": "8.5.2",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
"integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
"version": "8.5.3",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
"integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"funding": [
{
"type": "opencollective",
@@ -15734,9 +15734,9 @@
}
},
"node_modules/prettier": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz",
"integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==",
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
"dev": true,
"license": "MIT",
"bin": {
@@ -18377,9 +18377,9 @@
}
},
"node_modules/typescript": {
"version": "5.7.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"version": "5.8.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
"integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
+2 -1
View File
@@ -1,2 +1,3 @@
export const discordPath =
'M 9.1367188 3.8691406 C 9.1217187 3.8691406 9.1067969 3.8700938 9.0917969 3.8710938 C 8.9647969 3.8810937 5.9534375 4.1403594 4.0234375 5.6933594 C 3.0154375 6.6253594 1 12.073203 1 16.783203 C 1 16.866203 1.0215 16.946531 1.0625 17.019531 C 2.4535 19.462531 6.2473281 20.102859 7.1113281 20.130859 L 7.1269531 20.130859 C 7.2799531 20.130859 7.4236719 20.057594 7.5136719 19.933594 L 8.3886719 18.732422 C 6.0296719 18.122422 4.8248594 17.086391 4.7558594 17.025391 C 4.5578594 16.850391 4.5378906 16.549563 4.7128906 16.351562 C 4.8068906 16.244563 4.9383125 16.189453 5.0703125 16.189453 C 5.1823125 16.189453 5.2957188 16.228594 5.3867188 16.308594 C 5.4157187 16.334594 7.6340469 18.216797 11.998047 18.216797 C 16.370047 18.216797 18.589328 16.325641 18.611328 16.306641 C 18.702328 16.227641 18.815734 16.189453 18.927734 16.189453 C 19.059734 16.189453 19.190156 16.243562 19.285156 16.351562 C 19.459156 16.549563 19.441141 16.851391 19.244141 17.025391 C 19.174141 17.087391 17.968375 18.120469 15.609375 18.730469 L 16.484375 19.933594 C 16.574375 20.057594 16.718094 20.130859 16.871094 20.130859 L 16.886719 20.130859 C 17.751719 20.103859 21.5465 19.463531 22.9375 17.019531 C 22.9785 16.947531 23 16.866203 23 16.783203 C 23 12.073203 20.984172 6.624875 19.951172 5.671875 C 18.047172 4.140875 15.036203 3.8820937 14.908203 3.8710938 C 14.895203 3.8700938 14.880188 3.8691406 14.867188 3.8691406 C 14.681188 3.8691406 14.510594 3.9793906 14.433594 4.1503906 C 14.427594 4.1623906 14.362062 4.3138281 14.289062 4.5488281 C 15.548063 4.7608281 17.094141 5.1895937 18.494141 6.0585938 C 18.718141 6.1975938 18.787437 6.4917969 18.648438 6.7167969 C 18.558438 6.8627969 18.402188 6.9433594 18.242188 6.9433594 C 18.156188 6.9433594 18.069234 6.9200937 17.990234 6.8710938 C 15.584234 5.3800938 12.578 5.3046875 12 5.3046875 C 11.422 5.3046875 8.4157187 5.3810469 6.0117188 6.8730469 C 5.9327188 6.9210469 5.8457656 6.9433594 5.7597656 6.9433594 C 5.5997656 6.9433594 5.4425625 6.86475 5.3515625 6.71875 C 5.2115625 6.49375 5.2818594 6.1985938 5.5058594 6.0585938 C 6.9058594 5.1905937 8.4528906 4.7627812 9.7128906 4.5507812 C 9.6388906 4.3147813 9.5714062 4.1643437 9.5664062 4.1523438 C 9.4894063 3.9813438 9.3217188 3.8691406 9.1367188 3.8691406 z M 12 7.3046875 C 12.296 7.3046875 14.950594 7.3403125 16.933594 8.5703125 C 17.326594 8.8143125 17.777234 8.9453125 18.240234 8.9453125 C 18.633234 8.9453125 19.010656 8.8555 19.347656 8.6875 C 19.964656 10.2405 20.690828 12.686219 20.923828 15.199219 C 20.883828 15.143219 20.840922 15.089109 20.794922 15.037109 C 20.324922 14.498109 19.644687 14.191406 18.929688 14.191406 C 18.332687 14.191406 17.754078 14.405437 17.330078 14.773438 C 17.257078 14.832437 15.505 16.21875 12 16.21875 C 8.496 16.21875 6.7450313 14.834687 6.7070312 14.804688 C 6.2540312 14.407687 5.6742656 14.189453 5.0722656 14.189453 C 4.3612656 14.189453 3.6838438 14.494391 3.2148438 15.025391 C 3.1658438 15.080391 3.1201719 15.138266 3.0761719 15.197266 C 3.3091719 12.686266 4.0344375 10.235594 4.6484375 8.6835938 C 4.9864375 8.8525938 5.3657656 8.9433594 5.7597656 8.9433594 C 6.2217656 8.9433594 6.6724531 8.8143125 7.0644531 8.5703125 C 9.0494531 7.3393125 11.704 7.3046875 12 7.3046875 z M 8.890625 10.044922 C 7.966625 10.044922 7.2167969 10.901031 7.2167969 11.957031 C 7.2167969 13.013031 7.965625 13.869141 8.890625 13.869141 C 9.815625 13.869141 10.564453 13.013031 10.564453 11.957031 C 10.564453 10.900031 9.815625 10.044922 8.890625 10.044922 z M 15.109375 10.044922 C 14.185375 10.044922 13.435547 10.901031 13.435547 11.957031 C 13.435547 13.013031 14.184375 13.869141 15.109375 13.869141 C 16.034375 13.869141 16.783203 13.013031 16.783203 11.957031 C 16.783203 10.900031 16.033375 10.044922 15.109375 10.044922 z';
'M81.15,0c-1.2376,2.1973-2.3489,4.4704-3.3591,6.794-9.5975-1.4396-19.3718-1.4396-28.9945,0-.985-2.3236-2.1216-4.5967-3.3591-6.794-9.0166,1.5407-17.8059,4.2431-26.1405,8.0568C2.779,32.5304-1.6914,56.3725.5312,79.8863c9.6732,7.1476,20.5083,12.603,32.0505,16.0884,2.6014-3.4854,4.8998-7.1981,6.8698-11.0623-3.738-1.3891-7.3497-3.1318-10.8098-5.1523.9092-.6567,1.7932-1.3386,2.6519-1.9953,20.281,9.547,43.7696,9.547,64.0758,0,.8587.7072,1.7427,1.3891,2.6519,1.9953-3.4601,2.0457-7.0718,3.7632-10.835,5.1776,1.97,3.8642,4.2683,7.5769,6.8698,11.0623,11.5419-3.4854,22.3769-8.9156,32.0509-16.0631,2.626-27.2771-4.496-50.9172-18.817-71.8548C98.9811,4.2684,90.1918,1.5659,81.1752.0505l-.0252-.0505ZM42.2802,65.4144c-6.2383,0-11.4159-5.6575-11.4159-12.6535s4.9755-12.6788,11.3907-12.6788,11.5169,5.708,11.4159,12.6788c-.101,6.9708-5.026,12.6535-11.3907,12.6535ZM84.3576,65.4144c-6.2637,0-11.3907-5.6575-11.3907-12.6535s4.9755-12.6788,11.3907-12.6788,11.4917,5.708,11.3906,12.6788c-.101,6.9708-5.026,12.6535-11.3906,12.6535Z';
export const discordViewBox = '0 0 126.644 96';
+3 -2
View File
@@ -4,7 +4,7 @@ import React, { useEffect, useState } from 'react';
export default function VersionSwitcher(): JSX.Element {
const [versions, setVersions] = useState([]);
const [label, setLabel] = useState('Versions');
const [activeLabel, setLabel] = useState('Versions');
const windowSize = useWindowSize();
@@ -48,12 +48,13 @@ export default function VersionSwitcher(): JSX.Element {
versions.length > 0 && (
<DropdownNavbarItem
className="version-switcher-34ab39"
label={label}
label={activeLabel}
mobile={windowSize === 'mobile'}
items={versions.map(({ label, url }) => ({
label,
to: new URL(location.pathname + location.search + location.hash, url).href,
target: '_self',
className: label === activeLabel ? 'dropdown__link--active menu__link--active' : '', // workaround because React Router `<NavLink>` only supports using URL path for checking if active: https://v5.reactrouter.com/web/api/NavLink/isactive-func
}))}
/>
)
+15 -19
View File
@@ -1,12 +1,10 @@
import React from 'react';
import Link from '@docusaurus/Link';
import Layout from '@theme/Layout';
import { useColorMode } from '@docusaurus/theme-common';
import { discordPath } from '@site/src/components/svg-paths';
import { discordPath, discordViewBox } from '@site/src/components/svg-paths';
import ThemedImage from '@theme/ThemedImage';
import Icon from '@mdi/react';
function HomepageHeader() {
const { isDarkTheme } = useColorMode();
return (
<header>
<div className="top-[calc(12%)] md:top-[calc(30%)] h-screen w-full absolute -z-10">
@@ -14,8 +12,8 @@ function HomepageHeader() {
<div className="w-full h-[120vh] absolute left-0 top-0 backdrop-blur-3xl bg-immich-bg/40 dark:bg-transparent"></div>
</div>
<section className="text-center pt-12 sm:pt-24 bg-immich-bg/50 dark:bg-immich-dark-bg/80">
<img
src={isDarkTheme ? 'img/logomark-dark.svg' : 'img/logomark-light.svg'}
<ThemedImage
sources={{ dark: 'img/logomark-dark.svg', light: 'img/logomark-light.svg' }}
className="h-[115px] w-[115px] mb-2 antialiased rounded-none"
alt="Immich logo"
/>
@@ -35,7 +33,6 @@ function HomepageHeader() {
sacrificing your privacy.
</p>
</div>
<div className="flex flex-col sm:flex-row place-items-center place-content-center mt-9 gap-4 ">
<Link
className="flex place-items-center place-content-center py-3 px-8 border bg-immich-primary dark:bg-immich-dark-primary rounded-xl no-underline hover:no-underline text-white hover:text-gray-50 dark:text-immich-dark-bg font-bold uppercase"
@@ -58,27 +55,27 @@ function HomepageHeader() {
Buy Merch
</Link>
</div>
<div className="my-12 flex gap-1 font-medium place-items-center place-content-center text-immich-primary dark:text-immich-dark-primary">
<Icon path={discordPath} size={1} />
<Icon
path={discordPath}
viewBox={discordViewBox} /* viewBox may show an error in your IDE but it is normal. */
size={1}
/>
<Link to="https://discord.immich.app/">Join our Discord</Link>
</div>
<img
src={isDarkTheme ? '/img/screenshot-dark.webp' : '/img/screenshot-light.webp'}
<ThemedImage
sources={{ dark: '/img/screenshot-dark.webp', light: '/img/screenshot-light.webp' }}
alt="screenshots"
className="w-[95%] lg:w-[85%] xl:w-[70%] 2xl:w-[60%] "
/>
<div className="mx-[25%] m-auto my-14 md:my-28">
<hr className="border bg-gray-500 dark:bg-gray-400" />
</div>
<img
src={isDarkTheme ? 'img/logomark-dark.svg' : 'img/logomark-light.svg'}
<ThemedImage
sources={{ dark: 'img/logomark-dark.svg', light: 'img/logomark-light.svg' }}
className="h-[115px] w-[115px] mb-2 antialiased rounded-none"
alt="Immich logo"
/>
<div>
<p className="font-bold text-2xl md:text-5xl ">Download the mobile app</p>
<p className="text-lg">
@@ -97,9 +94,8 @@ function HomepageHeader() {
</a>
</div>
</div>
<img
src={isDarkTheme ? '/img/app-qr-code-dark.svg' : '/img/app-qr-code-light.svg'}
<ThemedImage
sources={{ dark: '/img/app-qr-code-dark.svg', light: '/img/app-qr-code-light.svg' }}
alt="app qr code"
width={'150px'}
className="shadow-lg p-3 my-8 dark:bg-immich-dark-bg "
-3
View File
@@ -1,10 +1,7 @@
import React from 'react';
import Link from '@docusaurus/Link';
import Layout from '@theme/Layout';
import { useColorMode } from '@docusaurus/theme-common';
function HomepageHeader() {
const { isDarkTheme } = useColorMode();
return (
<header>
<section className="max-w-[900px] m-4 p-4 md:p-6 md:m-auto md:my-12 border border-red-400 rounded-2xl bg-slate-200 dark:bg-immich-dark-gray">
+7
View File
@@ -242,6 +242,13 @@ const roadmap: Item[] = [
];
const milestones: Item[] = [
{
icon: mdiStar,
iconColor: 'gold',
title: '60,000 Stars',
description: 'Reached 60K Stars on GitHub!',
getDateLabel: withLanguage(new Date(2025, 2, 4)),
},
withRelease({
icon: mdiLinkEdit,
iconColor: 'crimson',
+32
View File
@@ -1,4 +1,36 @@
[
{
"label": "v1.131.2",
"url": "https://v1.131.2.archive.immich.app"
},
{
"label": "v1.131.1",
"url": "https://v1.131.1.archive.immich.app"
},
{
"label": "v1.131.0",
"url": "https://v1.131.0.archive.immich.app"
},
{
"label": "v1.130.3",
"url": "https://v1.130.3.archive.immich.app"
},
{
"label": "v1.130.2",
"url": "https://v1.130.2.archive.immich.app"
},
{
"label": "v1.130.1",
"url": "https://v1.130.1.archive.immich.app"
},
{
"label": "v1.130.0",
"url": "https://v1.130.0.archive.immich.app"
},
{
"label": "v1.129.0",
"url": "https://v1.129.0.archive.immich.app"
},
{
"label": "v1.128.0",
"url": "https://v1.128.0.archive.immich.app"
+1 -1
View File
@@ -37,7 +37,7 @@ services:
image: redis:6.2-alpine@sha256:148bb5411c184abd288d9aaed139c98123eeb8824c5d3fce03cf721db58066d8
database:
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
command: -c fsync=off -c shared_preload_libraries=vectors.so
environment:
POSTGRES_PASSWORD: postgres
+10 -20
View File
@@ -1,39 +1,29 @@
import { FlatCompat } from '@eslint/eslintrc';
import js from '@eslint/js';
import typescriptEslint from '@typescript-eslint/eslint-plugin';
import tsParser from '@typescript-eslint/parser';
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
import eslintPluginUnicorn from 'eslint-plugin-unicorn';
import globals from 'globals';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import typescriptEslint from 'typescript-eslint';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
});
export default [
export default typescriptEslint.config([
eslintPluginUnicorn.configs.recommended,
eslintPluginPrettierRecommended,
js.configs.recommended,
typescriptEslint.configs.recommended,
{
ignores: ['eslint.config.mjs'],
},
...compat.extends(
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
'plugin:unicorn/recommended',
),
{
plugins: {
'@typescript-eslint': typescriptEslint,
},
languageOptions: {
globals: {
...globals.node,
},
parser: tsParser,
parser: typescriptEslint.parser,
ecmaVersion: 5,
sourceType: 'module',
@@ -62,4 +52,4 @@ export default [
'object-shorthand': ['error', 'always'],
},
},
];
]);
+741 -905
View File
File diff suppressed because it is too large Load Diff
+5 -6
View File
@@ -1,6 +1,6 @@
{
"name": "immich-e2e",
"version": "1.128.0",
"version": "1.131.2",
"description": "",
"main": "index.js",
"type": "module",
@@ -25,20 +25,18 @@
"@immich/sdk": "file:../open-api/typescript-sdk",
"@playwright/test": "^1.44.1",
"@types/luxon": "^3.4.2",
"@types/node": "^22.13.4",
"@types/node": "^22.13.14",
"@types/oidc-provider": "^8.5.1",
"@types/pg": "^8.11.0",
"@types/pngjs": "^6.0.4",
"@types/supertest": "^6.0.2",
"@typescript-eslint/eslint-plugin": "^8.15.0",
"@typescript-eslint/parser": "^8.15.0",
"@vitest/coverage-v8": "^3.0.0",
"eslint": "^9.14.0",
"eslint-config-prettier": "^10.0.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^56.0.1",
"eslint-plugin-unicorn": "^57.0.0",
"exiftool-vendored": "^28.3.1",
"globals": "^15.9.0",
"globals": "^16.0.0",
"jose": "^5.6.3",
"luxon": "^3.4.4",
"oidc-provider": "^8.5.1",
@@ -49,6 +47,7 @@
"socket.io-client": "^4.7.4",
"supertest": "^7.0.0",
"typescript": "^5.3.3",
"typescript-eslint": "^8.28.0",
"utimes": "^5.2.1",
"vitest": "^3.0.0"
},
+2 -4
View File
@@ -4,7 +4,6 @@ import {
AssetResponseDto,
AssetTypeEnum,
getAssetInfo,
getConfig,
getMyUser,
LoginResponseDto,
SharedLinkType,
@@ -45,8 +44,6 @@ const locationAssetFilepath = `${testAssetDir}/metadata/gps-position/thompson-sp
const ratingAssetFilepath = `${testAssetDir}/metadata/rating/mongolels.jpg`;
const facesAssetFilepath = `${testAssetDir}/metadata/faces/portrait.jpg`;
const getSystemConfig = (accessToken: string) => getConfig({ headers: asBearerAuth(accessToken) });
const readTags = async (bytes: Buffer, filename: string) => {
const filepath = join(tempDir, filename);
await writeFile(filepath, bytes);
@@ -228,7 +225,7 @@ describe('/asset', () => {
});
it('should get the asset faces', async () => {
const config = await getSystemConfig(admin.accessToken);
const config = await utils.getSystemConfig(admin.accessToken);
config.metadata.faces.import = true;
await updateConfig({ systemConfigDto: config }, { headers: asBearerAuth(admin.accessToken) });
@@ -1260,6 +1257,7 @@ describe('/asset', () => {
for (const { id, status } of assets) {
expect(status).toBe(AssetMediaStatus.Created);
// longer timeout as the thumbnail generation from full-size raw files can take a while
await utils.waitForWebsocketEvent({ event: 'assetUpload', id });
}
+150 -11
View File
@@ -1,8 +1,9 @@
import { JobCommand, JobName, LoginResponseDto } from '@immich/sdk';
import { JobCommand, JobName, LoginResponseDto, updateConfig } from '@immich/sdk';
import { cpSync, rmSync } from 'node:fs';
import { readFile } from 'node:fs/promises';
import { basename } from 'node:path';
import { errorDto } from 'src/responses';
import { app, testAssetDir, utils } from 'src/utils';
import { app, asBearerAuth, testAssetDir, utils } from 'src/utils';
import request from 'supertest';
import { afterEach, beforeAll, describe, expect, it } from 'vitest';
@@ -20,6 +21,33 @@ describe('/jobs', () => {
command: JobCommand.Resume,
force: false,
});
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
command: JobCommand.Resume,
force: false,
});
await utils.jobCommand(admin.accessToken, JobName.FaceDetection, {
command: JobCommand.Resume,
force: false,
});
await utils.jobCommand(admin.accessToken, JobName.SmartSearch, {
command: JobCommand.Resume,
force: false,
});
await utils.jobCommand(admin.accessToken, JobName.DuplicateDetection, {
command: JobCommand.Resume,
force: false,
});
const config = await utils.getSystemConfig(admin.accessToken);
config.machineLearning.duplicateDetection.enabled = false;
config.machineLearning.enabled = false;
config.metadata.faces.import = false;
config.machineLearning.clip.enabled = false;
await updateConfig({ systemConfigDto: config }, { headers: asBearerAuth(admin.accessToken) });
});
it('should require authentication', async () => {
@@ -29,14 +57,7 @@ describe('/jobs', () => {
});
it('should queue metadata extraction for missing assets', async () => {
const path1 = `${testAssetDir}/formats/raw/Nikon/D700/philadelphia.nef`;
const path2 = `${testAssetDir}/formats/raw/Nikon/D80/glarus.nef`;
await utils.createAsset(admin.accessToken, {
assetData: { bytes: await readFile(path1), filename: basename(path1) },
});
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
const path = `${testAssetDir}/formats/raw/Nikon/D700/philadelphia.nef`;
await utils.jobCommand(admin.accessToken, JobName.MetadataExtraction, {
command: JobCommand.Pause,
@@ -44,7 +65,7 @@ describe('/jobs', () => {
});
const { id } = await utils.createAsset(admin.accessToken, {
assetData: { bytes: await readFile(path2), filename: basename(path2) },
assetData: { bytes: await readFile(path), filename: basename(path) },
});
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
@@ -82,5 +103,123 @@ describe('/jobs', () => {
expect(asset.exifInfo?.make).toBe('NIKON CORPORATION');
}
});
it('should not re-extract metadata for existing assets', async () => {
const path = `${testAssetDir}/temp/metadata/asset.jpg`;
cpSync(`${testAssetDir}/formats/raw/Nikon/D700/philadelphia.nef`, path);
const { id } = await utils.createAsset(admin.accessToken, {
assetData: { bytes: await readFile(path), filename: basename(path) },
});
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
{
const asset = await utils.getAssetInfo(admin.accessToken, id);
expect(asset.exifInfo).toBeDefined();
expect(asset.exifInfo?.model).toBe('NIKON D700');
}
cpSync(`${testAssetDir}/formats/raw/Nikon/D80/glarus.nef`, path);
await utils.jobCommand(admin.accessToken, JobName.MetadataExtraction, {
command: JobCommand.Start,
force: false,
});
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');
{
const asset = await utils.getAssetInfo(admin.accessToken, id);
expect(asset.exifInfo).toBeDefined();
expect(asset.exifInfo?.model).toBe('NIKON D700');
}
rmSync(path);
});
it('should queue thumbnail extraction for assets missing thumbs', async () => {
const path = `${testAssetDir}/albums/nature/tanners_ridge.jpg`;
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
command: JobCommand.Pause,
force: false,
});
const { id } = await utils.createAsset(admin.accessToken, {
assetData: { bytes: await readFile(path), filename: basename(path) },
});
await utils.waitForQueueFinish(admin.accessToken, JobName.MetadataExtraction);
await utils.waitForQueueFinish(admin.accessToken, JobName.ThumbnailGeneration);
const assetBefore = await utils.getAssetInfo(admin.accessToken, id);
expect(assetBefore.thumbhash).toBeNull();
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
command: JobCommand.Empty,
force: false,
});
await utils.waitForQueueFinish(admin.accessToken, JobName.MetadataExtraction);
await utils.waitForQueueFinish(admin.accessToken, JobName.ThumbnailGeneration);
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
command: JobCommand.Resume,
force: false,
});
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
command: JobCommand.Start,
force: false,
});
await utils.waitForQueueFinish(admin.accessToken, JobName.MetadataExtraction);
await utils.waitForQueueFinish(admin.accessToken, JobName.ThumbnailGeneration);
const assetAfter = await utils.getAssetInfo(admin.accessToken, id);
expect(assetAfter.thumbhash).not.toBeNull();
});
it('should not reload existing thumbnail when running thumb job for missing assets', async () => {
const path = `${testAssetDir}/temp/thumbs/asset1.jpg`;
cpSync(`${testAssetDir}/albums/nature/tanners_ridge.jpg`, path);
const { id } = await utils.createAsset(admin.accessToken, {
assetData: { bytes: await readFile(path), filename: basename(path) },
});
await utils.waitForQueueFinish(admin.accessToken, JobName.MetadataExtraction);
await utils.waitForQueueFinish(admin.accessToken, JobName.ThumbnailGeneration);
const assetBefore = await utils.getAssetInfo(admin.accessToken, id);
cpSync(`${testAssetDir}/albums/nature/notocactus_minimus.jpg`, path);
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
command: JobCommand.Resume,
force: false,
});
// This runs the missing thumbnail job
await utils.jobCommand(admin.accessToken, JobName.ThumbnailGeneration, {
command: JobCommand.Start,
force: false,
});
await utils.waitForQueueFinish(admin.accessToken, JobName.MetadataExtraction);
await utils.waitForQueueFinish(admin.accessToken, JobName.ThumbnailGeneration);
const assetAfter = await utils.getAssetInfo(admin.accessToken, id);
// Asset 1 thumbnail should be untouched since its thumb should not have been reloaded, even though the file was changed
expect(assetAfter.thumbhash).toEqual(assetBefore.thumbhash);
rmSync(path);
});
});
});
+265 -8
View File
@@ -329,7 +329,7 @@ describe('/libraries', () => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp`],
exclusionPatterns: ['**/directoryA'],
exclusionPatterns: ['**/directoryA/**'],
});
await utils.scan(admin.accessToken, library.id);
@@ -337,7 +337,82 @@ describe('/libraries', () => {
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(1);
expect(assets.items[0].originalPath.includes('directoryB'));
expect(assets.items).toEqual(
expect.arrayContaining([
expect.objectContaining({ originalPath: expect.stringContaining('directoryB/assetB.png') }),
]),
);
});
it('should scan external library with multiple exclusion patterns', async () => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp`],
exclusionPatterns: ['**/directoryA/**', '**/directoryB/**'],
});
await utils.scan(admin.accessToken, library.id);
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(0);
expect(assets.items).toEqual([]);
});
it('should remove assets covered by a new exclusion pattern', async () => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp`],
});
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(2);
expect(assets.items).toEqual(
expect.arrayContaining([
expect.objectContaining({ originalPath: expect.stringContaining('directoryA/assetA.png') }),
expect.objectContaining({ originalPath: expect.stringContaining('directoryB/assetB.png') }),
]),
);
}
await utils.updateLibrary(admin.accessToken, library.id, {
exclusionPatterns: ['**/directoryA/**'],
});
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(1);
expect(assets.items).toEqual(
expect.arrayContaining([
expect.objectContaining({ originalPath: expect.stringContaining('directoryB/assetB.png') }),
]),
);
}
await utils.updateLibrary(admin.accessToken, library.id, {
exclusionPatterns: ['**/directoryA/**', '**/directoryB/**'],
});
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(0);
expect(assets.items).toEqual([]);
}
});
it('should scan multiple import paths', async () => {
@@ -454,6 +529,133 @@ describe('/libraries', () => {
utils.removeImageFile(`${testAssetDir}/temp/folder${char}2/asset2.png`);
});
it('should respect exclusion patterns when using multiple import paths', async () => {
// https://github.com/immich-app/immich/issues/17121
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp/exclusion/`, `${testAssetDirInternal}/temp/exclusion2/`],
});
const excludedFolder = `Raw`;
utils.createImageFile(`${testAssetDir}/temp/exclusion/asset1.png`);
utils.createImageFile(`${testAssetDir}/temp/exclusion/${excludedFolder}/asset2.png`);
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.items).toEqual(
expect.arrayContaining([
expect.objectContaining({ originalPath: expect.stringContaining(`/asset1.png`) }),
expect.objectContaining({ originalPath: expect.stringContaining(`${excludedFolder}/asset2.png`) }),
]),
);
}
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.items).toEqual(
expect.arrayContaining([
expect.objectContaining({ originalPath: expect.stringContaining(`/asset1.png`) }),
expect.objectContaining({ originalPath: expect.stringContaining(`${excludedFolder}/asset2.png`) }),
]),
);
}
await utils.updateLibrary(admin.accessToken, library.id, { exclusionPatterns: [`**/${excludedFolder}/**`] });
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.items).toEqual([
expect.objectContaining({ originalPath: expect.stringContaining(`/asset1.png`) }),
]);
}
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.items).toEqual([
expect.objectContaining({ originalPath: expect.stringContaining(`/asset1.png`) }),
]);
}
utils.removeImageFile(`${testAssetDir}/temp/exclusion/asset1.png`);
utils.removeImageFile(`${testAssetDir}/temp/exclusion/${excludedFolder}/asset2.png`);
});
const annoyingExclusionPatterns = ['@', '#', '$', '%', '^', '&', '='];
it.each(annoyingExclusionPatterns)('should support exclusion patterns with %s', async (char) => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp/exclusion/`],
});
const excludedFolder = `${char}folder`;
utils.createImageFile(`${testAssetDir}/temp/exclusion/asset1.png`);
utils.createImageFile(`${testAssetDir}/temp/exclusion/${excludedFolder}/asset2.png`);
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.items).toEqual(
expect.arrayContaining([
expect.objectContaining({ originalPath: expect.stringContaining(`/asset1.png`) }),
expect.objectContaining({ originalPath: expect.stringContaining(`${excludedFolder}/asset2.png`) }),
]),
);
}
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.items).toEqual(
expect.arrayContaining([
expect.objectContaining({ originalPath: expect.stringContaining(`/asset1.png`) }),
expect.objectContaining({ originalPath: expect.stringContaining(`${excludedFolder}/asset2.png`) }),
]),
);
}
await utils.updateLibrary(admin.accessToken, library.id, { exclusionPatterns: [`**/${excludedFolder}/**`] });
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.items).toEqual([
expect.objectContaining({ originalPath: expect.stringContaining(`/asset1.png`) }),
]);
}
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.items).toEqual([
expect.objectContaining({ originalPath: expect.stringContaining(`/asset1.png`) }),
]);
}
utils.removeImageFile(`${testAssetDir}/temp/exclusion/asset1.png`);
utils.removeImageFile(`${testAssetDir}/temp/exclusion/${excludedFolder}/asset2.png`);
});
it('should reimport a modified file', async () => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
@@ -490,7 +692,7 @@ describe('/libraries', () => {
utils.removeImageFile(`${testAssetDir}/temp/reimport/asset.jpg`);
});
it('should not reimport unmodified files', async () => {
it('should not reimport a file with unchanged timestamp', async () => {
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp/reimport`],
@@ -933,6 +1135,8 @@ describe('/libraries', () => {
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(1);
utils.renameImageFile(`${testAssetDir}/temp/offline/offline.png`, `${testAssetDir}/temp/offline.png`);
await utils.scan(admin.accessToken, library.id);
@@ -963,6 +1167,58 @@ describe('/libraries', () => {
}
});
it('should set a trashed offline asset to online but keep it in trash', async () => {
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
const library = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
importPaths: [`${testAssetDirInternal}/temp/offline`],
});
await utils.scan(admin.accessToken, library.id);
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assets.count).toBe(1);
await utils.deleteAssets(admin.accessToken, [assets.items[0].id]);
{
const trashedAsset = await utils.getAssetInfo(admin.accessToken, assets.items[0].id);
expect(trashedAsset.isTrashed).toBe(true);
}
utils.renameImageFile(`${testAssetDir}/temp/offline/offline.png`, `${testAssetDir}/temp/offline.png`);
await utils.scan(admin.accessToken, library.id);
const offlineAsset = await utils.getAssetInfo(admin.accessToken, assets.items[0].id);
expect(offlineAsset.isTrashed).toBe(true);
expect(offlineAsset.originalPath).toBe(`${testAssetDirInternal}/temp/offline/offline.png`);
expect(offlineAsset.isOffline).toBe(true);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id, withDeleted: true });
expect(assets.count).toBe(1);
}
utils.renameImageFile(`${testAssetDir}/temp/offline.png`, `${testAssetDir}/temp/offline/offline.png`);
await utils.scan(admin.accessToken, library.id);
const backOnlineAsset = await utils.getAssetInfo(admin.accessToken, assets.items[0].id);
expect(backOnlineAsset.originalPath).toBe(`${testAssetDirInternal}/temp/offline/offline.png`);
expect(backOnlineAsset.isOffline).toBe(false);
expect(backOnlineAsset.isTrashed).toBe(true);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id, withDeleted: true });
expect(assets.count).toBe(1);
}
});
it('should not set an offline asset to online if its file exists, is not covered by an exclusion pattern, but is outside of all import paths', async () => {
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
@@ -1024,16 +1280,17 @@ describe('/libraries', () => {
await utils.scan(admin.accessToken, library.id);
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
{
const { assets: assetsBefore } = await utils.searchAssets(admin.accessToken, { libraryId: library.id });
expect(assetsBefore.count).toBe(1);
}
utils.renameImageFile(`${testAssetDir}/temp/offline/offline.png`, `${testAssetDir}/temp/offline.png`);
await utils.scan(admin.accessToken, library.id);
{
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id, withDeleted: true });
expect(assets.count).toBe(1);
}
const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id, withDeleted: true });
expect(assets.count).toBe(1);
const offlineAsset = await utils.getAssetInfo(admin.accessToken, assets.items[0].id);
+2 -2
View File
@@ -201,7 +201,7 @@ describe('/people', () => {
expect(body).toMatchObject({
id: expect.any(String),
name: 'New Person',
birthDate: '1990-01-01T00:00:00.000Z',
birthDate: '1990-01-01',
});
});
@@ -262,7 +262,7 @@ describe('/people', () => {
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ birthDate: '1990-01-01' });
expect(status).toBe(200);
expect(body).toMatchObject({ birthDate: '1990-01-01T00:00:00.000Z' });
expect(body).toMatchObject({ birthDate: '1990-01-01' });
});
it('should clear a date of birth', async () => {
+2 -2
View File
@@ -633,7 +633,6 @@ describe('/search', () => {
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual([
'Andalusia',
'Berlin',
'Glarus',
'Greater Accra',
'Havana',
@@ -642,6 +641,7 @@ describe('/search', () => {
'Mississippi',
'New York',
'Shanghai',
'State of Berlin',
'St.-Petersburg',
'Tbilisi',
'Tokyo',
@@ -657,7 +657,6 @@ describe('/search', () => {
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual([
'Andalusia',
'Berlin',
'Glarus',
'Greater Accra',
'Havana',
@@ -666,6 +665,7 @@ describe('/search', () => {
'Mississippi',
'New York',
'Shanghai',
'State of Berlin',
'St.-Petersburg',
'Tbilisi',
'Tokyo',
+1 -1
View File
@@ -117,7 +117,7 @@ describe('/shared-links', () => {
const resp = await request(shareUrl).get(`/${linkWithAssets.key}`);
expect(resp.status).toBe(200);
expect(resp.header['content-type']).toContain('text/html');
expect(resp.text).toContain(`<meta property="og:image" content="http://`);
expect(resp.text).toContain(`<meta property="og:image" content="https://my.immich.app`);
});
});
+5 -5
View File
@@ -22,7 +22,7 @@ const tests: Test[] = [
},
{
test: 'should support paths with an asterisk',
paths: [`/photos\*/image1.jpg`],
paths: [`/photos*/image1.jpg`],
files: {
'/photos*/image1.jpg': true,
'/photos*/image2.jpg': false,
@@ -40,7 +40,7 @@ const tests: Test[] = [
},
{
test: 'should support paths with a single quote',
paths: [`/photos\'/image1.jpg`],
paths: [`/photos'/image1.jpg`],
files: {
"/photos'/image1.jpg": true,
"/photos'/image2.jpg": false,
@@ -49,7 +49,7 @@ const tests: Test[] = [
},
{
test: 'should support paths with a double quote',
paths: [`/photos\"/image1.jpg`],
paths: [`/photos"/image1.jpg`],
files: {
'/photos"/image1.jpg': true,
'/photos"/image2.jpg': false,
@@ -67,7 +67,7 @@ const tests: Test[] = [
},
{
test: 'should support paths with an opening brace',
paths: [`/photos\{/image1.jpg`],
paths: [`/photos{/image1.jpg`],
files: {
'/photos{/image1.jpg': true,
'/photos{/image2.jpg': false,
@@ -76,7 +76,7 @@ const tests: Test[] = [
},
{
test: 'should support paths with a closing brace',
paths: [`/photos\}/image1.jpg`],
paths: [`/photos}/image1.jpg`],
files: {
'/photos}/image1.jpg': true,
'/photos}/image2.jpg': false,
+8 -3
View File
@@ -28,6 +28,7 @@ import {
deleteAssets,
getAllJobsStatus,
getAssetInfo,
getConfig,
getConfigDefaults,
login,
scanLibrary,
@@ -121,6 +122,7 @@ const execPromise = promisify(exec);
const onEvent = ({ event, id }: { event: EventType; id: string }) => {
// console.log(`Received event: ${event} [id=${id}]`);
const set = events[event];
set.add(id);
const idCallback = idCallbacks[id];
@@ -415,6 +417,8 @@ export const utils = {
rmSync(path, { recursive: true });
},
getSystemConfig: (accessToken: string) => getConfig({ headers: asBearerAuth(accessToken) }),
getAssetInfo: (accessToken: string, id: string) => getAssetInfo({ id }, { headers: asBearerAuth(accessToken) }),
checkExistingAssets: (accessToken: string, checkExistingAssetsDto: CheckExistingAssetsDto) =>
@@ -489,7 +493,7 @@ export const utils = {
value: accessToken,
domain,
path: '/',
expires: 1_742_402_728,
expires: 2_058_028_213,
httpOnly: true,
secure: false,
sameSite: 'Lax',
@@ -499,7 +503,7 @@ export const utils = {
value: 'password',
domain,
path: '/',
expires: 1_742_402_728,
expires: 2_058_028_213,
httpOnly: true,
secure: false,
sameSite: 'Lax',
@@ -509,7 +513,7 @@ export const utils = {
value: 'true',
domain,
path: '/',
expires: 1_742_402_728,
expires: 2_058_028_213,
httpOnly: false,
secure: false,
sameSite: 'Lax',
@@ -533,6 +537,7 @@ export const utils = {
},
waitForQueueFinish: (accessToken: string, queue: keyof AllJobStatusResponseDto, ms?: number) => {
// eslint-disable-next-line no-async-promise-executor
return new Promise<void>(async (resolve, reject) => {
const timeout = setTimeout(() => reject(new Error('Timed out waiting for queue to empty')), ms || 10_000);
+1 -1
View File
@@ -44,7 +44,7 @@ test.describe('Photo Viewer', () => {
const { x, y, width, height } = box!;
await page.mouse.move(x + width / 2, y + height / 2);
await page.mouse.wheel(0, -1);
await expect.poll(async () => await imageLocator(page).getAttribute('src')).toContain('original');
await expect.poll(async () => await imageLocator(page).getAttribute('src')).toContain('fullsize');
});
test('reloads photo when checksum changes', async ({ page }) => {
+1 -1
View File
@@ -45,7 +45,7 @@ test.describe('Shared Links', () => {
await page.goto(`/share/${sharedLink.key}`);
await page.getByRole('heading', { name: 'Test Album' }).waitFor();
await page.locator(`[data-asset-id="${asset.id}"]`).hover();
await page.waitForSelector('#asset-group-by-date svg');
await page.waitForSelector('[data-group] svg');
await page.getByRole('checkbox').click();
await page.getByRole('button', { name: 'Download' }).click();
await page.getByText('DOWNLOADING', { exact: true }).waitFor();
+13 -5
View File
@@ -1,5 +1,5 @@
{
"about": "Verfris",
"about": "Oor",
"account": "Rekening",
"account_settings": "Rekeninginstellings",
"acknowledge": "Erken",
@@ -56,15 +56,16 @@
"duplicate_detection_job_description": "Begin masjienleer op bates om soortgelyke beelde op te spoor. Maak staat op Smart Search",
"exclusion_pattern_description": "Met uitsluitingspatrone kan jy l├кers en vouers ignoreer wanneer jy jou biblioteek skandeer. Dit is nuttig as jy vouers het wat l├кers bevat wat jy nie wil invoer nie, soos RAW-l├кers.",
"external_library_created_at": "Eksterne biblioteek (geskep op {date})",
"external_library_management": "Eksterne Biblioteek-opsies",
"face_detection": "Gesigsopsporing",
"external_library_management": "Eksterne Biblioteekbestuur",
"face_detection": "Gesig deteksie",
"failed_job_command": "Opdrag {command} het misluk vir werk: {job}",
"force_delete_user_warning": "WAARSKUWING: Dit sal onmiddellik die gebruiker en alle bates verwyder. Dit kan nie ontdoen word nie en die l├кers kan nie herstel word nie.",
"forcing_refresh_library_files": "Forseer herlaai van alle biblioteekl├кers",
"image_format": "Formaat",
"image_format_description": "WebP produseer kleiner l├кers as JPEG, maar is stadiger om te enkodeer.",
"image_prefer_embedded_preview": "Verkies ingebedde voorskou",
"image_prefer_wide_gamut": "Verkies wye spektrum",
"image_prefer_wide_gamut": "Verkies wide gamut",
"image_prefer_wide_gamut_setting_description": "Gebruik Display P3 vir kleinkiekies. Dit behou die lewendheid van beelde met wye kleurruimtes beter, maar beelde kan anders verskyn op ou apparate met 'n ou blaaierweergawe. sRGB-beelde gebruik steeds sRGB om kleurverskuiwings te voorkom.",
"image_preview_description": "Mediumgrootte prent met gestroopte metadata, wat gebruik word wanneer 'n enkele bate bekyk word en vir masjienleer",
"image_preview_quality_description": "Voorskou kwaliteit van 1-100. Ho├лr is beter, maar produseer groter l├кers en kan app-reaksie verminder. Die stel van 'n lae waarde kan masjienleerkwaliteit be├пnvloed.",
"image_preview_title": "Voorskou Instellings",
@@ -72,7 +73,14 @@
"image_resolution": "Resolusie",
"image_resolution_description": "Ho├лr resolusies kan meer detail bewaar, maar neem langer om te enkodeer, het groter l├кergroottes en kan app-reaksie verminder.",
"image_settings": "Prent Instellings",
"image_settings_description": "Bestuur die kwaliteit en resolusie van gegenereerde beelde"
"image_settings_description": "Bestuur die kwaliteit en resolusie van gegenereerde beelde",
"image_thumbnail_description": "Klein kleinkiekies sonder metadata, gebruik om groepe foto's soos die tydlyn te bekyk",
"image_thumbnail_quality_description": "Kleinkiekiekwaliteit van 1-100. Ho├лr is beter, maar produseer groter l├кers en kan die toepassing vertraag.",
"image_thumbnail_title": "Kleinkiekie-instellings",
"job_concurrency": "{job} gelyktydigheid",
"job_created": "Taak gemaak",
"job_not_concurrency_safe": "Hierdie taak kan nie gelyktydig uitgevoer word nie.",
"job_settings": "Agtergrondtaakinstellings"
},
"search_by_description": "Soek by beskrywing",
"search_by_description_example": "Stapdag in Sapa"
+22 -3
View File
@@ -41,6 +41,7 @@
"backup_settings": "╪е╪╣╪п╪з╪п╪з╪к ╪з┘Д┘Ж╪│╪о ╪з┘Д╪з╪н╪к┘К╪з╪╖┘К",
"backup_settings_description": "╪е╪п╪з╪▒╪й ╪е╪╣╪п╪з╪п╪з╪к ╪з┘Д┘Ж╪│╪о ╪з┘Д╪з╪н╪к┘К╪з╪╖┘К ┘Д┘В╪з╪╣╪п╪й ╪з┘Д╪и┘К╪з┘Ж╪з╪к",
"check_all": "╪з╪о╪к╪▒ ╪з┘Д┘Г┘Д",
"cleanup": "╪к┘Ж╪╕┘К┘Б",
"cleared_jobs": "╪к┘Е ╪е╪о┘Д╪з╪б ┘Е┘З╪з┘Е: {job}",
"config_set_by_file": "╪з┘Д╪е╪╣╪п╪з╪п╪з╪к ╪н╪з┘Д┘К┘Л╪з ┘Е╪╣┘К┘Ж╪й ╪╣┘Ж ╪╖╪▒┘К┘В ┘Е┘Д┘Б ╪з┘Д╪з╪╣╪п╪з╪п╪з╪к",
"confirm_delete_library": "┘З┘Д ╪г┘Ж╪к ┘Е╪к╪г┘Г╪п ╪г┘Ж┘Г ╪к╪▒┘К╪п ╪н╪░┘Б ┘Е┘Г╪к╪и╪й {library}╪Я",
@@ -96,7 +97,7 @@
"library_scanning_enable_description": "╪к┘Б╪╣┘К┘Д ┘Б╪н╪╡ ╪з┘Д┘Е┘Г╪к╪и╪й ╪з┘Д╪п┘И╪▒┘К",
"library_settings": "╪з┘Д┘Е┘Г╪к╪и╪й ╪з┘Д╪о╪з╪▒╪м┘К╪й",
"library_settings_description": "╪е╪п╪з╪▒╪й ╪е╪╣╪п╪з╪п╪з╪к ╪з┘Д┘Е┘Г╪к╪и╪й ╪з┘Д╪о╪з╪▒╪м┘К╪й",
"library_tasks_description": "┘В┘Е ╪и╪к┘Ж┘Б┘К╪░ ┘Е┘З╪з┘Е ╪з┘Д┘Е┘Г╪к╪и╪й",
"library_tasks_description": "┘Е╪│╪н ╪з┘Д┘Е┘Г╪к╪и╪з╪к ╪з┘Д╪о╪з╪▒╪м┘К╪й ┘Д┘Д╪╣╪л┘И╪▒ ╪╣┘Д┘Й ╪з┘Д╪г╪╡┘И┘Д ╪з┘Д╪м╪п┘К╪п╪й ┘И/╪г┘И ╪з┘Д┘Е╪к╪║┘К╪▒╪й",
"library_watching_enable_description": "╪▒╪з┘В╪и ╪з┘Д┘Е┘Г╪к╪и╪з╪к ╪з┘Д╪о╪з╪▒╪м┘К╪й ┘Д╪к╪к╪и╪╣ ╪к╪║┘К┘К╪▒╪з╪к ╪з┘Д┘Е┘Д┘Б╪з╪к",
"library_watching_settings": "┘Е╪▒╪з┘В╪и╪й ╪з┘Д┘Е┘Г╪к╪и╪з╪к (╪к╪м╪▒┘К╪и┘К)",
"library_watching_settings_description": "╪▒╪з┘В╪и ╪к┘Д┘В╪з╪ж┘К┘Л╪з ╪з┘Д╪к╪║┘К┘К╪▒╪з╪к ┘Б┘К ╪з┘Д┘Е┘Д┘Б╪з╪к",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "╪з┘Д╪и╪н╪л ╪╣┘Ж ╪з┘Д╪╡┘И╪▒ ╪и╪┤┘Г┘Д ╪п┘Д╪з┘Д┘К ╪и╪з╪│╪к╪о╪п╪з┘Е ╪к╪╢┘Е┘К┘Ж╪з╪к CLIP",
"machine_learning_smart_search_enabled": "╪к┘Б╪╣┘К┘Д ╪з┘Д╪и╪н╪л ╪з┘Д╪░┘Г┘К",
"machine_learning_smart_search_enabled_description": "╪е╪░╪з ╪к┘Е ╪к╪╣╪╖┘К┘Д┘З╪М ┘Б┘Д┘Ж ┘К╪к┘Е ╪к╪▒┘Е┘К╪▓ ╪з┘Д╪╡┘И╪▒ ┘Д┘Д╪и╪н╪л ╪з┘Д╪░┘Г┘К.",
"machine_learning_url_description": "╪╣┘Ж┘И╪з┘Ж URL ┘Д╪о╪з╪п┘Е ╪з┘Д╪к╪╣┘Д┘Е ╪з┘Д╪в┘Д┘К. ╪е╪░╪з ╪к┘Е ╪к┘И┘Б┘К╪▒ ╪г┘Г╪л╪▒ ┘Е┘Ж ╪╣┘Ж┘И╪з┘Ж URL╪М ┘Б╪│┘К╪к┘Е ┘Е╪н╪з┘И┘Д╪й ╪з┘Д┘И╪╡┘И┘Д ╪е┘Д┘Й ┘Г┘Д ╪о╪з╪п┘Е ╪╣┘Д┘Й ╪н╪п╪й ╪н╪к┘Й ┘К╪│╪к╪м┘К╪и ╪г╪н╪п ╪з┘Д╪о┘И╪з╪п┘Е ╪и┘Ж╪м╪з╪н╪М ╪и╪з┘Д╪к╪▒╪к┘К╪и ┘Е┘Ж ╪з┘Д╪г┘И┘Д ╪е┘Д┘Й ╪з┘Д╪г╪о┘К╪▒.",
"machine_learning_url_description": "╪╣┘Ж┘И╪з┘Ж URL ┘Д╪о╪з╪п┘Е ╪з┘Д╪к╪╣┘Д┘Е ╪з┘Д╪в┘Д┘К. ╪е╪░╪з ╪к┘Е ╪к┘И┘Б┘К╪▒ ╪г┘Г╪л╪▒ ┘Е┘Ж ╪╣┘Ж┘И╪з┘Ж URL ┘И╪з╪н╪п╪М ╪│┘К╪к┘Е ┘Е╪н╪з┘И┘Д╪й ╪з┘Д╪з╪к╪╡╪з┘Д ╪и┘Г┘Д ╪о╪з╪п┘Е ╪╣┘Д┘Й ╪н╪п╪й ╪н╪к┘Й ┘К╪│╪к╪м┘К╪и ╪г╪н╪п┘З┘Е ╪и┘Ж╪м╪з╪н╪М ╪и╪п╪б┘Л╪з ┘Е┘Ж ╪з┘Д╪г┘И┘Д ╪е┘Д┘Й ╪з┘Д╪г╪о┘К╪▒. ╪│┘К╪к┘Е ╪к╪м╪з┘З┘Д ╪з┘Д╪о┘И╪з╪п┘Е ╪з┘Д╪к┘К ┘Д╪з ╪к╪│╪к╪м┘К╪и ┘Е╪д┘В╪к┘Л╪з ╪н╪к┘Й ╪к╪╣┘И╪п ┘Д┘Д╪╣┘Е┘Д.",
"manage_concurrency": "╪е╪п╪з╪▒╪й ╪з┘Д╪к╪▓╪з┘Е┘Ж",
"manage_log_settings": "╪е╪п╪з╪▒╪й ╪е╪╣╪п╪з╪п╪з╪к ╪з┘Д╪│╪м┘Д╪з╪к",
"map_dark_style": "╪з┘Д┘Ж┘Е╪╖ ╪з┘Д╪п╪з┘Г┘Ж",
@@ -147,6 +148,8 @@
"map_settings": "╪з┘Д╪о╪▒┘К╪╖╪й",
"map_settings_description": "╪е╪п╪з╪▒╪й ╪е╪╣╪п╪з╪п╪з╪к ╪з┘Д╪о╪▒┘К╪╖╪й",
"map_style_description": "╪╣┘Ж┘И╪з┘Ж URL ┘Д╪│┘Е╪й ╪з┘Д╪о╪▒┘К╪╖╪й style.json",
"memory_cleanup_job": "╪к┘Ж╪╕┘К┘Б ╪з┘Д╪░╪з┘Г╪▒╪й",
"memory_generate_job": "╪к┘И┘Д┘К╪п ╪з┘Д╪░╪з┘Г╪▒╪й",
"metadata_extraction_job": "╪з╪│╪к╪о╪▒╪з╪м ╪з┘Д╪и┘К╪з┘Ж╪з╪к ╪з┘Д┘И╪╡┘Б┘К╪й",
"metadata_extraction_job_description": "╪з╪│╪к╪о╪▒╪з╪м ┘Е╪╣┘Д┘И┘Е╪з╪к ╪з┘Д╪и┘К╪з┘Ж╪з╪к ╪з┘Д┘И╪╡┘Б┘К╪й ┘Е┘Ж ┘Г┘Д ╪г╪╡┘Д╪М ┘Е╪л┘Д ╪е╪н╪п╪з╪л┘К╪з╪к ╪з┘Д┘Е┘И┘В╪╣, ╪з┘Д┘И╪м┘И┘З ┘И╪з┘Д╪п┘В╪й",
"metadata_faces_import_setting": "╪к┘Е┘Г┘К┘Ж ╪з╪│╪к┘К╪▒╪з╪п ╪з┘Д┘И╪м┘З",
@@ -391,6 +394,7 @@
"allow_edits": "╪е╪│┘Е╪н ╪и╪з┘Д╪к╪╣╪п┘К┘Д",
"allow_public_user_to_download": "╪з┘Д╪│┘Е╪з╪н ┘Д╪г┘К ┘Е╪│╪к╪о╪п┘Е ╪╣╪з┘Е ╪и╪з┘Д╪к┘Ж╪▓┘К┘Д",
"allow_public_user_to_upload": "╪з┘Д╪│┘Е╪з╪н ┘Д┘Д┘Е╪│╪к╪о╪п┘Е ╪з┘Д╪╣╪з┘Е ╪и╪з┘Д╪▒┘Б╪╣",
"alt_text_qr_code": "╪╡┘И╪▒╪й ╪▒┘Е╪▓ ╪з┘Д╪з╪│╪к╪м╪з╪и╪й ╪з┘Д╪│╪▒┘К╪╣╪й (QR)",
"anti_clockwise": "╪╣┘Г╪│ ╪з╪к╪м╪з┘З ╪╣┘В╪з╪▒╪и ╪з┘Д╪│╪з╪╣╪й",
"api_key": "┘Е┘Б╪к╪з╪н ┘И╪з╪м┘З╪й ╪и╪▒┘Е╪м╪й ╪з┘Д╪к╪╖╪и┘К┘В╪з╪к",
"api_key_description": "╪│┘К╪к┘Е ╪╣╪▒╪╢ ┘З╪░┘З ╪з┘Д┘В┘К┘Е╪й ┘Е╪▒╪й ┘И╪з╪н╪п╪й ┘Б┘В╪╖. ┘К╪▒╪м┘Й ╪з┘Д╪к╪г┘Г╪п ┘Е┘Ж ┘Ж╪│╪о┘З╪з ┘В╪и┘Д ╪е╪║┘Д╪з┘В ╪з┘Д┘Ж╪з┘Б╪░╪й.",
@@ -481,6 +485,7 @@
"comments_are_disabled": "╪з┘Д╪к╪╣┘Д┘К┘В╪з╪к ┘Е╪╣╪╖┘Д╪й",
"confirm": "╪к╪г┘Г┘К╪п",
"confirm_admin_password": "╪к╪г┘Г┘К╪п ┘Г┘Д┘Е╪й ┘Е╪▒┘И╪▒ ╪з┘Д┘Е╪│╪д┘И┘Д",
"confirm_delete_face": "┘З┘Д ╪г┘Ж╪к ┘Е╪к╪г┘Г╪п ┘Е┘Ж ╪н╪░┘Б ┘И╪м┘З {name} ┘Е┘Ж ╪з┘Д╪г╪╡┘И┘Д╪Я",
"confirm_delete_shared_link": "┘З┘Д ╪г┘Ж╪к ┘Е╪к╪г┘Г╪п ╪г┘Ж┘Г ╪к╪▒┘К╪п ╪н╪░┘Б ┘З╪░╪з ╪з┘Д╪▒╪з╪и╪╖ ╪з┘Д┘Е╪┤╪к╪▒┘Г╪Я",
"confirm_keep_this_delete_others": "╪│┘К╪к┘Е ╪н╪░┘Б ╪м┘Е┘К╪╣ ╪з┘Д╪г╪╡┘И┘Д ╪з┘Д╪г╪о╪▒┘Й ┘Б┘К ╪з┘Д┘Е╪м┘Е┘И╪╣╪й ╪и╪з╪│╪к╪л┘Ж╪з╪б ┘З╪░╪з ╪з┘Д╪г╪╡┘Д. ┘З┘Д ╪г┘Ж╪к ┘Е╪к╪г┘Г╪п ┘Е┘Ж ╪г┘Ж┘Г ╪к╪▒┘К╪п ╪з┘Д┘Е╪к╪з╪и╪╣╪й╪Я",
"confirm_password": "╪к╪г┘Г┘К╪п ┘Г┘Д┘Е╪й ╪з┘Д┘Е╪▒┘И╪▒",
@@ -533,6 +538,7 @@
"delete_album": "╪н╪░┘Б ╪з┘Д╪г┘Д╪и┘И┘Е",
"delete_api_key_prompt": "┘З┘Д ╪г┘Ж╪к ┘Е╪к╪г┘Г╪п ╪г┘Ж┘Г ╪к╪▒┘К╪п ╪н╪░┘Б ┘Е┘Б╪к╪з╪н API ┘З╪░╪з╪Я",
"delete_duplicates_confirmation": "┘З┘Д ╪г┘Ж╪к ┘Е╪к╪г┘Г╪п ╪г┘Ж┘Г ╪к╪▒┘К╪п ╪н╪░┘Б ┘З╪░┘З ╪з┘Д╪к┘Г╪▒╪з╪▒╪з╪к ┘Ж┘З╪з╪ж┘К┘Л╪з╪Я",
"delete_face": "╪н╪░┘Б ╪з┘Д┘И╪м┘З",
"delete_key": "╪н╪░┘Б ╪з┘Д┘Е┘Б╪к╪з╪н",
"delete_library": "╪н╪░┘Б ╪з┘Д┘Е┘Г╪к╪и╪й",
"delete_link": "╪н╪░┘Б ╪з┘Д╪▒╪з╪и╪╖",
@@ -600,6 +606,7 @@
"enabled": "┘Е┘Б╪╣┘Д",
"end_date": "╪к╪з╪▒┘К╪о ╪з┘Д╪е┘Ж╪к┘З╪з╪б",
"error": "╪о╪╖╪г",
"error_delete_face": "╪н╪п╪л ╪о╪╖╪г ┘Б┘К ╪н╪░┘Б ╪з┘Д┘И╪м┘З ┘Е┘Ж ╪з┘Д╪г╪╡┘И┘Д",
"error_loading_image": "╪н╪п╪л ╪о╪╖╪г ╪г╪л┘Ж╪з╪б ╪к╪н┘Е┘К┘Д ╪з┘Д╪╡┘И╪▒╪й",
"error_title": "╪о╪╖╪г - ╪н╪п╪л ╪о┘Д┘Д┘М ┘Е╪з",
"errors": {
@@ -769,7 +776,7 @@
"group_country": "┘Е╪м┘Е┘И╪╣╪й ╪з┘Д╪и┘Д╪п",
"group_no": "╪и╪п┘И┘Ж ╪к╪м┘Е┘К╪╣",
"group_owner": "╪к╪м┘Е┘К╪╣ ╪н╪│╪и ╪з┘Д┘Е╪з┘Д┘Г",
"group_places_by": "╪к╪м┘Е┘К╪╣ ╪з┘Д╪г┘Е╪з┘Г┘Ж ╪н╪│╪и",
"group_places_by": "╪к╪м┘Е┘К╪╣ ╪з┘Д╪г┘Е╪з┘Г┘Ж ╪н╪│╪и...",
"group_year": "╪к╪м┘Е┘К╪╣ ╪н╪│╪и ╪з┘Д╪│┘Ж╪й",
"has_quota": "┘Е╪н╪п╪п ╪и╪н╪╡╪й",
"hi_user": "┘Е╪▒╪н╪и╪з {name} ({email})",
@@ -884,6 +891,7 @@
"month": "╪┤┘З╪▒",
"more": "╪з┘Д┘Е╪▓┘К╪п",
"moved_to_trash": "╪к┘Е ╪з┘Д┘Ж┘В┘Д ╪е┘Д┘Й ╪│┘Д╪й ╪з┘Д┘Е┘З┘Е┘Д╪з╪к",
"mute_memories": "┘Г╪к┘Е ╪з┘Д╪░┘Г╪▒┘К╪з╪к",
"my_albums": "╪г┘Д╪и┘И┘Е╪з╪к┘К",
"name": "╪з┘Д╪з╪│┘Е",
"name_or_nickname": "╪з┘Д╪з╪│┘Е ╪г┘И ╪з┘Д┘Д┘В╪и",
@@ -979,6 +987,7 @@
"permanently_deleted_asset": "╪к┘Е ╪н╪░┘Б ╪з┘Д╪г╪╡┘Д ╪и╪┤┘Г┘Д ┘Ж┘З╪з╪ж┘К",
"permanently_deleted_assets_count": "╪к┘Е ╪н╪░┘Б {count, plural, one {# ┘Е╪н╪к┘И┘Й} other {# ╪з┘Д┘Е╪н╪к┘И┘К╪з╪к}} ┘Ж┘З╪з╪ж┘К┘Л╪з",
"person": "╪┤╪о╪╡",
"person_birthdate": "╪к╪з╪▒┘К╪о ╪з┘Д┘Е┘К┘Д╪з╪п {╪з┘Д╪к╪з╪▒┘К╪о}",
"person_hidden": "{name}{hidden, select, true { (┘Е╪о┘Б┘К)} other {}}",
"photo_shared_all_users": "┘К╪и╪п┘И ╪г┘Ж┘Г ╪┤╪з╪▒┘Г╪к ╪╡┘И╪▒┘Г ┘Е╪╣ ╪м┘Е┘К╪╣ ╪з┘Д┘Е╪│╪к╪о╪п┘Е┘К┘Ж ╪г┘И ┘Д┘К╪│ ┘Д╪п┘К┘Г ╪г┘К ┘Е╪│╪к╪о╪п┘Е ┘Д┘Д┘Е╪┤╪з╪▒┘Г╪й ┘Е╪╣┘З.",
"photos": "╪з┘Д╪╡┘И╪▒",
@@ -1070,12 +1079,16 @@
"remove_from_album": "╪е╪▓╪з┘Д╪й ┘Е┘Ж ╪з┘Д╪г┘Д╪и┘И┘Е",
"remove_from_favorites": "╪е╪▓╪з┘Д╪й ┘Е┘Ж ╪з┘Д┘Е┘Б╪╢┘Д╪й",
"remove_from_shared_link": "╪е╪▓╪з┘Д╪й ┘Е┘Ж ╪з┘Д╪▒╪з╪и╪╖ ╪з┘Д┘Е╪┤╪к╪▒┘Г",
"remove_memory": "╪е╪▓╪з┘Д╪й ╪з┘Д╪░╪з┘Г╪▒╪й",
"remove_photo_from_memory": "╪е╪▓╪з┘Д╪й ╪з┘Д╪╡┘И╪▒╪й ┘Е┘Ж ┘З╪░┘З ╪з┘Д╪░┘Г╪▒┘Й",
"remove_url": "╪е╪▓╪з┘Д╪й ╪╣┘Ж┘И╪з┘Ж URL",
"remove_user": "╪е╪▓╪з┘Д╪й ╪з┘Д┘Е╪│╪к╪о╪п┘Е",
"removed_api_key": "╪к┘Е ╪е╪▓╪з┘Д╪й ┘Е┘Б╪к╪з╪н API: {name}",
"removed_from_archive": "╪к┘Е╪к ╪е╪▓╪з┘Д╪к┘З╪з ┘Е┘Ж ╪з┘Д╪г╪▒╪┤┘К┘Б",
"removed_from_favorites": "╪к┘Е╪к ╪з┘Д╪е╪▓╪з┘Д╪й ┘Е┘Ж ╪з┘Д┘Е┘Б╪╢┘Д╪й",
"removed_from_favorites_count": "{count, plural, other {╪г┘П╪▓┘К┘Д╪к #}} ┘Е┘Ж ╪з┘Д╪к┘Б╪╢┘К┘Д╪з╪к",
"removed_memory": "╪з┘Д╪░╪з┘Г╪▒╪й ╪з┘Д┘Е╪н╪░┘И┘Б╪й",
"removed_photo_from_memory": "╪к┘Е ╪е╪▓╪з┘Д╪й ╪з┘Д╪╡┘И╪▒╪й ┘Е┘Ж ╪з┘Д╪░╪з┘Г╪▒╪й",
"removed_tagged_assets": "╪к┘Е╪к ╪е╪▓╪з┘Д╪й ╪з┘Д╪╣┘Д╪з┘Е╪й ┘Е┘Ж {count, plural, one {# ╪з┘Д╪г╪╡┘Д} other {# ╪з┘Д╪г╪╡┘И┘Д}}",
"rename": "╪е╪╣╪з╪п╪й ╪к╪│┘Е┘К╪й",
"repair": "╪е╪╡┘Д╪з╪н",
@@ -1084,6 +1097,7 @@
"repository": "╪з┘Д┘Е╪│╪к┘И╪п╪╣",
"require_password": "┘К╪к╪╖┘Д╪и ┘Г┘Д┘Е╪й ╪з┘Д┘Е╪▒┘И╪▒",
"require_user_to_change_password_on_first_login": "┘Е╪╖╪з┘Д╪и╪й ╪з┘Д┘Е╪│╪к╪о╪п┘Е ╪и╪к╪║┘К┘К╪▒ ┘Г┘Д┘Е╪й ╪з┘Д┘Е╪▒┘И╪▒ ╪╣┘Ж╪п ╪к╪│╪м┘К┘Д ╪з┘Д╪п╪о┘И┘Д ┘Д╪г┘И┘Д ┘Е╪▒╪й",
"rescan": "╪е╪╣╪з╪п╪й ╪з┘Д┘Е╪│╪н",
"reset": "╪е╪╣╪з╪п╪й ╪╢╪и╪╖",
"reset_password": "╪е╪╣╪з╪п╪й ╪к╪╣┘К┘К┘Ж ┘Г┘Д┘Е╪й ╪з┘Д┘Е╪▒┘И╪▒",
"reset_people_visibility": "╪е╪╣╪з╪п╪й ╪╢╪и╪╖ ╪╕┘З┘И╪▒ ╪з┘Д╪г╪┤╪о╪з╪╡",
@@ -1127,6 +1141,7 @@
"search_options": "╪о┘К╪з╪▒╪з╪к ╪з┘Д╪и╪н╪л",
"search_people": "╪з┘Д╪и╪н╪л ╪╣┘Ж ╪з┘Д╪г╪┤╪о╪з╪╡",
"search_places": "╪з┘Д╪и╪н╪л ╪╣┘Ж ╪з┘Д╪г┘Е╪з┘Г┘Ж",
"search_rating": "╪з┘Д╪и╪н╪л ╪н╪│╪и ╪з┘Д╪к┘В┘К┘К┘Е...",
"search_settings": "╪е╪╣╪п╪з╪п╪з╪к ╪з┘Д╪и╪н╪л",
"search_state": "╪з┘Д╪и╪н╪л ╪н╪│╪и ╪з┘Д┘И┘Д╪з┘К╪й...",
"search_tags": "╪з┘Д╪и╪н╪л ╪╣┘Ж ╪з┘Д╪╣┘Д╪з┘Е╪з╪к...",
@@ -1136,6 +1151,7 @@
"searching_locales": "╪м╪з╪▒┘Н ╪з┘Д╪и╪н╪л ┘Б┘К ╪з┘Д┘Д╪║╪з╪к...",
"second": "╪л╪з┘Ж┘К╪й",
"see_all_people": "╪╣╪▒╪╢ ╪м┘Е┘К╪╣ ╪з┘Д╪г╪┤╪о╪з╪╡",
"select": "╪е╪о╪к╪▒",
"select_album_cover": "╪к╪н╪п┘К╪п ╪║┘Д╪з┘Б ╪з┘Д╪г┘Д╪и┘И┘Е",
"select_all": "╪к╪н╪п┘К╪п ╪з┘Д┘Г┘Д",
"select_all_duplicates": "╪к╪н╪п┘К╪п ╪м┘Е┘К╪╣ ╪з┘Д┘Ж╪│╪о ╪з┘Д┘Е┘Г╪▒╪▒╪й",
@@ -1250,6 +1266,7 @@
"tag_created": "╪к┘Е ╪е┘Ж╪┤╪з╪б ╪з┘Д╪╣┘Д╪з┘Е╪й: {tag}",
"tag_feature_description": "╪к╪╡┘Б╪н ╪з┘Д╪╡┘И╪▒ ┘И┘Е┘В╪з╪╖╪╣ ╪з┘Д┘Б┘К╪п┘К┘И ╪з┘Д┘Е╪м┘Е╪╣╪й ╪н╪│╪и ┘Е┘И╪з╪╢┘К╪╣ ╪з┘Д╪╣┘Д╪з┘Е╪з╪к ╪з┘Д┘Е┘Ж╪╖┘В┘К╪й",
"tag_not_found_question": "┘Д╪з ┘К┘Е┘Г┘Ж ╪з┘Д╪╣╪л┘И╪▒ ╪╣┘Д┘Й ╪╣┘Д╪з┘Е╪й╪Я <link>┘В┘Е ╪и╪е┘Ж╪┤╪з╪б ╪╣┘Д╪з┘Е╪й ╪м╪п┘К╪п╪й.</link>",
"tag_people": "╪╣┘Д┘Р┘С┘Е ╪з┘Д╪г╪┤╪о╪з╪╡",
"tag_updated": "╪к┘Е ╪к╪н╪п┘К╪л ╪з┘Д╪╣┘Д╪з┘Е╪й: {tag}",
"tagged_assets": "╪к┘Е ┘И╪╢╪╣ ╪╣┘Д╪з┘Е╪й {count, plural, one {# asset} other {# assets}}",
"tags": "╪з┘Д╪╣┘Д╪з┘Е╪з╪к",
@@ -1290,6 +1307,7 @@
"unlink_motion_video": "╪е┘Д╪║╪з╪б ╪▒╪и╪╖ ┘Б┘К╪п┘К┘И ╪з┘Д╪н╪▒┘Г╪й",
"unlink_oauth": "╪е┘Д╪║╪з╪б ╪▒╪и╪╖ OAuth",
"unlinked_oauth_account": "╪к┘Е ╪е┘Д╪║╪з╪б ╪▒╪и╪╖ ╪н╪│╪з╪и OAuth",
"unmute_memories": "╪к╪┤╪║┘К┘Д ╪з┘Д╪╡┘И╪к ┘Д┘Д╪░┘Г╪▒┘К╪з╪к",
"unnamed_album": "╪г┘Д╪и┘И┘Е ╪и┘Д╪з ╪е╪│┘Е",
"unnamed_album_delete_confirmation": "┘З┘Д ╪г┘Ж╪к ┘Е╪к╪г┘Г╪п ╪г┘Ж┘Г ╪к╪▒┘К╪п ╪н╪░┘Б ┘З╪░╪з ╪з┘Д╪г┘Д╪и┘И┘Е╪Я",
"unnamed_share": "┘Е╪┤╪з╪▒┘Г╪й ╪и┘Д╪з ╪е╪│┘Е",
@@ -1343,6 +1361,7 @@
"view_all": "╪╣╪▒╪╢ ╪з┘Д┘Г┘Д",
"view_all_users": "╪╣╪▒╪╢ ┘Г╪з┘Б╪й ╪з┘Д┘Е╪│╪к╪о╪п┘Е┘К┘Ж",
"view_in_timeline": "╪╣╪▒╪╢ ┘Б┘К ╪з┘Д╪м╪п┘И┘Д ╪з┘Д╪▓┘Е┘Ж┘К",
"view_link": "╪╣╪▒╪╢ ╪з┘Д╪▒╪з╪и╪╖",
"view_links": "╪╣╪▒╪╢ ╪з┘Д╪▒┘И╪з╪и╪╖",
"view_name": "╪╣╪▒╪╢",
"view_next_asset": "╪╣╪▒╪╢ ╪з┘Д┘Е╪н╪к┘И┘Й ╪з┘Д╪к╪з┘Д┘К",
+37 -11
View File
@@ -20,7 +20,7 @@
"add_partner": "╨Ф╨╛╨▒╨░╨▓╨╡╤В╨╡ ╨┐╨░╤А╤В╨╜╤М╨╛╤А",
"add_path": "╨Ф╨╛╨▒╨░╨▓╨╕ ╨┐╤К╤В",
"add_photos": "╨Ф╨╛╨▒╨░╨▓╨╡╤В╨╡ ╤Б╨╜╨╕╨╝╨║╨╕",
"add_to": "╨Ф╨╛╨▒╨░╨▓╨╕ ╨║╤К╨╝...",
"add_to": "╨Ф╨╛╨▒╨░╨▓╨╕ ╨║╤К╨╝тАж",
"add_to_album": "╨Ф╨╛╨▒╨░╨▓╨╕ ╨║╤К╨╝ ╨░╨╗╨▒╤Г╨╝",
"add_to_shared_album": "╨Ф╨╛╨▒╨░╨▓╨╕ ╨║╤К╨╝ ╤Б╨┐╨╛╨┤╨╡╨╗╨╡╨╜ ╨░╨╗╨▒╤Г╨╝",
"add_url": "╨Ф╨╛╨▒╨░╨▓╨╕ URL",
@@ -41,6 +41,7 @@
"backup_settings": "╨Э╨░╤Б╤В╤А╨╛╨╣╨║╨░ ╨╜╨░ ╤А╨╡╨╖╨╡╤А╨▓╨╜╨╕ ╨║╨╛╨┐╨╕╤П",
"backup_settings_description": "╨г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨╜╨░ ╨╜╨░╤Б╤В╤А╨╛╨╣╨║╨╕╤В╨╡ ╨╖╨░ ╤А╨╡╨╖╨╡╤А╨▓╨╜╨╛ ╨║╨╛╨┐╨╕╨╡ ╨╜╨░ ╨▒╨░╨╖╨░╤В╨░ ╨┤╨░╨╜╨╜╨╕",
"check_all": "╨Я╤А╨╛╨▓╨╡╤А╨╕ ╨▓╤Б╨╕╤З╨║╨╛",
"cleanup": "╨Я╨╛╤З╨╕╤Б╤В╨▓╨░╨╜╨╡",
"cleared_jobs": "╨Ш╨╖╤З╨╕╤Б╤В╨╡╨╜╨╕ ╨╖╨░╨┤╨░╤З╨╕ ╨╛╤В ╤В╨╕╨┐: {job}",
"config_set_by_file": "╨Ъ╨╛╨╜╤Д╨╕╨│╤Г╤А╨░╤Ж╨╕╤П╤В╨░ ╨╡ ╨╖╨░╨┤╨░╨┤╨╡╨╜╨░ ╨╛╤В ╤Д╨░╨╣╨╗",
"confirm_delete_library": "╨б╨╕╨│╤Г╤А╨╜╨╕ ╨╗╨╕ ╤Б╤В╨╡ ╤З╨╡ ╨╕╤Б╨║╨░╤В╨╡ ╨┤╨░ ╨╕╨╖╤В╤А╨╕╨╡╤В╨╡ ╨▒╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░╤В╨░ - {library} ?",
@@ -96,7 +97,7 @@
"library_scanning_enable_description": "╨Т╨║╨╗╤О╤З╨▓╨░╨╜╨╡ ╨╜╨░ ╨┐╨╡╤А╨╕╨╛╨┤╨╕╤З╨╜╨╛╤В╨╛ ╤Б╨║╨░╨╜╨╕╤А╨░╨╜╨╡ ╨╜╨░ ╨▒╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░╤В╨░",
"library_settings": "╨Т╤К╨╜╤И╨╜╨░ ╨▒╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░",
"library_settings_description": "╨г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨╜╨░ ╨╜╨░╤Б╤В╤А╨╛╨╣╨║╨╕╤В╨╡ ╨╖╨░ ╨▓╤К╨╜╤И╨╜╨░ ╨▒╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░",
"library_tasks_description": "╨Ш╨╖╨▓╤К╤А╤И╨▓╨░╨╜╨╡ ╨╜╨░ ╨╖╨░╨┤╨░╤З╨╕ ╨╖╨░ ╨▒╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░╤В╨░",
"library_tasks_description": "╨б╨║╨░╨╜╨╕╤А╨░╨╣╤В╨╡ ╨▓╤К╨╜╤И╨╜╨╕ ╨▒╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨╕ ╨╖╨░ ╨╜╨╛╨▓╨╕ ╨╕/╨╕╨╗╨╕ ╨┐╤А╨╛╨╝╨╡╨╜╨╡╨╜╨╕ ╨░╨║╤В╨╕╨▓╨╕",
"library_watching_enable_description": "╨Э╨░╨▒╨╗╤О╨┤╨░╨▓╨░╨╜╨╡ ╨╖╨░ ╨┐╤А╨╛╨╝╤П╨╜╨░ ╨╜╨░ ╤Д╨░╨╣╨╗╨╛╨▓╨╡╤В╨╡ ╨▓╤К╨▓ ╨▓╤К╨╜╤И╨╜╨░╤В╨░ ╨▒╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░",
"library_watching_settings": "╨Э╨░╨▒╨╗╤О╨┤╨░╨▓╨░╨╜╨╡ ╨╜╨░ ╨▒╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░╤В╨░ (╨Х╨Ъ╨б╨Я╨Х╨а╨Ш╨Ь╨Х╨Э╨в╨Р╨Ы╨Э╨Ю)",
"library_watching_settings_description": "╨Р╨▓╤В╨╛╨╝╨░╤В╨╕╤З╨╜╨╛ ╨╜╨░╨▒╨╗╤О╨┤╨░╨▓╨░╨╣ ╨╖╨░ ╨┐╤А╨╛╨╝╨╡╨╜╨╡╨╜╨╕ ╤Д╨░╨╣╨╗╨╛╨▓╨╡",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "╨б╨╡╨╝╨░╨╜╤В╨╕╤З╨╜╨╛ ╤В╤К╤А╤Б╨╡╨╜╨╡ ╨╜╨░ ╨╕╨╖╨╛╨▒╤А╨░╨╢╨╡╨╜╨╕╤П ╤Б ╨┐╨╛╨╝╨╛╤Й╤В╨░ ╨╜╨░ CLIP ╨▓╨│╤А╨░╨╢╨┤╨░╨╜╨╕╤П",
"machine_learning_smart_search_enabled": "╨Т╨║╨╗╤О╤З╨▓╨░╨╜╨╡ ╨╜╨░ ╨Ш╨╜╤В╨╡╨╗╨╕╨│╨╡╨╜╤В╨╜╨╛ ╨в╤К╤А╤Б╨╡╨╜╨╡",
"machine_learning_smart_search_enabled_description": "╨Р╨║╨╛ ╨╡ ╨┤╨╡╨░╨║╤В╨╕╨▓╨╕╤А╨░╨╜╨╛, ╨╕╨╖╨╛╨▒╤А╨░╨╢╨╡╨╜╨╕╤П╤В╨░ ╨╜╤П╨╝╨░ ╨┤╨░ ╨▒╤К╨┤╨░╤В ╨║╨╛╨┤╨╕╤А╨░╨╜╨╕ ╨╖╨░ ╨Ш╨╜╤В╨╡╨╗╨╕╨│╨╡╨╜╤В╨╜╨╛ ╨в╤К╤А╤Б╨╡╨╜╨╡.",
"machine_learning_url_description": "URL ╨╜╨░ ╤Б╤К╤А╨▓╤К╤А╨░ ╨╖╨░ ╨╝╨░╤И╨╕╨╜╨╜╨╛ ╨╛╨▒╤Г╤З╨╡╨╜╨╕╨╡. ╨Р╨║╨╛ ╤Б╨░ ╨┐╤А╨╡╨┤╨╛╤Б╤В╨░╨▓╨╡╨╜╨╕ ╨┐╨╛╨▓╨╡╤З╨╡ ╨╛╤В ╨╡╨┤╨╕╨╜ URL, ╨▓╤Б╨╡╨║╨╕ ╤Б╤К╤А╨▓╤К╤А ╤Й╨╡ ╨▒╤К╨┤╨╡ ╨╛╨┐╨╕╤В╨░╨╜ ╨╡╨┤╨╕╨╜ ╨┐╨╛ ╨╡╨┤╨╕╨╜, ╨┤╨╛╨║╨░╤В╨╛ ╨╡╨┤╨╕╨╜ ╨╜╨╡ ╨╛╤В╨│╨╛╨▓╨╛╤А╨╕ ╤Г╤Б╨┐╨╡╤И╨╜╨╛, ╨▓ ╤А╨╡╨┤╨░ ╨╛╤В ╨┐╤К╤А╨▓╨╕╤П ╨┤╨╛ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╤П.",
"machine_learning_url_description": "URL ╨╜╨░ ╤Б╤К╤А╨▓╤К╤А╨░ ╨╖╨░ ╨╝╨░╤И╨╕╨╜╨╜╨╛ ╨╛╨▒╤Г╤З╨╡╨╜╨╕╨╡. ╨Р╨║╨╛ ╤Б╨░ ╨┐╤А╨╡╨┤╨╛╤Б╤В╨░╨▓╨╡╨╜╨╕ ╨┐╨╛╨▓╨╡╤З╨╡ ╨╛╤В ╨╡╨┤╨╕╨╜ URL, ╨▓╤Б╨╡╨║╨╕ ╤Б╤К╤А╨▓╤К╤А ╤Й╨╡ ╨▒╤К╨┤╨╡ ╨╛╨┐╨╕╤В╨░╨╜ ╨╡╨┤╨╕╨╜ ╨┐╨╛ ╨╡╨┤╨╕╨╜, ╨┤╨╛╨║╨░╤В╨╛ ╨╡╨┤╨╕╨╜ ╨╛╤В╨│╨╛╨▓╨╛╤А╨╕ ╤Г╤Б╨┐╨╡╤И╨╜╨╛, ╨▓ ╤А╨╡╨┤╨░ ╨╛╤В ╨┐╤К╤А╨▓╨╕╤П ╨┤╨╛ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╤П. ╨б╤К╤А╨▓╤К╤А╨╕, ╨║╨╛╨╕╤В╨╛ ╨╜╨╡ ╨╛╤В╨│╨╛╨▓╨╛╤А╤П╤В, ╤Й╨╡ ╨▒╤К╨┤╨░╤В ╨▓╤А╨╡╨╝╨╡╨╜╨╜╨╛ ╨╕╨│╨╜╨╛╤А╨╕╤А╨░╨╜╨╕, ╨┤╨╛╨║╨░╤В╨╛ ╨╜╨╡ ╤Б╨╡ ╨▓╤К╤А╨╜╨░╤В ╨╛╨╜╨╗╨░╨╣╨╜.",
"manage_concurrency": "╨г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨╜╨░ ╨┐╨░╤А╨░╨╗╨╡╨╗╨╜╨╛╤Б╤В",
"manage_log_settings": "╨г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨╜╨░ ╨╜╨░╤Б╤В╤А╨╛╨╣╨║╨╕╤В╨╡ ╨╜╨░ ╨╖╨░╨┐╨╕╤Б╨▓╨░╨╜╨╡",
"map_dark_style": "╨в╤К╨╝╨╡╨╜ ╤Б╤В╨╕╨╗",
@@ -147,6 +148,8 @@
"map_settings": "╨Ъ╨░╤А╤В╨░",
"map_settings_description": "╨г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨╜╨░ ╨╜╨░╤Б╤В╤А╨╛╨╣╨║╨╕╤В╨╡ ╨╜╨░ ╨║╨░╤А╤В╨░╤В╨░",
"map_style_description": "URL ╨░╨┤╤А╨╡╤Б ╨║╤К╨╝ ╤Д╨░╨╣╨╗ \"style.json\" ╨╖╨░ ╨╖╨░╨┤╨░╨▓╨░╨╜╨╡ ╨╜╨░ ╤Б╤В╨╕╨╗ ╨╜╨░ ╨║╨░╤А╤В╨░╤В╨░",
"memory_cleanup_job": "╨Я╨╛╤З╨╕╤Б╤В╨▓╨░╨╜╨╡ ╨╜╨░ ╨┐╨░╨╝╨╡╤В╤В╨░",
"memory_generate_job": "╨У╨╡╨╜╨╡╤А╨╕╤А╨░╨╜╨╡ ╨╜╨░ ╨┐╨░╨╝╨╡╤В╤В╨░",
"metadata_extraction_job": "╨Ш╨╖╨▓╨╗╨╕╤З╨░╨╜╨╡ ╨╜╨░ ╨╝╨╡╤В╨░╨┤╨░╨╜╨╜╨╕",
"metadata_extraction_job_description": "╨Ш╨╖╨▓╨╗╨╕╤З╨░╨╜╨╡ ╨╜╨░ ╨╝╨╡╤В╨░╨┤╨░╨╜╨╜╨╕ ╨╛╤В ╨▓╤Б╨╡╨║╨╕ ╨╛╤В ╨╡╨╗╨╡╨╝╨╡╨╜╤В, ╨║╨░╤В╨╛ GPS ╨╗╨╛╨║╨░╤Ж╨╕╤П, ╨╗╨╕╤Ж╨░ ╨╕ ╤А╨╡╨╖╨╛╨╗╤О╤Ж╨╕╤П ╨╜╨░ ╤Д╨░╨╣╨╗╨╛╨▓╨╡╤В╨╡",
"metadata_faces_import_setting": "╨Т╨║╨╗╤О╤З╨╕ ╨╕╨╝╨┐╨╛╤А╤В ╨╜╨░ ╨╗╨╕╤Ж╨╡",
@@ -219,7 +222,7 @@
"reset_settings_to_default": "╨Т╤К╨╖╤Б╤В╨░╨╜╨╛╨▓╤П╨▓╨░╨╜╨╡ ╨╜╨░ ╨╜╨░╤Б╤В╤А╨╛╨╣╨║╨╕╤В╨╡ ╨┐╨╛ ╨┐╨╛╨┤╤А╨░╨╖╨▒╨╕╤А╨░╨╜╨╡",
"reset_settings_to_recent_saved": "╨Т╤К╨╖╤Б╤В╨░╨╜╨╛╨▓╤П╨▓╨░╨╜╨╡ ╨╜╨░ ╨╜╨░╤Б╤В╤А╨╛╨╣╨║╨╕╤В╨╡ ╨┤╨╛ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╤В╨╡ ╨╖╨░╨┐╨░╨╖╨╡╨╜╨╕ ╨╜╨░╤Б╤В╤А╨╛╨╣╨║╨╕",
"scanning_library": "╨б╨║╨░╨╜╨╕╤А╨░╨╜╨╡ ╨╜╨░ ╨▒╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░╤В╨░",
"search_jobs": "╨в╤К╤А╤Б╨╡╨╜╨╡ ╨╜╨░ ╨╖╨░╨┤╨░╤З╨╕...",
"search_jobs": "╨в╤К╤А╤Б╨╡╨╜╨╡ ╨╜╨░ ╨╖╨░╨┤╨░╤З╨╕тАж",
"send_welcome_email": "╨Ш╨╖╨┐╤А╨░╤Й╨░╨╜╨╡ ╨╜╨░ ╨╕╨╝╨╡╨╣╨╗ ╨╖╨░ ╨┤╨╛╨▒╤А╨╡ ╨┤╨╛╤И╨╗╨╕",
"server_external_domain_settings": "╨Т╤К╨╜╤И╨╡╨╜ ╨┤╨╛╨╝╨╡╨╣╨╜",
"server_external_domain_settings_description": "╨Ф╨╛╨╝╨╡╨╣╨╜ ╨╖╨░ ╨┐╤Г╨▒╨╗╨╕╤З╨╜╨╕ ╤Б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨╕ ╨▓╤А╤К╨╖╨║╨╕, ╨▓╨║╨╗╤О╤З╨╕╤В╨╡╨╗╨╜╨╛ http(s)://",
@@ -299,7 +302,7 @@
"transcoding_max_b_frames": "╨Ь╨░╨║╤Б╨╕╨╝╨░╨╗╨╜╨╕ B-╤Д╤А╨╡╨╣╨╝╨░",
"transcoding_max_b_frames_description": "╨Я╨╛-╨▓╨╕╤Б╨╛╨║╨╕╤В╨╡ ╤Б╤В╨╛╨╣╨╜╨╛╤Б╤В╨╕ ╨┐╨╛╨┤╨╛╨▒╤А╤П╨▓╨░╤В ╨╡╤Д╨╡╨║╤В╨╕╨▓╨╜╨╛╤Б╤В╤В╨░ ╨╜╨░ ╨║╨╛╨╝╨┐╤А╨╡╤Б╨╕╤П╤В╨░, ╨╜╨╛ ╨╖╨░╨▒╨░╨▓╤П╤В ╤А╨░╨╖╨║╨╛╨┤╨╕╤А╨░╨╜╨╡╤В╨╛. ╨Ь╨╛╨╢╨╡ ╨┤╨░ ╨╜╨╡ ╨╡ ╤Б╤К╨▓╨╝╨╡╤Б╤В╨╕╨╝ ╤Б ╤Е╨░╤А╨┤╤Г╨╡╤А╨╜╨╛╤В╨╛ ╤Г╤Б╨║╨╛╤А╨╡╨╜╨╕╨╡ ╨╜╨░ ╨┐╨╛-╤Б╤В╨░╤А╨╕ ╤Г╤Б╤В╤А╨╛╨╣╤Б╤В╨▓╨░. 0 ╨┤╨╡╨░╨║╤В╨╕╨▓╨╕╤А╨░ B-╤Д╤А╨╡╨╣╨╝╨░, ╨┤╨╛╨║╨░╤В╨╛ -1 ╨╖╨░╨┤╨░╨▓╨░ ╤В╨░╨╖╨╕ ╤Б╤В╨╛╨╣╨╜╨╛╤Б╤В ╨░╨▓╤В╨╛╨╝╨░╤В╨╕╤З╨╜╨╛.",
"transcoding_max_bitrate": "╨Ь╨░╨║╤Б╨╕╨╝╨░╨╗╨╡╨╜ ╨▒╨╕╤В╤А╨╡╨╣╤В",
"transcoding_max_bitrate_description": "╨Ч╨░╨┤╨░╨▓╨░╨╜╨╡╤В╨╛ ╨╜╨░ ╨╝╨░╨║╤Б╨╕╨╝╨░╨╗╨╡╨╜ ╨▒╨╕╤В╤А╨╡╨╣╤В ╨╝╨╛╨╢╨╡ ╨┤╨░ ╨╜╨░╨┐╤А╨░╨▓╨╕ ╤А╨░╨╖╨╝╨╡╤А╨╕╤В╨╡ ╨╜╨░ ╤Д╨░╨╣╨╗╨╛╨▓╨╡╤В╨╡ ╨┐╨╛-╨┐╤А╨╡╨┤╨▓╨╕╨┤╨╕╨╝╨╕ ╨┐╤А╨╕ ╨╜╨╡╨╖╨╜╨░╤З╨╕╤В╨╡╨╗╨╜╨╕ ╤А╨░╨╖╨╗╨╕╨║╨╕ ╨╖╨░ ╨║╨░╤З╨╡╤Б╤В╨▓╨╛╤В╨╛. ╨Я╤А╨╕ 720p ╤В╨╕╨┐╨╕╤З╨╜╨╕╤В╨╡ ╤Б╤В╨╛╨╣╨╜╨╛╤Б╤В╨╕ ╤Б╨░ 2600k ╨╖╨░ VP9 ╨╕╨╗╨╕ HEVC ╨╕╨╗╨╕ 4500k ╨╖╨░ H.264. ╨Ф╨╡╨░╨║╤В╨╕╨▓╨╕╤А╨░╨╜╨╛, ╨░╨║╨╛ ╨╡ ╨╖╨░╨┤╨░╨┤╨╡╨╜╨╛ ╨╜╨░ 0.",
"transcoding_max_bitrate_description": "╨Ч╨░╨┤╨░╨▓╨░╨╜╨╡╤В╨╛ ╨╜╨░ ╨╝╨░╨║╤Б╨╕╨╝╨░╨╗╨╡╨╜ ╨▒╨╕╤В╤А╨╡╨╣╤В ╨╝╨╛╨╢╨╡ ╨┤╨░ ╨╜╨░╨┐╤А╨░╨▓╨╕ ╤А╨░╨╖╨╝╨╡╤А╨╕╤В╨╡ ╨╜╨░ ╤Д╨░╨╣╨╗╨╛╨▓╨╡╤В╨╡ ╨┐╨╛-╨┐╤А╨╡╨┤╨▓╨╕╨┤╨╕╨╝╨╕ ╨┐╤А╨╕ ╨╜╨╡╨╖╨╜╨░╤З╨╕╤В╨╡╨╗╨╜╨╕ ╤А╨░╨╖╨╗╨╕╨║╨╕ ╨╖╨░ ╨║╨░╤З╨╡╤Б╤В╨▓╨╛╤В╨╛. ╨Я╤А╨╕ 720p ╤В╨╕╨┐╨╕╤З╨╜╨╕╤В╨╡ ╤Б╤В╨╛╨╣╨╜╨╛╤Б╤В╨╕ ╤Б╨░ 2600 kbit/s ╨╖╨░ VP9 ╨╕╨╗╨╕ HEVC ╨╕╨╗╨╕ 4500 kbit/s ╨╖╨░ H.264. ╨Ф╨╡╨░╨║╤В╨╕╨▓╨╕╤А╨░╨╜╨╛, ╨░╨║╨╛ ╨╡ ╨╖╨░╨┤╨░╨┤╨╡╨╜╨╛ ╨╜╨░ 0.",
"transcoding_max_keyframe_interval": "╨Ь╨░╨║╤Б╨╕╨╝╨░╨╗╨╡╨╜ ╨╕╨╜╤В╨╡╤А╨▓╨░╨╗ ╨╝╨╡╨╢╨┤╤Г ╨║╨╗╤О╤З╨╛╨▓╨╕╤В╨╡ ╨║╨░╨┤╤А╨╕",
"transcoding_max_keyframe_interval_description": "╨Ч╨░╨┤╨░╨▓╨░ ╨╝╨░╨║╤Б╨╕╨╝╨░╨╗╨╜╨╛╤В╨╛ ╤А╨░╨╖╤Б╤В╨╛╤П╨╜╨╕╨╡ ╨╝╨╡╨╢╨┤╤Г ╨║╨╗╤О╤З╨╛╨▓╨╕╤В╨╡ ╨║╨░╨┤╤А╨╕. ╨Я╨╛-╨╜╨╕╤Б╨║╨╕╤В╨╡ ╤Б╤В╨╛╨╣╨╜╨╛╤Б╤В╨╕ ╨▓╨╗╨╛╤И╨░╨▓╨░╤В ╨╡╤Д╨╡╨║╤В╨╕╨▓╨╜╨╛╤Б╤В╤В╨░ ╨╜╨░ ╨║╨╛╨╝╨┐╤А╨╡╤Б╨╕╤П╤В╨░, ╨╜╨╛ ╨┐╨╛╨┤╨╛╨▒╤А╤П╨▓╨░╤В ╨▓╤А╨╡╨╝╨╡╤В╨╛ ╨╖╨░ ╤В╤К╤А╤Б╨╡╨╜╨╡ ╨╕ ╨╝╨╛╨│╨░╤В ╨┤╨░ ╨┐╨╛╨┤╨╛╨▒╤А╤П╤В ╨║╨░╤З╨╡╤Б╤В╨▓╨╛╤В╨╛ ╨▓ ╤Б╤Ж╨╡╨╜╨╕ ╤Б ╨▒╤К╤А╨╖╨╛ ╨┤╨▓╨╕╨╢╨╡╨╜╨╕╨╡. 0 ╨╖╨░╨┤╨░╨▓╨░ ╤В╨░╨╖╨╕ ╤Б╤В╨╛╨╣╨╜╨╛╤Б╤В ╨░╨▓╤В╨╛╨╝╨░╤В╨╕╤З╨╜╨╛.",
"transcoding_optimal_description": "╨Т╨╕╨┤╨╡╨╛╨║╨╗╨╕╨┐╨╛╨▓╨╡ ╤Б ╨┐╨╛-╨▓╨╕╤Б╨╛╨║╨░ ╨╛╤В ╤Ж╨╡╨╗╨╡╨▓╨░╤В╨░ ╤А╨░╨╖╨┤╨╡╨╗╨╕╤В╨╡╨╗╨╜╨░ ╤Б╨┐╨╛╤Б╨╛╨▒╨╜╨╛╤Б╤В ╨╕╨╗╨╕ ╨╜╨╡ ╨▓ ╨┐╤А╨╕╨╡╤В╨╕╤П ╤Д╨╛╤А╨╝╨░╤В",
@@ -391,6 +394,7 @@
"allow_edits": "╨Я╨╛╨╖╨▓╨╛╨╗╤П╨▓╨░╨╜╨╡ ╨╜╨░ ╤А╨╡╨┤╨░╨║╤Ж╨╕╨╕",
"allow_public_user_to_download": "╨Я╨╛╨╖╨▓╨╛╨╗╨╡╤В╨╡ ╨╜╨░ ╨┐╤Г╨▒╨╗╨╕╤З╨╡╨╜ ╨┐╨╛╤В╤А╨╡╨▒╨╕╤В╨╡╨╗ ╨┤╨░ ╨╝╨╛╨╢╨╡ ╨┤╨░ ╨╕╨╖╤В╨╡╨│╨╗╤П",
"allow_public_user_to_upload": "╨Я╨╛╨╖╨▓╨╛╨╗╨╡╤В╨╡ ╨╜╨░ ╨┐╤Г╨▒╨╗╨╕╤З╨╜╨╕╤П ╨┐╨╛╤В╤А╨╡╨▒╨╕╤В╨╡╨╗ ╨┤╨░ ╨╝╨╛╨╢╨╡ ╨┤╨░ ╨║╨░╤З╨▓╨░",
"alt_text_qr_code": "╨Ш╨╖╨╛╨▒╤А╨░╨╢╨╡╨╜╨╕╨╡ ╨╜╨░ QR ╨║╨╛╨┤",
"anti_clockwise": "╨Ю╨▒╤А╨░╤В╨╜╨╛ ╨╜╨░ ╤З╨░╤Б╨╛╨▓╨╜╨╕╨║╨╛╨▓╨░╤В╨░ ╤Б╤В╤А╨╡╨╗╨║╨░",
"api_key": "API ╨║╨╗╤О╤З",
"api_key_description": "╨в╨░╨╖╨╕ ╤Б╤В╨╛╨╣╨╜╨╛╤Б╤В ╤Й╨╡ ╨▒╤К╨┤╨╡ ╨┐╨╛╨║╨░╨╖╨░╨╜╨░ ╤Б╨░╨╝╨╛ ╨▓╨╡╨┤╨╜╤К╨╢. ╨Ь╨╛╨╗╤П, ╨╜╨╡ ╨╖╨░╨▒╤А╨░╨▓╤П╨╣╤В╨╡ ╨┤╨░ ╨│╨╛ ╨║╨╛╨┐╨╕╤А╨░╤В╨╡, ╨┐╤А╨╡╨┤╨╕ ╨┤╨░ ╨╖╨░╤В╨▓╨╛╤А╨╕╤В╨╡ ╨┐╤А╨╛╨╖╨╛╤А╨╡╤Ж╨░.",
@@ -406,17 +410,17 @@
"are_these_the_same_person": "╨в╨╛╨▓╨░ ╨╡╨┤╨╜╨╛ ╨╕ ╤Б╤К╤Й╨╛ ╨╗╨╕╤Ж╨╡ ╨╗╨╕ ╨╡?",
"are_you_sure_to_do_this": "╨б╨╕╨│╤Г╤А╨╜╨╕ ╨╗╨╕ ╤Б╤В╨╡, ╤З╨╡ ╨╕╤Б╨║╨░╤В╨╡ ╨┤╨░ ╨╜╨░╨┐╤А╨░╨▓╨╕╤В╨╡ ╤В╨╛╨▓╨░?",
"asset_added_to_album": "╨Ф╨╛╨▒╨░╨▓╨╡╨╜╨╛ ╨▓ ╨░╨╗╨▒╤Г╨╝",
"asset_adding_to_album": "╨Ф╨╛╨▒╨░╨▓╤П╨╜╨╡ ╨▓ ╨░╨╗╨▒╤Г╨╝...",
"asset_adding_to_album": "╨Ф╨╛╨▒╨░╨▓╤П╨╜╨╡ ╨▓ ╨░╨╗╨▒╤Г╨╝тАж",
"asset_description_updated": "╨Ю╨┐╨╕╤Б╨░╨╜╨╕╨╡╤В╨╛ ╨╜╨░ ╨╡╨╗╨╡╨╝╨╡╨╜╤В╨░ ╨╡ ╨╛╨▒╨╜╨╛╨▓╨╡╨╜╨╛",
"asset_filename_is_offline": "╨Р╨║╤В╨╕╨▓╤К╤В {filename} ╨╡ ╨╛╤Д╨╗╨░╨╣╨╜",
"asset_has_unassigned_faces": "╨Х╨╗╨╡╨╝╨╡╨╜╤В╤К╤В ╨╕╨╝╨░ ╨╜╨╡╨╖╨░╨┤╨░╨┤╨╡╨╜╨╕ ╨╗╨╕╤Ж╨░",
"asset_hashing": "╨е╨╡╤И╨╕╤А╨░╨╜╨╡...",
"asset_hashing": "╨е╨╡╤И╨╕╤А╨░╨╜╨╡тАж",
"asset_offline": "╨Х╨╗╨╡╨╝╨╡╨╜╤В╤К╤В ╨╡ ╨╛╤Д╨╗╨░╨╣╨╜",
"asset_offline_description": "╨в╨╛╨╖╨╕ ╨▓╤К╨╜╤И╨╡╨╜ ╨░╨║╤В╨╕╨▓ ╨▓╨╡╤З╨╡ ╨╜╨╡ ╤Б╨╡ ╨╜╨░╨╝╨╕╤А╨░ ╨╜╨░ ╨┤╨╕╤Б╨║╨░. ╨Ь╨╛╨╗╤П, ╤Б╨▓╤К╤А╨╢╨╡╤В╨╡ ╤Б╨╡ ╤Б ╨░╨┤╨╝╨╕╨╜╨╕╤Б╤В╤А╨░╤В╨╛╤А╨░ ╨╜╨░ Immich ╨╖╨░ ╨┐╨╛╨╝╨╛╤Й.",
"asset_skipped": "╨Я╤А╨╛╨┐╤Г╤Б╨╜╨░╤В╨╛",
"asset_skipped_in_trash": "╨Т ╨║╨╛╤И╤З╨╡╤В╨╛",
"asset_uploaded": "╨Ъ╨░╤З╨╡╨╜╨╛",
"asset_uploading": "╨Ъ╨░╤З╨▓╨░╨╜╨╡...",
"asset_uploading": "╨Ъ╨░╤З╨▓╨░╨╜╨╡тАж",
"assets": "╨Х╨╗╨╡╨╝╨╡╨╜╤В╨╕",
"assets_added_count": "╨Ф╨╛╨▒╨░╨▓╨╡╨╜╨╛ {count, plural, one {# asset} other {# assets}}",
"assets_added_to_album_count": "╨Ф╨╛╨▒╨░╨▓╨╡╨╜(╨╕) ╤Б╨░ {count, plural, one {# ╨░╨║╤В╨╕╨▓} other {# ╨░╨║╤В╨╕╨▓╨░}} ╨▓ ╨░╨╗╨▒╤Г╨╝╨░",
@@ -481,6 +485,7 @@
"comments_are_disabled": "╨Ъ╨╛╨╝╨╡╨╜╤В╨░╤А╨╕╤В╨╡ ╤Б╨░ ╨┤╨╡╨░╨║╤В╨╕╨▓╨╕╤А╨░╨╜╨╕",
"confirm": "╨Я╨╛╤В╨▓╤К╤А╨┤╨╕",
"confirm_admin_password": "╨Я╨╛╤В╨▓╤К╤А╨╢╨┤╨░╨▓╨░╨╜╨╡ ╨╜╨░ ╨┐╨░╤А╨╛╨╗╨░╤В╨░ ╨╜╨░ ╨░╨┤╨╝╨╕╨╜╨╕╤Б╤В╤А╨░╤В╨╛╤А╨░",
"confirm_delete_face": "╨б╨╕╨│╤Г╤А╨╜╨╕ ╨╗╨╕ ╤Б╤В╨╡, ╤З╨╡ ╨╕╤Б╨║╨░╤В╨╡ ╨┤╨░ ╨╕╨╖╤В╤А╨╕╨╡╤В╨╡ ╨╗╨╕╤Ж╨╡╤В╨╛ ╨╜╨░ {name} ╨╛╤В ╨░╨║╤В╨╕╨▓╨░?",
"confirm_delete_shared_link": "╨б╨╕╨│╤Г╤А╨╜╨╕ ╨╗╨╕ ╤Б╤В╨╡, ╤З╨╡ ╨╕╤Б╨║╨░╤В╨╡ ╨┤╨░ ╨╕╨╖╤В╤А╨╕╨╡╤В╨╡ ╤В╨░╨╖╨╕ ╤Б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨░ ╨▓╤А╤К╨╖╨║╨░?",
"confirm_keep_this_delete_others": "╨Т╤Б╨╕╤З╨║╨╕ ╨╛╤Б╤В╨░╨╜╨░╨╗╨╕ ╤Д╨░╨╣╨╗╨╛╨▓╨╡ ╨▓ ╤Б╤В╨╡╨║╨░ ╤Й╨╡ ╨▒╤К╨┤╨░╤В ╨╕╨╖╤В╤А╨╕╤В╨╕, ╤Б ╨╕╨╖╨║╨╗╤О╤З╨╡╨╜╨╕╨╡ ╨╜╨░ ╤В╨╛╨╖╨╕ ╤Д╨░╨╣╨╗. ╨б╨╕╨│╤Г╤А╨╜╨╕ ╨╗╨╕ ╤Б╤В╨╡, ╤З╨╡ ╨╕╤Б╨║╨░╤В╨╡ ╨┤╨░ ╨┐╤А╨╛╨┤╤К╨╗╨╢╨╕╤В╨╡?",
"confirm_password": "╨Я╨╛╤В╨▓╤К╤А╨┤╨╡╤В╨╡ ╨┐╨░╤А╨╛╨╗╨░╤В╨░",
@@ -533,6 +538,7 @@
"delete_album": "╨Ш╨╖╤В╤А╨╕╨╣ ╨░╨╗╨▒╤Г╨╝",
"delete_api_key_prompt": "╨б╨╕╨│╤Г╤А╨╜╨╕ ╨╗╨╕ ╤Б╤В╨╡, ╤З╨╡ ╨╕╤Б╨║╨░╤В╨╡ ╨┤╨░ ╨╕╨╖╤В╤А╨╕╨╡╤В╨╡ ╤В╨╛╨╖╨╕ API ╨║╨╗╤О╤З?",
"delete_duplicates_confirmation": "╨б╨╕╨│╤Г╤А╨╜╨╕ ╨╗╨╕ ╤Б╤В╨╡, ╤З╨╡ ╨╕╤Б╨║╨░╤В╨╡ ╨┤╨░ ╨╕╨╖╤В╤А╨╕╨╡╤В╨╡ ╨╛╨║╨╛╨╜╤З╨░╤В╨╡╨╗╨╜╨╛ ╤В╨╡╨╖╨╕ ╨┤╤Г╨▒╨╗╨╕╨║╨░╤В╨╕?",
"delete_face": "╨Ш╨╖╤В╤А╨╕╨╣ ╨╗╨╕╤Ж╨╡",
"delete_key": "╨Ш╨╖╤В╤А╨╕╨╣ ╨║╨╗╤О╤З",
"delete_library": "╨Ш╨╖╤В╤А╨╕╨╣ ╨▒╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░",
"delete_link": "╨Ш╨╖╤В╤А╨╕╨╣ ╨╗╨╕╨╜╨║",
@@ -600,6 +606,7 @@
"enabled": "╨Т╨║╨╗╤О╤З╨╡╨╜╨╛",
"end_date": "╨Ъ╤А╨░╨╣╨╜╨░ ╨┤╨░╤В╨░",
"error": "╨У╤А╨╡╤И╨║╨░",
"error_delete_face": "╨У╤А╨╡╤И╨║╨░ ╨┐╤А╨╕ ╨╕╨╖╤В╤А╨╕╨▓╨░╨╜╨╡ ╨╜╨░ ╨╗╨╕╤Ж╨╡ ╨╛╤В ╨░╨║╤В╨╕╨▓╨░",
"error_loading_image": "╨У╤А╨╡╤И╨║╨░ ╨┐╤А╨╕ ╨╖╨░╤А╨╡╨╢╨┤╨░╨╜╨╡ ╨╜╨░ ╨╕╨╖╨╛╨▒╤А╨░╨╢╨╡╨╜╨╕╨╡╤В╨╛",
"error_title": "╨У╤А╨╡╤И╨║╨░ - ╨╜╨╡╤Й╨╛ ╤Б╨╡ ╨╛╨▒╤К╤А╨║╨░",
"errors": {
@@ -766,8 +773,10 @@
"go_to_folder": "╨Ю╤В╨╕╨┤╨╕ ╨▓ ╨┐╨░╨┐╨║╨░╤В╨░",
"go_to_search": "╨Я╤А╨╡╨╝╨╕╨╜╨░╨▓╨░╨╜╨╡ ╨║╤К╨╝ ╤В╤К╤А╤Б╨╡╨╜╨╡",
"group_albums_by": "╨У╤А╤Г╨┐╨╕╤А╨░╨╣ ╨░╨╗╨▒╤Г╨╝ ╨┐╨╛...",
"group_country": "╨У╤А╤Г╨┐╨╕╤А╨░╨╣ ╨┐╨╛ ╨┤╤К╤А╨╢╨░╨▓╨░",
"group_no": "╨Э╤П╨╝╨░ ╨│╤А╤Г╨┐╨░",
"group_owner": "╨У╤А╤Г╨┐╨╕╤А╨░╨╜╨╡ ╨┐╨╛ ╤Б╨╛╨▒╤Б╤В╨▓╨╡╨╜╨╕╨║",
"group_places_by": "╨У╤А╤Г╨┐╨╕╤А╨░╨╣ ╨╝╨╡╤Б╤В╨░ ╨┐╨╛тАж",
"group_year": "╨У╤А╤Г╨┐╨╕╤А╨░╨╜╨╡ ╨┐╨╛ ╨│╨╛╨┤╨╕╨╜╨░",
"has_quota": "╨Ы╨╕╨╝╨╕╤В",
"hi_user": "╨Ч╨┤╤А╨░╨▓╨╡╨╣, {name} {email}",
@@ -800,6 +809,7 @@
"include_shared_albums": "╨Т╨║╨╗╤О╤З╨▓╨░╨╜╨╡ ╨╜╨░ ╤Б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨╕ ╨░╨╗╨▒╤Г╨╝╨╕",
"include_shared_partner_assets": "╨Т╨║╨╗╤О╤З╨▓╨░╨╜╨╡ ╨╜╨░ ╤Б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨╕╤В╨╡ ╤Б ╨┐╨░╤А╤В╨╜╤М╨╛╤А ╨╡╨╗╨╡╨╝╨╡╨╜╤В╨╕",
"individual_share": "╨Ш╨╜╨┤╨╕╨▓╨╕╨┤╤Г╨░╨╗╨╜╨╛ ╤Б╨┐╨╛╨┤╨╡╨╗╤П╨╜╨╡",
"individual_shares": "╨Ш╨╜╨┤╨╕╨▓╨╕╨┤╤Г╨░╨╗╨╜╨╕ ╤Б╨┐╨╛╨┤╨╡╨╗╤П╨╜╨╕╤П",
"info": "╨Ш╨╜╤Д╨╛╤А╨╝╨░╤Ж╨╕╤П",
"interval": {
"day_at_onepm": "╨Т╤Б╨╡╨║╨╕ ╨┤╨╡╨╜ ╨▓ 13:00",
@@ -822,6 +832,7 @@
"latest_version": "╨Я╨╛╤Б╨╗╨╡╨┤╨╜╨░ ╨▓╨╡╤А╤Б╨╕╤П",
"latitude": "╨и╨╕╤А╨╕╨╜╨░",
"leave": "╨Ш╨╖╨╗╨╡╨╖",
"lens_model": "╨Ь╨╛╨┤╨╡╨╗ ╨╗╨╡╤Й╨░",
"let_others_respond": "╨Я╨╛╨╖╨▓╨╛╨╗╨╡╤В╨╡ ╨╜╨░ ╨┤╤А╤Г╨│╨╕╤В╨╡ ╨┤╨░ ╨╛╤В╨│╨╛╨▓╨╛╤А╤П╤В",
"level": "╨Э╨╕╨▓╨╛",
"library": "╨С╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░",
@@ -880,6 +891,7 @@
"month": "╨Ь╨╡╤Б╨╡╤Ж",
"more": "╨Ю╤Й╨╡",
"moved_to_trash": "╨Я╤А╨╡╨╝╨╡╤Б╤В╨╡╨╜╨╛ ╨▓ ╨║╨╛╤И╤З╨╡╤В╨╛",
"mute_memories": "╨Ш╨╖╨║╨╗╤О╤З╨▓╨░╨╜╨╡ ╨╜╨░ ╨╖╨▓╤Г╨║╨░ ╨╜╨░ ╤Б╨┐╨╛╨╝╨╡╨╜╨╕╤В╨╡",
"my_albums": "╨Ь╨╛╨╕ ╨░╨╗╨▒╤Г╨╝╨╕",
"name": "╨Ш╨╝╨╡",
"name_or_nickname": "╨Ш╨╝╨╡ ╨╕╨╗╨╕ ╨┐╤А╤П╨║╨╛╤А",
@@ -984,6 +996,7 @@
"pick_a_location": "╨Ш╨╖╨▒╨╡╤А╨╕ ╨╗╨╛╨║╨░╤Ж╨╕╤П",
"place": "╨Ь╨╡╤Б╤В╨╛╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╨╡",
"places": "╨Ь╨╡╤Б╤В╨╛╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╤П",
"places_count": "{count, plural, one {{count, number} ╨Ь╤П╤Б╤В╨╛} other {{count, number} ╨Ь╨╡╤Б╤В╨░}}",
"play": "╨Т╤К╨╖╨┐╤А╨╛╨╕╨╖╨▓╨╡╨╢╨┤╨░╨╜╨╡",
"play_memories": "╨Т╤К╨╖╨┐╤А╨╛╨╕╨╖╨▓╨╡╨╢╨┤╨░╨╜╨╡ ╨╜╨░ ╤Б╨┐╨╛╨╝╨╡╨╜╨╕",
"play_motion_photo": "╨Т╤К╨╖╨┐╤А╨╛╨╕╨╖╨▓╨╡╨┤╨╕ Motion Photo",
@@ -1067,10 +1080,12 @@
"remove_from_shared_link": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨╕ ╨╛╤В ╤Б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨╕╤П ╨╗╨╕╨╜╨║",
"remove_url": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨╕ URL",
"remove_user": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨╕ ╨┐╨╛╤В╤А╨╡╨▒╨╕╤В╨╡╨╗╤П",
"removed_api_key": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨╕ API Key: {name}",
"removed_from_archive": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨╕ ╨╛╤В ╨Р╤А╤Е╨╕╨▓╨░",
"removed_from_favorites": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨░╤В╨╛ ╨╛╤В ╨Ы╤О╨▒╨╕╨╝╨╕",
"removed_api_key": "╨Я╤А╨╡╨╝╨░╤Е╨░╤В API ╨║╨╗╤О╤З: {name}",
"removed_from_archive": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨╕ ╨╛╤В ╨░╤А╤Е╨╕╨▓╨░",
"removed_from_favorites": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨░╤В╨╛ ╨╛╤В ╨╗╤О╨▒╨╕╨╝╨╕",
"removed_from_favorites_count": "{count, plural, other {╨Я╤А╨╡╨╝╨░╤Е╨╜╨░╤В╨╕ #}} ╨╛╤В ╨Ы╤О╨▒╨╕╨╝╨╕",
"removed_memory": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨░╤В ╤Б╨┐╨╛╨╝╨╡╨╜",
"removed_photo_from_memory": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨░╤В╨░ ╤Б╨╜╨╕╨╝╨║╨░ ╨╛╤В ╤Б╨┐╨╛╨╝╨╡╨╜",
"removed_tagged_assets": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨░╤В ╨╡ ╨╡╤В╨╕╨║╨╡╤В╤К╤В ╨╛╤В {count, plural, one {# ╨╡╨╗╨╡╨╝╨╡╨╜╤В} other {# ╨╡╨╗╨╡╨╝╨╡╨╜╤В╨░}}",
"rename": "╨Я╤А╨╡╨╕╨╝╨╡╨╜╤Г╨▓╨░╨╣",
"repair": "╨Я╨╛╨┐╤А╨░╨▓╨╕",
@@ -1079,6 +1094,7 @@
"repository": "╨е╤А╨░╨╜╨╕╨╗╨╕╤Й╨╡",
"require_password": "╨Ш╨╖╨╕╤Б╨║╨░╨╣ ╨┐╨░╤А╨╛╨╗╨░",
"require_user_to_change_password_on_first_login": "╨Ш╨╖╨╕╤Б╨║╨▓╨░╨╣ ╨┐╨╛╤В╤А╨╡╨▒╨╕╤В╨╡╨╗╤П╤В ╨┤╨░ ╨┐╤А╨╛╨╝╨╡╨╜╨╕ ╨┐╨░╤А╨╛╨╗╨░╤В╨░ ╤Б╨╕ ╨┐╤А╨╕ ╨┐╤К╤А╨▓╨╛╤В╨╛ ╨▓╨╗╨╕╨╖╨░╨╜╨╡",
"rescan": "╨Я╤А╨╡╤Б╨║╨░╨╜╨╕╤А╨░╨╜╨╡",
"reset": "╨Э╤Г╨╗╨╕╤А╨░╨╜╨╡",
"reset_password": "╨Э╤Г╨╗╨╕╤А╨░╨╜╨╡ ╨╜╨░ ╨┐╨░╤А╨╛╨╗╨░╤В╨░",
"reset_people_visibility": "╨Э╤Г╨╗╨╕╤А╨░╨╜╨╡ ╨╜╨░ ╨▓╨╕╨┤╨╕╨╝╨╛╤Б╤В╤В╨░ ╨╜╨░ ╤Е╨╛╤А╨░╤В╨░",
@@ -1107,18 +1123,22 @@
"search": "╨в╤К╤А╤Б╨╡╨╜╨╡",
"search_albums": "╨в╤К╤А╤Б╨╕ ╨░╨╗╨▒╤Г╨╝╨╕",
"search_by_context": "╨в╤К╤А╤Б╨╕ ╨┐╨╛ ╨║╨╛╨╜╤В╨╡╨║╤Б╤В",
"search_by_description": "╨в╤К╤А╤Б╨╕ ╨┐╨╛ ╨╛╨┐╨╕╤Б╨░╨╜╨╕╨╡",
"search_by_description_example": "╨а╨░╨╖╤Е╨╛╨┤╨║╨░ ╨▓ ╨б╨░╨┐╨░",
"search_by_filename": "╨в╤К╤А╤Б╨╕ ╨┐╨╛ ╨╕╨╝╨╡ ╨╜╨░ ╤Д╨░╨╣╨╗╨░ ╨╕╨╗╨╕ ╤А╨░╨╖╤И╨╕╤А╨╡╨╜╨╕╨╡",
"search_by_filename_example": "╨╜╨░╨┐╤А╨╕╨╝╨╡╤А IMG_1234.JPG ╨╕╨╗╨╕ PNG",
"search_camera_make": "╨в╤К╤А╤Б╨╕ ╨┐╤А╨╛╨╕╨╖╨▓╨╛╨┤╨╕╤В╨╡╨╗ ╨╜╨░ ╨║╨░╨╝╨╡╤А╨░╤В╨░...",
"search_camera_model": "╨в╤К╤А╤Б╨╕ ╨╝╨╛╨┤╨╡╨╗ ╨╜╨░ ╨║╨░╨╝╨╡╤А╨░╤В╨░...",
"search_city": "╨в╤К╤А╤Б╨╕ ╨│╤А╨░╨┤...",
"search_country": "╨в╤К╤А╤Б╨╕ ╨┤╤К╤А╨╢╨░╨▓╨░...",
"search_for": "╨в╤К╤А╤Б╨╕ ╨╖╨░",
"search_for_existing_person": "╨в╤К╤А╤Б╨╕ ╤Б╤К╤Й╨╡╤Б╤В╨▓╤Г╨▓╨░╤Й ╤З╨╛╨▓╨╡╨║",
"search_no_people": "╨Э╤П╨╝╨░ ╤Е╨╛╤А╨░",
"search_no_people_named": "╨Э╤П╨╝╨░ ╤Е╨╛╤А╨░ ╨╜╨░ ╨╕╨╝╨╡ \"{name}\"",
"search_options": "╨Ю╨┐╤Ж╨╕╨╕ ╨╖╨░ ╤В╤К╤А╤Б╨╡╨╜╨╡",
"search_people": "╨в╤К╤А╤Б╨╡╤В╨╡ ╨╜╨░ ╤Е╨╛╤А╨░",
"search_places": "╨в╤К╤А╤Б╨╡╨╜╨╡ ╨╜╨░ ╨╝╨╡╤Б╤В╨░",
"search_rating": "╨в╤К╤А╤Б╨╕ ╨┐╨╛ ╤А╨╡╨╣╤В╨╕╨╜╨│тАж",
"search_settings": "╨в╤К╤А╤Б╨╡╨╜╨╡ ╨╜╨░ ╨╜╨░╤Б╤В╤А╨╛╨╣╨║╨╕",
"search_state": "╨в╤К╤А╤Б╨╡╨╜╨╡ ╨╜╨░ ╤Й╨░╤В...",
"search_tags": "╨в╤К╤А╤Б╨╡╨╜╨╡ ╨╜╨░ ╨╡╤В╨╕╨║╨╡╤В╨╕...",
@@ -1165,6 +1185,7 @@
"shared_from_partner": "╨б╨╜╨╕╨╝╨║╨╕ ╨╛╤В {partner}",
"shared_link_options": "╨Ю╨┐╤Ж╨╕╨╕ ╨╖╨░ ╤Б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨░ ╨▓╤А╤К╨╖╨║╨░",
"shared_links": "╨б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨╕ ╨▓╤А╤К╨╖╨║╨╕",
"shared_links_description": "╨б╨┐╨╛╨┤╨╡╨╗╨╕ ╤Б╨╜╨╕╨╝╨║╨╕ ╨╕ ╨▓╨╕╨┤╨╡╨░ ╤Б ╨╗╨╕╨╜╨║",
"shared_photos_and_videos_count": "{assetCount, plural, other {# ╤Б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨╕ ╤Б╨╜╨╕╨╝╨║╨╕ ╨╕ ╨▓╨╕╨┤╨╡╨░.}}",
"shared_with_partner": "╨б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨╛ ╤Б {partner}",
"sharing": "╨б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨╕",
@@ -1187,6 +1208,7 @@
"show_person_options": "╨Я╨╛╨║╨░╨╖╨▓╨░╨╜╨╡ ╨╜╨░ ╨╛╨┐╤Ж╨╕╨╕ ╨╖╨░ ╨╗╨╕╤Ж╨░",
"show_progress_bar": "╨Я╨╛╨║╨░╨╖╨▓╨░╨╜╨╡ ╨╜╨░ ╨┐╤А╨╛╨│╤А╨╡╤Б ╨▒╨░╤А╨░",
"show_search_options": "╨Я╨╛╨║╨░╨╖╨▓╨░╨╜╨╡ ╨╜╨░ ╨╛╨┐╤Ж╨╕╨╕╤В╨╡ ╨╖╨░ ╤В╤К╤А╤Б╨╡╨╜╨╡",
"show_shared_links": "╨Я╨╛╨║╨░╨╢╨╕ ╤Б╨┐╨╛╨┤╨╡╨╗╨╡╨╜╨╕ ╨╗╨╕╨╜╨║╨╛╨▓╨╡",
"show_slideshow_transition": "╨Я╨╛╨║╨░╨╢╨╕ ╨┐╤А╨╡╤Е╨╛╨┤╨░ ╨╜╨░ ╤Б╨╗╨░╨╣╨┤╤И╨╛╤Г╤В╨╛",
"show_supporter_badge": "╨Ч╨╜╨░╤З╨║╨░ ╨┐╨╛╨┤╨┤╤А╤К╨╢╨╜╨╕╨║",
"show_supporter_badge_description": "╨Я╨╛╨║╨░╨╢╨╕ ╨╖╨╜╨░╤З╨║╨░ ╨┐╨╛╨┤╨┤╤А╤К╨╢╨╜╨╕╨║",
@@ -1240,6 +1262,7 @@
"tag_created": "╨б╤К╨╖╨┤╨░╨┤╨╡╨╜ ╨╡╤В╨╕╨║╨╡╤В: {tag}",
"tag_feature_description": "╨а╨░╨╖╨│╨╗╨╡╨╢╨┤╨░╨╜╨╡ ╨╜╨░ ╤Б╨╜╨╕╨╝╨║╨╕ ╨╕ ╨▓╨╕╨┤╨╡╨╛╨║╨╗╨╕╨┐╨╛╨▓╨╡, ╨│╤А╤Г╨┐╨╕╤А╨░╨╜╨╕ ╨┐╨╛ ╤В╨╡╨╝╨╕ ╤Б ╨╗╨╛╨│╨╕╤З╨╡╤Б╨║╨╕ ╤В╨░╨│╨╛╨▓╨╡",
"tag_not_found_question": "╨Э╨╡ ╨╝╨╛╨╢╨╡╤В╨╡ ╨┤╨░ ╨╜╨░╨╝╨╡╤А╨╕╤В╨╡ ╨╡╤В╨╕╨║╨╡╤В? ╨б╤К╨╖╨┤╨░╨╣╤В╨╡ ╤В╨░╨║╤К╨▓ <link>╤В╤Г╨║</link>",
"tag_people": "╨Ю╤В╨▒╨╡╨╗╨╡╨╢╨╕ ╨е╨╛╤А╨░",
"tag_updated": "╨Р╨║╤В╤Г╨░╨╗╨╕╨╖╨╕╤А╨░╨╜ ╨╡╤В╨╕╨║╨╡╤В: {tag}",
"tagged_assets": "╨в╨░╨│╨╜╨░╤В╨╕ {count, plural, one {# ╨╡╨╗╨╡╨╝╨╡╨╜╤В} other {# ╨╡╨╗╨╡╨╝╨╡╨╜╤В╨╕}}",
"tags": "╨Х╤В╨╕╨║╨╡╤В",
@@ -1274,11 +1297,13 @@
"unfavorite": "╨Я╤А╨╡╨╝╨░╤Е╨▓╨░╨╜╨╡ ╨╛╤В ╨╗╤О╨▒╨╕╨╝╨╕╤В╨╡",
"unhide_person": "╨Я╨╛╨║╨░╨╢╨╕ ╨╛╤В╨╜╨╛╨▓╨╛ ╤З╨╛╨▓╨╡╨║╨░",
"unknown": "╨Э╨╡╨╕╨╖╨▓╨╡╤Б╤В╨╜╨╛",
"unknown_country": "╨Э╨╡╨┐╨╛╨╖╨╜╨░╤В╨░ ╨Ф╤К╤А╨╢╨░╨▓╨░",
"unknown_year": "╨Э╨╡╨╕╨╖╨▓╨╡╤Б╤В╨╜╨░ ╨│╨╛╨┤╨╕╨╜╨░",
"unlimited": "╨Э╨╡╨╛╨│╤А╨░╨╜╨╕╤З╨╡╨╜╨╛",
"unlink_motion_video": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨╕ ╨▓╤А╤К╨╖╨║╨░╤В╨░ ╤Б ╨▓╨╕╨┤╨╡╨╛",
"unlink_oauth": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨╕ OAuth",
"unlinked_oauth_account": "╨Я╤А╨╡╨╝╨░╤Е╨╜╨╕ OAuth ╨░╨║╨░╤Г╨╜╤В",
"unmute_memories": "╨Т╨║╨╗╤О╤З╨▓╨░╨╜╨╡ ╨╜╨░ ╨╖╨▓╤Г╨║╨░ ╨╜╨░ ╤Б╨┐╨╛╨╝╨╡╨╜╨╕╤В╨╡",
"unnamed_album": "╨Р╨╗╨▒╤Г╨╝ ╨▒╨╡╨╖ ╨╕╨╝╨╡",
"unnamed_album_delete_confirmation": "╨б╨╕╨│╤Г╤А╨╜╨╕ ╨╗╨╕ ╤Б╤В╨╡, ╤З╨╡ ╨╕╤Б╨║╨░╤В╨╡ ╨┤╨░ ╨╕╨╖╤В╤А╨╕╨╡╤В╨╡ ╤В╨╛╨╖╨╕ ╨░╨╗╨▒╤Г╨╝?",
"unnamed_share": "╨б╨┐╨╛╨┤╨╡╨╗╤П╨╜╨╡ ╨▒╨╡╨╖ ╨╕╨╝╨╡",
@@ -1332,6 +1357,7 @@
"view_all": "╨Я╤А╨╡╨│╨╗╨╡╨┤ ╨╜╨░ ╨▓╤Б╨╕╤З╨║╨╕",
"view_all_users": "╨Я╤А╨╡╨│╨╗╨╡╨┤ ╨╜╨░ ╨▓╤Б╨╕╤З╨║╨╕ ╨┐╨╛╤В╤А╨╡╨▒╨╕╤В╨╡╨╗╨╕",
"view_in_timeline": "╨Я╨╛╨║╨░╨╢╨╕ ╨▓╤К╨▓ ╨▓╤А╨╡╨╝╨╡╨▓╨░ ╨╗╨╕╨╜╨╕╤П",
"view_link": "╨Я╤А╨╡╨│╨╗╨╡╨┤ ╨╜╨░ ╨▓╤А╤К╨╖╨║╨░╤В╨░",
"view_links": "╨Я╤А╨╡╨│╨╗╨╡╨┤ ╨╜╨░ ╨▓╤А╤К╨╖╨║╨╕╤В╨╡",
"view_name": "╨Я╤А╨╡╨│╨╗╨╡╨┤╨░╨╣",
"view_next_asset": "╨Я╤А╨╡╨│╨╗╨╡╨┤ ╨╜╨░ ╤Б╨╗╨╡╨┤╨▓╨░╤Й╨╕╤П ╤Д╨░╨╣╨╗",
+30 -6
View File
@@ -41,6 +41,7 @@
"backup_settings": "Ajustes de les c├▓pies de seguretat",
"backup_settings_description": "Gestionar la configuraci├│ de la c├▓pia de seguretat de la base de dades",
"check_all": "Marca-ho tot",
"cleanup": "Neteja",
"cleared_jobs": "Tasques esborrades per a: {job}",
"config_set_by_file": "La configuraci├│ est├а definida per un fitxer de configuraci├│",
"confirm_delete_library": "Esteu segurs que voleu eliminar la llibreria {library}?",
@@ -96,7 +97,7 @@
"library_scanning_enable_description": "Habilita l'escaneig peri├▓dic de biblioteques",
"library_settings": "Llibreria externes",
"library_settings_description": "Gestiona la configuraci├│ de les llibreries externes",
"library_tasks_description": "Realitza tasques de la bilbioteca",
"library_tasks_description": "Escaneja biblioteques externes per arxius nous o canviats",
"library_watching_enable_description": "Consultar llibreries externes per detectar canvis en fitxers",
"library_watching_settings": "Monitoratge de la llibreria (EXPERIMENTAL)",
"library_watching_settings_description": "Monitoritzaci├│ autom├аtica de fitxers modificats",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "Cerca imatges sem├аnticament emprant incrustacions CLIP",
"machine_learning_smart_search_enabled": "Activa la cerca intel┬╖ligent",
"machine_learning_smart_search_enabled_description": "Si est├а deshabilitat les imatges no es codificaran per la cerca intel┬╖ligent.",
"machine_learning_url_description": "La URL del servidor d'aprenentatge autom├аtic. Si es proporciona m├йs d'una URL, s'intentar├а accedir a cada servidor en ordre fins que un d'ells respongui correctament.",
"machine_learning_url_description": "L'URL del servidor d'aprenentatge autom├аtic. Si es proporciona m├йs d'un URL, s'intentar├а accedir a cada servidor en ordre fins que un d'ells respongui correctament.",
"manage_concurrency": "Gestiona la concurr├иncia",
"manage_log_settings": "Gestiona la configuraci├│ del registre",
"map_dark_style": "Tema fosc",
@@ -147,6 +148,8 @@
"map_settings": "Mapa",
"map_settings_description": "Gestiona la configuraci├│ del mapa",
"map_style_description": "URL a un tema del mapa style.json",
"memory_cleanup_job": "Neteja de mem├▓ries",
"memory_generate_job": "Generaci├│ de mem├▓ries",
"metadata_extraction_job": "Extreure metadades",
"metadata_extraction_job_description": "Extreu la informaci├│ de metadades de cada element, com per exemple el GPS i la resoluci├│",
"metadata_faces_import_setting": "Activar la importaci├│ de cares",
@@ -240,7 +243,7 @@
"storage_template_hash_verification_enabled_description": "Activa la verificaci├│ de hash. No la desactiveu a menys que estigueu segurs de les implicacions",
"storage_template_migration": "Migraci├│ de plantilles d'emmagatzematge",
"storage_template_migration_description": "Aplica la <link>{template}</link> actual als elements pujats pr├иviament",
"storage_template_migration_info": "Els canvis de plantilla nom├йs s'aplicaran a nous elements. Per aplicar la plantilla rectroactivament a elements pujats pr├иviament, executeu la <link>{job}</link>.",
"storage_template_migration_info": "Les extensions es convertiran a min├║scules. Els canvis de plantilla nom├йs s'aplicaran a nous elements. Per aplicar la plantilla rectroactivament a elements pujats pr├иviament, executeu la <link>{job}</link>.",
"storage_template_migration_job": "Tasca de migraci├│ de la plantilla d'emmagatzematge",
"storage_template_more_details": "Per obtenir m├йs detalls sobre aquesta funci├│, consulteu la <template-link>Storage Template</template-link> i les seves <implications-link>implications</implications-link>",
"storage_template_onboarding_description": "Quan est├а activada, aquesta funci├│ organitzar├а autom├аticament els fitxers en funci├│ d'una plantilla definida per l'usuari. A causa de problemes d'estabilitat, la funci├│ s'ha desactivat de manera predeterminada. Per obtenir m├йs informaci├│, consulteu la <link>documentation</link>.",
@@ -299,7 +302,7 @@
"transcoding_max_b_frames": "Nombre m├аxim de B-frames",
"transcoding_max_b_frames_description": "Els valors m├йs alts milloren l'efici├иncia de la compressi├│, per├▓ alenteixen la codificaci├│. ├Йs possible que no sigui compatible amb l'acceleraci├│ de maquinari en dispositius antics. 0 desactiva els B-frames, mentre que -1 estableix aquest valor autom├аticament.",
"transcoding_max_bitrate": "Taxa de bits m├аxima",
"transcoding_max_bitrate_description": "Establir una taxa de bits m├аxima pot fer que les mides dels fitxers siguin m├йs previsibles amb un cost menor per a la qualitat. A 720p, els valors t├нpics s├│n 2600k per a VP9 o HEVC, o 4500k per a H.264. Desactivat si s'estableix a 0.",
"transcoding_max_bitrate_description": "Establir una taxa de bits m├аxima pot fer que les mides dels fitxers siguin m├йs previsibles amb un cost menor per a la qualitat. A 720p, els valors t├нpics s├│n 2600 kbit/s per a VP9 o HEVC, o 4500 kbit/s per a H.264. Desactivat si s'estableix a 0.",
"transcoding_max_keyframe_interval": "Interval m├аxim de fotogrames clau",
"transcoding_max_keyframe_interval_description": "Estableix la dist├аncia m├аxima entre fotogrames clau. Els valors m├йs baixos empitjoren l'efici├иncia de la compressi├│, per├▓ milloren els temps de cerca i poden millorar la qualitat en escenes amb moviment r├аpid. 0 estableix aquest valor autom├аticament.",
"transcoding_optimal_description": "V├нdeos superiors a la resoluci├│ objectiu o que no tenen un format acceptat",
@@ -391,6 +394,7 @@
"allow_edits": "Permet editar",
"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",
"alt_text_qr_code": "Codi QR",
"anti_clockwise": "En sentit antihorari",
"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.",
@@ -410,7 +414,7 @@
"asset_description_updated": "La descripci├│ del recurs s'ha actualitzat",
"asset_filename_is_offline": "L'element {filename} est├а fora de l├нnia",
"asset_has_unassigned_faces": "L'element t├й cares no assignades",
"asset_hashing": "HashingтАж",
"asset_hashing": "HasheantтАж",
"asset_offline": "Element fora de l├нnia",
"asset_offline_description": "Aquest recurs extern ja no es troba al disc. Poseu-vos en contacte amb el vostre administrador d'Immich per obtenir ajuda.",
"asset_skipped": "Saltat",
@@ -464,7 +468,7 @@
"check_logs": "Comprovar els registres",
"choose_matching_people_to_merge": "Trieu les persones que coincideixin per combinar-les",
"city": "Ciutat",
"clear": "Neteja",
"clear": "Buida",
"clear_all": "Neteja-ho tot",
"clear_all_recent_searches": "Esborra totes les cerques recents",
"clear_message": "Neteja el missatge",
@@ -481,6 +485,7 @@
"comments_are_disabled": "Els comentaris estan desactivats",
"confirm": "Confirmar",
"confirm_admin_password": "Confirmeu la contrasenya d'administrador",
"confirm_delete_face": "Est├аs segur que vols eliminar la cara de {name} de les cares reconegudes?",
"confirm_delete_shared_link": "Esteu segurs que voleu eliminar aquest enlla├з compartit?",
"confirm_keep_this_delete_others": "Excepte aquest element, tots els altres de la pila se suprimiran. Esteu segur que voleu continuar?",
"confirm_password": "Confirmaci├│ de contrasenya",
@@ -533,6 +538,7 @@
"delete_album": "Esborra l'├аlbum",
"delete_api_key_prompt": "Esteu segurs que voleu eliminar aquesta clau API?",
"delete_duplicates_confirmation": "Esteu segurs que voleu eliminar aquests duplicats permanentment?",
"delete_face": "Esborrar cara",
"delete_key": "Suprimeix la clau",
"delete_library": "Suprimeix la Llibreria",
"delete_link": "Esborra l'enlla├з",
@@ -600,6 +606,7 @@
"enabled": "Activat",
"end_date": "Data final",
"error": "Error",
"error_delete_face": "Error esborrant cara de les cares reconegudes",
"error_loading_image": "Error carregant la imatge",
"error_title": "Error - Quelcom ha anat malament",
"errors": {
@@ -766,8 +773,10 @@
"go_to_folder": "Anar al directori",
"go_to_search": "V├йs a cercar",
"group_albums_by": "Agrupa ├аlbums per...",
"group_country": "Agrupar per pa├нs",
"group_no": "Cap agrupaci├│",
"group_owner": "Agrupar per propietari",
"group_places_by": "Agrupar llocs per...",
"group_year": "Agrupar per any",
"has_quota": "Quota",
"hi_user": "Hola {name} ({email})",
@@ -800,6 +809,7 @@
"include_shared_albums": "Inclou ├аlbums compartits",
"include_shared_partner_assets": "Incloure elements dels companys",
"individual_share": "Compartit individualment",
"individual_shares": "Espais individuals",
"info": "Informaci├│",
"interval": {
"day_at_onepm": "Cada dia a les 13h",
@@ -881,6 +891,7 @@
"month": "Mes",
"more": "M├йs",
"moved_to_trash": "S'ha mogut a la paperera",
"mute_memories": "Silenciar records",
"my_albums": "Els meus ├аlbums",
"name": "Nom",
"name_or_nickname": "Nom o sobrenom",
@@ -985,6 +996,7 @@
"pick_a_location": "Triar una ubicaci├│",
"place": "Lloc",
"places": "Llocs",
"places_count": "{count, plural, one {{count, number} Lloc} other {{count, number} Llocs}}",
"play": "Reprodueix",
"play_memories": "Reproduir records",
"play_motion_photo": "Reproduir Fotos en Moviment",
@@ -1072,6 +1084,8 @@
"removed_from_archive": "Eliminat de l'arxiu",
"removed_from_favorites": "Eliminat dels preferits",
"removed_from_favorites_count": "{count, plural, other {# eliminats}} dels preferits",
"removed_memory": "Eliminat mem├▓ria",
"removed_photo_from_memory": "Eliminat foto de mem├▓ria",
"removed_tagged_assets": "Etiqueta eliminada de {count, plural, one {# actiu} other {# actius}}",
"rename": "Canviar nom",
"repair": "Reparaci├│",
@@ -1080,6 +1094,7 @@
"repository": "Repositori",
"require_password": "Requereix contrasenya",
"require_user_to_change_password_on_first_login": "Requerir que l'usuari canvi├п la contrasenya en el primer inici de sessi├│",
"rescan": "Tornar a escanejar",
"reset": "Restablir",
"reset_password": "Restablir contrasenya",
"reset_people_visibility": "Restablir la visibilitat de les persones",
@@ -1108,6 +1123,8 @@
"search": "Cerca",
"search_albums": "Buscar ├аlbums",
"search_by_context": "Buscar per context",
"search_by_description": "Cercar per descripci├│",
"search_by_description_example": "Jornada de senderisme a Sapa",
"search_by_filename": "Cerca per nom de fitxer o extensi├│",
"search_by_filename_example": "per exemple IMG_1234.JPG o PNG",
"search_camera_make": "Buscar per fabricant de c├аmara...",
@@ -1121,6 +1138,7 @@
"search_options": "Opcions de cerca",
"search_people": "Buscar persones",
"search_places": "Buscar llocs",
"search_rating": "Buscar per qualificaci├│...",
"search_settings": "Configuraci├│ de cerca",
"search_state": "Buscar per regi├│...",
"search_tags": "Cercant etiquetes...",
@@ -1167,6 +1185,7 @@
"shared_from_partner": "Fotos de {partner}",
"shared_link_options": "Opcions d'enlla├зos compartits",
"shared_links": "Enlla├зos compartits",
"shared_links_description": "Comparteix fotos i v├нdeos amb un enlla├з",
"shared_photos_and_videos_count": "{assetCount, plural, other {# fotos i v├нdeos compartits.}}",
"shared_with_partner": "Compartit amb {partner}",
"sharing": "Compartit",
@@ -1189,6 +1208,7 @@
"show_person_options": "Mostra opcions de la persona",
"show_progress_bar": "Mostra barra de progr├йs",
"show_search_options": "Mostra opcions de cerca",
"show_shared_links": "Mostra els enlla├зos compartits",
"show_slideshow_transition": "Mostra la transici├│ de la presentaci├│ de diapositives",
"show_supporter_badge": "Ins├нgnia de contribuent",
"show_supporter_badge_description": "Mostra una ins├нgnia de contributor",
@@ -1242,6 +1262,7 @@
"tag_created": "Etiqueta creada: {tag}",
"tag_feature_description": "Exploreu fotos i v├нdeos agrupats per temes d'etiquetes l├▓giques",
"tag_not_found_question": "No trobeu una etiqueta? <link>Crear una nova etiqueta</link>",
"tag_people": "Etiquetar personas",
"tag_updated": "Etiqueta actualizada: {tag}",
"tagged_assets": "{count, plural, one {#Etiquetat} other {#Etiquetats}} {count, plural, one {# actiu} other {# actius}}",
"tags": "Etiquetes",
@@ -1276,11 +1297,13 @@
"unfavorite": "Reverteix preferit",
"unhide_person": "Mostra persona",
"unknown": "Desconegut",
"unknown_country": "Pa├нs Desconegut",
"unknown_year": "Any desconegut",
"unlimited": "Il┬╖limitat",
"unlink_motion_video": "Desvincular v├нdeo en moviment",
"unlink_oauth": "Desvincula OAuth",
"unlinked_oauth_account": "Compte Oauth desvinculat",
"unmute_memories": "Activar el so dels records",
"unnamed_album": "├Аlbum sense nom",
"unnamed_album_delete_confirmation": "Segur que voleu esborrar aquest ├аlbum?",
"unnamed_share": "Compartit sense nom",
@@ -1334,6 +1357,7 @@
"view_all": "Veure tot",
"view_all_users": "Mostra tot els usuaris",
"view_in_timeline": "Mostrar a la l├нnia de temps",
"view_link": "Veure enlla├з",
"view_links": "Mostra enlla├зos",
"view_name": "Veure",
"view_next_asset": "Mostra el seg├╝ent element",
+30 -11
View File
@@ -41,6 +41,7 @@
"backup_settings": "Nastaven├н z├бlohov├бn├н",
"backup_settings_description": "Spr├бva nastaven├н z├бlohov├бn├н datab├бze",
"check_all": "V┼бe zkontrolovat",
"cleanup": "Vy─Нi┼бt─Ыn├н",
"cleared_jobs": "Hotov├й ├║lohy pro: {job}",
"config_set_by_file": "Konfigurace je aktu├бln─Ы prov├бd─Ыna konfigura─Нn├нm souborem",
"confirm_delete_library": "Opravdu chcete odstranit knihovnu {library}?",
@@ -96,7 +97,7 @@
"library_scanning_enable_description": "Povolit pravideln├й prohled├бv├бn├н knihovny",
"library_settings": "Extern├н knihovna",
"library_settings_description": "Spr├бva nastaven├н extern├н knihovny",
"library_tasks_description": "Prov├бd─Ыn├н ├║kol┼п v knihovn─Ы",
"library_tasks_description": "Vyhled├бv├бn├н nov├╜ch nebo zm─Ыn─Ыn├╜ch polo┼╛ek 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_description": "Automatick├й sledov├бn├н zm─Ыn─Ыn├╜ch soubor┼п",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "S├йmantick├й vyhled├бv├бn├н obr├бzk┼п pomoc├н CLIP embeddings",
"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_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.",
"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.",
"manage_concurrency": "Spr├бva soub─Ы┼╛nosti",
"manage_log_settings": "Spr├бva nastaven├н protokolu",
"map_dark_style": "Tmav├╜ motiv",
@@ -147,6 +148,8 @@
"map_settings": "Mapa",
"map_settings_description": "Spr├бva nastaven├н mapy",
"map_style_description": "URL na style.json motivu",
"memory_cleanup_job": "Promaz├бn├н vzpom├нnek",
"memory_generate_job": "Vytvo┼Щen├н vzpom├нnek",
"metadata_extraction_job": "Extrakce metadat",
"metadata_extraction_job_description": "Z├нsk├бn├н informac├н o metadatech z ka┼╛d├йho sn├нmku, jako je GPS, obli─Нeje a rozli┼бen├н",
"metadata_faces_import_setting": "Povolit import obli─Нeje",
@@ -240,7 +243,7 @@
"storage_template_hash_verification_enabled_description": "Povol├н ov─Ы┼Щov├бn├н hashe, nevyp├нnejte ji, pokud si nejste jisti d┼пsledky",
"storage_template_migration": "Migrace ┼бablony ├║lo┼╛i┼бt─Ы",
"storage_template_migration_description": "Pou┼╛├нt aktu├бln├н <link>{template}</link> na d┼Щ├нve nahran├й polo┼╛ky",
"storage_template_migration_info": "Zm─Ыny ┼бablon se uplatn├н pouze u nov├╜ch polo┼╛ek. Chcete-li ┼бablonu zp─Ыtn─Ы pou┼╛├нt na d┼Щ├нve nahran├й polo┼╛ky, spus┼еte <link>{job}</link>.",
"storage_template_migration_info": "┼аablona ├║lo┼╛i┼бt─Ы p┼Щevede v┼бechny p┼Щ├нpony na mal├б p├нsmena. Zm─Ыny ┼бablon se uplatn├н pouze u nov├╜ch polo┼╛ek. Chcete-li ┼бablonu zp─Ыtn─Ы pou┼╛├нt na d┼Щ├нve nahran├й polo┼╛ky, spus┼еte <link>{job}</link>.",
"storage_template_migration_job": "├Ъloha migrace ┼бablony ├║lo┼╛i┼бt─Ы",
"storage_template_more_details": "Dal┼б├н podrobnosti o t├йto funkci naleznete v sekci <template-link>┼аablona ├║lo┼╛i┼бt─Ы</template-link> v─Нetn─Ы jej├нch <implications-link>d┼пsledk┼п</implications-link>",
"storage_template_onboarding_description": "Je-li tato funkce povolena, automaticky uspo┼Щ├бd├б soubory na z├бklad─Ы u┼╛ivatelem definovan├й ┼бablony. Z d┼пvodu probl├йm┼п se stabilitou byla tato funkce ve v├╜choz├нm nastaven├н vypnuta. Dal┼б├н informace naleznete v <link>dokumentaci</link>.",
@@ -288,7 +291,7 @@
"transcoding_constant_quality_mode_description": "ICQ je lep┼б├н ne┼╛ CQP, ale n─Ыkter├б za┼Щ├нzen├н pro hardwarovou akceleraci tento re┼╛im nepodporuj├н. Nastaven├нm t├йto volby se p┼Щi pou┼╛it├н k├│dov├бn├н zalo┼╛en├йho na kvalit─Ы up┼Щednostn├н zadan├╜ re┼╛im. Ignorov├бno NVENC, proto┼╛e nepodporuje ICQ.",
"transcoding_constant_rate_factor": "Faktor konstantn├н rychlosti (-crf)",
"transcoding_constant_rate_factor_description": "├Ъrove┼И kvality videa. Typick├й hodnoty jsou 23 pro H.264, 28 pro HEVC, 31 pro VP9 a 35 pro AV1. Ni┼╛┼б├н je lep┼б├н, ale vytv├б┼Щ├н v─Ыt┼б├н soubory.",
"transcoding_disabled_description": "Nep┼Щek├│dov├бvejte ┼╛├бdn├б videa, u n─Ыkter├╜ch klient┼п m┼п┼╛e doj├нt k znemo┼╛n─Ыn├н p┼Щehr├бv├бn├н",
"transcoding_disabled_description": "Nep┼Щek├│dov├бvat ┼╛├бdn├б videa, u n─Ыkter├╜ch klient┼п m┼п┼╛e doj├нt k znemo┼╛n─Ыn├н p┼Щehr├бv├бn├н",
"transcoding_encoding_options": "Mo┼╛nosti k├│dov├бn├н",
"transcoding_encoding_options_description": "Nastavte kodeky, rozli┼бen├н, kvalitu a dal┼б├н mo┼╛nosti pro k├│dovan├б videa",
"transcoding_hardware_acceleration": "Hardwarov├б akcelerace",
@@ -299,7 +302,7 @@
"transcoding_max_b_frames": "Maxim├бln├н po─Нet B-sn├нmk┼п",
"transcoding_max_b_frames_description": "Vy┼б┼б├н hodnoty zvy┼бuj├н ├║─Нinnost komprese, ale zpomaluj├н k├│dov├бn├н. Nemus├н b├╜t kompatibiln├н s hardwarovou akcelerac├н na star┼б├нch za┼Щ├нzen├нch. Hodnota 0 zak├б┼╛e B-sn├нmky, zat├нmco -1 tuto hodnotu nastav├н automaticky.",
"transcoding_max_bitrate": "Maxim├бln├н datov├╜ tok",
"transcoding_max_bitrate_description": "Nastaven├н maxim├бln├нho datov├йho toku m┼п┼╛e zv├╜┼бit p┼Щedv├нdatelnost velikosti soubor┼п za cenu men┼б├н ├║jmy na kvalit─Ы. P┼Щi rozli┼бen├н 720p jsou typick├й hodnoty 2600k pro VP9 nebo HEVC nebo 4500k pro H.264. Je zak├бz├бno, pokud je nastavena hodnota 0.",
"transcoding_max_bitrate_description": "Nastaven├н maxim├бln├нho datov├йho toku m┼п┼╛e zv├╜┼бit p┼Щedv├нdatelnost velikosti soubor┼п za cenu men┼б├н ├║jmy na kvalit─Ы. P┼Щi rozli┼бen├н 720p jsou typick├й hodnoty 2600 kbit/s pro VP9 nebo HEVC nebo 4500 kbit/s pro H.264. Je zak├бz├бno, pokud je nastavena hodnota 0.",
"transcoding_max_keyframe_interval": "Maxim├бln├н interval kl├н─Нov├╜ch sn├нmk┼п",
"transcoding_max_keyframe_interval_description": "Nastavuje maxim├бln├н vzd├бlenost mezi kl├н─Нov├╜mi sn├нmky. Ni┼╛┼б├н hodnoty zhor┼бuj├н ├║─Нinnost komprese, ale zlep┼бuj├н rychlost p┼Щi p┼Щeskakov├бn├н a mohou zlep┼бit kvalitu ve sc├йn├бch s rychl├╜m pohybem. Hodnota 0 nastavuje tuto hodnotu automaticky.",
"transcoding_optimal_description": "Videa s vy┼б┼б├нm ne┼╛ c├нlov├╜m rozli┼бen├нm nebo videa, kter├б nejsou v akceptovan├йm form├бtu",
@@ -391,6 +394,7 @@
"allow_edits": "Povolit ├║pravy",
"allow_public_user_to_download": "Povolit ve┼Щejnosti stahovat",
"allow_public_user_to_upload": "Povolit ve┼Щejnosti nahr├бvat",
"alt_text_qr_code": "Obr├бzek QR k├│du",
"anti_clockwise": "Proti sm─Ыru hodinov├╜ch ru─Нi─Нek",
"api_key": "API kl├н─Н",
"api_key_description": "Tato hodnota se zobraz├н pouze jednou. P┼Щed zav┼Щen├нm okna ji nezapome┼Иte zkop├нrovat.",
@@ -464,11 +468,11 @@
"check_logs": "Zkontrolujte protokoly",
"choose_matching_people_to_merge": "Zvolte odpov├нdaj├нc├н osoby ke slou─Нen├н",
"city": "M─Ыsto",
"clear": "Vy─Нistit",
"clear": "Vymazat",
"clear_all": "Vymazat v┼бe",
"clear_all_recent_searches": "Vymazat v┼бechna ned├бvn├б vyhled├бv├бn├н",
"clear_message": "Vy─Нistit zpr├бvu",
"clear_value": "Vy─Нistit hodnotu",
"clear_message": "Vymazat zpr├бvu",
"clear_value": "Vymazat hodnotu",
"clockwise": "Po sm─Ыru hodinov├╜ch ru─Нi─Нek",
"close": "Zav┼Щ├нt",
"collapse": "Sbalit",
@@ -481,6 +485,7 @@
"comments_are_disabled": "Koment├б┼Щe jsou vypnuty",
"confirm": "Potvrdit",
"confirm_admin_password": "Potvrzen├н hesla spr├бvce",
"confirm_delete_face": "Opravdu chcete z polo┼╛ky odstranit obli─Нej osoby {name}?",
"confirm_delete_shared_link": "Opravdu chcete odstranit tento sd├нlen├╜ odkaz?",
"confirm_keep_this_delete_others": "V┼бechny ostatn├н polo┼╛ky v tomto uskupen├н mimo t├йto budou odstran─Ыny. Opravdu chcete pokra─Нovat?",
"confirm_password": "Potvrzen├н hesla",
@@ -533,6 +538,7 @@
"delete_album": "Smazat album",
"delete_api_key_prompt": "Opravdu chcete tento API kl├н─Н odstranit?",
"delete_duplicates_confirmation": "Opravdu chcete tyto duplicity trvale odstranit?",
"delete_face": "Odstranit obli─Нej",
"delete_key": "Smazat kl├н─Н",
"delete_library": "Smazat knihovnu",
"delete_link": "Smazat odkaz",
@@ -600,6 +606,7 @@
"enabled": "Povoleno",
"end_date": "Kone─Нn├й datum",
"error": "Chyba",
"error_delete_face": "Chyba p┼Щi odstra┼Иov├бn├н obli─Нeje z polo┼╛ky",
"error_loading_image": "Chyba p┼Щi na─Н├нt├бn├н obr├бzku",
"error_title": "Chyba - N─Ыco se pokazilo",
"errors": {
@@ -751,8 +758,8 @@
"features_setting_description": "Spr├бva funkc├н aplikace",
"file_name": "N├бzev souboru",
"file_name_or_extension": "N├бzev nebo p┼Щ├нpona souboru",
"filename": "Filename",
"filetype": "Filetype",
"filename": "N├бzev souboru",
"filetype": "Typ souboru",
"filter_people": "Filtrovat lidi",
"find_them_fast": "Najd─Ыte je rychle vyhled├бn├нm jejich jm├йna",
"fix_incorrect_match": "Opravit nespr├бvnou shodu",
@@ -884,6 +891,7 @@
"month": "M─Ыs├нc",
"more": "V├нce",
"moved_to_trash": "P┼Щesunuto do ko┼бe",
"mute_memories": "Ztlumit vzpom├нnky",
"my_albums": "Moje alba",
"name": "Jm├йno",
"name_or_nickname": "Jm├йno nebo p┼Щezd├нvka",
@@ -979,6 +987,7 @@
"permanently_deleted_asset": "Polo┼╛ka trvale odstran─Ыna",
"permanently_deleted_assets_count": "{count, plural, one {Polo┼╛ka trvale vymaz├бna} other {Polo┼╛ky trvale vymaz├бny}}",
"person": "Osoba",
"person_birthdate": "Narozen/a {date}",
"person_hidden": "{name}{hidden, select, true { (skryto)} other {}}",
"photo_shared_all_users": "Vypad├б to, ┼╛e jste fotky sd├нleli se v┼бemi u┼╛ivateli, nebo nem├бte ┼╛├бdn├йho u┼╛ivatele, se kter├╜m byste je mohli sd├нlet.",
"photos": "Fotky",
@@ -1070,12 +1079,16 @@
"remove_from_album": "Odstranit z alba",
"remove_from_favorites": "Odstranit z obl├нben├╜ch",
"remove_from_shared_link": "Odstranit ze sd├нlen├йho odkazu",
"remove_memory": "Odstranit vzpom├нnku",
"remove_photo_from_memory": "Odstranit fotografii z t├йto vzpom├нnky",
"remove_url": "Odstranit URL",
"remove_user": "Odebrat u┼╛ivatele",
"removed_api_key": "Odstran─Ыn API kl├н─Н: {name}",
"removed_from_archive": "Odstran─Ыno z archivu",
"removed_from_favorites": "Odstran─Ыno z obl├нben├╜ch",
"removed_from_favorites_count": "{count, plural, one {Odstran─Ыn #} few {Odstran─Ыny #} other {Odstran─Ыno #}} z obl├нben├╜ch",
"removed_memory": "Vzpom├нnka odstran─Ыna",
"removed_photo_from_memory": "Fotografie odstran─Ыna ze vzpom├нnky",
"removed_tagged_assets": "Odstran─Ыn├б zna─Нka z {count, plural, one {# polo┼╛ky} other {# polo┼╛ek}}",
"rename": "P┼Щejmenovat",
"repair": "Opravy",
@@ -1084,6 +1097,7 @@
"repository": "Repozit├б┼Щ",
"require_password": "Po┼╛adovat heslo",
"require_user_to_change_password_on_first_login": "Po┼╛adovat, aby si u┼╛ivatel p┼Щi prvn├нm p┼Щihl├б┼бen├н zm─Ыnil heslo",
"rescan": "Znovu prohledat",
"reset": "V├╜choz├н",
"reset_password": "Obnovit heslo",
"reset_people_visibility": "Obnovit viditelnost lid├н",
@@ -1127,6 +1141,7 @@
"search_options": "Mo┼╛nosti vyhled├бv├бn├н",
"search_people": "Vyhledat lidi",
"search_places": "Vyhledat m├нsta",
"search_rating": "Vyhled├бv├бn├н podle hodnocen├н...",
"search_settings": "Hledat nastaven├н",
"search_state": "Vyhledat st├бt...",
"search_tags": "Vyhled├бvat zna─Нky...",
@@ -1136,6 +1151,7 @@
"searching_locales": "Vyhled├бv├бn├н jazyk┼п...",
"second": "Sekunda",
"see_all_people": "Zobrazit v┼бechny lidi",
"select": "Vybrat",
"select_album_cover": "Vybrat obal alba",
"select_all": "Vybrat v┼бe",
"select_all_duplicates": "Vybrat v┼бechny duplicity",
@@ -1250,6 +1266,7 @@
"tag_created": "Vytvo┼Щena zna─Нka: {tag}",
"tag_feature_description": "Proch├бzen├н fotografi├н a vide├н seskupen├╜ch podle t├йmat logick├╜ch zna─Нek",
"tag_not_found_question": "Nem┼п┼╛ete naj├нt zna─Нku? <link>Vytvo┼Щte novou.</link>",
"tag_people": "Ozna─Нit lidi",
"tag_updated": "Aktualizov├бna zna─Нka: {tag}",
"tagged_assets": "P┼Щi┼Щazena zna─Нka {count, plural, one {# polo┼╛ce} other {# polo┼╛k├бm}}",
"tags": "Zna─Нky",
@@ -1290,6 +1307,7 @@
"unlink_motion_video": "Odpojit pohybliv├й video",
"unlink_oauth": "Zru┼бit OAuth propojen├н",
"unlinked_oauth_account": "OAuth ├║─Нet odpojen",
"unmute_memories": "Zru┼бit ztlumen├н vzpom├нnek",
"unnamed_album": "Nepojmenovan├й album",
"unnamed_album_delete_confirmation": "Opravdu chcete toto album smazat?",
"unnamed_share": "Nepojmenovan├й sd├нlen├н",
@@ -1343,6 +1361,7 @@
"view_all": "Zobrazit v┼бe",
"view_all_users": "Zobrazit v┼бechny u┼╛ivatele",
"view_in_timeline": "Zobrazit na ─Нasov├й ose",
"view_link": "Zobrazit odkaz",
"view_links": "Zobrazit odkazy",
"view_name": "Zobrazit",
"view_next_asset": "Zobrazit dal┼б├н polo┼╛ku",
@@ -1355,7 +1374,7 @@
"welcome": "V├нtejte",
"welcome_to_immich": "V├нtejte v Immichi",
"year": "Rok",
"years_ago": "P┼Щed {years, plural, one {# rokem} other {# lety}}",
"years_ago": "P┼Щed {years, plural, one {rokem} other {# lety}}",
"yes": "Ano",
"you_dont_have_any_shared_links": "Nem├бte ┼╛├бdn├й sd├нlen├й odkazy",
"zoom_image": "Zv─Ыt┼бit obr├бzek"
+72 -53
View File
@@ -41,6 +41,7 @@
"backup_settings": "Backup-indstillinger",
"backup_settings_description": "Administrer backupindstillinger for database",
"check_all": "Tjek Alle",
"cleanup": "Ryd op",
"cleared_jobs": "Ryddet jobs til: {job}",
"config_set_by_file": "konfigurationen er i ├╕jeblikket indstillet af en konfigurations fil",
"confirm_delete_library": "Er du sikker p├е, at du vil slette {library} bibliotek?",
@@ -96,7 +97,7 @@
"library_scanning_enable_description": "Aktiver periodisk biblioteksscanning",
"library_settings": "Eksternt bibliotek",
"library_settings_description": "Administrer eksterne biblioteksindstillinger",
"library_tasks_description": "Udf├╕r biblioteksopgaver",
"library_tasks_description": "Scan eksterne biblioteker for nye og/eller ├жndrede mediefiler",
"library_watching_enable_description": "Overv├еg eksterne biblioteker for fil├жndringer",
"library_watching_settings": "Biblioteks overv├еgning (EKSPERIMENTEL)",
"library_watching_settings_description": "Tjek automatisk for ├жndrede filer",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "S├╕g semantisk efter billeder ved hj├жlp af CLIP-indlejringer",
"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_url_description": "URL p├е maskinl├жringsserveren. Hvis der er angivet mere end ├йn URL, hver server vil blive fors├╕gt en ad gangen, indtil en reagerer med succes, i r├жkkef├╕lge fra f├╕rste til sidste.",
"machine_learning_url_description": "URLтАЩen 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.",
"manage_concurrency": "Administrer antallet af samtidige opgaver",
"manage_log_settings": "Administrer logindstillinger",
"map_dark_style": "M├╕rk tema",
@@ -147,6 +148,8 @@
"map_settings": "Kort",
"map_settings_description": "Administrer kortindstillinger",
"map_style_description": "URL til en style.json for et korttema",
"memory_cleanup_job": "Mindeoprydning",
"memory_generate_job": "Mindegeneration",
"metadata_extraction_job": "Udtr├жk metadata",
"metadata_extraction_job_description": "Udtr├жk metadataoplysninger fra hvert Billede/Video, s├еsom GPS og opl├╕sning",
"metadata_faces_import_setting": "Aktiv├йr for at importere ansigter",
@@ -240,7 +243,7 @@
"storage_template_hash_verification_enabled_description": "Sl├еr hash-verifikation til, sl├е ikke dette fra med mindre du er sikker p├е dets konsekvenser",
"storage_template_migration": "Lagringsskabelonmigration",
"storage_template_migration_description": "Anvend den nuv├жrende <link>{template}</link> p├е tidligere uploadede mediefiler",
"storage_template_migration_info": "Skabelon├жndringer vil kun g├жlde for nye mediefiler. For at anvende skabelonen retroaktivt p├е tidligere uploadede mediefiler skal du k├╕re <link>{job}</link>.",
"storage_template_migration_info": "Lager-skabelonen vil konvertere alle filendelser til sm├е bogstaver. Skabelon├жndringer vil kun g├жlde for nye mediefiler. For at anvende skabelonen retroaktivt p├е tidligere uploadede mediefiler skal du k├╕re <link>{job}</link>.",
"storage_template_migration_job": "Lager Skabelon Migreringsjob",
"storage_template_more_details": "For flere detaljer om denne funktion, referer til <template-link>Lager Skabelonen</template-link> og dens <implications-link>implikationer</implications-link>",
"storage_template_onboarding_description": "N├еr denne funktion er aktiveret, vil den automatisk organisere filer baseret p├е en brugerdefineret skabelon. P├е grund af stabilitetsproblemer er funktionen som standard sl├еet fra. For mere information, se <link>dokumentation</link>.",
@@ -299,7 +302,7 @@
"transcoding_max_b_frames": "Maksimum B-frames",
"transcoding_max_b_frames_description": "H├╕jere v├жrdier forbedrer kompressionseffektivitet, men kan g├╕re indkodning langsommere. Er m├еske ikke kompatibelt med hardware-acceleration p├е ├жldre enheder. 0 sl├еr B-frames fra, mens -1 s├жtter denne v├жrdi automatisk.",
"transcoding_max_bitrate": "Maksimal bitrate",
"transcoding_max_bitrate_description": "At s├жtte en maksmimal bitrate kan g├╕re filst├╕rrelserne mere forudsigelige med et lille tab i kvalitet. Ved 720p er almindelige v├жrdier 2600k for VP9 eller HEVC, eller 4500K for H.264. Sl├еet fra hvis sat til 0.",
"transcoding_max_bitrate_description": "At s├жtte en maksmimal bitrate kan g├╕re filst├╕rrelserne mere forudsigelige med et lille tab i kvalitet. Ved 720p er almindelige v├жrdier 2600 kbit/s for VP9 eller HEVC, eller 4500 kbit/s for H.264. Sl├еet fra hvis sat til 0.",
"transcoding_max_keyframe_interval": "Maksimal keyframe-interval",
"transcoding_max_keyframe_interval_description": "S├жtter den maksimale frameafstand mellem keyframes. Lavere v├жrdier forringer kompressionseffektiviteten, men forbedrer s├╕getider og kan forbedre kvaliteten i scener med hurtig bev├жgelse. 0 s├жtter denne v├жrdi automatisk.",
"transcoding_optimal_description": "Videoer h├╕jere end m├еlopl├╕sningen eller ikke i et godkendt format",
@@ -391,6 +394,7 @@
"allow_edits": "Tillad redigeringer",
"allow_public_user_to_download": "Tillad offentlige brugere til at hente",
"allow_public_user_to_upload": "Tillad offentlige brugere til at uploade",
"alt_text_qr_code": "QR-kode billede",
"anti_clockwise": "Mod uret",
"api_key": "API-n├╕gle",
"api_key_description": "Denne v├жrdi vises kun ├йn gang. Venligst kopi├йr den f├╕r du lukker vinduet.",
@@ -481,6 +485,7 @@
"comments_are_disabled": "Kommentarer er sl├еet fra",
"confirm": "Bekr├жft",
"confirm_admin_password": "Bekr├жft administratoradgangskode",
"confirm_delete_face": "Er du sikker p├е, du vil slette {name}s ansigt fra denne mediefil?",
"confirm_delete_shared_link": "Er du sikker p├е, at du vil slette dette delte link?",
"confirm_keep_this_delete_others": "Alle andre aktiver i stakken vil blive slettet undtagen dette aktiv. Er du sikker p├е, at du vil forts├жtte?",
"confirm_password": "Bekr├жft adgangskode",
@@ -504,7 +509,7 @@
"create_library": "Opret bibliotek",
"create_link": "Opret link",
"create_link_to_share": "Opret link for at dele",
"create_link_to_share_description": "Lad alle med linket se de(t) valgte billede(r)",
"create_link_to_share_description": "Tillad alle med linket at se de(t) valgte billede(r)",
"create_new_person": "Opret ny person",
"create_new_person_hint": "Tildel valgte aktiver til en ny person",
"create_new_user": "Opret ny bruger",
@@ -519,20 +524,21 @@
"date_after": "Dato efter",
"date_and_time": "Dato og klokkesl├жt",
"date_before": "Dato f├╕r",
"date_of_birth_saved": "F├╕dselsdatoen blev gemt",
"date_of_birth_saved": "F├╕dselsdatoen blev gemt korrekt",
"date_range": "Datointerval",
"day": "Dag",
"deduplicate_all": "Dedupliker alle",
"deduplicate_all": "Kopier alle",
"deduplication_criteria_1": "Billedst├╕rrelse i bytes",
"deduplication_criteria_2": "Antal EXIF-data",
"deduplication_info": "Deduplikerings info",
"deduplication_info_description": "For automatisk at forudv├жlge emner og fjerne dubletter i bulk ser vi p├е:",
"default_locale": "Standardlokalitet",
"default_locale_description": "Format├йr datoer og tal",
"default_locale_description": "Format├йr datoer og tal baseret p├е din browsers regions indstillinger",
"delete": "Slet",
"delete_album": "Slet album",
"delete_api_key_prompt": "Er du sikker p├е, at du vil slette denne API-n├╕gle?",
"delete_duplicates_confirmation": "Er du sikker p├е, at du vil slette disse dubletter permanent?",
"delete_face": "Slet ansigt",
"delete_key": "Slet n├╕gle",
"delete_library": "Slet bibliotek",
"delete_link": "Slet link",
@@ -565,7 +571,7 @@
"download_settings": "Download",
"download_settings_description": "Administrer indstillinger relateret til mediefil-downloads",
"downloading": "Downloader",
"downloading_asset_filename": "Downloader aktiv {filename}",
"downloading_asset_filename": "Downloader mediefil {filename}",
"drop_files_to_upload": "Slip filer hvor som helst for at uploade dem",
"duplicates": "Duplikater",
"duplicates_description": "L├╕s hver gruppe ved at angive, hvilke, hvis nogen, er dubletter",
@@ -600,6 +606,7 @@
"enabled": "Aktiveret",
"end_date": "Slutdato",
"error": "Fejl",
"error_delete_face": "Fejl ved sletning af ansigt fra mediefil",
"error_loading_image": "Fejl ved indl├жsning af billede",
"error_title": "Fejl - Noget gik galt",
"errors": {
@@ -607,11 +614,11 @@
"cannot_navigate_previous_asset": "Kan ikke navigere til forrige mediefil",
"cant_apply_changes": "├Жndringerne kan ikke anvendes",
"cant_change_activity": "Kan ikke {enabled, select, true {disable} other {enable}} aktivitet",
"cant_change_asset_favorite": "Kan ikke ├жndre favorit til aktiv",
"cant_change_asset_favorite": "Kan ikke ├жndre favorit til mediefil",
"cant_change_metadata_assets_count": "Kan ikke ├жndre metadata for {count, plural, one {# objekt} other {# objekter}}",
"cant_get_faces": "Kan ikke hente ansigter",
"cant_get_number_of_comments": "Kan ikke f├е antallet af kommentarer",
"cant_search_people": "Kan ikke s├╕ge efter folk",
"cant_search_people": "Kan ikke s├╕ge efter personer",
"cant_search_places": "Kan ikke s├╕ge efter steder",
"cleared_jobs": "Ryddede opgaver for: {job}",
"error_adding_assets_to_album": "Fejl i tilf├╕jelse af mediefiler til album",
@@ -620,20 +627,20 @@
"error_downloading": "Fejl i download af {filename}",
"error_hiding_buy_button": "Fejl i skjulning af k├╕b-knap",
"error_removing_assets_from_album": "Fejl i fjernelse af mediefiler fra album. Tjek konsol for flere detaljer",
"error_selecting_all_assets": "Fejl ved valg af alle aktiver",
"error_selecting_all_assets": "Fejl ved valg af alle mediefiler",
"exclusion_pattern_already_exists": "Denne udelukkelsesm├╕nster findes allerede.",
"failed_job_command": "Kommando {command} slog fejl for opgave: {job}",
"failed_to_create_album": "Oprettelse af album mislykkedes",
"failed_to_create_shared_link": "Oprettelse af delt link mislykkedes",
"failed_to_edit_shared_link": "Redigering af delt link mislykkedes",
"failed_to_get_people": "Det lykkedes ikke at hente folk",
"failed_to_keep_this_delete_others": "Kunne ikke beholde dette aktiv og slette de andre aktiver",
"failed_to_get_people": "Det lykkedes ikke at hente personer",
"failed_to_keep_this_delete_others": "Kunne ikke beholde denne mediefil og slette de andre mediefiler",
"failed_to_load_asset": "Indl├жsning af mediefil mislykkedes",
"failed_to_load_assets": "Indl├жsning af mediefiler mislykkedes",
"failed_to_load_people": "Indl├жsning af personer mislykkedes",
"failed_to_remove_product_key": "Fjernelse af produktn├╕gle mislykkedes",
"failed_to_stack_assets": "Det lykkedes ikke at stable aktiver",
"failed_to_unstack_assets": "Det lykkedes ikke at fjerne stablen af aktiver",
"failed_to_stack_assets": "Det lykkedes ikke at stable mediefiler",
"failed_to_unstack_assets": "Det lykkedes ikke at fjerne gruperingen af mediefiler",
"import_path_already_exists": "Denne importsti findes allerede.",
"incorrect_email_or_password": "Forkert email eller kodeord",
"paths_validation_failed": "{paths, plural, one {# sti} other {# stier}} slog fejl ved validering",
@@ -641,7 +648,7 @@
"quota_higher_than_disk_size": "Du har sat en kvote der er st├╕rre end disken",
"repair_unable_to_check_items": "Kunne ikke tjekke {count, select, one {element} other {elementer}}",
"unable_to_add_album_users": "Ikke i stand til at tilf├╕je brugere til album",
"unable_to_add_assets_to_shared_link": "Kan ikke tilf├╕je aktiver til delt 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_exclusion_pattern": "Kunne ikke tilf├╕je udelukkelsesm├╕nster",
"unable_to_add_import_path": "Kunne ikke tilf├╕je importsti",
@@ -651,7 +658,7 @@
"unable_to_archive_unarchive": "Ude af stand til at {archived, select, true {arkivere} other {fjerne fra arkiv}}",
"unable_to_change_album_user_role": "Ikke i stand til at ├жndre albumbrugerens rolle",
"unable_to_change_date": "Ikke i stand til at ├жndre dato",
"unable_to_change_favorite": "Kan ikke ├жndre favorit for aktiv",
"unable_to_change_favorite": "Kan ikke ├жndre favorit for mediefil",
"unable_to_change_location": "Ikke i stand til at ├жndre sted",
"unable_to_change_password": "Kunne ikke ├жndre adgangskode",
"unable_to_change_visibility": "Kan ikke ├жndre synligheden for {count, plural, one {# person} other {# personer}}",
@@ -698,16 +705,16 @@
"unable_to_remove_deleted_assets": "Kunne ikke fjerne offlinefiler",
"unable_to_remove_library": "Ikke i stand til at fjerne bibliotek",
"unable_to_remove_partner": "Ikke i stand til at fjerne partner",
"unable_to_remove_reaction": "Ikke i stand til at reaktion",
"unable_to_remove_reaction": "Ikke i stand til at fjerne reaktion",
"unable_to_repair_items": "Ikke i stand til at reparere ting",
"unable_to_reset_password": "Ikke i stand til at nulstille adgangskode",
"unable_to_resolve_duplicate": "Kunne ikke opklare duplikat",
"unable_to_restore_assets": "Kunne ikke genoprette medier",
"unable_to_restore_trash": "Ikke i stand til at genoprette skrald",
"unable_to_restore_user": "Ikke i stand til at genoprette bruger",
"unable_to_restore_assets": "Kunne ikke gendanne medierfil",
"unable_to_restore_trash": "Ikke i stand til at gendanne fra skraldespanden",
"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_api_key": "Kunne ikke gemme API-n├╕gle",
"unable_to_save_date_of_birth": "Kan ikke gemme f├╕dselsdatoen",
"unable_to_save_date_of_birth": "Kunne ikke gemme f├╕dselsdatoen",
"unable_to_save_name": "Ikke i stand til at gemme navn",
"unable_to_save_profile": "Ikke i stand til at gemme profil",
"unable_to_save_settings": "Ikke i stand til at gemme indstillinger",
@@ -729,7 +736,7 @@
"unable_to_upload_file": "Filen kunne ikke uploades"
},
"exif": "Exif",
"exit_slideshow": "Forlad slideshow",
"exit_slideshow": "Afslut slideshow",
"expand_all": "Udvid alle",
"expire_after": "Udl├╕b efter",
"expired": "Udl├╕bet",
@@ -742,7 +749,7 @@
"external": "Ekstern",
"external_libraries": "Eksterne biblioteker",
"face_unassigned": "Ikke tildelt",
"failed_to_load_assets": "Kunne ikke indl├жse aktiver",
"failed_to_load_assets": "Kunne ikke indl├жse mediefiler",
"favorite": "Favorit",
"favorite_or_unfavorite_photo": "Tilf├╕j eller fjern fra yndlingsbilleder",
"favorites": "Favoritter",
@@ -774,10 +781,10 @@
"has_quota": "Har kvote",
"hi_user": "Hej {name} ({email})",
"hide_all_people": "Skjul alle personer",
"hide_gallery": "Gem galleri",
"hide_gallery": "Skjul galleri",
"hide_named_person": "Skjul person {name}",
"hide_password": "Gem adgangskode",
"hide_person": "Gem person",
"hide_password": "Skjul adgangskode",
"hide_person": "Skjul person",
"hide_unnamed_people": "Skjul unavngivne personer",
"host": "Host",
"hour": "Time",
@@ -817,7 +824,7 @@
"keep": "Behold",
"keep_all": "Behold alle",
"keep_this_delete_others": "Behold dette, slet andre",
"kept_this_deleted_others": "Beholdt dette aktiv og slettede {count, plural, one {# aktiv} other {# aktiver}}",
"kept_this_deleted_others": "Beholdt denne mediefil og slettede {count, plural, one {# aktiv} other {# aktiver}}",
"keyboard_shortcuts": "Tastaturgenveje",
"language": "Sprog",
"language_setting_description": "V├жlg dit foretrukne sprog",
@@ -837,8 +844,8 @@
"link_to_oauth": "Link til OAuth",
"linked_oauth_account": "Tilsluttet OAuth-konto",
"list": "Liste",
"loading": "Loader",
"loading_search_results_failed": "At loade s├╕geresultater slog fejl",
"loading": "Indl├жser",
"loading_search_results_failed": "Indl├жsning af s├╕geresultater fejlede",
"log_out": "Log ud",
"log_out_all_devices": "Log ud af alle enheder",
"logged_out_all_devices": "Logget ud af alle enheder",
@@ -874,7 +881,7 @@
"merge": "Sammenflet",
"merge_people": "Sammenflet personer",
"merge_people_limit": "Du kan kun flette op til 5 ansigter ad gangen",
"merge_people_prompt": "Vil du sl├е disse mennesker sammen? Denne handling er uigenkaldelig.",
"merge_people_prompt": "Vil du flette disse mennesker sammen? Denne handling er uigenkaldelig.",
"merge_people_successfully": "Personer sammenflettet med succes",
"merged_people_count": "{count, plural, one {# person} other {# personer}} lagt sammen",
"minimize": "Minim├йr",
@@ -884,6 +891,7 @@
"month": "M├еned",
"more": "Mere",
"moved_to_trash": "Flyttet til skraldespand",
"mute_memories": "D├жmp minder",
"my_albums": "Mine albummer",
"name": "Navn",
"name_or_nickname": "Navn eller k├жlenavn",
@@ -901,7 +909,7 @@
"no_albums_message": "Opret et album for at organisere dine billeder og videoer",
"no_albums_with_name_yet": "Det ser ud til, at du ikke har noget album med dette navn endnu.",
"no_albums_yet": "Det ser ud til, at du ikke har nogen album endnu.",
"no_archived_assets_message": "Arkiv├йr billeder og fotos for at gemme dem v├жk fra dit Billed-view",
"no_archived_assets_message": "Arkiv├йr billeder og videoer for at gemme dem v├жk fra din Billede oversigt",
"no_assets_message": "KLIK FOR AT UPLOADE DIT F├ШRSTE BILLEDE",
"no_duplicates_found": "Ingen duplikater fundet.",
"no_exif_info_available": "Ingen tilg├жngelig exif information",
@@ -948,7 +956,7 @@
"owner": "Ejer",
"partner": "Partner",
"partner_can_access": "{partner} kan tilg├е",
"partner_can_access_assets": "Alle dine billeder og videoer, bortset fra dem i Arkiveret og Slettet",
"partner_can_access_assets": "Alle dine billeder og videoer, bortset fra dem i Arkivet og Slettet",
"partner_can_access_location": "Stedet, hvor dine billeder blev taget",
"partner_sharing": "Partnerdeling",
"partners": "Partnere",
@@ -979,6 +987,7 @@
"permanently_deleted_asset": "Permanent slettet medie",
"permanently_deleted_assets_count": "{count, plural, one {# aktiv} other {# aktiver}} permanent slettet",
"person": "Person",
"person_birthdate": "F├╕dt den {date}",
"person_hidden": "{name}{hidden, select, true { (skjult)} other {}}",
"photo_shared_all_users": "Det ser ud til, at du har delt dine billeder med alle brugere, eller ogs├е har du ikke nogen bruger at dele med.",
"photos": "Billeder",
@@ -992,7 +1001,7 @@
"play": "Afspil",
"play_memories": "Afspil minder",
"play_motion_photo": "Afspil bev├жgelsesbillede",
"play_or_pause_video": "Afspil eller paus video",
"play_or_pause_video": "Afspil eller pause video",
"port": "Port",
"preset": "Forudindstilling",
"preview": "Forh├еndsvisning",
@@ -1046,7 +1055,7 @@
"reassign": "Gentildel",
"reassigned_assets_to_existing_person": "{count, plural, one {# mediefil} other {# mediefiler}} er blevet gentildelt til {name, select, null {en eksisterende person} other {{name}}}",
"reassigned_assets_to_new_person": "Gentildelt {count, plural, one {# aktiv} other {# aktiver}} til en ny person",
"reassing_hint": "Tildel valgte aktiver til en eksisterende person",
"reassing_hint": "Tildel valgte mediefiler til en eksisterende person",
"recent": "For nylig",
"recent-albums": "Seneste albums",
"recent_searches": "Seneste s├╕gninger",
@@ -1064,26 +1073,31 @@
"remove": "Fjern",
"remove_assets_album_confirmation": "Er du sikker p├е, at du vil fjerne {count, plural, one {# aktiv} other {# aktiver}} fra albummet?",
"remove_assets_shared_link_confirmation": "Er du sikker p├е, at du vil fjerne {count, plural, one {# aktiv} other {# aktiver}} fra dette delte link?",
"remove_assets_title": "Fjern aktiver?",
"remove_assets_title": "Fjern mediefiler?",
"remove_custom_date_range": "Fjern tilpasset datointerval",
"remove_deleted_assets": "Fjern fra offlinefiler",
"remove_deleted_assets": "Fjern slettede mediefiler",
"remove_from_album": "Fjern fra album",
"remove_from_favorites": "Fjern fra favoritter",
"remove_from_shared_link": "Fjern fra delt link",
"remove_memory": "Fjern minde",
"remove_photo_from_memory": "Fjern foto fra dette minde",
"remove_url": "Fjern URL",
"remove_user": "Fjern bruger",
"removed_api_key": "Fjernede API-n├╕gle: {name}",
"removed_from_archive": "Fjernet fra arkiv",
"removed_from_favorites": "Fjernet fra favoritter",
"removed_from_favorites_count": "{count, plural, other {Fjernede #}} fra favoritter",
"removed_memory": "Fjernede minde",
"removed_photo_from_memory": "Fjernede foto fra minde",
"removed_tagged_assets": "Fjernede tag fra {count, plural, one {# aktiv} other {# aktiver}}",
"rename": "Omd├╕b",
"repair": "Repar├йr",
"repair_no_results_message": "Utrackede og manglende filer vil blive vist her",
"repair_no_results_message": "Usporede og manglende filer vil blive vist her",
"replace_with_upload": "Erstat med upload",
"repository": "Depot",
"require_password": "Kr├жv adgangskode",
"require_user_to_change_password_on_first_login": "Kr├жv at bruger skifter adgangskode ved f├╕rste login",
"rescan": "Genopfrisk",
"reset": "Nulstil",
"reset_password": "Nulstil adgangskode",
"reset_people_visibility": "Nulstil personsynlighed",
@@ -1093,19 +1107,19 @@
"restore": "Gendan",
"restore_all": "Gendan alle",
"restore_user": "Gendan bruger",
"restored_asset": "Gendannet aktiv",
"restored_asset": "Gendannet mediefilen",
"resume": "Genoptag",
"retry_upload": "Fors├╕g upload igen",
"review_duplicates": "Gennemg├е dubletter",
"role": "Rolle",
"role_editor": "Editor",
"role_editor": "Redakt├╕r",
"role_viewer": "Seer",
"save": "Gem",
"saved_api_key": "Gemt API-n├╕gle",
"saved_profile": "Gemte profil",
"saved_settings": "Gemte indstillinger",
"say_something": "Skriv noget",
"scan_all_libraries": "Skan gennem alle biblioteker",
"scan_all_libraries": "Skan alle biblioteker",
"scan_library": "Skan",
"scan_settings": "Skanningsindstillinger",
"scanning_for_album": "Skanner efter albummer...",
@@ -1127,8 +1141,9 @@
"search_options": "S├╕gemuligheder",
"search_people": "S├╕g i personer",
"search_places": "S├╕g i steder",
"search_rating": "S├╕g efter vurdering...",
"search_settings": "s├╕geindstillinger",
"search_state": "S├╕g efter stat...",
"search_state": "S├╕g efter lansdel...",
"search_tags": "S├╕g tags...",
"search_timezone": "S├╕g i tidszone...",
"search_type": "S├╕g efter type",
@@ -1136,6 +1151,7 @@
"searching_locales": "S├╕ger lokaler...",
"second": "Sekund",
"see_all_people": "Se alle personer",
"select": "V├жlg",
"select_album_cover": "V├жlg albumcover",
"select_all": "V├жlg alle",
"select_all_duplicates": "V├жlg alle dubletter",
@@ -1183,15 +1199,15 @@
"show_album_options": "Vis albumindstillinger",
"show_albums": "Vis albummer",
"show_all_people": "Vis alle personer",
"show_and_hide_people": "Vis & gem personer",
"show_and_hide_people": "Vis & skjul personer",
"show_file_location": "Vis filplacering",
"show_gallery": "Vis galleri",
"show_hidden_people": "Vis gemte personer",
"show_hidden_people": "Vis skjulte personer",
"show_in_timeline": "Vis p├е tidslinje",
"show_in_timeline_setting_description": "Vis billeder og videoer fra denne bruger p├е din tidslinje",
"show_keyboard_shortcuts": "Vis tastaturgenveje",
"show_metadata": "Vis metadata",
"show_or_hide_info": "Vis eller gem info",
"show_or_hide_info": "Vis eller skjul info",
"show_password": "Vis adgangskode",
"show_person_options": "Vis personindstillinger",
"show_progress_bar": "Vis statuslinje",
@@ -1216,7 +1232,7 @@
"sort_items": "Antal genstande",
"sort_modified": "├Жndret dato",
"sort_oldest": "├Жldste foto",
"sort_people_by_similarity": "Sorter folk efter lighed",
"sort_people_by_similarity": "Sorter efter personer der ligner hinanden",
"sort_recent": "Seneste foto",
"sort_title": "Titel",
"source": "Kilde",
@@ -1242,14 +1258,15 @@
"sunrise_on_the_beach": "Solopgang p├е stranden",
"support": "Support",
"support_and_feedback": "Support & Feedback",
"support_third_party_description": "Din Immich-installation blev pakket af en tredjepart. Problemer, du oplever, kan v├жre for├еrsaget af denne pakke, s├е rejs venligst problemer med dem i f├╕rste omgang ved at bruge nedenst├еende links.",
"support_third_party_description": "Din Immich-installation blev sammensat af en tredjepart. Problemer, du oplever, kan v├жre for├еrsaget af denne udvikler, s├е rejs venligst problemer med dem i f├╕rste omgang ved at bruge nedenst├еende links.",
"swap_merge_direction": "Byt retning for sammenfletning",
"sync": "Synkronis├йr",
"tag": "Tag",
"tag_assets": "Tag aktiver",
"tag_assets": "Tag mediefiler",
"tag_created": "Oprettet tag: {tag}",
"tag_feature_description": "Gennemse billeder og videoer grupperet efter logiske tag-emner",
"tag_not_found_question": "Kan du ikke finde et tag? <link>Opret et nyt tag.</link>",
"tag_people": "Tag personer",
"tag_updated": "Opdateret tag: {tag}",
"tagged_assets": "Tagget {count, plural, one {# aktiv} other {# aktiver}}",
"tags": "Tags",
@@ -1275,14 +1292,14 @@
"trash": "Papirkurv",
"trash_all": "Smid alle ud",
"trash_count": "Slet {count, number}",
"trash_delete_asset": "Papirkurv/slet aktiv",
"trash_delete_asset": "Flyt mediefil til Papirkurv",
"trash_no_results_message": "Billeder og videoer markeret til sletning vil blive vist her.",
"trashed_items_will_be_permanently_deleted_after": "Mediefiler i skraldespanden vil blive slettet permanent efter {days, plural, one {# dag} other {# dage}}.",
"type": "Type",
"unarchive": "Afakiv├йr",
"unarchived_count": "{count, plural, other {Uarkiveret #}}",
"unfavorite": "Fjern favorit",
"unhide_person": "Hold op med at gemme person v├жk",
"unhide_person": "Stop med at skjule person",
"unknown": "Ukendt",
"unknown_country": "Ukendt land",
"unknown_year": "Ukendt ├еr",
@@ -1290,6 +1307,7 @@
"unlink_motion_video": "Fjern link til bev├жgelsesvideo",
"unlink_oauth": "Frakobl OAuth",
"unlinked_oauth_account": "Frakoblede OAuth-konto",
"unmute_memories": "Oph├жv d├жmpning af minder",
"unnamed_album": "Unavngivet album",
"unnamed_album_delete_confirmation": "Er du sikker p├е, at du vil slette dette album?",
"unnamed_share": "Unavngivet deling",
@@ -1303,7 +1321,7 @@
"up_next": "N├жste",
"updated_password": "Opdaterede adgangskode",
"upload": "Upload",
"upload_concurrency": "Uploadsamtidighed",
"upload_concurrency": "Upload samtidighed",
"upload_errors": "Upload afsluttet med {count, plural, one {# fejl} other {# fejl}}. Opdater siden for at se nye uploadaktiver.",
"upload_progress": "Resterende {remaining, number} - Behandlet {processed, number}/{total, number}",
"upload_skipped_duplicates": "Sprang over {count, plural, one {# duplet aktiv} other {# duplikerede aktiver}}",
@@ -1321,7 +1339,7 @@
"user_purchase_settings_description": "Administrer dit k├╕b",
"user_role_set": "Indstil {user} som {role}",
"user_usage_detail": "Detaljer om brugers forbrug",
"user_usage_stats": "Konto anvendelsesstatistik",
"user_usage_stats": "Kontoens anvendelsesstatistik",
"user_usage_stats_description": "Vis konto anvendelsesstatistik",
"username": "Brugernavn",
"users": "Brugere",
@@ -1343,6 +1361,7 @@
"view_all": "Se alle",
"view_all_users": "Se alle brugere",
"view_in_timeline": "Se p├е tidslinjen",
"view_link": "Vis Link",
"view_links": "Vis links",
"view_name": "Se",
"view_next_asset": "Se n├жste medie",
+23 -4
View File
@@ -41,6 +41,7 @@
"backup_settings": "Datensicherungs-Einstellungen",
"backup_settings_description": "Datensicherungs-Einstellungen verwalten",
"check_all": "Alle ├╝berpr├╝fen",
"cleanup": "Aufr├дumen",
"cleared_jobs": "Folgende Aufgaben zur├╝ckgesetzt: {job}",
"config_set_by_file": "Ist derzeit in einer Konfigurationsdatei festgelegt",
"confirm_delete_library": "Bist du sicher, dass du die Bibliothek {library} l├╢schen willst?",
@@ -96,7 +97,7 @@
"library_scanning_enable_description": "Regelm├д├Яiges Scannen der Bibliothek aktivieren",
"library_settings": "Externe Bibliothek",
"library_settings_description": "Einstellungen externer Bibliotheken verwalten",
"library_tasks_description": "Diese Aufgabe aktualisiert und ├╝berpr├╝ft die Bibliotheken",
"library_tasks_description": "├Ьberpr├╝fe externe Bibliotheken auf neue oder ver├дnderte Medien",
"library_watching_enable_description": "├Ьberwache externe Bibliotheken auf Datei├дnderungen",
"library_watching_settings": "Bibliotheks├╝berwachung (EXPERIMENTELL)",
"library_watching_settings_description": "Automatisch auf ge├дnderte Dateien pr├╝fen",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "Semantische Bildsuche mittels CLIP-Einbettungen",
"machine_learning_smart_search_enabled": "Intelligente Suche aktivieren",
"machine_learning_smart_search_enabled_description": "Ist diese Option deaktiviert, werden die Bilder nicht f├╝r die intelligente Suche verwendet.",
"machine_learning_url_description": "Die URL des Servers f├╝r maschinelles Lernen. Wenn mehr als eine URL angegeben wird, wird jeder Server einzeln ausprobiert, bis einer erfolgreich antwortet, und zwar in der Reihenfolge vom ersten bis zum letzten.",
"machine_learning_url_description": "Die URL des Servers f├╝r maschinelles Lernen. Wenn mehr als eine URL angegeben wird, wird jeder Server einzeln ausprobiert, bis einer erfolgreich antwortet, und zwar in der Reihenfolge vom ersten bis zum letzten. Server die nicht antworten werden tempor├дr ignoriert, bis sie wieder verf├╝gbar sind.",
"manage_concurrency": "Gleichzeitige Ausf├╝hrungen verwalten",
"manage_log_settings": "Log-Einstellungen verwalten",
"map_dark_style": "Dunkler Stil",
@@ -147,6 +148,8 @@
"map_settings": "Karte",
"map_settings_description": "Karten- und GPS-Einstellungen verwalten",
"map_style_description": "URL zu einem style.json Karten-Theme",
"memory_cleanup_job": "Erinnerungen aufr├дumen",
"memory_generate_job": "Erinnerungen Generierung",
"metadata_extraction_job": "Metadaten extrahieren",
"metadata_extraction_job_description": "Extrahieren von Metadaten, wie zum Beispiel GPS, Gesichtern und Aufl├╢sung aus jeder Datei",
"metadata_faces_import_setting": "Import von Gesichtern aktivieren",
@@ -240,7 +243,7 @@
"storage_template_hash_verification_enabled_description": "Aktiviert die Hash-Verifizierung. Deaktiviere diese Option nur, wenn du dir ├╝ber die damit verbundenen Auswirkungen im Klaren bist",
"storage_template_migration": "Migration von Speichervorlagen",
"storage_template_migration_description": "Diese Aufgabe wendet die aktuelle <link>{template}</link> auf zuvor hochgeladene Dateien an",
"storage_template_migration_info": "Vorlagen├дnderungen gelten nur f├╝r neue Dateien. Um die Vorlage r├╝ckwirkend auf bereits hochgeladene Assets anzuwenden, f├╝hre den <link>{job}</link> aus.",
"storage_template_migration_info": "Die Vorlage wird alle Dateierweiterungen in Kleinbuchstaben umwandeln. Vorlagen├дnderungen gelten nur f├╝r neue Dateien. Um die Vorlage r├╝ckwirkend auf bereits hochgeladene Assets anzuwenden, f├╝hre den <link>{job}</link> aus.",
"storage_template_migration_job": "Speichervorlagenmigrations-Aufgabe",
"storage_template_more_details": "Weitere Details zu dieser Funktion findest du unter <template-link>Speichervorlage</template-link> und dessen <implications-link>Implikationen</implications-link>",
"storage_template_onboarding_description": "Wenn aktiviert, sortiert diese Funktion Dateien automatisch basierend auf einer benutzerdefinierten Vorlage. Aufgrund von Stabilit├дtsproblemen ist die Funktion standardm├д├Яig deaktiviert. Weitere Informationen findest du in der <link>Dokumentation</link>.",
@@ -299,7 +302,7 @@
"transcoding_max_b_frames": "Maximale B-Frames",
"transcoding_max_b_frames_description": "H├╢here Werte verbessern die Komprimierungseffizienz, verlangsamen aber die Kodierung. Ist m├╢glicherweise nicht mit der Hardware-Beschleunigung ├дlterer Ger├дte kompatibel. 0 deaktiviert die B-Frames, w├дhrend -1 diesen Wert automatisch setzt.",
"transcoding_max_bitrate": "Maximale Bitrate",
"transcoding_max_bitrate_description": "Die Festlegung einer maximalen Bitrate kann die Dateigr├╢├Яen vorhersagbarer machen, ohne dass die Qualit├дt darunter leidet. Bei 720p sind typische Werte 2600k f├╝r VP9 oder HEVC oder 4500k f├╝r H.264. Deaktiviert, wenn der Wert auf 0 gesetzt ist.",
"transcoding_max_bitrate_description": "Die Festlegung einer maximalen Bitrate kann die Dateigr├╢├Яen vorhersagbarer machen, ohne dass die Qualit├дt darunter leidet. Bei 720p sind typische Werte 2600 kbit/s f├╝r VP9 oder HEVC oder 4500 kbit/s f├╝r H.264. Deaktiviert, wenn der Wert auf 0 gesetzt ist.",
"transcoding_max_keyframe_interval": "Maximales Keyframe-Intervall",
"transcoding_max_keyframe_interval_description": "Legt den maximalen Frame-Abstand zwischen Keyframes fest. Niedrigere Werte verschlechtern die Komprimierungseffizienz, verbessern aber die Suchzeiten und k├╢nnen die Qualit├дt in Szenen mit schnellen Bewegungen verbessern. Bei 0 wird dieser Wert automatisch eingestellt.",
"transcoding_optimal_description": "Videos mit einer h├╢heren Aufl├╢sung als der Zielaufl├╢sung oder in einem nicht akzeptierten Format",
@@ -391,6 +394,7 @@
"allow_edits": "Bearbeiten erlauben",
"allow_public_user_to_download": "Erlaube ├╢ffentlichen Benutzern, herunterzuladen",
"allow_public_user_to_upload": "Erlaube ├╢ffentlichen Benutzern, hochzuladen",
"alt_text_qr_code": "QR-Code Bild",
"anti_clockwise": "Gegen den Uhrzeigersinn",
"api_key": "API-Schl├╝ssel",
"api_key_description": "Dieser Wert wird nur einmal angezeigt. Bitte kopiere ihn, bevor du das Fenster schlie├Яt.",
@@ -481,6 +485,7 @@
"comments_are_disabled": "Kommentare sind deaktiviert",
"confirm": "Best├дtigen",
"confirm_admin_password": "Administrator Passwort best├дtigen",
"confirm_delete_face": "Bist du sicher dass du das Gesicht von {name} aus der Datei entfernen willst?",
"confirm_delete_shared_link": "Bist du sicher, dass du diesen geteilten Link l├╢schen willst?",
"confirm_keep_this_delete_others": "Alle anderen Dateien im Stapel bis auf diese werden gel├╢scht. Bist du sicher, dass du fortfahren m├╢chten?",
"confirm_password": "Passwort best├дtigen",
@@ -533,6 +538,7 @@
"delete_album": "Album l├╢schen",
"delete_api_key_prompt": "Bist du sicher, dass du diesen API-Schl├╝ssel l├╢schen willst?",
"delete_duplicates_confirmation": "Bist du sicher, dass du diese Duplikate endg├╝ltig l├╢schen willst?",
"delete_face": "Gesicht l├╢schen",
"delete_key": "Schl├╝ssel l├╢schen",
"delete_library": "Bibliothek l├╢schen",
"delete_link": "Link l├╢schen",
@@ -600,6 +606,7 @@
"enabled": "Aktiviert",
"end_date": "Enddatum",
"error": "Fehler",
"error_delete_face": "Fehler beim L├╢schen des Gesichts",
"error_loading_image": "Fehler beim Laden des Bildes",
"error_title": "Fehler - Etwas ist schief gelaufen",
"errors": {
@@ -884,6 +891,7 @@
"month": "Monat",
"more": "Mehr",
"moved_to_trash": "In den Papierkorb verschoben",
"mute_memories": "Erinnerungen stumm schalten",
"my_albums": "Meine Alben",
"name": "Name",
"name_or_nickname": "Name oder Nickname",
@@ -979,6 +987,7 @@
"permanently_deleted_asset": "Endg├╝ltig gel├╢schtes Objekt",
"permanently_deleted_assets_count": "{count, plural, one {# Datei} other {# Dateien}} endg├╝ltig gel├╢scht",
"person": "Person",
"person_birthdate": "Geboren am {date}",
"person_hidden": "{name}{hidden, select, true { (verborgen)} other {}}",
"photo_shared_all_users": "Es sieht so aus, als h├дttest du deine Fotos mit allen Benutzern geteilt oder du hast keine Benutzer, mit denen du teilen kannst.",
"photos": "Fotos",
@@ -1070,12 +1079,16 @@
"remove_from_album": "Aus Album entfernen",
"remove_from_favorites": "Aus Favoriten entfernen",
"remove_from_shared_link": "Aus geteiltem Link entfernen",
"remove_memory": "Erinnerung entfernen",
"remove_photo_from_memory": "Foto aus dieser Erinnerung entfernen",
"remove_url": "URL entfernen",
"remove_user": "Nutzer entfernen",
"removed_api_key": "API-Schl├╝ssel {name} wurde entfernt",
"removed_from_archive": "Aus dem Archiv entfernt",
"removed_from_favorites": "Aus den Favoriten entfernt",
"removed_from_favorites_count": "{count, plural, other {#}} aus den Favoriten entfernt",
"removed_memory": "Erinnerung entfernt",
"removed_photo_from_memory": "Foto aus Erinnerung entfernt",
"removed_tagged_assets": "Tag von {count, plural, one {# Datei} other {# Dateien}} entfernt",
"rename": "Umbenennen",
"repair": "Reparatur",
@@ -1084,6 +1097,7 @@
"repository": "Repository",
"require_password": "Passwort erforderlich",
"require_user_to_change_password_on_first_login": "Benutzer muss das Passwort beim ersten Login ├дndern",
"rescan": "Erneut scannen",
"reset": "Zur├╝cksetzen",
"reset_password": "Passwort zur├╝cksetzen",
"reset_people_visibility": "Sichtbarkeit von Personen zur├╝cksetzen",
@@ -1127,6 +1141,7 @@
"search_options": "Suchoptionen",
"search_people": "Suche nach Personen",
"search_places": "Suche nach Orten",
"search_rating": "Suche nach Bewertung...",
"search_settings": "Suche nach Einstellungen",
"search_state": "Suche nach Bundesland / Provinz...",
"search_tags": "Sache nach Tags...",
@@ -1136,6 +1151,7 @@
"searching_locales": "Suche nach Orten...",
"second": "Sekunde",
"see_all_people": "Alle Personen anzeigen",
"select": "Ausw├дhlen",
"select_album_cover": "Album-Cover ausw├дhlen",
"select_all": "Alles ausw├дhlen",
"select_all_duplicates": "Alle Duplikate ausw├дhlen",
@@ -1250,6 +1266,7 @@
"tag_created": "Tag erstellt: {tag}",
"tag_feature_description": "Durchsuchen von Fotos und Videos, gruppiert nach logischen Tag-Themen",
"tag_not_found_question": "Kein Tag zu finden? <link>Erstelle einen neuen Tag.</link>",
"tag_people": "Personen taggen",
"tag_updated": "Tag aktualisiert: {tag}",
"tagged_assets": "{count, plural, one {# Datei} other {# Dateien}} getagged",
"tags": "Tags",
@@ -1290,6 +1307,7 @@
"unlink_motion_video": "Verkn├╝pfung zum Bewegungsvideo aufheben",
"unlink_oauth": "OAuth entfernen",
"unlinked_oauth_account": "OAuth-Konto entfernt",
"unmute_memories": "Stummschaltung f├╝r Erinnerungen aufheben",
"unnamed_album": "Unbenanntes Album",
"unnamed_album_delete_confirmation": "Bist du sicher, dass du dieses Album l├╢schen willst?",
"unnamed_share": "Unbenannte Freigabe",
@@ -1343,6 +1361,7 @@
"view_all": "Alles anzeigen",
"view_all_users": "Alle Nutzer anzeigen",
"view_in_timeline": "In Zeitleiste anzeigen",
"view_link": "Link anzeigen",
"view_links": "Links anzeigen",
"view_name": "Ansicht",
"view_next_asset": "N├дchste Datei anzeigen",
+20 -2
View File
@@ -41,6 +41,7 @@
"backup_settings": "╬б╧Е╬╕╬╝╬п╧Г╬╡╬╣╧В ╬С╬╜╧Д╬╣╬│╧Б╬м╧Ж╧Й╬╜ ╬С╧Г╧Ж╬▒╬╗╬╡╬п╬▒╧В",
"backup_settings_description": "╬Ф╬╣╬▒╧З╬╡╬п╧Б╬╖╧Г╬╖ ╧Б╧Е╬╕╬╝╬п╧Г╬╡╧Й╬╜ ╧Д╧Й╬╜ ╬▒╬╜╧Д╬╣╬│╧Б╬м╧Ж╧Й╬╜ ╬▒╧Г╧Ж╬▒╬╗╬╡╬п╬▒╧В ╧Д╬╖╧В ╬▓╬м╧Г╬╖╧В ╬┤╬╡╬┤╬┐╬╝╬н╬╜╧Й╬╜",
"check_all": "╬И╬╗╬╡╬│╧З╬┐╧В ╬М╬╗╧Й╬╜",
"cleanup": "╬Х╬║╬║╬▒╬╕╬м╧Б╬╣╧Г╬╖",
"cleared_jobs": "╬Х╬║╬║╬▒╬╕╬▒╧Б╬п╧Г╧Д╬╖╬║╬▒╬╜ ╬┐╬╣ ╬╡╧Б╬│╬▒╧Г╬п╬╡╧В ╬│╬╣╬▒: {job}",
"config_set_by_file": "╬Ч ╧А╬▒╧Б╬▒╬╝╬╡╧Д╧Б╬┐╧А╬┐╬п╬╖╧Г╬╖ ╬│╬п╬╜╬╡╧Д╬▒╬╣, ╧А╧Б╬┐╧В ╧Д╬┐ ╧А╬▒╧Б╧М╬╜, ╬╝╬н╧Г╧Й ╬╡╬╜╧М╧В ╬▒╧Б╧З╬╡╬п╬┐╧Е ╧А╬▒╧Б╬▒╬╝╬н╧Д╧Б╧Й╬╜",
"confirm_delete_library": "╬Х╬п╧Г╧Д╬╡ ╬▓╬н╬▓╬▒╬╣╬┐╬╣ ╧М╧Д╬╣ ╬╕╬н╬╗╬╡╧Д╬╡ ╬╜╬▒ ╬┤╬╣╬▒╬│╧Б╬м╧И╬╡╧Д╬╡ ╧Д╬╖ ╬▓╬╣╬▓╬╗╬╣╬┐╬╕╬о╬║╬╖ {library};",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "╬С╬╜╬▒╬╢╬╖╧Д╬о╧Г╧Д╬╡ ╬╡╬╣╬║╧М╬╜╬╡╧В ╧Г╬╖╬╝╬▒╧Г╬╣╬┐╬╗╬┐╬│╬╣╬║╬м ╧З╧Б╬╖╧Г╬╣╬╝╬┐╧А╬┐╬╣╧О╬╜╧Д╬▒╧В ╬╡╬╜╧Г╧Й╬╝╬▒╧Д╧О╧Г╬╡╬╣╧В CLIP",
"machine_learning_smart_search_enabled": "╬Х╬╜╬╡╧Б╬│╬┐╧А╬┐╬п╬╖╧Г╬╖ ╬н╬╛╧Е╧А╬╜╬╖╧В ╬▒╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖╧В",
"machine_learning_smart_search_enabled_description": "╬С╬╜ ╬▒╧А╬╡╬╜╬╡╧Б╬│╬┐╧А╬┐╬╣╬╖╬╕╬╡╬п, ╬┐╬╣ ╬╡╬╣╬║╧М╬╜╬╡╧В ╬┤╬╡╬╜ ╬╕╬▒ ╬║╧Й╬┤╬╣╬║╬┐╧А╬┐╬╣╬┐╧Н╬╜╧Д╬▒╬╣ ╬│╬╣╬▒ ╬н╬╛╧Е╧А╬╜╬╖ ╬▒╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖.",
"machine_learning_url_description": "╬Ч ╬┤╬╣╬╡╧Н╬╕╧Е╬╜╧Г╬╖ URL ╧Д╬┐╧Е ╬┤╬╣╬▒╬║╬┐╬╝╬╣╧Г╧Д╬о ╬╝╬╖╧З╬▒╬╜╬╣╬║╬о╧В ╬╝╬м╬╕╬╖╧Г╬╖╧В. ╬С╬╜ ╧А╬▒╧Б╬н╧З╬┐╬╜╧Д╬▒╬╣ ╧А╬╡╧Б╬╣╧Г╧Г╧М╧Д╬╡╧Б╬╡╧В ╬▒╧А╧М ╬╝╬п╬▒ ╬┤╬╣╬╡╧Е╬╕╧Н╬╜╧Г╬╡╬╣╧В, ╧Д╧М╧Д╬╡ ╬╕╬▒ ╬│╬п╬╜╬╡╬╣ ╧А╧Б╬┐╧Г╧А╬м╬╕╬╡╬╣╬▒ ╧Г╧Н╬╜╬┤╬╡╧Г╬╖╧В ╧Г╬╡ ╬║╬м╬╕╬╡ ╬╝╬╣╬▒ ╬┤╬╣╬▒╬┤╬┐╧З╬╣╬║╬м ╬▒╧А╧М ╧Д╬╖╬╜ ╧А╧Б╧О╧Д╬╖ ╬╝╬н╧З╧Б╬╣ ╧Д╬╖╬╜ ╧Д╬╡╬╗╬╡╧Е╧Д╬▒╬п╬▒, ╬н╧Й╧В ╧М╧Д╬┐╧Е ╬║╬м╧А╬┐╬╣╬▒ ╬╜╬▒ ╬╡╬п╬╜╬▒╬╣ ╬╡╧А╬╣╧Д╧Е╧З╬о╧В.",
"machine_learning_url_description": "╬Ч ╬┤╬╣╬╡╧Н╬╕╧Е╬╜╧Г╬╖ URL ╧Д╬┐╧Е ╬┤╬╣╬▒╬║╬┐╬╝╬╣╧Г╧Д╬о ╬╝╬╖╧З╬▒╬╜╬╣╬║╬о╧В ╬╝╬м╬╕╬╖╧Г╬╖╧В. ╬С╬╜ ╬┤╬┐╬╕╬┐╧Н╬╜ ╧А╬╡╧Б╬╣╧Г╧Г╧М╧Д╬╡╧Б╬╡╧В ╬▒╧А╧М ╬╝╬п╬▒ ╬┤╬╣╬╡╧Е╬╕╧Н╬╜╧Г╬╡╬╣╧В URL, ╬║╬м╬╕╬╡ ╬┤╬╣╬▒╬║╬┐╬╝╬╣╧Г╧Д╬о╧В ╬╕╬▒ ╬┤╬┐╬║╬╣╬╝╬м╬╢╬╡╧Д╬▒╬╣ ╬┤╬╣╬▒╬┤╬┐╧З╬╣╬║╬м ╬╝╬н╧З╧Б╬╣ ╬╜╬▒ ╬▒╬╜╧Д╬▒╧А╬┐╬║╧Б╬╣╬╕╬╡╬п ╬н╬╜╬▒╧В ╬╝╬╡ ╬╡╧А╬╣╧Д╧Е╧З╬п╬▒, ╬╝╬╡ ╧Д╬╖ ╧Г╬╡╬╣╧Б╬м ╬▒╧А╧М ╧Д╬╖╬╜ ╧А╧Б╧О╧Д╬╖ ╬н╧Й╧В ╧Д╬╖╬╜ ╧Д╬╡╬╗╬╡╧Е╧Д╬▒╬п╬▒. ╬Я╬╣ ╬┤╬╣╬▒╬║╬┐╬╝╬╣╧Г╧Д╬н╧В ╧А╬┐╧Е ╬┤╬╡╬╜ ╬▒╬╜╧Д╬▒╧А╬┐╬║╧Б╬п╬╜╬┐╬╜╧Д╬▒╬╣ ╬╕╬▒ ╬▒╬│╬╜╬┐╬┐╧Н╬╜╧Д╬▒╬╣ ╧А╧Б╬┐╧Г╧Й╧Б╬╣╬╜╬м ╬╝╬н╧З╧Б╬╣ ╬╜╬▒ ╬╡╧А╬▒╬╜╬н╬╗╬╕╬┐╧Е╬╜ ╧Г╬╡ ╬╗╬╡╬╣╧Д╬┐╧Е╧Б╬│╬п╬▒.",
"manage_concurrency": "╬Ф╬╣╬▒╧З╬╡╬п╧Б╬╣╧Г╬╖ ╧Д╬▒╧Е╧Д╧М╧З╧Б╬┐╬╜╬╖ ╬╡╬║╧Д╬н╬╗╬╡╧Г╬╖╧В",
"manage_log_settings": "╬Ф╬╣╬▒╧З╬╡╬п╧Б╬╣╧Г╬╖ ╧Б╧Е╬╕╬╝╬п╧Г╬╡╧Й╬╜ ╬▒╧Б╧З╬╡╬п╬┐╧Е ╬║╬▒╧Д╬▒╬│╧Б╬▒╧Ж╬о╧В",
"map_dark_style": "╬г╬║╬┐╧Н╧Б╬┐ ╬Ш╬н╬╝╬▒",
@@ -147,6 +148,8 @@
"map_settings": "╬з╬м╧Б╧Д╬╖╧В",
"map_settings_description": "╬Ф╬╣╬▒╧З╬╡╬п╧Б╬╣╧Г╬╖ ╧Б╧Е╬╕╬╝╬п╧Г╬╡╧Й╬╜ ╧З╬м╧Б╧Д╬╖",
"map_style_description": "URL ╧А╧Б╬┐╧В ╬▒╧Б╧З╬╡╬п╬┐ ╬╕╬н╬╝╬▒╧Д╬┐╧В ╧Д╬┐╧Е ╧З╬м╧Б╧Д╬╖ style.json",
"memory_cleanup_job": "╬Ъ╬▒╬╕╬▒╧Б╬╣╧Г╬╝╧М╧В ╬╝╬╜╬о╬╝╬╖╧В",
"memory_generate_job": "╬Ф╬╖╬╝╬╣╬┐╧Е╧Б╬│╬п╬▒ ╬╝╬╜╬о╬╝╬╖╧В",
"metadata_extraction_job": "╬Х╬╛╬▒╬│╧Й╬│╬о ╬╝╬╡╧Д╬▒╬┤╬╡╬┤╬┐╬╝╬н╬╜╧Й╬╜",
"metadata_extraction_job_description": "╬Х╬╛╬▒╬│╧Й╬│╬о ╬╝╬╡╧Д╬▒╬┤╬╡╬┤╬┐╬╝╬н╬╜╧Й╬╜ ╬▒╧А╧М ╬║╬м╬╕╬╡ ╬▒╧Б╧З╬╡╬п╬┐, ╧М╧А╧Й╧В ╧Д╬┐╧А╬┐╬╕╬╡╧Г╬п╬▒, ╧А╧Б╧М╧Г╧Й╧А╬▒ ╬║╬▒╬╣ ╬▒╬╜╬м╬╗╧Е╧Г╬╖",
"metadata_faces_import_setting": "╬Х╬╜╬╡╧Б╬│╬┐╧А╬┐╬п╬╖╧Г╬╖ ╬╡╬╣╧Г╬▒╬│╧Й╬│╬о╧В ╧А╧Б╬┐╧Г╧О╧А╧Й╬╜",
@@ -299,7 +302,7 @@
"transcoding_max_b_frames": "╬Ь╬н╬│╬╣╧Г╧Д╬┐╧В ╬▒╧Б╬╣╬╕╬╝╧М╧В B-frames(Bidirectional Predictive Frames)",
"transcoding_max_b_frames_description": "╬Я╬╣ ╧Е╧И╬╖╬╗╧М╧Д╬╡╧Б╬╡╧В ╧Д╬╣╬╝╬н╧В ╬▓╬╡╬╗╧Д╬╣╧О╬╜╬┐╧Е╬╜ ╧Д╬╖╬╜ ╬▒╧А╬┐╬┤╬┐╧Д╬╣╬║╧М╧Д╬╖╧Д╬▒ ╧Д╬╖╧В ╧Г╧Е╬╝╧А╬п╬╡╧Г╬╖╧В, ╬▒╬╗╬╗╬м ╬╡╧А╬╣╬▓╧Б╬▒╬┤╧Н╬╜╬┐╧Е╬╜ ╧Д╬╖╬╜ ╬║╧Й╬┤╬╣╬║╬┐╧А╬┐╬п╬╖╧Г╬╖. ╬Х╬╜╬┤╬н╧З╬╡╧Д╬▒╬╣ ╬╜╬▒ ╬╝╬╖╬╜ ╬╡╬п╬╜╬▒╬╣ ╧Г╧Е╬╝╬▓╬▒╧Д╬н╧В ╬╝╬╡ ╧Д╬╖╬╜ ╬╡╧А╬╣╧Д╬м╧З╧Е╬╜╧Г╬╖ ╧Е╬╗╬╣╬║╬┐╧Н ╧Г╬╡ ╧А╬▒╬╗╬▒╬╣╧М╧Д╬╡╧Б╬╡╧В ╧Г╧Е╧Г╬║╬╡╧Е╬н╧В. ╬Ч ╧Д╬╣╬╝╬о 0 ╬▒╧А╬╡╬╜╬╡╧Б╬│╬┐╧А╬┐╬╣╬╡╬п ╧Д╬▒ B-frames, ╬╡╬╜╧О ╬╖ -1, ╧Д╬╖ ╧Б╧Е╬╕╬╝╬п╬╢╬╡╬╣ ╬▒╧Е╧Д╧М╬╝╬▒╧Д╬▒.",
"transcoding_max_bitrate": "╬Ь╬н╬│╬╣╧Г╧Д╬┐╧В ╧Б╧Е╬╕╬╝╧М╧В ╬╝╬╡╧Д╬м╬┤╬┐╧Г╬╖╧В (bitrate)",
"transcoding_max_bitrate_description": "╬Ч ╧Б╧Н╬╕╬╝╬╣╧Г╬╖ ╬╡╬╜╧М╧В ╬╝╬н╬│╬╣╧Г╧Д╬┐╧Е ╧Б╧Е╬╕╬╝╬┐╧Н ╬╝╬╡╧Д╬м╬┤╬┐╧Г╬╖╧В(bitrate) ╬╝╧А╬┐╧Б╬╡╬п ╬╜╬▒ ╬║╬м╬╜╬╡╬╣ ╧Д╬┐ ╬╝╬н╬│╬╡╬╕╬┐╧В ╧Д╧Й╬╜ ╬▒╧Б╧З╬╡╬п╧Й╬╜ ╧А╬╣╬┐ ╧А╧Б╬┐╬▓╬╗╬н╧И╬╣╬╝╬┐, ╬▒╬╗╬╗╬м ╬╝╬╡ ╬н╬╜╬▒ ╬╝╬╣╬║╧Б╧М ╬║╧М╧Г╧Д╬┐╧В ╧Г╧Д╬╖╬╜ ╧А╬┐╬╣╧М╧Д╬╖╧Д╬▒. ╬г╧Д╬╖╬╜ ╬▒╬╜╬м╬╗╧Е╧Г╬╖ ╧Д╧Й╬╜ 720p, ╬┐╬╣ ╧Д╧Е╧А╬╣╬║╬н╧В ╧Д╬╣╬╝╬н╧В ╬╡╬п╬╜╬▒╬╣ 2600k ╬│╬╣╬▒ VP9 ╬о HEVC, ╬о 4500k ╬│╬╣╬▒ H.264. ╬С╧А╬╡╬╜╬╡╧Б╬│╬┐╧А╬┐╬╣╬╡╬п╧Д╬▒╬╣ ╬╡╬м╬╜ ╬┐╧Б╬╣╧Г╧Д╬╡╬п ╧Г╬╡ 0.",
"transcoding_max_bitrate_description": "╬Ч ╧Б╧Н╬╕╬╝╬╣╧Г╬╖ ╬╡╬╜╧М╧В ╬╝╬н╬│╬╣╧Г╧Д╬┐╧Е ╧Б╧Е╬╕╬╝╬┐╧Н ╬╝╬╡╧Д╬м╬┤╬┐╧Г╬╖╧В(bitrate) ╬╝╧А╬┐╧Б╬╡╬п ╬╜╬▒ ╬║╬м╬╜╬╡╬╣ ╧Д╬┐ ╬╝╬н╬│╬╡╬╕╬┐╧В ╧Д╧Й╬╜ ╬▒╧Б╧З╬╡╬п╧Й╬╜ ╧А╬╣╬┐ ╧А╧Б╬┐╬▓╬╗╬н╧И╬╣╬╝╬┐, ╬▒╬╗╬╗╬м ╬╝╬╡ ╬н╬╜╬▒ ╬╝╬╣╬║╧Б╧М ╬║╧М╧Г╧Д╬┐╧В ╧Г╧Д╬╖╬╜ ╧А╬┐╬╣╧М╧Д╬╖╧Д╬▒. ╬г╧Д╬╖╬╜ ╬▒╬╜╬м╬╗╧Е╧Г╬╖ ╧Д╧Й╬╜ 720p, ╬┐╬╣ ╧Д╧Е╧А╬╣╬║╬н╧В ╧Д╬╣╬╝╬н╧В ╬╡╬п╬╜╬▒╬╣ 2600 kbit/s ╬│╬╣╬▒ VP9 ╬о HEVC, ╬о 4500 kbit/s ╬│╬╣╬▒ H.264. ╬С╧А╬╡╬╜╬╡╧Б╬│╬┐╧А╬┐╬╣╬╡╬п╧Д╬▒╬╣ ╬╡╬м╬╜ ╬┐╧Б╬╣╧Г╧Д╬╡╬п ╧Г╬╡ 0.",
"transcoding_max_keyframe_interval": "╬Ь╬н╬│╬╣╧Г╧Д╬┐ ╧З╧Б╬┐╬╜╬╣╬║╧М ╬┤╬╣╬м╧Г╧Д╬╖╬╝╬▒ ╬╝╬╡╧Д╬▒╬╛╧Н ╧Д╧Й╬╜ ╬║╬▒╧Б╬н ╬▒╬╜╬▒╧Ж╬┐╧Б╬м╧В (keyframe)",
"transcoding_max_keyframe_interval_description": "╬Я╧Б╬п╬╢╬╡╬╣ ╧Д╬┐ ╬╝╬н╬│╬╣╧Г╧Д╬┐ ╬┤╬╣╬м╧Г╧Д╬╖╬╝╬▒ ╬╝╬╡╧Д╬▒╬╛╧Н ╧Д╧Й╬╜ ╬║╬▒╧Б╬н ╬▒╬╜╬▒╧Ж╬┐╧Б╬м╧В. ╬з╬▒╬╝╬╖╬╗╧М╧Д╬╡╧Б╬╡╧В ╧Д╬╣╬╝╬н╧В ╬╝╬╡╬╣╧О╬╜╬┐╧Е╬╜ ╧Д╬╖╬╜ ╬▒╧А╬┐╬┤╬┐╧Д╬╣╬║╧М╧Д╬╖╧Д╬▒ ╧Г╧Е╬╝╧А╬п╬╡╧Г╬╖╧В, ╬▒╬╗╬╗╬м ╬▓╬╡╬╗╧Д╬╣╧О╬╜╬┐╧Е╬╜ ╧Д╬┐╬╜ ╧З╧Б╧М╬╜╬┐ ╬▒╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖╧В ╬║╬▒╬╣ ╬╝╧А╬┐╧Б╬╡╬п ╬╜╬▒ ╬▓╬╡╬╗╧Д╬╣╧О╧Г╬┐╧Е╬╜ ╧Д╬╖╬╜ ╧А╬┐╬╣╧М╧Д╬╖╧Д╬▒ ╧Г╬╡ ╧Г╬║╬╖╬╜╬н╧В ╬╝╬╡ ╬│╧Б╬о╬│╬┐╧Б╬╖ ╬║╬п╬╜╬╖╧Г╬╖. ╬Ч ╧Д╬╣╬╝╬о 0 ╧Б╧Е╬╕╬╝╬п╬╢╬╡╬╣ ╬▒╧Е╧Д╧М ╧Д╬┐ ╬┤╬╣╬м╧Г╧Д╬╖╬╝╬▒ ╬▒╧Е╧Д╧М╬╝╬▒╧Д╬▒.",
"transcoding_optimal_description": "╬Т╬п╬╜╧Д╬╡╬┐ ╬╝╬╡ ╬▒╬╜╧О╧Д╬╡╧Б╬╖ ╬▒╬╜╬м╬╗╧Е╧Г╬╖ ╬▒╧А╧М ╧Д╬╖╬╜ ╬╡╧А╬╣╬╕╧Е╬╝╬╖╧Д╬о ╬о ╧Г╬╡ ╬╝╬╖ ╬▒╧А╬┐╬┤╬╡╬║╧Д╬о ╬╝╬┐╧Б╧Ж╬о",
@@ -391,6 +394,7 @@
"allow_edits": "╬Х╧А╬╣╧Д╧Б╬н╧И╧Д╬╡ ╧Д╬╣╧В ╧Д╧Б╬┐╧А╬┐╧А╬┐╬╣╬о╧Г╬╡╬╣╧В",
"allow_public_user_to_download": "╬Х╧А╬╣╧Д╧Б╬н╧И╧Д╬╡ ╧Г╬╡ ╬┤╬╖╬╝╧М╧Г╬╣╬┐ ╧З╧Б╬о╧Г╧Д╬╖ ╬╜╬▒ ╬║╬▒╧Д╬╡╬▓╬м╧Г╬╡╬╣",
"allow_public_user_to_upload": "╬Х╧А╬╣╧Д╧Б╬н╧И╧Д╬╡ ╧Г╧Д╬┐╬╜ ╬┤╬╖╬╝╧М╧Г╬╣╬┐ ╧З╧Б╬о╧Г╧Д╬╖ ╬╜╬▒ ╬▒╬╜╬╡╬▓╬м╧Г╬╡╬╣",
"alt_text_qr_code": "╬Х╬╣╬║╧М╬╜╬▒ ╬║╧Й╬┤╬╣╬║╬┐╧Н QR",
"anti_clockwise": "╬С╬╜╧Д╬п╬╕╬╡╧Д╬▒ ╬╝╬╡ ╧Д╬╖ ╧Ж╬┐╧Б╬м ╧Д╬┐╧Е ╧Б╬┐╬╗╬┐╬│╬╣╬┐╧Н",
"api_key": "╬Ъ╬╗╬╡╬╣╬┤╬п API",
"api_key_description": "╬С╧Е╧Д╬о ╬╖ ╧Д╬╣╬╝╬о ╬╕╬▒ ╬╡╬╝╧Ж╬▒╬╜╬╣╧Г╧Д╬╡╬п ╬╝╧М╬╜╬┐ ╬╝╬п╬▒ ╧Ж╬┐╧Б╬м. ╬а╬▒╧Б╬▒╬║╬▒╬╗╧О ╬▓╬╡╬▓╬▒╬╣╧Й╬╕╬╡╬п╧Д╬╡ ╧М╧Д╬╣ ╧Д╬╖╬╜ ╬н╧З╬╡╧Д╬╡ ╬▒╬╜╧Д╬╣╬│╧Б╬м╧И╬╡╬╣ ╧А╧Б╬╣╬╜ ╬║╬╗╬╡╬п╧Г╬╡╧Д╬╡ ╧Д╬┐ ╧А╬▒╧Б╬м╬╕╧Е╧Б╬┐.",
@@ -481,6 +485,7 @@
"comments_are_disabled": "╬д╬▒ ╧Г╧З╧М╬╗╬╣╬▒ ╬╡╬п╬╜╬▒╬╣ ╬▒╧А╬╡╬╜╬╡╧Б╬│╬┐╧А╬┐╬╣╬╖╬╝╬н╬╜╬▒",
"confirm": "╬Х╧А╬╣╬▓╬╡╬▓╬▒╬п╧Й╧Г╬╖",
"confirm_admin_password": "╬Х╧А╬╣╬▓╬╡╬▓╬▒╬п╧Й╧Г╬╖ ╬║╧Й╬┤╬╣╬║╬┐╧Н ╬Ф╬╣╬▒╧З╬╡╬╣╧Б╬╣╧Г╧Д╬о",
"confirm_delete_face": "╬Х╬п╧Г╧Д╬╡ ╧Г╬п╬│╬┐╧Е╧Б╬┐╬╣ ╧М╧Д╬╣ ╬╕╬н╬╗╬╡╧Д╬╡ ╬╜╬▒ ╬┤╬╣╬▒╬│╧Б╬м╧И╬╡╧Д╬╡ ╧Д╬┐ ╧А╧Б╧М╧Г╧Й╧А╬┐ ╧Д╬┐╧Е/╧Д╬╖╧В {name} ╬▒╧А╧М ╧Д╬┐ ╧Г╧Д╬┐╬╣╧З╬╡╬п╬┐;",
"confirm_delete_shared_link": "╬Х╬п╧Г╧Д╬╡ ╧Г╬п╬│╬┐╧Е╧Б╬┐╬╣ ╧М╧Д╬╣ ╬╕╬н╬╗╬╡╧Д╬╡ ╬╜╬▒ ╬┤╬╣╬▒╬│╧Б╬м╧И╬╡╧Д╬╡ ╬▒╧Е╧Д╧М╬╜ ╧Д╬┐╬╜ ╬║╬┐╬╣╬╜╧М╧З╧Б╬╖╧Г╧Д╬┐ ╧Г╧Н╬╜╬┤╬╡╧Г╬╝╬┐;",
"confirm_keep_this_delete_others": "╬М╬╗╬▒ ╧Д╬▒ ╬м╬╗╬╗╬▒ ╧Г╧Д╬┐╬╣╧З╬╡╬п╬▒ ╧Д╬╖╧В ╧Г╧Д╬┐╬п╬▓╬▒╧В ╬╕╬▒ ╬┤╬╣╬▒╬│╧Б╬▒╧Ж╬┐╧Н╬╜, ╬╡╬║╧Д╧М╧В ╬▒╧А╧М ╬▒╧Е╧Д╧М ╧Д╬┐ ╧Г╧Д╬┐╬╣╧З╬╡╬п╬┐. ╬Х╬п╧Г╧Д╬╡ ╧Г╬п╬│╬┐╧Е╧Б╬┐╬╣ ╧М╧Д╬╣ ╬╕╬н╬╗╬╡╧Д╬╡ ╬╜╬▒ ╧Г╧Е╬╜╬╡╧З╬п╧Г╬╡╧Д╬╡;",
"confirm_password": "╬Х╧А╬╣╬▓╬╡╬▓╬▒╬п╧Й╧Г╬╖ ╬║╧Й╬┤╬╣╬║╬┐╧Н",
@@ -533,6 +538,7 @@
"delete_album": "╬Ф╬╣╬▒╬│╧Б╬▒╧Ж╬о ╬м╬╗╬╝╧А╬┐╧Е╬╝",
"delete_api_key_prompt": "╬Х╬п╧Г╧Д╬╡ ╧Г╬п╬│╬┐╧Е╧Б╬┐╬╣ ╧М╧Д╬╣ ╬╕╬н╬╗╬╡╧Д╬╡ ╬╜╬▒ ╬┤╬╣╬▒╬│╧Б╬м╧И╬╡╧Д╬╡ ╬▒╧Е╧Д╧М ╬║╬╗╬╡╬╣╬┤╬п API;",
"delete_duplicates_confirmation": "╬Х╬п╧Г╧Д╬╡ ╧Г╬п╬│╬┐╧Е╧Б╬┐╬╣ ╧М╧Д╬╣ ╬╡╧А╬╣╬╕╧Е╬╝╬╡╬п╧Д╬╡ ╧Д╬╖ ╬╝╧М╬╜╬╣╬╝╬╖ ╬┤╬╣╬▒╬│╧Б╬▒╧Ж╬о ╬▒╧Е╧Д╧О╬╜ ╧Д╧Й╬╜ ╬┤╬╣╧А╬╗╧М╧Д╧Е╧А╧Й╬╜;",
"delete_face": "╬Ф╬╣╬▒╬│╧Б╬▒╧Ж╬о ╧А╧Б╬┐╧Г╧О╧А╬┐╧Е",
"delete_key": "╬Ф╬╣╬▒╬│╧Б╬▒╧Ж╬о ╬║╬╗╬╡╬╣╬┤╬╣╬┐╧Н",
"delete_library": "╬Ф╬╣╬▒╬│╧Б╬▒╧Ж╬о ╬Т╬╣╬▓╬╗╬╣╬┐╬╕╬о╬║╬╖╧В",
"delete_link": "╬Ф╬╣╬▒╬│╧Б╬▒╧Ж╬о ╧Г╧Е╬╜╬┤╬н╧Г╬╝╬┐╧Е",
@@ -600,6 +606,7 @@
"enabled": "╬Х╬╜╬╡╧Б╬│╬┐╧А╬┐╬╣╬╖╬╝╬н╬╜╬┐",
"end_date": "╬д╬╡╬╗╬╣╬║╬о ╬╖╬╝╬╡╧Б╬┐╬╝╬╖╬╜╬п╬▒",
"error": "╬г╧Ж╬м╬╗╬╝╬▒",
"error_delete_face": "╬г╧Ж╬м╬╗╬╝╬▒ ╬┤╬╣╬▒╬│╧Б╬▒╧Ж╬о╧В ╧А╧Б╬┐╧Г╧О╧А╬┐╧Е ╬▒╧А╧М ╧Д╬┐ ╧Г╧Д╬┐╬╣╧З╬╡╬п╬┐",
"error_loading_image": "╬г╧Ж╬м╬╗╬╝╬▒ ╬║╬▒╧Д╬м ╧Д╬╖ ╧Ж╧М╧Б╧Д╧Й╧Г╬╖ ╧Д╬╖╧В ╬╡╬╣╬║╧М╬╜╬▒╧В",
"error_title": "╬г╧Ж╬м╬╗╬╝╬▒ - ╬Ъ╬м╧Д╬╣ ╧А╬о╬│╬╡ ╧Г╧Д╧Б╬▒╬▓╬м",
"errors": {
@@ -884,6 +891,7 @@
"month": "╬Ь╬о╬╜╬▒╧В",
"more": "╬а╬╡╧Б╬╣╧Г╧Г╧М╧Д╬╡╧Б╬▒",
"moved_to_trash": "╬Ь╬╡╧Д╬▒╬║╬╣╬╜╬о╬╕╬╖╬║╬╡ ╧Г╧Д╬┐╬╜ ╬║╬м╬┤╬┐ ╬▒╧А╬┐╧Б╧Б╬╣╬╝╬╝╬м╧Д╧Й╬╜",
"mute_memories": "╬г╬п╬│╬▒╧Г╬╖ ╬С╬╜╬▒╬╝╬╜╬о╧Г╬╡╧Й╬╜",
"my_albums": "╬д╬▒ ╬м╬╗╬╝╧А╬┐╧Е╬╝ ╬╝╬┐╧Е",
"name": "╬М╬╜╬┐╬╝╬▒",
"name_or_nickname": "╬М╬╜╬┐╬╝╬▒ ╬о ╧И╬╡╧Е╬┤╧О╬╜╧Е╬╝╬┐",
@@ -979,6 +987,7 @@
"permanently_deleted_asset": "╬Я╧Б╬╣╧Г╧Д╬╣╬║╬м ╬┤╬╣╬▒╬│╧Б╬▒╬╝╬╝╬н╬╜╬┐ ╧Г╧Д╬┐╬╣╧З╬╡╬п╬┐",
"permanently_deleted_assets_count": "╬Я╧Б╬╣╧Г╧Д╬╣╬║╬о ╬┤╬╣╬▒╬│╧Б╬▒╧Ж╬о {count, plural, one {# ╧Г╧Д╬┐╬╣╧З╬╡╬п╬┐╧Е} other {# ╧Г╧Д╬┐╬╣╧З╬╡╬п╧Й╬╜}}",
"person": "╬Ж╧Д╬┐╬╝╬┐",
"person_birthdate": "╬У╬╡╬╜╬╜╬╖╬╕╬╡╬п╧В ╧Г╧Д╬╣╧В {date}",
"person_hidden": "{name}{hidden, select, true { (╬║╧Б╧Е╧Ж╧М)} other {}}",
"photo_shared_all_users": "╬ж╬▒╬п╬╜╬╡╧Д╬▒╬╣ ╧М╧Д╬╣ ╬╝╬┐╬╣╧Б╬▒╧Г╧Д╬о╬║╬▒╧Д╬╡ ╧Д╬╣╧В ╧Ж╧Й╧Д╬┐╬│╧Б╬▒╧Ж╬п╬╡╧В ╧Г╬▒╧В ╬╝╬╡ ╧М╬╗╬┐╧Е╧В ╧Д╬┐╧Е╧В ╧З╧Б╬о╧Г╧Д╬╡╧В ╬о ╬┤╬╡╬╜ ╬н╧З╬╡╧Д╬╡ ╬║╬▒╬╜╬н╬╜╬▒╬╜ ╧З╧Б╬о╧Г╧Д╬╖ ╬│╬╣╬▒ ╬║╬┐╬╣╬╜╬о ╧З╧Б╬о╧Г╬╖.",
"photos": "╬ж╧Й╧Д╬┐╬│╧Б╬▒╧Ж╬п╬╡╧В",
@@ -1070,12 +1079,16 @@
"remove_from_album": "╬С╧Ж╬▒╬п╧Б╬╡╧Г╬╖ ╬▒╧А╧М ╧Д╬┐ ╬м╬╗╬╝╧А╬┐╧Е╬╝",
"remove_from_favorites": "╬С╧Ж╬▒╬п╧Б╬╡╧Г╬╖ ╬▒╧А╧М ╧Д╬▒ ╬▒╬│╬▒╧А╬╖╬╝╬н╬╜╬▒",
"remove_from_shared_link": "╬С╧Ж╬▒╬п╧Б╬╡╧Г╬╖ ╬▒╧А╧М ╧Д╬┐╬╜ ╬║╬┐╬╣╬╜╧М╧З╧Б╬╖╧Г╧Д╬┐ ╧Г╧Н╬╜╬┤╬╡╧Г╬╝╬┐",
"remove_memory": "╬С╧Ж╬▒╬п╧Б╬╡╧Г╬╖ ╬▒╬╜╬м╬╝╬╜╬╖╧Г╬╖╧В",
"remove_photo_from_memory": "╬С╧Ж╬▒╬п╧Б╬╡╧Г╬╖ ╧Ж╧Й╧Д╬┐╬│╧Б╬▒╧Ж╬п╬▒╧В ╬▒╧А╧М ╧Д╬╖╬╜ ╬▒╬╜╬м╬╝╬╜╬╖╧Г╬╖",
"remove_url": "╬С╧Ж╬▒╬п╧Б╬╡╧Г╬╖ ╬г╧Е╬╜╬┤╬н╧Г╬╝╬┐╧Е",
"remove_user": "╬С╧Ж╬▒╬п╧Б╬╡╧Г╬╖ ╧З╧Б╬о╧Г╧Д╬╖",
"removed_api_key": "╬С╧Ж╬▒╬╣╧Б╬н╬╕╬╖╬║╬╡ ╧Д╬┐ API Key: {name}",
"removed_from_archive": "╬С╧Ж╬▒╬╣╧Б╬н╬╕╬╖╬║╬╡/╬║╬▒╬╜ ╬▒╧А╧М ╧Д╬┐ ╬С╧Б╧З╬╡╬п╬┐",
"removed_from_favorites": "╬С╧Ж╬▒╬╣╧Б╬н╬╕╬╖╬║╬╡ ╬▒╧А╧М ╧Д╬▒ ╬▒╬│╬▒╧А╬╖╬╝╬н╬╜╬▒",
"removed_from_favorites_count": "╬С╧Ж╬▒╬╣╧Б╬н╬╕╬╖╬║╬▒╬╜ {count, plural, other {#}} ╬▒╧А╧М ╧Д╬▒ ╬▒╬│╬▒╧А╬╖╬╝╬н╬╜╬▒",
"removed_memory": "╬Ф╬╣╬▒╬│╧Б╬▒╬╝╬╝╬н╬╜╬╖ ╬╝╬╜╬о╬╝╬╖",
"removed_photo_from_memory": "╬Ф╬╣╬▒╬│╧Б╬▒╬╝╬╝╬н╬╜╬╖ ╧Ж╧Й╧Д╬┐╬│╧Б╬▒╧Ж╬п╬▒ ╬▒╧А╧М ╧Д╬╖ ╬╝╬╜╬о╬╝╬╖",
"removed_tagged_assets": "╬С╧Ж╬▒╬╣╧Б╬н╬╕╬╖╬║╬╡ ╬╖ ╬╡╧Д╬╣╬║╬н╧Д╬▒ ╬▒╧А╧М {count, plural, one {# ╧Г╧Д╬┐╬╣╧З╬╡╬п╬┐} other {# ╧Г╧Д╬┐╬╣╧З╬╡╬п╬▒}}",
"rename": "╬Ь╬╡╧Д╬┐╬╜╬┐╬╝╬▒╧Г╬п╬▒",
"repair": "╬Х╧А╬╣╧Г╬║╬╡╧Е╬о",
@@ -1084,6 +1097,7 @@
"repository": "╬С╧А╬┐╬╕╬╡╧Д╬о╧Б╬╣╬┐",
"require_password": "╬С╧А╬▒╬╣╧Д╬╡╬п╧Д╬▒╬╣ ╬║╧Й╬┤╬╣╬║╧М╧В ╧А╧Б╧М╧Г╬▓╬▒╧Г╬╖╧В",
"require_user_to_change_password_on_first_login": "╬Я ╧З╧Б╬о╧Г╧Д╬╖╧В ╬▒╧А╬▒╬╣╧Д╬╡╬п╧Д╬▒╬╣ ╬╜╬▒ ╬▒╬╗╬╗╬м╬╛╬╡╬╣ ╧Д╬┐╬╜ ╬║╧Й╬┤╬╣╬║╧М ╧А╧Б╧М╧Г╬▓╬▒╧Г╬о╧В ╧Д╬┐╧Е ╬║╬▒╧Д╬м ╧Д╬╖╬╜ ╧А╧Б╧О╧Д╬╖ ╧Г╧Н╬╜╬┤╬╡╧Г╬╖",
"rescan": "╬Х╬║ ╬╜╬н╬┐╧Е ╧Г╬м╧Б╧Й╧Г╬╖",
"reset": "╬Х╧А╬▒╬╜╬▒╧Ж╬┐╧Б╬м",
"reset_password": "╬Х╧А╬▒╬╜╬▒╧Ж╬┐╧Б╬м ╬║╧Й╬┤╬╣╬║╬┐╧Н ╧А╧Б╧М╧Г╬▓╬▒╧Г╬╖╧В",
"reset_people_visibility": "╬Х╧А╬▒╬╜╬▒╧Ж╬┐╧Б╬м ╧А╧Б╬┐╬▓╬┐╬╗╬о╧В ╬▒╧Д╧М╬╝╧Й╬╜",
@@ -1127,6 +1141,7 @@
"search_options": "╬Х╧А╬╣╬╗╬┐╬│╬н╧В ╬▒╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖╧В",
"search_people": "╬С╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖ ╬▒╧Д╧М╬╝╧Й╬╜",
"search_places": "╬С╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖ ╧Д╬┐╧А╬┐╬╕╬╡╧Г╬╣╧О╬╜",
"search_rating": "╬С╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖ ╬║╬▒╧Д╬м ╬▓╬▒╬╕╬╝╬┐╬╗╬┐╬│╬п╬▒...",
"search_settings": "╬б╧Е╬╕╬╝╬п╧Г╬╡╬╣╧В ╬▒╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖╧В",
"search_state": "╬С╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖ ╬╜╬┐╬╝╬┐╧Н...",
"search_tags": "╬С╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖ ╬╡╧Д╬╣╬║╬╡╧Д╧О╬╜...",
@@ -1136,6 +1151,7 @@
"searching_locales": "╬С╬╜╬▒╬╢╬о╧Д╬╖╧Г╬╖ ╧Д╬┐╧А╬┐╬╕╬╡╧Г╬╣╧О╬╜...",
"second": "╬Ф╬╡╧Е╧Д╬╡╧Б╧М╬╗╬╡╧А╧Д╬┐",
"see_all_people": "╬а╧Б╬┐╬▓╬┐╬╗╬о ╧М╬╗╧Й╬╜ ╧Д╧Й╬╜ ╬▒╧Д╧М╬╝╧Й╬╜",
"select": "╬Х╧А╬╣╬╗╬┐╬│╬о",
"select_album_cover": "╬Х╧А╬╣╬╗╬н╬╛╧Д╬╡ ╬╡╬╛╧О╧Ж╧Е╬╗╬╗╬┐ ╬м╬╗╬╝╧А╬┐╧Е╬╝",
"select_all": "╬Х╧А╬╣╬╗╬┐╬│╬о ╧М╬╗╧Й╬╜",
"select_all_duplicates": "╬Х╧А╬╣╬╗╬┐╬│╬о ╧М╬╗╧Й╬╜ ╧Д╧Й╬╜ ╬┤╬╣╧А╬╗╧М╧Д╧Е╧А╧Й╬╜",
@@ -1250,6 +1266,7 @@
"tag_created": "╬Ф╬╖╬╝╬╣╬┐╧Е╧Б╬│╬о╬╕╬╖╬║╬╡ ╬╡╧Д╬╣╬║╬н╧Д╬▒: {tag}",
"tag_feature_description": "╬а╬╡╧Б╬╣╬о╬│╬╖╧Г╬╖ ╧Г╬╡ ╧Ж╧Й╧Д╬┐╬│╧Б╬▒╧Ж╬п╬╡╧В ╬║╬▒╬╣ ╬▓╬п╬╜╧Д╬╡╬┐ ╧А╬┐╧Е ╬╡╬п╬╜╬▒╬╣ ╬┐╧Б╬│╬▒╬╜╧Й╬╝╬н╬╜╬▒ ╧Г╧Н╬╝╧Ж╧Й╬╜╬▒ ╬╝╬╡ ╬╗╬┐╬│╬╣╬║╬м ╬╕╬н╬╝╬▒╧Д╬▒ ╬╡╧Д╬╣╬║╬╡╧Д╧О╬╜",
"tag_not_found_question": "╬Ф╬╡╬╜ ╬╝╧А╬┐╧Б╬╡╬п╧Д╬╡ ╬╜╬▒ ╬▓╧Б╬╡╬п╧Д╬╡ ╬╝╬╣╬▒ ╬╡╧Д╬╣╬║╬н╧Д╬▒; <link>╬Ф╬╖╬╝╬╣╬┐╧Е╧Б╬│╬о╧Г╧Д╬╡ ╬╝╬╣╬▒ ╬╜╬н╬▒ ╬╡╧Д╬╣╬║╬н╧Д╬▒.</link>",
"tag_people": "╬Х╧А╬╣╧Г╬о╬╝╬▒╬╜╧Г╬╖ ╬▒╧Д╧М╬╝╧Й╬╜",
"tag_updated": "╬Х╬╜╬╖╬╝╬╡╧Б╧О╬╕╬╖╬║╬╡ ╬╖ ╬╡╧Д╬╣╬║╬н╧Д╬▒: {tag}",
"tagged_assets": "╬Х╧Д╬╣╬║╬╡╧Д╬┐╧А╬┐╬╣╬╖╬╝╬н╬╜╬┐/╬▒ {count, plural, one {# ╧Г╧Д╬┐╬╣╧З╬╡╬п╬┐} other {# ╧Г╧Д╬┐╬╣╧З╬╡╬п╬▒}}",
"tags": "╬Х╧Д╬╣╬║╬н╧Д╬╡╧В",
@@ -1343,6 +1360,7 @@
"view_all": "╬а╧Б╬┐╬▓╬┐╬╗╬о ╬М╬╗╧Й╬╜",
"view_all_users": "╬а╧Б╬┐╬▓╬┐╬╗╬о ╧М╬╗╧Й╬╜ ╧Д╧Й╬╜ ╧З╧Б╬╖╧Г╧Д╧О╬╜",
"view_in_timeline": "╬а╧Б╬┐╬▓╬┐╬╗╬о ╧Г╧Д╬┐ ╧З╧Б╬┐╬╜╬┐╬┤╬╣╬м╬│╧Б╬▒╬╝╬╝╬▒",
"view_link": "╬а╧Б╬┐╬▓╬┐╬╗╬о ╧Г╧Н╬╜╬┤╬╡╧Г╬╝╬┐╧Е",
"view_links": "╬а╧Б╬┐╬▓╬┐╬╗╬о ╧Г╧Е╬╜╬┤╬н╧Г╬╝╧Й╬╜",
"view_name": "╬а╧Б╬┐╬▓╬┐╬╗╬о",
"view_next_asset": "╬а╧Б╬┐╬▓╬┐╬╗╬о ╬╡╧А╧М╬╝╬╡╬╜╬┐╧Е ╧Г╧Д╬┐╬╣╧З╬╡╬п╬┐╧Е",
+19 -4
View File
@@ -65,8 +65,13 @@
"forcing_refresh_library_files": "Forcing refresh of all library files",
"image_format": "Format",
"image_format_description": "WebP produces smaller files than JPEG, but is slower to encode.",
"image_fullsize_enabled": "Enable full-size image generation",
"image_fullsize_enabled_description": "Generate full-size image for non-web-friendly formats. When \"Prefer embedded preview\" is enabled, embedded previews are used directly without conversion. Does not affect web-friendly formats like JPEG.",
"image_fullsize_quality_description": "Full-size image quality from 1-100. Higher is better, but produces larger files.",
"image_fullsize_title": "Full-size Image Settings",
"image_fullsize_description": "Full-size image with stripped metadata, used when zoomed in",
"image_prefer_embedded_preview": "Prefer embedded preview",
"image_prefer_embedded_preview_setting_description": "Use embedded previews in RAW photos as the input to image processing when available. This can produce more accurate colors for some images, but the quality of the preview is camera-dependent and the image may have more compression artifacts.",
"image_prefer_embedded_preview_setting_description": "Use embedded previews in RAW photos as the input to image processing and when available. This can produce more accurate colors for some images, but the quality of the preview is camera-dependent and the image may have more compression artifacts.",
"image_prefer_wide_gamut": "Prefer wide gamut",
"image_prefer_wide_gamut_setting_description": "Use Display P3 for thumbnails. This better preserves the vibrance of images with wide colorspaces, but images may appear differently on old devices with an old browser version. sRGB images are kept as sRGB to avoid color shifts.",
"image_preview_description": "Medium-size image with stripped metadata, used when viewing a single asset and for machine learning",
@@ -96,7 +101,7 @@
"library_scanning_enable_description": "Enable periodic library scanning",
"library_settings": "External Library",
"library_settings_description": "Manage external library settings",
"library_tasks_description": "Perform library tasks",
"library_tasks_description": "Scan external libraries for new and/or changed assets",
"library_watching_enable_description": "Watch external libraries for file changes",
"library_watching_settings": "Library watching (EXPERIMENTAL)",
"library_watching_settings_description": "Automatically watch for changed files",
@@ -240,7 +245,7 @@
"storage_template_hash_verification_enabled_description": "Enables hash verification, don't disable this unless you're certain of the implications",
"storage_template_migration": "Storage template migration",
"storage_template_migration_description": "Apply the current <link>{template}</link> to previously uploaded assets",
"storage_template_migration_info": "Template changes will only apply to new assets. To retroactively apply the template to previously uploaded assets, run the <link>{job}</link>.",
"storage_template_migration_info": "The storage template will convert all extensions to lowercase. Template changes will only apply to new assets. To retroactively apply the template to previously uploaded assets, run the <link>{job}</link>.",
"storage_template_migration_job": "Storage Template Migration Job",
"storage_template_more_details": "For more details about this feature, refer to the <template-link>Storage Template</template-link> and its <implications-link>implications</implications-link>",
"storage_template_onboarding_description": "When enabled, this feature will auto-organize files based on a user-defined template. Due to stability issues the feature has been turned off by default. For more information, please see the <link>documentation</link>.",
@@ -299,7 +304,7 @@
"transcoding_max_b_frames": "Maximum B-frames",
"transcoding_max_b_frames_description": "Higher values improve compression efficiency, but slow down encoding. May not be compatible with hardware acceleration on older devices. 0 disables B-frames, while -1 sets this value automatically.",
"transcoding_max_bitrate": "Maximum bitrate",
"transcoding_max_bitrate_description": "Setting a max bitrate can make file sizes more predictable at a minor cost to quality. At 720p, typical values are 2600k for VP9 or HEVC, or 4500k for H.264. Disabled if set to 0.",
"transcoding_max_bitrate_description": "Setting a max bitrate can make file sizes more predictable at a minor cost to quality. At 720p, typical values are 2600 kbit/s for VP9 or HEVC, or 4500 kbit/s for H.264. Disabled if set to 0.",
"transcoding_max_keyframe_interval": "Maximum keyframe interval",
"transcoding_max_keyframe_interval_description": "Sets the maximum frame distance between keyframes. Lower values worsen compression efficiency, but improve seek times and may improve quality in scenes with fast movement. 0 sets this value automatically.",
"transcoding_optimal_description": "Videos higher than target resolution or not in an accepted format",
@@ -336,6 +341,7 @@
"untracked_files": "Untracked Files",
"untracked_files_description": "These files are not tracked by the application. They can be the results of failed moves, interrupted uploads, or left behind due to a bug",
"user_cleanup_job": "User cleanup",
"cleanup": "Cleanup",
"user_delete_delay": "<b>{user}</b>'s account and assets will be scheduled for permanent deletion in {delay, plural, one {# day} other {# days}}.",
"user_delete_delay_settings": "Delete delay",
"user_delete_delay_settings_description": "Number of days after removal to permanently delete a user's account and assets. The user deletion job runs at midnight to check for users that are ready for deletion. Changes to this setting will be evaluated at the next execution.",
@@ -393,6 +399,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",
"alt_text_qr_code": "QR code image",
"anti_clockwise": "Anti-clockwise",
"api_key": "API Key",
"api_key_description": "This value will only be shown once. Please be sure to copy it before closing the window.",
@@ -889,6 +896,7 @@
"month": "Month",
"more": "More",
"moved_to_trash": "Moved to trash",
"mute_memories": "Mute Memories",
"my_albums": "My albums",
"name": "Name",
"name_or_nickname": "Name or nickname",
@@ -984,6 +992,7 @@
"permanently_deleted_asset": "Permanently deleted asset",
"permanently_deleted_assets_count": "Permanently deleted {count, plural, one {# asset} other {# assets}}",
"person": "Person",
"person_birthdate": "Born on {date}",
"person_hidden": "{name}{hidden, select, true { (hidden)} other {}}",
"photo_shared_all_users": "Looks like you shared your photos with all users or you don't have any user to share with.",
"photos": "Photos",
@@ -1078,7 +1087,9 @@
"remove_url": "Remove URL",
"remove_user": "Remove user",
"removed_api_key": "Removed API Key: {name}",
"remove_memory": "Remove memory",
"removed_memory": "Removed memory",
"remove_photo_from_memory": "Remove photo from this memory",
"removed_photo_from_memory": "Removed photo from memory",
"removed_from_archive": "Removed from archive",
"removed_from_favorites": "Removed from favorites",
@@ -1114,6 +1125,7 @@
"say_something": "Say something",
"scan_all_libraries": "Scan All Libraries",
"scan_library": "Scan",
"rescan": "Rescan",
"scan_settings": "Scan Settings",
"scanning_for_album": "Scanning for album...",
"search": "Search",
@@ -1145,6 +1157,7 @@
"second": "Second",
"see_all_people": "See all people",
"select_album_cover": "Select album cover",
"select": "Select",
"select_all": "Select all",
"select_all_duplicates": "Select all duplicates",
"select_avatar_color": "Select avatar color",
@@ -1302,6 +1315,7 @@
"unnamed_album": "Unnamed Album",
"unnamed_album_delete_confirmation": "Are you sure you want to delete this album?",
"unnamed_share": "Unnamed Share",
"unmute_memories": "Unmute Memories",
"unsaved_change": "Unsaved change",
"unselect_all": "Unselect all",
"unselect_all_duplicates": "Unselect all duplicates",
@@ -1352,6 +1366,7 @@
"view_all": "View All",
"view_all_users": "View all users",
"view_in_timeline": "View in timeline",
"view_link": "View link",
"view_links": "View links",
"view_name": "View",
"view_next_asset": "View next asset",
+26 -7
View File
@@ -7,7 +7,7 @@
"actions": "Acciones",
"active": "Activo",
"activity": "Actividad",
"activity_changed": "La actividad est├б {enabled, select, true {activada} other {desactivada}}",
"activity_changed": "La actividad est├б {enabled, select, true {habilitada} other {deshabilitada}}",
"add": "Agregar",
"add_a_description": "Agregar descripci├│n",
"add_a_location": "Agregar ubicaci├│n",
@@ -24,7 +24,7 @@
"add_to_album": "Incluir en ├бlbum",
"add_to_shared_album": "Incluir en ├бlbum compartido",
"add_url": "A├▒adir URL",
"added_to_archive": "Archivado",
"added_to_archive": "Agregado al Archivado",
"added_to_favorites": "Agregado a favoritos",
"added_to_favorites_count": "Agregado {count, number} a favoritos",
"admin": {
@@ -41,6 +41,7 @@
"backup_settings": "Ajustes de respaldo",
"backup_settings_description": "Administrar configuraci├│n de respaldo de base de datos",
"check_all": "Verificar todo",
"cleanup": "Limpieza",
"cleared_jobs": "Trabajos borrados para: {job}",
"config_set_by_file": "La configuraci├│n est├б definida por un archivo de configuraci├│n",
"confirm_delete_library": "┬┐Est├бs seguro de que quieres eliminar la biblioteca {library}?",
@@ -96,7 +97,7 @@
"library_scanning_enable_description": "Activar el escaneo peri├│dico de la biblioteca",
"library_settings": "Biblioteca externa",
"library_settings_description": "Administrar configuraci├│n biblioteca externa",
"library_tasks_description": "Realizar tareas de biblioteca",
"library_tasks_description": "Buscar archivos nuevos o modificados en bibliotecas externas",
"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_description": "Vigilar automaticamente en busca de archivos modificados",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "Busque im├бgenes sem├бnticamente utilizando incrustaciones CLIP (Contrastive Language-Image Pre-Training)",
"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_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.",
"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.",
"manage_concurrency": "Ajustes de concurrencia",
"manage_log_settings": "Administrar la configuraci├│n de los registros",
"map_dark_style": "Estilo oscuro",
@@ -147,6 +148,8 @@
"map_settings": "Mapa",
"map_settings_description": "Administrar la configuraci├│n del mapa",
"map_style_description": "Direcci├│n URL a un tema de mapa (style.json)",
"memory_cleanup_job": "Limpieza de memoria",
"memory_generate_job": "Generaci├│n de memoria",
"metadata_extraction_job": "Extracci├│n de metadatos",
"metadata_extraction_job_description": "Extraer informaci├│n de metadatos de cada activo, como GPS, caras y resoluci├│n",
"metadata_faces_import_setting": "Activar importaci├│n de caras",
@@ -240,7 +243,7 @@
"storage_template_hash_verification_enabled_description": "Habilita la verificaci├│n de hash, no la desactive a menos que est├й seguro de las implicaciones",
"storage_template_migration": "Migraci├│n de plantillas de almacenamiento",
"storage_template_migration_description": "Aplicar la <link>{template}</link> actual a los elementos subidos previamente",
"storage_template_migration_info": "Los cambios en las plantillas solo se aplican a los elementos nuevos. Para aplicarlos retroactivamente a los elementos subidos previamente ejecute la <link>{job}</link>.",
"storage_template_migration_info": "La plantilla de almacenamiento convertir├б todas las extensiones a min├║scula. Los cambios en las plantillas solo se aplican a los elementos nuevos. Para aplicarlos retroactivamente a los elementos subidos previamente ejecute la <link>{job}</link>.",
"storage_template_migration_job": "Migraci├│n de la plantilla de almacenamiento",
"storage_template_more_details": "Para obtener m├бs detalles sobre esta funci├│n, consulte la <template-link>Plantilla de almacenamiento</template-link> y sus <implications-link>implicaciones</implications-link>",
"storage_template_onboarding_description": "Cuando est├б habilitada, esta funci├│n organizar├б autom├бticamente los archivos seg├║n una plantilla definida por el usuario. Debido a problemas de estabilidad, la funci├│n se ha desactivado de forma predeterminada. Para obtener m├бs informaci├│n, consulte la <link>documentaci├│n</link>.",
@@ -299,7 +302,7 @@
"transcoding_max_b_frames": "Maximos B-frames",
"transcoding_max_b_frames_description": "Los valores m├бs altos mejoran la eficiencia de la compresi├│n, pero ralentizan la codificaci├│n. Puede que no sea compatible con la aceleraci├│n de hardware en dispositivos m├бs antiguos. 0 desactiva los fotogramas B, mientras que -1 establece este valor autom├бticamente.",
"transcoding_max_bitrate": "M├бxima tasa de bits",
"transcoding_max_bitrate_description": "Establecer una tasa de bits m├бxima puede hacer que los tama├▒os de archivos sean m├бs predecibles con un costo menor para la calidad. A 720p, los valores t├нpicos son 2600k para VP9 o HEVC, o 4500k para H.264. Deshabilitado si se establece en 0.",
"transcoding_max_bitrate_description": "Establecer una tasa de bits m├бxima puede hacer que los tama├▒os de archivos sean m├бs predecibles con un costo menor para la calidad. A 720p, los valores t├нpicos son 2600 kbit/s para VP9 o HEVC, o 4500 kbit/s para H.264. Deshabilitado si se establece en 0.",
"transcoding_max_keyframe_interval": "Intervalo m├бximo de fotogramas clave",
"transcoding_max_keyframe_interval_description": "Establece la distancia m├бxima de fotograma entre fotogramas clave. Los valores m├бs bajos empeoran la eficiencia de la compresi├│n, pero mejoran los tiempos de b├║squeda y pueden mejorar la calidad en escenas con movimientos r├бpidos. 0 establece este valor autom├бticamente.",
"transcoding_optimal_description": "V├нdeos con una resoluci├│n superior a la fijada o que no est├бn en un formato aceptado",
@@ -391,6 +394,7 @@
"allow_edits": "Permitir edici├│n",
"allow_public_user_to_download": "Permitir descargar al usuario p├║blico",
"allow_public_user_to_upload": "Permitir cargar al usuario publico",
"alt_text_qr_code": "C├│digo QR",
"anti_clockwise": "En sentido antihorario",
"api_key": "Clave API",
"api_key_description": "Este valor s├│lo se mostrar├б una vez. Aseg├║rese de copiarlo antes de cerrar la ventana.",
@@ -438,7 +442,7 @@
"blurred_background": "Fondo borroso",
"bugs_and_feature_requests": "Errores y solicitudes de funciones",
"build": "Compilaci├│n",
"build_image": "Construir imagen",
"build_image": "Crear imagen",
"bulk_delete_duplicates_confirmation": "┬┐Est├бs seguro de que deseas eliminar de forma masiva {count, plural, one {# elemento duplicado} other {# elementos duplicados}}? Esto mantendr├б el activo m├бs grande de cada grupo y eliminar├б permanentemente todos los dem├бs duplicados. ┬бEsta acci├│n no se puede deshacer!",
"bulk_keep_duplicates_confirmation": "┬┐Estas seguro de que desea mantener {count, plural, one {# duplicate asset} other {# duplicate assets}} archivos duplicados? Esto resolver├б todos los grupos duplicados sin borrar nada.",
"bulk_trash_duplicates_confirmation": "┬┐Estas seguro de que desea eliminar masivamente {count, plural, one {# duplicate asset} other {# duplicate assets}} archivos duplicados? Esto mantendr├б el archivo m├бs grande de cada grupo y eliminar├б todos los dem├бs duplicados.",
@@ -481,6 +485,7 @@
"comments_are_disabled": "Los comentarios est├бn deshabilitados",
"confirm": "Confirmar",
"confirm_admin_password": "Confirmar Contrase├▒a de Administrador",
"confirm_delete_face": "┬┐Est├бs seguro que deseas eliminar la cara de {name} del archivo?",
"confirm_delete_shared_link": "┬┐Est├бs seguro de que deseas eliminar este enlace compartido?",
"confirm_keep_this_delete_others": "Todos los dem├бs activos de la pila se eliminar├бn excepto este activo. ┬┐Est├б seguro de que quiere continuar?",
"confirm_password": "Confirmar contrase├▒a",
@@ -533,6 +538,7 @@
"delete_album": "Eliminar ├бlbum",
"delete_api_key_prompt": "┬┐Est├б seguro de que desea eliminar esta clave API?",
"delete_duplicates_confirmation": "┬┐Est├б seguro de que desea eliminar permanentemente estos duplicados?",
"delete_face": "Eliminar cara",
"delete_key": "Eliminar clave",
"delete_library": "Eliminar biblioteca",
"delete_link": "Eliminar enlace",
@@ -600,6 +606,7 @@
"enabled": "Habilitado",
"end_date": "Fecha final",
"error": "Error",
"error_delete_face": "Error al eliminar la cara del archivo",
"error_loading_image": "Error al cargar la imagen",
"error_title": "Error: algo sali├│ mal",
"errors": {
@@ -884,6 +891,7 @@
"month": "Mes",
"more": "Mas",
"moved_to_trash": "Movido a la papelera",
"mute_memories": "Silenciar Recuerdos",
"my_albums": "Mis albums",
"name": "Nombre",
"name_or_nickname": "Nombre o apodo",
@@ -979,6 +987,7 @@
"permanently_deleted_asset": "Archivo eliminado permanentemente",
"permanently_deleted_assets_count": "Eliminado permanentemente {count, plural, one {# elemento} other {# elementos}}",
"person": "Persona",
"person_birthdate": "Nacido el {date}",
"person_hidden": "{name}{hidden, select, true { (oculto)} other {}}",
"photo_shared_all_users": "Parece que compartiste tus fotos con todos los usuarios o no tienes ning├║n usuario con quien compartirlas.",
"photos": "Fotos",
@@ -1070,12 +1079,16 @@
"remove_from_album": "Eliminar del ├бlbum",
"remove_from_favorites": "Quitar de favoritos",
"remove_from_shared_link": "Eliminar desde enlace compartido",
"remove_memory": "Quitar memoria",
"remove_photo_from_memory": "Quitar foto de esta memoria",
"remove_url": "Eliminar URL",
"remove_user": "Eliminar usuario",
"removed_api_key": "Clave API eliminada: {name}",
"removed_from_archive": "Eliminado del archivo",
"removed_from_favorites": "Eliminado de favoritos",
"removed_from_favorites_count": "{count, plural, other {Eliminados #}} de favoritos",
"removed_memory": "Memoria eliminada",
"removed_photo_from_memory": "Se ha eliminado la foto de la memoria",
"removed_tagged_assets": "Etiqueta eliminada de {count, plural, one {# activo} other {# activos}}",
"rename": "Renombrar",
"repair": "Reparar",
@@ -1084,6 +1097,7 @@
"repository": "Repositorio",
"require_password": "Contrase├▒a requerida",
"require_user_to_change_password_on_first_login": "Requerir que el usuario cambie la contrase├▒a en el primer inicio de sesi├│n",
"rescan": "Volver a escanear",
"reset": "Reiniciar",
"reset_password": "Restablecer la contrase├▒a",
"reset_people_visibility": "Restablecer la visibilidad de las personas",
@@ -1127,6 +1141,7 @@
"search_options": "Opciones de b├║squeda",
"search_people": "Buscar personas",
"search_places": "Buscar lugar",
"search_rating": "Buscar por calificaci├│n...",
"search_settings": "Ajustes de la b├║squeda",
"search_state": "Buscar regi├│n/estado...",
"search_tags": "Buscando etiquetas...",
@@ -1136,6 +1151,7 @@
"searching_locales": "Buscando sitios...",
"second": "Segundo",
"see_all_people": "Ver todas las personas",
"select": "Selecciona",
"select_album_cover": "Seleccionar portada del ├бlbum",
"select_all": "Seleccionar todo",
"select_all_duplicates": "Seleccionar todos los duplicados",
@@ -1250,6 +1266,7 @@
"tag_created": "Etiqueta creada: {tag}",
"tag_feature_description": "Explore fotos y videos agrupados por temas de etiquetas l├│gicas",
"tag_not_found_question": "┬┐No encuentra una etiqueta? <link>Crea una nueva etiqueta.</link>",
"tag_people": "Etiquetar personas",
"tag_updated": "Etiqueta actualizada: {tag}",
"tagged_assets": "Etiquetado(s) {count, plural, one {# activo} other {# activos}}",
"tags": "Etiquetas",
@@ -1290,6 +1307,7 @@
"unlink_motion_video": "Desvincular v├нdeo en movimiento",
"unlink_oauth": "Desvincular OAuth",
"unlinked_oauth_account": "Cuenta OAuth desconectada",
"unmute_memories": "Habilitar sonido recuerdos",
"unnamed_album": "Album sin nombre",
"unnamed_album_delete_confirmation": "┬┐Seguro que quieres borrar este ├бlbum?",
"unnamed_share": "Compartido sin nombre",
@@ -1343,6 +1361,7 @@
"view_all": "Ver todas",
"view_all_users": "Mostrar todos los usuarios",
"view_in_timeline": "Mostrar en la l├нnea de tiempo",
"view_link": "Ver enlace",
"view_links": "Mostrar enlaces",
"view_name": "Ver",
"view_next_asset": "Mostrar siguiente elemento",
+32 -6
View File
@@ -41,6 +41,7 @@
"backup_settings": "Varundamise seaded",
"backup_settings_description": "Halda andmebaasi varundamise seadeid",
"check_all": "M├дrgi k├╡ik",
"cleanup": "Koristus",
"cleared_jobs": "T├╢├╢ted eemaldatud: {job}",
"config_set_by_file": "Konfiguratsioon on m├д├дratud konfifaili abil",
"confirm_delete_library": "Kas oled kindel, et soovid kustutada {library} kogu?",
@@ -96,7 +97,7 @@
"library_scanning_enable_description": "Luba kogu perioodiline skaneerimine",
"library_settings": "V├дline kogu",
"library_settings_description": "Halda v├дlise kogu seadeid",
"library_tasks_description": "Soorita kogu toiminguid",
"library_tasks_description": "Otsi v├дlistest kogudest uusi ja muutunud ├╝ksuseid",
"library_watching_enable_description": "J├дlgi v├дlises kogus failide muudatusi",
"library_watching_settings": "Kogu j├дlgimine (EKSPERIMENTAALNE)",
"library_watching_settings_description": "J├дlgi automaatselt muutunud faile",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "Otsi pilte semantiliselt CLIP-manuste abil",
"machine_learning_smart_search_enabled": "Luba nutiotsing",
"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.",
"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.",
"manage_concurrency": "Halda samaaegsust",
"manage_log_settings": "Halda logi seadeid",
"map_dark_style": "Tume stiil",
@@ -147,6 +148,8 @@
"map_settings": "Kaart",
"map_settings_description": "Halda kaardi seadeid",
"map_style_description": "Kaarditeema style.json URL",
"memory_cleanup_job": "M├дlestuste korrastamine",
"memory_generate_job": "M├дlestuste genereerimine",
"metadata_extraction_job": "Metaandmete eraldamine",
"metadata_extraction_job_description": "Eralda igast ├╝ksusest metaandmed, nagu GPS-koordinaadid, n├дod ja resolutsioon",
"metadata_faces_import_setting": "Luba n├дgude import",
@@ -240,7 +243,7 @@
"storage_template_hash_verification_enabled_description": "L├╝litab sisse r├дsi kontrolli; ├дra l├╝lita seda v├дlja, kui sa ei ole tagaj├дrgedest teadlik",
"storage_template_migration": "Talletusmalli migreerimine",
"storage_template_migration_description": "Rakenda praegune <link>{template}</link> varem ├╝leslaaditud ├╝ksustele",
"storage_template_migration_info": "Malli muudatused rakenduvad ainult uutele ├╝ksustele. Et rakendada malli tagasiulatuvalt varem ├╝leslaaditud ├╝ksustele, k├дivita <link>{job}</link>.",
"storage_template_migration_info": "Talletusmall teeb k├╡ik faililaiendid v├дiket├дhtedeks. Malli muudatused rakenduvad ainult uutele ├╝ksustele. Et rakendada malli tagasiulatuvalt varem ├╝leslaaditud ├╝ksustele, k├дivita <link>{job}</link>.",
"storage_template_migration_job": "Talletusmallide migreerimise t├╢├╢de",
"storage_template_more_details": "Et selle funktsiooni kohta rohkem teada saada, loe <template-link>talletusmallide</template-link> ja nende <implications-link>tagaj├дrgede</implications-link> kohta",
"storage_template_onboarding_description": "Kui sisse l├╝litatud, v├╡imaldab see faile kasutaja m├д├дratud malli alusel automaatselt organiseerida. Stabiilsusprobleemide t├╡ttu on see funktsioon vaikimisi v├дlja l├╝litatud. Rohkem infot leiad <link>dokumentatsioonist</link>.",
@@ -299,7 +302,7 @@
"transcoding_max_b_frames": "Maksimaalne B-kaadrite arv",
"transcoding_max_b_frames_description": "K├╡rgemad v├д├дrtused parandavad pakkimise efektiivsust, aga aeglustavad kodeerimist. See valik ei pruugi olla ├╝hilduv riistvaralise kiirendusega vanematel seadmetel. 0 l├╝litab B-kaadrid v├дlja, -1 m├д├дrab v├д├дrtuse automaatselt.",
"transcoding_max_bitrate": "Maksimaalne bitisagedus",
"transcoding_max_bitrate_description": "Maksimaalse bitisageduse m├д├дramine teeb failisuurused ennustatavamaks, v├дikese kvaliteedikao hinnaga. 720p resolutsiooni puhul on t├╝├╝pilised v├д├дrtused 2600k (VP9 ja HEVC) v├╡i 4500k (H.264). V├д├дrtus 0 eemaldab piirangu.",
"transcoding_max_bitrate_description": "Maksimaalse bitisageduse m├д├дramine teeb failisuurused ennustatavamaks, v├дikese kvaliteedikao hinnaga. 720p resolutsiooni puhul on t├╝├╝pilised v├д├дrtused 2600 kbit/s (VP9 ja HEVC) v├╡i 4500 kbit/s (H.264). V├д├дrtus 0 eemaldab piirangu.",
"transcoding_max_keyframe_interval": "Maksimaalne v├╡tmekaadri intervall",
"transcoding_max_keyframe_interval_description": "M├д├дrab maksimaalse kauguse v├╡tmekaadrite vahel. Madalamad v├д├дrtused v├дhendavad pakkimise efektiivsust, aga parandavad otsimiskiirust ning v├╡ivad t├╡sta kiire liikumisega stseenide kvaliteeti. 0 m├д├дrab v├д├дrtuse automaatselt.",
"transcoding_optimal_description": "K├╡rgema kui lubatud resolutsiooniga v├╡i mittelubatud formaadis videod",
@@ -391,6 +394,7 @@
"allow_edits": "Luba muutmine",
"allow_public_user_to_download": "Luba avalikul kasutajal alla laadida",
"allow_public_user_to_upload": "Luba avalikul kasutajal ├╝les laadida",
"alt_text_qr_code": "QR kood",
"anti_clockwise": "Vastup├дeva",
"api_key": "API v├╡ti",
"api_key_description": "Seda v├д├дrtust kuvatakse ainult ├╝ks kord. Kopeeri see enne akna sulgemist.",
@@ -431,7 +435,7 @@
"assets_were_part_of_album_count": "{count, plural, one {├Ьksus oli} other {├Ьksused olid}} juba osa albumist",
"authorized_devices": "Autoriseeritud seadmed",
"back": "Tagasi",
"back_close_deselect": "Tagasi, sulge, v├╡i t├╝hista valik",
"back_close_deselect": "Tagasi, sulge v├╡i t├╝hista valik",
"backward": "Tagasi",
"birthdate_saved": "S├╝nnikuup├дev salvestatud",
"birthdate_set_description": "S├╝nnikuup├дeva kasutatakse isiku vanuse arvutamiseks foto tegemise hetkel.",
@@ -481,6 +485,7 @@
"comments_are_disabled": "Kommentaarid on keelatud",
"confirm": "Kinnita",
"confirm_admin_password": "Kinnita administraatori parool",
"confirm_delete_face": "Kas oled kindel, et soovid isiku {name} n├дo ├╝ksuselt kustutada?",
"confirm_delete_shared_link": "Kas oled kindel, et soovid selle jagatud lingi kustutada?",
"confirm_keep_this_delete_others": "K├╡ik muud ├╝ksused selles virnas kustutatakse. Kas oled kindel, et soovid j├дtkata?",
"confirm_password": "Kinnita parool",
@@ -533,6 +538,7 @@
"delete_album": "Kustuta album",
"delete_api_key_prompt": "Kas oled kindel, et soovid selle API v├╡tme kustutada?",
"delete_duplicates_confirmation": "Kas oled kindel, et soovid need duplikaadid j├д├дdavalt kustutada?",
"delete_face": "Kustuta n├дgu",
"delete_key": "Kustuta v├╡ti",
"delete_library": "Kustuta kogu",
"delete_link": "Kustuta link",
@@ -600,6 +606,7 @@
"enabled": "Lubatud",
"end_date": "L├╡ppkuup├дev",
"error": "Viga",
"error_delete_face": "Viga n├дo kustutamisel",
"error_loading_image": "Viga pildi laadimisel",
"error_title": "Viga - midagi l├дks valesti",
"errors": {
@@ -718,6 +725,7 @@
"unable_to_submit_job": "T├╢├╢te edastamine eba├╡nnestus",
"unable_to_trash_asset": "├Ьksuse pr├╝gikasti liigutamine eba├╡nnestus",
"unable_to_unlink_account": "Konto lahti├╝hendamine eba├╡nnestus",
"unable_to_unlink_motion_video": "Liikuva video linkimise t├╝histamine eba├╡nnestus",
"unable_to_update_album_cover": "Albumi kaanepildi muutmine eba├╡nnestus",
"unable_to_update_album_info": "Albumi info muutmine eba├╡nnestus",
"unable_to_update_library": "Kogu uuendamine eba├╡nnestus",
@@ -734,6 +742,7 @@
"expired": "Aegunud",
"expires_date": "Aegub {date}",
"explore": "Avasta",
"explorer": "Brauser",
"export": "Ekspordi",
"export_as_json": "Ekspordi JSON-formaati",
"extension": "Laiend",
@@ -742,6 +751,7 @@
"face_unassigned": "Seostamata",
"failed_to_load_assets": "├Ьksuste laadimine eba├╡nnestus",
"favorite": "Lemmik",
"favorite_or_unfavorite_photo": "Lisa foto lemmikutesse v├╡i eemalda lemmikutest",
"favorites": "Lemmikud",
"feature_photo_updated": "Esilet├╡stetud foto muudetud",
"features": "Funktsioonid",
@@ -799,6 +809,7 @@
"include_shared_albums": "Kaasa jagatud albumid",
"include_shared_partner_assets": "Kaasa partneri jagatud ├╝ksused",
"individual_share": "Jagatud ├╝ksus",
"individual_shares": "Jagatud ├╝ksused",
"info": "Info",
"interval": {
"day_at_onepm": "Iga p├дev kell 13",
@@ -828,6 +839,7 @@
"library_options": "Kogu seaded",
"light": "Hele",
"like_deleted": "Meeldimine kustutatud",
"link_motion_video": "Lingi liikuv video",
"link_options": "Lingi valikud",
"link_to_oauth": "├Ьhenda OAuth",
"linked_oauth_account": "OAuth konto ├╝hendatud",
@@ -879,6 +891,7 @@
"month": "Kuu",
"more": "Rohkem",
"moved_to_trash": "Liigutatud pr├╝gikasti",
"mute_memories": "Vaigista m├дlestused",
"my_albums": "Minu albumid",
"name": "Nimi",
"name_or_nickname": "Nimi v├╡i h├╝├╝dnimi",
@@ -974,6 +987,7 @@
"permanently_deleted_asset": "├Ьksus j├д├дdavalt kustutatud",
"permanently_deleted_assets_count": "{count, plural, one {# ├╝ksus} other {# ├╝ksust}} j├д├дdavalt kustutatud",
"person": "Isik",
"person_birthdate": "S├╝ndinud {date}",
"person_hidden": "{name}{hidden, select, true { (peidetud)} other {}}",
"photo_shared_all_users": "Paistab, et oled oma fotosid k├╡igi kasutajatega jaganud, v├╡i pole ├╝htegi kasutajat, kellega jagada.",
"photos": "Fotod",
@@ -1065,12 +1079,16 @@
"remove_from_album": "Eemalda albumist",
"remove_from_favorites": "Eemalda lemmikutest",
"remove_from_shared_link": "Eemalda jagatud lingist",
"remove_memory": "Eemalda m├дlestus",
"remove_photo_from_memory": "Eemalda foto sellest m├дlestusest",
"remove_url": "Eemalda URL",
"remove_user": "Eemalda kasutaja",
"removed_api_key": "API v├╡ti eemaldatud: {name}",
"removed_from_archive": "Arhiivist eemaldatud",
"removed_from_favorites": "Lemmikutest eemaldatud",
"removed_from_favorites_count": "{count, plural, other {# eemaldatud}} lemmikutest",
"removed_memory": "M├дletus eemaldatud",
"removed_photo_from_memory": "Foto m├дlestustest eemaldatud",
"removed_tagged_assets": "Silt eemaldatud {count, plural, one {# ├╝ksuselt} other {# ├╝ksuselt}}",
"rename": "Nimeta ├╝mber",
"repair": "Parandus",
@@ -1079,6 +1097,7 @@
"repository": "Koodihoidla",
"require_password": "N├╡ua parooli",
"require_user_to_change_password_on_first_login": "N├╡ua kasutajalt esmakordsel sisenemisel parooli muutmist",
"rescan": "Skaneeri uuesti",
"reset": "L├дhtesta",
"reset_password": "L├дhtesta parool",
"reset_people_visibility": "L├дhtesta isikute n├дhtavus",
@@ -1122,6 +1141,7 @@
"search_options": "Otsingu valikud",
"search_people": "Otsi inimesi",
"search_places": "Otsi kohti",
"search_rating": "Otsi hinnangu j├дrgi...",
"search_settings": "Otsi seadeid",
"search_state": "Otsi osariiki...",
"search_tags": "Otsi silte...",
@@ -1131,6 +1151,7 @@
"searching_locales": "Lokaatide otsimine...",
"second": "Sekund",
"see_all_people": "Vaata k├╡iki isikuid",
"select": "Vali",
"select_album_cover": "Vali albumi kaanepilt",
"select_all": "Vali k├╡ik",
"select_all_duplicates": "Vali k├╡ik duplikaadid",
@@ -1225,7 +1246,7 @@
"start_date": "Alguskuup├дev",
"state": "Osariik",
"status": "Staatus",
"stop_motion_photo": "Peata liikuv pilt",
"stop_motion_photo": "Peata liikuv foto",
"stop_photo_sharing": "L├╡peta oma fotode jagamine?",
"stop_photo_sharing_description": "{partner} ei p├д├дse rohkem su fotodele ligi.",
"stop_sharing_photos_with_user": "L├╡peta oma fotode selle kasutajaga jagamine",
@@ -1245,6 +1266,7 @@
"tag_created": "Lisatud silt: {tag}",
"tag_feature_description": "Fotode ja videote lehitsemine siltide kaupa grupeeritult",
"tag_not_found_question": "Ei leia silti? <link>Lisa uus silt.</link>",
"tag_people": "Sildista inimesi",
"tag_updated": "Muudetud silt: {tag}",
"tagged_assets": "{count, plural, one {# ├╝ksus} other {# ├╝ksust}} sildistatud",
"tags": "Sildid",
@@ -1282,10 +1304,13 @@
"unknown_country": "Tundmatu riik",
"unknown_year": "Teadmata aasta",
"unlimited": "Piiramatu",
"unlink_motion_video": "T├╝hista liikuva video linkimine",
"unlink_oauth": "Eemalda OAuth ├╝hendus",
"unlinked_oauth_account": "OAuth ├╝hendus eemaldatud",
"unmute_memories": "T├╝hista m├дlestuste vaigistamine",
"unnamed_album": "Nimetu album",
"unnamed_album_delete_confirmation": "Kas oled kindel, et soovid selle albumi kustutada?",
"unnamed_share": "Nimetu jagamine",
"unsaved_change": "Salvestamata muudatus",
"unselect_all": "├Дra vali ├╝htegi",
"unselect_all_duplicates": "├Дra vali duplikaate",
@@ -1336,6 +1361,7 @@
"view_all": "Vaata k├╡iki",
"view_all_users": "Vaata k├╡iki kasutajaid",
"view_in_timeline": "Vaata ajajoonel",
"view_link": "Vaata linki",
"view_links": "Vaata linke",
"view_name": "Vaade",
"view_next_asset": "Vaata j├дrgmist ├╝ksust",
+1
View File
@@ -0,0 +1 @@
{}
+1 -1
View File
@@ -254,7 +254,7 @@
"transcoding_max_b_frames": "╪и█М╪┤╪к╪▒█М┘Ж B-frames",
"transcoding_max_b_frames_description": "┘Е┘В╪з╪п█М╪▒ ╪и╪з┘Д╪з╪к╪▒ ┌й╪з╪▒╪з█М█М ┘Б╪┤╪▒╪п┘З ╪│╪з╪▓█М ╪▒╪з ╪и┘З╪и┘И╪п ┘Е█МтАМ╪и╪о╪┤┘Ж╪п╪М ╪з┘Е╪з ┌й╪п┌п╪░╪з╪▒█М ╪▒╪з ┌й┘Ж╪п ┘Е█МтАМ┌й┘Ж┘Ж╪п. ┘Е┘Е┌й┘Ж ╪з╪│╪к ╪и╪з ╪┤╪к╪з╪и ╪п┘З█М ╪│╪о╪ктАМ╪з┘Б╪▓╪з╪▒█М ╪п╪▒ ╪п╪│╪к┌п╪з┘ЗтАМ┘З╪з█М ┘В╪п█М┘Е█М ╪│╪з╪▓┌п╪з╪▒ ┘Ж╪и╪з╪┤╪п. ┘Е┘В╪п╪з╪▒( 0 ) B-frames ╪▒╪з ╪║█М╪▒┘Б╪╣╪з┘Д ┘Е█МтАМ┌й┘Ж╪п╪М ╪п╪▒ ╪н╪з┘Д█М ┌й┘З ┘Е┘В╪п╪з╪▒ ( 1 ) ╪з█М┘Ж ┘Е┘В╪п╪з╪▒ ╪▒╪з ╪и┘З ╪╡┘И╪▒╪к ╪о┘И╪п┌й╪з╪▒ ╪к┘Ж╪╕█М┘Е ┘Е█МтАМ┌й┘Ж╪п.",
"transcoding_max_bitrate": "╪и█М╪┤╪к╪▒█М┘Ж ╪и█М╪к ╪▒█М╪к",
"transcoding_max_bitrate_description": "╪к┘Ж╪╕█М┘Е ╪н╪п╪з┌й╪л╪▒ ╪и█М╪ктАМ╪▒█М╪к ┘Е█МтАМ╪к┘И╪з┘Ж╪п ╪з┘Ж╪п╪з╪▓┘З ┘Б╪з█М┘ДтАМ┘З╪з ╪▒╪з ╪п╪▒ ╪н╪п█М ┘В╪з╪и┘Д ┘╛█М╪┤тАМ╪и█М┘Ж█МтАМ╪к╪▒ ┌й┘Ж╪п╪М ┘З╪▒┌Ж┘Ж╪п ┌й┘З ┘З╪▓█М┘Ж┘З ┌й┘Е█М ╪и╪▒╪з█М ┌й█М┘Б█М╪к ╪п╪з╪▒╪п. ╪п╪▒ ┘И╪╢┘И╪н 720p╪М ┘Е┘В╪з╪п█М╪▒ ┘Е╪╣┘Е┘И┘Д 2600k ╪и╪▒╪з█М VP9 █М╪з HEVC ┘И 4500k ╪и╪▒╪з█М H.264 ╪з╪│╪к. ╪з┌п╪▒ ╪и┘З 0 ╪к┘Ж╪╕█М┘Е ╪┤┘И╪п╪М ╪║█М╪▒┘Б╪╣╪з┘Д ┘Е█МтАМ╪┤┘И╪п.",
"transcoding_max_bitrate_description": "╪к┘Ж╪╕█М┘Е ╪н╪п╪з┌й╪л╪▒ ╪и█М╪ктАМ╪▒█М╪к ┘Е█МтАМ╪к┘И╪з┘Ж╪п ╪з┘Ж╪п╪з╪▓┘З ┘Б╪з█М┘ДтАМ┘З╪з ╪▒╪з ╪п╪▒ ╪н╪п█М ┘В╪з╪и┘Д ┘╛█М╪┤тАМ╪и█М┘Ж█МтАМ╪к╪▒ ┌й┘Ж╪п╪М ┘З╪▒┌Ж┘Ж╪п ┌й┘З ┘З╪▓█М┘Ж┘З ┌й┘Е█М ╪и╪▒╪з█М ┌й█М┘Б█М╪к ╪п╪з╪▒╪п. ╪п╪▒ ┘И╪╢┘И╪н 720p╪М ┘Е┘В╪з╪п█М╪▒ ┘Е╪╣┘Е┘И┘Д 2600 kbit/s ╪и╪▒╪з█М VP9 █М╪з HEVC ┘И 4500 kbit/s ╪и╪▒╪з█М H.264 ╪з╪│╪к. ╪з┌п╪▒ ╪и┘З 0 ╪к┘Ж╪╕█М┘Е ╪┤┘И╪п╪М ╪║█М╪▒┘Б╪╣╪з┘Д ┘Е█МтАМ╪┤┘И╪п.",
"transcoding_max_keyframe_interval": "╪н╪п╪з┌й╪л╪▒ ┘Б╪з╪╡┘Д┘З ┌й┘Д█М╪п ┘Б╪▒█М┘Е",
"transcoding_max_keyframe_interval_description": "╪н╪п╪з┌й╪л╪▒ ┘Б╪з╪╡┘Д┘З ┘Б╪▒█М┘Е ╪и█М┘Ж ┌й┘Д█М╪п┘Б╪▒█М┘ЕтАМ┘З╪з ╪▒╪з ╪к┘Ж╪╕█М┘Е ┘Е█МтАМ┌й┘Ж╪п. ┘Е┘В╪з╪п█М╪▒ ┘╛╪з█М█М┘ЖтАМ╪к╪▒ ┌й╪з╪▒╪з█М█М ┘Б╪┤╪▒╪п┘ЗтАМ╪│╪з╪▓█М ╪▒╪з ┌й╪з┘З╪┤ ┘Е█МтАМ╪п┘З┘Ж╪п╪М ╪з┘Е╪з ╪▓┘Е╪з┘Ж ╪м╪│╪к╪м┘И ╪▒╪з ╪и┘З╪и┘И╪п ┘Е█МтАМ╪и╪о╪┤┘Ж╪п ┘И ┘Е┘Е┌й┘Ж ╪з╪│╪к ┌й█М┘Б█М╪к ╪▒╪з ╪п╪▒ ╪╡╪н┘Ж┘ЗтАМ┘З╪з█М ╪и╪з ╪н╪▒┌й╪к ╪│╪▒█М╪╣ ╪и┘З╪и┘И╪п ╪п┘З┘Ж╪п. ┘Е┘В╪п╪з╪▒ 0 ╪з█М┘Ж ┘Е┘В╪п╪з╪▒ ╪▒╪з ╪и┘ЗтАМ╪╖┘И╪▒ ╪о┘И╪п┌й╪з╪▒ ╪к┘Ж╪╕█М┘Е ┘Е█МтАМ┌й┘Ж╪п.",
"transcoding_optimal_description": "┘И█М╪п█М┘И┘З╪з█М█М ┌й┘З ╪з╪▓ ╪▒╪▓┘И┘Д┘И╪┤┘Ж ┘З╪п┘Б ╪и╪з┘Д╪з╪к╪▒ ┘З╪│╪к┘Ж╪п █М╪з ╪п╪▒ ┘В╪з┘Д╪и ┘╛╪░█М╪▒┘Б╪к┘З ╪┤╪п┘З ┘Ж█М╪│╪к┘Ж╪п",
+5 -1
View File
@@ -299,7 +299,7 @@
"transcoding_max_b_frames": "B-kehysten enimm├дism├д├дr├д",
"transcoding_max_b_frames_description": "Korkeampi arvo parantaa pakkausta, mutta hidastaa enkoodausta. Ei v├дltt├дm├дtt├д ole yhteensopiva vanhempien laitteiden kanssa. 0 poistaa B-kehykset k├дyt├╢st├д, -1 m├д├дritt├д├д arvon automaattisesti.",
"transcoding_max_bitrate": "Suurin bittinopeus",
"transcoding_max_bitrate_description": "Suurimman sallitun bittinopeuden asettaminen tekee tiedostojen koosta ennustettavampaa vaikka laatu voi hieman heiket├д. 720p videossa tyypilliset arvot ovat 2600k VP9:lle ja HEVC:lle, tai 4500k H.254:lle. Jos 0, ei k├дyt├╢ss├д.",
"transcoding_max_bitrate_description": "Suurimman sallitun bittinopeuden asettaminen tekee tiedostojen koosta ennustettavampaa vaikka laatu voi hieman heiket├д. 720p videossa tyypilliset arvot ovat 2600 kbit/s VP9:lle ja HEVC:lle, tai 4500 kbit/s H.254:lle. Jos 0, ei k├дyt├╢ss├д.",
"transcoding_max_keyframe_interval": "Suurin avainkehysten v├дli",
"transcoding_max_keyframe_interval_description": "Asettaa avainkehysten v├дlin maksimiarvon. Alempi arvo huonontaa pakkauksen tehoa, mutta parantaa hakuaikoja ja voi parantaa laatua nopealiikkeisiss├д kohtauksissa. 0 asettaa arvon automaattisesti.",
"transcoding_optimal_description": "Videot, joiden resoluutio on korkeampi kuin kohteen, tai ei hyv├дksytyss├д formaatissa",
@@ -766,8 +766,10 @@
"go_to_folder": "Mene kansioon",
"go_to_search": "Siirry hakuun",
"group_albums_by": "Ryhmit├д albumi...",
"group_country": "Ryhmit├д maan mukaan",
"group_no": "Ei ryhmityst├д",
"group_owner": "Ryhmit├д omistajan mukaan",
"group_places_by": "Ryhmit├д paikat...",
"group_year": "Ryhmit├д vuoden mukaan",
"has_quota": "On kiinti├╢",
"hi_user": "Hei {name} ({email})",
@@ -800,6 +802,7 @@
"include_shared_albums": "Sis├дllyt├д jaetut albumit",
"include_shared_partner_assets": "Sis├дllyt├д jaetut kumppanikohteet",
"individual_share": "Yksitt├дinen jako",
"individual_shares": "Yksitt├дiset jaot",
"info": "Lis├дtietoja",
"interval": {
"day_at_onepm": "Joka p├дiv├д klo 13:00",
@@ -1107,6 +1110,7 @@
"search": "Haku",
"search_albums": "Etsi albumeita",
"search_by_context": "Etsi kontekstin perusteella",
"search_by_description": "Etsi kuvauksen perusteella",
"search_by_filename": "Hae tiedostonimen tai -p├д├дtteen mukaan",
"search_by_filename_example": "esim. IMG_1234.JPG tai PNG",
"search_camera_make": "Etsi kameramerkki├д...",
+23 -4
View File
@@ -41,6 +41,7 @@
"backup_settings": "Param├иtres de la sauvegarde",
"backup_settings_description": "G├йrer les param├иtres de la sauvegarde",
"check_all": "Tout cocher",
"cleanup": "Nettoyage",
"cleared_jobs": "T├вches supprim├йes pour┬а: {job}",
"config_set_by_file": "La configuration est actuellement d├йfinie par un fichier de configuration",
"confirm_delete_library": "├Кtes-vous s├╗r de vouloir supprimer la biblioth├иque {library}тАп?",
@@ -96,7 +97,7 @@
"library_scanning_enable_description": "Activer l'analyse p├йriodique de la biblioth├иque",
"library_settings": "Biblioth├иque externe",
"library_settings_description": "Gestion des param├иtres des biblioth├иques externes",
"library_tasks_description": "Ex├йcution d'actions sur la biblioth├иque",
"library_tasks_description": "Scanner les biblioth├иques externes pour les nouveaux et/ou les ├йl├йments modifi├йs",
"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_description": "Surveiller automatiquement les fichiers modifi├йs",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "Rechercher des images de mani├иre s├йmantique en utilisant les int├йgrations CLIP",
"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_url_description": "LтАЩURL du serveur d'apprentissage automatique. Si plusieurs URL sont fournies, chaque serveur sera essay├й un par un jusquтАЩ├а ce que lтАЩun dтАЩeux r├йponde avec succ├иs, dans lтАЩordre de la premi├иre ├а la derni├иre.",
"machine_learning_url_description": "LтАЩURL du serveur d'apprentissage automatique. Si plusieurs URL sont fournies, chaque serveur sera essay├й un par un jusquтАЩ├а ce que lтАЩun dтАЩeux r├йponde avec succ├иs, dans lтАЩordre 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.",
"manage_concurrency": "G├йrer du multit├вche",
"manage_log_settings": "G├йrer les param├иtres de journalisation",
"map_dark_style": "Th├иme sombre",
@@ -147,6 +148,8 @@
"map_settings": "Carte",
"map_settings_description": "G├йrer les param├иtres de la carte",
"map_style_description": "URL vers un th├иme de carte au format style.json",
"memory_cleanup_job": "Nettoyage des souvenirs",
"memory_generate_job": "G├йn├йration des souvenirs",
"metadata_extraction_job": "Extraction des m├йtadonn├йes",
"metadata_extraction_job_description": "Extraction des informations des m├йtadonn├йes de chaque m├йdia, telles que la position GPS, les visages et la r├йsolution",
"metadata_faces_import_setting": "Active l'importation des visages",
@@ -240,7 +243,7 @@
"storage_template_hash_verification_enabled_description": "Active la v├йrification du hachage, ne d├йsactivez pas cette option ├а moins d'├кtre s├╗r de ce que vous faites",
"storage_template_migration": "Migration du mod├иle de stockage",
"storage_template_migration_description": "Appliquer le mod├иle courant <link>{template}</link> aux m├йdias pr├йc├йdemment envoy├йs",
"storage_template_migration_info": "Les changements de mod├иle ne s'appliqueront qu'aux nouveaux m├йdias. Pour appliquer r├йtroactivement le mod├иle aux m├йdias pr├йc├йdemment envoy├йs, ex├йcutez la t├вche <link>{job}</link>.",
"storage_template_migration_info": "L'enregistrement des mod├иles convertit toutes les extensions en minuscule. Les changements de mod├иle ne s'appliqueront qu'aux nouveaux m├йdias. Pour appliquer r├йtroactivement le mod├иle aux m├йdias pr├йc├йdemment envoy├йs, ex├йcutez la t├вche <link>{job}</link>.",
"storage_template_migration_job": "T├вche de migration du mod├иle de stockage",
"storage_template_more_details": "Pour plus de d├йtails sur cette fonctionnalit├й, reportez-vous au <template-link>Mod├иle de stockage</template-link> et ├а ses <implications-link>implications</implications-link>",
"storage_template_onboarding_description": "Lorsqu'elle est activ├йe, cette fonctionnalit├й r├йorganise les fichiers bas├йs sur un mod├иle d├йfini par l'utilisateur. En raison de probl├иmes de stabilit├й, la fonction a ├йt├й d├йsactiv├йe par d├йfaut. Pour plus d'informations, veuillez consulter la <link>documentation</link>.",
@@ -299,7 +302,7 @@
"transcoding_max_b_frames": "Nombre maximum de trames B",
"transcoding_max_b_frames_description": "Des valeurs plus ├йlev├йes am├йliorent l'efficacit├й de la compression, mais ralentissent l'encodage. Elles peuvent ne pas ├кtre compatibles avec l'acc├йl├йration mat├йrielle sur les anciens appareils. Une valeur de 0 d├йsactive les trames B, tandis qu'une valeur de -1 d├йfinit automatiquement ce param├иtre.",
"transcoding_max_bitrate": "D├йbit binaire maximal",
"transcoding_max_bitrate_description": "D├йfinir un d├йbit binaire maximal peut r├йsulter en des fichiers de taille plus pr├йdictible, au prix d'une l├йg├иre perte en qualit├й. En 720p, les valeurs sont 2600k pour du VP9 ou du HEVC ou 4500k pour du H.264. D├йsactiv├й si le d├йbit binaire est ├а 0.",
"transcoding_max_bitrate_description": "D├йfinir un d├йbit binaire maximal peut r├йsulter en des fichiers de taille plus pr├йdictible, au prix d'une l├йg├иre perte en qualit├й. En 720p, les valeurs sont 2600 kbit/s pour du VP9 ou du HEVC ou 4500 kbit/s pour du H.264. D├йsactiv├й si le d├йbit binaire est ├а 0.",
"transcoding_max_keyframe_interval": "Intervalle maximal entre les images cl├йs",
"transcoding_max_keyframe_interval_description": "D├йfinit la distance maximale de trames entre les images cl├йs. Les valeurs plus basses diminuent l'efficacit├й de la compression, mais am├йliorent les temps de recherche et peuvent am├йliorer la qualit├й dans les sc├иnes avec des mouvements rapides. Une valeur de 0 d├йfinit automatiquement ce param├иtre.",
"transcoding_optimal_description": "Les vid├йos dont la r├йsolution est sup├йrieure ├а celle attendue ou celles qui ne sont pas dans un format accept├й",
@@ -391,6 +394,7 @@
"allow_edits": "Autoriser les modifications",
"allow_public_user_to_download": "Permettre aux utilisateurs non connect├йs de t├йl├йcharger",
"allow_public_user_to_upload": "Permettre l'envoi aux utilisateurs non connect├йs",
"alt_text_qr_code": "Image du code QR",
"anti_clockwise": "Sens anti-horaire",
"api_key": "Cl├й API",
"api_key_description": "Cette valeur ne sera affich├йe qu'une seule fois. Assurez-vous de la copier avant de fermer la fen├кtre.",
@@ -481,6 +485,7 @@
"comments_are_disabled": "Les commentaires sont d├йsactiv├йs",
"confirm": "Confirmer",
"confirm_admin_password": "Confirmer le mot de passe Admin",
"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_keep_this_delete_others": "Tous les autres m├йdias dans la pile seront supprim├йs sauf celui-ci. ├Кtes-vous s├╗r de vouloir continuerтАп?",
"confirm_password": "Confirmer le mot de passe",
@@ -533,6 +538,7 @@
"delete_album": "Supprimer l'album",
"delete_api_key_prompt": "Voulez-vous vraiment supprimer cette cl├й APIтАп?",
"delete_duplicates_confirmation": "├Кtes-vous certain de vouloir supprimer d├йfinitivement ces doublonsтАп?",
"delete_face": "Supprimer le visage",
"delete_key": "Supprimer la cl├й",
"delete_library": "Supprimer la biblioth├иque",
"delete_link": "Supprimer le lien",
@@ -600,6 +606,7 @@
"enabled": "Activ├й",
"end_date": "Date de fin",
"error": "Erreur",
"error_delete_face": "Erreur lors de la suppression du visage pour le m├йdia",
"error_loading_image": "Erreur de chargement de l'image",
"error_title": "Erreur - Quelque chose s'est mal pass├й",
"errors": {
@@ -884,6 +891,7 @@
"month": "Mois",
"more": "Plus",
"moved_to_trash": "D├йplac├й dans la corbeille",
"mute_memories": "Mettre en sourdine les souvenirs",
"my_albums": "Mes albums",
"name": "Nom",
"name_or_nickname": "Nom ou surnom",
@@ -979,6 +987,7 @@
"permanently_deleted_asset": "M├йdia supprim├й d├йfinitivement",
"permanently_deleted_assets_count": "{count, plural, one {# m├йdia d├йfinitivement supprim├й} other {# m├йdias d├йfinitivement supprim├йs}}",
"person": "Personne",
"person_birthdate": "N├й(e) le {date}",
"person_hidden": "{name}{hidden, select, true { (cach├й)} other {}}",
"photo_shared_all_users": "Il semble que vous ayez partag├й vos photos avec tous les utilisateurs ou que vous n'ayez aucun utilisateur avec qui les partager.",
"photos": "Photos",
@@ -1070,12 +1079,16 @@
"remove_from_album": "Supprimer de l'album",
"remove_from_favorites": "Supprimer des favoris",
"remove_from_shared_link": "Supprimer des liens partag├йs",
"remove_memory": "Supprimer le souvenir",
"remove_photo_from_memory": "Supprimer la photo de ce souvenir",
"remove_url": "Supprimer l'URL",
"remove_user": "Supprimer l'utilisateur",
"removed_api_key": "Cl├й API supprim├йeтАп: {name}",
"removed_from_archive": "Supprim├й de l'archive",
"removed_from_favorites": "Supprim├й des favoris",
"removed_from_favorites_count": "{count, plural, one {# supprim├й} other {# supprim├йs}} des favoris",
"removed_memory": "Souvenir supprim├й",
"removed_photo_from_memory": "Photo supprim├йe du souvenir",
"removed_tagged_assets": "Tag supprim├й de {count, plural, one {# m├йdia} other {# m├йdias}}",
"rename": "Renommer",
"repair": "R├йparer",
@@ -1084,6 +1097,7 @@
"repository": "D├йp├┤t",
"require_password": "Demander le mot de passe",
"require_user_to_change_password_on_first_login": "Demander ├а l'utilisateur de changer son mot de passe lors de sa premi├иre connexion",
"rescan": "Rescanner",
"reset": "R├йinitialiser",
"reset_password": "R├йinitialiser le mot de passe",
"reset_people_visibility": "R├йinitialiser la visibilit├й des personnes",
@@ -1127,6 +1141,7 @@
"search_options": "Rechercher une option",
"search_people": "Rechercher une personne",
"search_places": "Rechercher un lieu",
"search_rating": "Chercher par ├йvaluation...",
"search_settings": "Param├иtres de recherche",
"search_state": "Rechercher par ├йtat/r├йgion...",
"search_tags": "Recherche d'├йtiquettes...",
@@ -1136,6 +1151,7 @@
"searching_locales": "Recherche des param├иtres r├йgionaux...",
"second": "Seconde",
"see_all_people": "Voir toutes les personnes",
"select": "S├йlectionner",
"select_album_cover": "S├йlectionner la couverture d'album",
"select_all": "Tout s├йlectionner",
"select_all_duplicates": "S├йlectionner tous les doublons",
@@ -1250,6 +1266,7 @@
"tag_created": "├Йtiquette cr├й├йeтАп: {tag}",
"tag_feature_description": "Parcourir les photos et vid├йos group├йes par th├иmes logiques",
"tag_not_found_question": "Vous ne trouvez pas une ├йtiquetteтАп? <link>Cr├йer une nouvelle ├йtiquette.</link>",
"tag_people": "├Йtiqueter les personnes",
"tag_updated": "├Йtiquette mise ├а jourтАп: {tag}",
"tagged_assets": "├Йtiquette ajout├йe ├а {count, plural, one {# m├йdia} other {# m├йdias}}",
"tags": "├Йtiquettes",
@@ -1290,6 +1307,7 @@
"unlink_motion_video": "D├йtacher la photo anim├йe",
"unlink_oauth": "D├йconnecter OAuth",
"unlinked_oauth_account": "Compte OAuth non connect├й",
"unmute_memories": "R├йactiver les souvenirs",
"unnamed_album": "Album sans nom",
"unnamed_album_delete_confirmation": "├Кtes-vous s├╗r de vouloir supprimer cet albumтАп?",
"unnamed_share": "Partage sans nom",
@@ -1343,6 +1361,7 @@
"view_all": "Voir tout",
"view_all_users": "Voir tous les utilisateurs",
"view_in_timeline": "Voir dans la vue chronologique",
"view_link": "Voir le lien",
"view_links": "Voir les liens",
"view_name": "Vue",
"view_next_asset": "Voir le m├йdia suivant",
+1
View File
@@ -0,0 +1 @@
{}
+24 -5
View File
@@ -41,6 +41,7 @@
"backup_settings": "╫Ф╫Т╫У╫и╫Х╫к ╫Т╫Щ╫С╫Х╫Щ",
"backup_settings_description": "╫а╫Щ╫Ф╫Х╫Ь ╫Ф╫Т╫У╫и╫Х╫к ╫Т╫Щ╫С╫Х╫Щ ╫Ю╫б╫У ╫а╫к╫Х╫а╫Щ╫Э",
"check_all": "╫б╫Щ╫Ю╫Х╫Я ╫Ф╫Ы╫Ь",
"cleanup": "╫а╫Щ╫з╫Х╫Щ",
"cleared_jobs": "╫а╫Х╫з╫Х ╫Ю╫й╫Щ╫Ю╫Х╫к ╫в╫С╫Х╫и: {job}",
"config_set_by_file": "╫Ф╫к╫ж╫Х╫и╫Ф ╫Ю╫Х╫Т╫У╫и╫к ╫Ы╫в╫к ╫в╫Ь ╫Щ╫У╫Щ ╫з╫Х╫С╫е ╫к╫ж╫Х╫и╫Ф",
"confirm_delete_library": "╫Ф╫Р╫Э ╫Р╫к/╫Ф ╫С╫Ш╫Х╫Ч/╫Ф ╫й╫С╫и╫ж╫Х╫а╫Ъ ╫Ь╫Ю╫Ч╫Х╫з ╫Р╫к ╫Ф╫б╫д╫и╫Щ╫Щ╫Ф {library}?",
@@ -96,7 +97,7 @@
"library_scanning_enable_description": "╫Р╫д╫й╫и ╫б╫и╫Щ╫з╫к ╫б╫д╫и╫Щ╫Щ╫Ф ╫к╫з╫Х╫д╫к╫Щ╫к",
"library_settings": "╫б╫д╫и╫Щ╫Щ╫Ф ╫Ч╫Щ╫ж╫Х╫а╫Щ╫к",
"library_settings_description": "╫а╫Щ╫Ф╫Х╫Ь ╫Ф╫Т╫У╫и╫Х╫к ╫б╫д╫и╫Щ╫Щ╫Ф ╫Ч╫Щ╫ж╫Х╫а╫Щ╫к",
"library_tasks_description": "╫С╫Щ╫ж╫Х╫в ╫Ю╫й╫Щ╫Ю╫Х╫к ╫б╫д╫и╫Щ╫Щ╫Ф",
"library_tasks_description": "╫б╫и╫Х╫з ╫б╫д╫и╫Щ╫Х╫к ╫Ч╫Щ╫ж╫Х╫а╫Щ╫Х╫к ╫в╫С╫Х╫и ╫а╫Ы╫б╫Щ╫Э ╫Ч╫У╫й╫Щ╫Э ╫Х/╫Р╫Х ╫й╫Ф╫й╫к╫а╫Х",
"library_watching_enable_description": "╫в╫з╫Х╫С ╫Р╫Ч╫и ╫й╫Щ╫а╫Х╫Щ╫Щ ╫з╫С╫ж╫Щ╫Э ╫С╫б╫д╫и╫Щ╫Х╫к ╫Ч╫Щ╫ж╫Х╫а╫Щ╫Х╫к",
"library_watching_settings": "╫ж╫д╫Щ╫Щ╫к ╫б╫д╫и╫Щ╫Щ╫Ф (╫а╫Щ╫б╫Щ╫Х╫а╫Щ)",
"library_watching_settings_description": "╫в╫з╫Х╫С ╫Р╫Х╫Ш╫Х╫Ю╫Ш╫Щ╫к ╫Р╫Ч╫и ╫й╫Щ╫а╫Х╫Щ╫Щ ╫з╫С╫ж╫Щ╫Э",
@@ -131,7 +132,7 @@
"machine_learning_smart_search_description": "╫Ч╫Щ╫д╫Х╫й ╫к╫Ю╫Х╫а╫Х╫к ╫С╫Р╫Х╫д╫Я ╫б╫Ю╫а╫Ш╫Щ ╫С╫Р╫Ю╫ж╫в╫Х╫к ╫Ф╫Ш╫Ю╫в╫Х╫к ╫й╫Ь CLIP",
"machine_learning_smart_search_enabled": "╫Р╫д╫й╫и ╫Ч╫Щ╫д╫Х╫й ╫Ч╫Ы╫Э",
"machine_learning_smart_search_enabled_description": "╫Р╫Э ╫Ю╫Х╫й╫С╫к, ╫к╫Ю╫Х╫а╫Х╫к ╫Ь╫Р ╫Щ╫з╫Х╫У╫У╫Х ╫Ь╫Ч╫Щ╫д╫Х╫й ╫Ч╫Ы╫Э.",
"machine_learning_url_description": "╫Ы╫к╫Х╫С╫к ╫Ф╫Р╫к╫и ╫й╫Ь ╫й╫и╫к ╫Ь╫Ю╫Щ╫У╫к ╫Ф╫Ю╫Ы╫Х╫а╫Ф. ╫Р╫Э ╫а╫Щ╫к╫а╫к ╫Щ╫Х╫к╫и ╫Ю╫Ы╫к╫Х╫С╫к ╫Р╫Ч╫к, ╫Ы╫Ь ╫й╫и╫к ╫Щ╫а╫б╫Ф ╫С╫к╫Х╫и╫Х ╫в╫У ╫Р╫й╫и ╫Щ╫в╫а╫Ф ╫С╫Ч╫Щ╫Х╫С, ╫С╫б╫У╫и ╫Ф╫к╫Ч╫Ь╫к╫Щ.",
"machine_learning_url_description": "╫Ы╫к╫Х╫С╫к ╫Ф-URL ╫й╫Ь ╫й╫и╫к ╫Ь╫Ю╫Щ╫У╫к ╫Ф╫Ю╫Ы╫Х╫а╫Ф. ╫Р╫Э ╫а╫Щ╫к╫а╫к ╫Щ╫Х╫к╫и ╫Ю╫Ы╫к╫Х╫С╫к URL ╫Р╫Ч╫к, ╫Ы╫Ь ╫й╫и╫к ╫Щ╫а╫Х╫б╫Ф ╫а╫Щ╫б╫Щ╫Х╫Я ╫Р╫Ч╫У ╫С╫Ы╫Ь ╫д╫в╫Э ╫в╫У ╫й╫Р╫Ч╫У ╫Ю╫Ф╫Э ╫Щ╫Т╫Щ╫С ╫С╫Ф╫ж╫Ь╫Ч╫Ф, ╫Ь╫д╫Щ ╫Ф╫б╫У╫и ╫Ю╫Ф╫и╫Р╫й╫Х╫Я ╫в╫У ╫Ф╫Р╫Ч╫и╫Х╫Я. ╫й╫и╫к╫Щ╫Э ╫й╫Ь╫Р ╫Ю╫Т╫Щ╫С╫Щ╫Э ╫Щ╫Х╫Ц╫а╫Ч╫Х ╫Ц╫Ю╫а╫Щ╫к ╫в╫У ╫й╫Щ╫Ч╫Ц╫и╫Х ╫Ь╫Ф╫Щ╫Х╫к ╫Ю╫з╫Х╫Х╫а╫Щ╫Э.",
"manage_concurrency": "╫а╫Щ╫Ф╫Х╫Ь ╫С╫Х-╫Ц╫Ю╫а╫Щ╫Х╫к",
"manage_log_settings": "╫а╫Щ╫Ф╫Х╫Ь ╫Ф╫Т╫У╫и╫Х╫к ╫и╫Щ╫й╫Х╫Э ╫С╫Щ╫Х╫Ю╫Я",
"map_dark_style": "╫в╫Щ╫ж╫Х╫С ╫Ы╫Ф╫Ф",
@@ -147,6 +148,8 @@
"map_settings": "╫Ю╫д╫Ф",
"map_settings_description": "╫а╫Щ╫Ф╫Х╫Ь ╫Ф╫Т╫У╫и╫Х╫к ╫Ю╫д╫Ф",
"map_style_description": "╫Ы╫к╫Х╫С╫к ╫Р╫к╫и ╫Ь╫в╫и╫Ы╫к ╫а╫Х╫й╫Р ╫й╫Ь ╫Ю╫д╫Ф style.json",
"memory_cleanup_job": "╫а╫Щ╫з╫Х╫Щ ╫Ц╫Щ╫Ы╫и╫Х╫Я",
"memory_generate_job": "╫Щ╫ж╫Щ╫и╫к ╫Ц╫Щ╫Ы╫и╫Х╫Я",
"metadata_extraction_job": "╫Ч╫Ь╫е ╫Ю╫Ш╫Р-╫а╫к╫Х╫а╫Щ╫Э",
"metadata_extraction_job_description": "╫Ч╫Ь╫е ╫Ю╫Щ╫У╫в ╫Ю╫Ш╫Р-╫а╫к╫Х╫а╫Щ╫Э ╫Ю╫Ы╫Ь ╫а╫Ы╫б, ╫Ы╫Т╫Х╫Я GPS, ╫д╫а╫Щ╫Э ╫Х╫и╫Ц╫Х╫Ь╫Х╫ж╫Щ╫Ф",
"metadata_faces_import_setting": "╫Р╫д╫й╫и ╫Щ╫С╫Х╫Р ╫д╫а╫Щ╫Э",
@@ -240,7 +243,7 @@
"storage_template_hash_verification_enabled_description": "╫Ю╫Р╫д╫й╫и ╫Р╫Щ╫Ю╫Х╫к ╫Т╫Щ╫С╫Х╫С, ╫Р╫Ь ╫к╫й╫С╫Щ╫к/╫Щ ╫Ц╫Р╫к ╫Р╫Ь╫Р ╫Р╫Э ╫Ы╫Я ╫Р╫к/╫Ф ╫С╫Ш╫Х╫Ч/╫Ф ╫С╫Ф╫й╫Ь╫Ы╫Х╫к",
"storage_template_migration": "╫Ф╫в╫С╫и╫к ╫к╫С╫а╫Щ╫к ╫Р╫Ч╫б╫Х╫Я",
"storage_template_migration_description": "╫Ф╫Ч╫Ь ╫Р╫к ╫Ф<link>{template}</link> ╫Ф╫а╫Х╫Ы╫Ч╫Щ╫к ╫в╫Ь ╫а╫Ы╫б╫Щ╫Э ╫й╫Ф╫Х╫в╫Ь╫Х ╫С╫в╫С╫и",
"storage_template_migration_info": "╫й╫Щ╫а╫Х╫Щ╫Щ╫Э ╫С╫к╫С╫а╫Щ╫к ╫Щ╫Ч╫Х╫Ь╫Х ╫и╫з ╫в╫Ь ╫а╫Ы╫б╫Щ╫Э ╫Ч╫У╫й╫Щ╫Э. ╫Ы╫У╫Щ ╫Ь╫Ф╫Ч╫Щ╫Ь ╫С╫Р╫Х╫д╫Я ╫и╫Ш╫и╫Х╫Р╫з╫Ш╫Щ╫С╫Щ ╫Р╫к ╫Ф╫к╫С╫а╫Щ╫к ╫в╫Ь ╫а╫Ы╫б╫Щ╫Э ╫й╫Ф╫Х╫в╫Ь╫Х ╫С╫в╫С╫и, ╫Ф╫д╫в╫Ь ╫Р╫к <link>{job}</link>.",
"storage_template_migration_info": "╫к╫С╫а╫Щ╫к ╫Ф╫Р╫Ч╫б╫Х╫Я ╫к╫Ю╫Щ╫и ╫Р╫к ╫Ы╫Ь ╫Ф╫Ф╫и╫Ч╫С╫Х╫к ╫Ь╫Р╫Х╫к╫Щ╫Х╫к ╫з╫Ш╫а╫Х╫к. ╫й╫Щ╫а╫Х╫Щ╫Щ╫Э ╫С╫к╫С╫а╫Щ╫к ╫Щ╫Ч╫Х╫Ь╫Х ╫и╫з ╫в╫Ь ╫а╫Ы╫б╫Щ╫Э ╫Ч╫У╫й╫Щ╫Э. ╫Ы╫У╫Щ ╫Ь╫Ф╫Ч╫Щ╫Ь ╫С╫Р╫Х╫д╫Я ╫и╫Ш╫и╫Х╫Р╫з╫Ш╫Щ╫С╫Щ ╫Р╫к ╫Ф╫к╫С╫а╫Щ╫к ╫в╫Ь ╫а╫Ы╫б╫Щ╫Э ╫й╫Ф╫Х╫в╫Ь╫Х ╫С╫в╫С╫и, ╫Ф╫д╫в╫Ь ╫Р╫к <link>{job}</link>.",
"storage_template_migration_job": "╫Ю╫й╫Щ╫Ю╫к ╫Ф╫в╫С╫и╫к ╫к╫С╫а╫Щ╫к ╫Р╫Ч╫б╫Х╫Я",
"storage_template_more_details": "╫Ь╫д╫и╫Ш╫Щ╫Э ╫а╫Х╫б╫д╫Щ╫Э ╫Р╫Х╫У╫Х╫к ╫к╫Ы╫Х╫а╫Ф ╫Ц╫Х, ╫в╫Щ╫Щ╫Я ╫С<template-link>╫к╫С╫а╫Щ╫к ╫Ф╫Р╫Ч╫б╫Х╫Я</template-link> ╫Х╫С<implications-link>╫Ф╫й╫Ь╫Ы╫Х╫к╫Щ╫Ф</implications-link>",
"storage_template_onboarding_description": "╫Ы╫Р╫й╫и ╫Ю╫Х╫д╫в╫Ь╫к, ╫к╫Ы╫Х╫а╫Ф ╫Ц╫Х ╫к╫Р╫и╫Т╫Я ╫Р╫Х╫Ш╫Х╫Ю╫Ш╫Щ╫к ╫з╫С╫ж╫Щ╫Э ╫С╫Ф╫к╫С╫б╫б ╫в╫Ь ╫к╫С╫а╫Щ╫к ╫й╫Ф╫Ю╫й╫к╫Ю╫й ╫Ф╫Т╫У╫Щ╫и. ╫в╫з╫С ╫С╫в╫Щ╫Х╫к ╫Щ╫ж╫Щ╫С╫Х╫к ╫Ф╫к╫Ы╫Х╫а╫Ф ╫Ы╫С╫Х╫Щ╫Ф ╫Ы╫С╫и╫Щ╫и╫к ╫Ю╫Ч╫У╫Ь. ╫Ь╫Ю╫Щ╫У╫в ╫а╫Х╫б╫г, ╫а╫Р ╫Ь╫и╫Р╫Х╫к ╫Р╫к ╫Ф<link>╫к╫Щ╫в╫Х╫У</link>.",
@@ -299,7 +302,7 @@
"transcoding_max_b_frames": "B-╫д╫и╫Щ╫Щ╫Ю╫Щ╫Э ╫Ю╫и╫С╫Щ╫Щ╫Э",
"transcoding_max_b_frames_description": "╫в╫и╫Ы╫Щ╫Э ╫Т╫С╫Х╫Ф╫Щ╫Э ╫Щ╫Х╫к╫и ╫Ю╫й╫д╫и╫Щ╫Э ╫Р╫к ╫Щ╫в╫Щ╫Ь╫Х╫к ╫Ф╫У╫Ч╫Щ╫б╫Ф, ╫Р╫Ъ ╫Ю╫Р╫Ш╫Щ╫Э ╫Р╫к ╫Ф╫з╫Щ╫У╫Х╫У. ╫Щ╫Щ╫к╫Ы╫Я ╫й╫Ь╫Р ╫Щ╫Ф╫Щ╫Ф ╫к╫Х╫Р╫Э ╫в╫Э ╫Ф╫Р╫ж╫к ╫Ч╫Х╫Ю╫и╫Ф ╫С╫Ю╫Ы╫й╫Щ╫и╫Щ╫Э ╫Щ╫й╫а╫Щ╫Э ╫Щ╫Х╫к╫и. 0 ╫Ю╫й╫С╫Щ╫к ╫Р╫к B-╫д╫и╫Щ╫Щ╫Ю╫Щ╫Э, ╫С╫в╫Х╫У ╫й1- ╫Ю╫Т╫У╫Щ╫и ╫Р╫к ╫Ф╫в╫и╫Ъ ╫Ц╫Ф ╫С╫Р╫Х╫д╫Я ╫Р╫Х╫Ш╫Х╫Ю╫Ш╫Щ.",
"transcoding_max_bitrate": "╫з╫ж╫С ╫б╫Щ╫С╫Щ╫Х╫к ╫Ю╫и╫С╫Щ",
"transcoding_max_bitrate_description": "╫з╫С╫Щ╫в╫к ╫з╫ж╫С ╫б╫Щ╫С╫Щ╫Х╫к ╫Ю╫и╫С╫Щ ╫Щ╫Ы╫Х╫Ь╫Ф ╫Ь╫Ф╫д╫Х╫Ъ ╫Р╫к ╫Т╫У╫Ь╫Щ ╫Ф╫з╫С╫ж╫Щ╫Э ╫Ь╫ж╫д╫Х╫Щ╫Щ╫Э ╫Щ╫Х╫к╫и ╫С╫в╫Ь╫Х╫к ╫з╫Ь╫Ф ╫Ь╫Р╫Щ╫Ы╫Х╫к. ╫С-720p, ╫в╫и╫Ы╫Щ╫Э ╫Ш╫Щ╫д╫Х╫б╫Щ╫Щ╫Э ╫Ф╫Э 2600k ╫в╫С╫Х╫и VP9 ╫Р╫Х HEVC, ╫Р╫Х 4500k ╫в╫С╫Х╫и H.264. ╫Ю╫Х╫й╫С╫к ╫Р╫Э ╫Ю╫Х╫Т╫У╫и ╫Ь-0.",
"transcoding_max_bitrate_description": "╫з╫С╫Щ╫в╫к ╫з╫ж╫С ╫б╫Щ╫С╫Щ╫Х╫к ╫Ю╫и╫С╫Щ ╫Щ╫Ы╫Х╫Ь╫Ф ╫Ь╫Ф╫д╫Х╫Ъ ╫Р╫к ╫Т╫У╫Ь╫Щ ╫Ф╫з╫С╫ж╫Щ╫Э ╫Ь╫ж╫д╫Х╫Щ╫Щ╫Э ╫Щ╫Х╫к╫и ╫С╫в╫Ь╫Х╫к ╫з╫Ь╫Ф ╫Ь╫Р╫Щ╫Ы╫Х╫к. ╫С-720p, ╫в╫и╫Ы╫Щ╫Э ╫Ш╫Щ╫д╫Х╫б╫Щ╫Щ╫Э ╫Ф╫Э 2600 kbit/s ╫в╫С╫Х╫и VP9 ╫Р╫Х HEVC, ╫Р╫Х 4500 kbit/s ╫в╫С╫Х╫и H.264. ╫Ю╫Х╫й╫С╫к ╫Р╫Э ╫Ю╫Х╫Т╫У╫и ╫Ь-0.",
"transcoding_max_keyframe_interval": "╫Ю╫и╫Х╫Х╫Ч ╫к╫Ю╫Х╫а╫к ╫Ю╫д╫к╫Ч ╫Ю╫и╫С╫Щ",
"transcoding_max_keyframe_interval_description": "╫Ю╫Т╫У╫Щ╫и ╫Р╫к ╫Ю╫и╫Ч╫з ╫Ф╫д╫и╫Щ╫Щ╫Ю╫Щ╫Э ╫Ф╫Ю╫и╫С╫Щ ╫С╫Щ╫Я ╫к╫Ю╫Х╫а╫Х╫к ╫Ю╫д╫к╫Ч. ╫в╫и╫Ы╫Щ╫Э ╫а╫Ю╫Х╫Ы╫Щ╫Э ╫Т╫Х╫и╫в╫Щ╫Э ╫Р╫к ╫Щ╫в╫Щ╫Ь╫Х╫к ╫Ф╫У╫Ч╫Щ╫б╫Ф, ╫Р╫Ъ ╫Ю╫й╫д╫и╫Щ╫Э ╫Р╫к ╫Ц╫Ю╫а╫Щ ╫Ф╫Ч╫Щ╫д╫Х╫й ╫Х╫в╫й╫Х╫Щ╫Щ╫Э ╫Ь╫й╫д╫и ╫Р╫к ╫Ф╫Р╫Щ╫Ы╫Х╫к ╫С╫б╫ж╫а╫Х╫к ╫в╫Э ╫к╫а╫Х╫в╫Ф ╫Ю╫Ф╫Щ╫и╫Ф. 0 ╫Ю╫Т╫У╫Щ╫и ╫в╫и╫Ъ ╫Ц╫Ф ╫С╫Р╫Х╫д╫Я ╫Р╫Х╫Ш╫Х╫Ю╫Ш╫Щ.",
"transcoding_optimal_description": "╫б╫и╫Ш╫Х╫а╫Щ╫Э ╫Т╫С╫Х╫Ф╫Щ╫Э ╫Ю╫и╫Ц╫Х╫Ь╫Х╫ж╫Щ╫Щ╫к ╫Ф╫Щ╫в╫У ╫Р╫Х ╫Ь╫Р ╫С╫д╫Х╫и╫Ю╫Ш ╫Ю╫з╫Х╫С╫Ь",
@@ -391,6 +394,7 @@
"allow_edits": "╫Р╫д╫й╫и ╫в╫и╫Щ╫Ы╫Х╫к",
"allow_public_user_to_download": "╫Р╫д╫й╫и ╫Ь╫Ю╫й╫к╫Ю╫й ╫ж╫Щ╫С╫Х╫и╫Щ ╫Ь╫Ф╫Х╫и╫Щ╫У",
"allow_public_user_to_upload": "╫Р╫д╫й╫и ╫Ь╫Ю╫й╫к╫Ю╫й ╫ж╫Щ╫С╫Х╫и╫Щ ╫Ь╫Ф╫в╫Ь╫Х╫к",
"alt_text_qr_code": "╫к╫Ю╫Х╫а╫к ╫з╫Х╫У QR",
"anti_clockwise": "╫а╫Т╫У ╫Ы╫Щ╫Х╫Х╫Я ╫Ф╫й╫в╫Х╫Я",
"api_key": "╫Ю╫д╫к╫Ч API",
"api_key_description": "╫Ф╫в╫и╫Ъ ╫Ф╫Ц╫Ф ╫Щ╫Х╫ж╫Т ╫и╫з ╫д╫в╫Э ╫Р╫Ч╫к. ╫а╫Р ╫Ь╫Х╫Х╫У╫Р ╫й╫Ф╫в╫к╫з╫к ╫Р╫Х╫к╫Х ╫Ь╫д╫а╫Щ ╫б╫Т╫Щ╫и╫к ╫Ф╫Ч╫Ь╫Х╫Я.",
@@ -437,7 +441,7 @@
"birthdate_set_description": "╫к╫Р╫и╫Щ╫Ъ ╫Ь╫Щ╫У╫Ф ╫Ю╫й╫Ю╫й ╫Ь╫Ч╫Щ╫й╫Х╫С ╫Ф╫Т╫Щ╫Ь ╫й╫Ь ╫Ф╫Р╫У╫Э ╫Ф╫Ц╫Ф ╫С╫Ц╫Ю╫Я ╫к╫ж╫Ь╫Х╫Э.",
"blurred_background": "╫и╫з╫в ╫Ю╫Ш╫Х╫й╫Ш╫й",
"bugs_and_feature_requests": "╫С╫Р╫Т╫Щ╫Э & ╫С╫з╫й╫Х╫к ╫Ь╫к╫Ы╫Х╫а╫Х╫к",
"build": "╫Т╫и╫б╫Р╫к ╫С╫а╫Щ╫Щ╫Ф",
"build": "╫Т╫и╫б╫к ╫С╫а╫Щ╫Щ╫Ф",
"build_image": "╫Т╫и╫б╫к ╫к╫Х╫Ы╫а╫Ф",
"bulk_delete_duplicates_confirmation": "╫Ф╫Р╫Э ╫Р╫к/╫Ф ╫С╫Ш╫Х╫Ч/╫Ф ╫й╫С╫и╫ж╫Х╫а╫Ъ ╫Ь╫Ю╫Ч╫Х╫з ╫С╫Ы╫Ю╫Х╫к ╫Т╫У╫Х╫Ь╫Ф {count, plural, one {╫а╫Ы╫б # ╫Ы╫д╫Х╫Ь} other {# ╫а╫Ы╫б╫Щ╫Э ╫Ы╫д╫Х╫Ь╫Щ╫Э}}? ╫Ц╫Ф ╫Щ╫й╫Ю╫Х╫и ╫в╫Ь ╫Ф╫а╫Ы╫б ╫Ф╫Ы╫Щ ╫Т╫У╫Х╫Ь ╫й╫Ь ╫Ы╫Ь ╫з╫С╫Х╫ж╫Ф ╫Х╫Щ╫Ю╫Ч╫з ╫Ь╫ж╫Ю╫Щ╫к╫Х╫к ╫Р╫к ╫Ы╫Ь ╫й╫Р╫и ╫Ф╫Ы╫д╫Щ╫Ь╫Х╫Щ╫Х╫к. ╫Р╫к/╫Ф ╫Ь╫Р ╫Щ╫Ы╫Х╫Ь/╫Ф ╫Ь╫С╫Ш╫Ь ╫Р╫к ╫Ф╫д╫в╫Х╫Ь╫Ф ╫Ф╫Ц╫Х!",
"bulk_keep_duplicates_confirmation": "╫Ф╫Р╫Э ╫Р╫к/╫Ф ╫С╫Ш╫Х╫Ч/╫Ф ╫й╫С╫и╫ж╫Х╫а╫Ъ ╫Ь╫Ф╫й╫Р╫Щ╫и {count, plural, one {╫а╫Ы╫б # ╫Ы╫д╫Х╫Ь} other {# ╫а╫Ы╫б╫Щ╫Э ╫Ы╫д╫Х╫Ь╫Щ╫Э}}? ╫Ц╫Ф ╫Щ╫д╫к╫Х╫и ╫Р╫к ╫Ы╫Ь ╫Ф╫з╫С╫Х╫ж╫Х╫к ╫Ф╫Ы╫д╫Х╫Ь╫Х╫к ╫Ю╫С╫Ь╫Щ ╫Ь╫Ю╫Ч╫Х╫з ╫У╫С╫и.",
@@ -481,6 +485,7 @@
"comments_are_disabled": "╫к╫Т╫Х╫С╫Х╫к ╫Ю╫Х╫й╫С╫к╫Х╫к",
"confirm": "╫Р╫Щ╫й╫Х╫и",
"confirm_admin_password": "╫Р╫Щ╫й╫Х╫и ╫б╫Щ╫б╫Ю╫к ╫Ю╫а╫Ф╫Ь",
"confirm_delete_face": "╫Ф╫Р╫Э ╫Р╫к/╫Ф ╫С╫Ш╫Х╫Ч/╫Ф ╫й╫С╫и╫ж╫Х╫а╫Ъ ╫Ь╫Ю╫Ч╫Х╫з ╫Р╫к ╫Ф╫д╫а╫Щ╫Э ╫й╫Ь {name} ╫Ю╫Ф╫а╫Ы╫б?",
"confirm_delete_shared_link": "╫Ф╫Р╫Э ╫Р╫к/╫Ф ╫С╫Ш╫Х╫Ч/╫Ф ╫й╫С╫и╫ж╫Х╫а╫Ъ ╫Ь╫Ю╫Ч╫Х╫з ╫Р╫к ╫Ф╫з╫Щ╫й╫Х╫и ╫Ф╫Ю╫й╫Х╫к╫г ╫Ф╫Ц╫Ф?",
"confirm_keep_this_delete_others": "╫Ы╫Ь ╫й╫Р╫и ╫Ф╫а╫Ы╫б╫Щ╫Э ╫С╫в╫и╫Щ╫Ю╫Ф ╫Щ╫Щ╫Ю╫Ч╫з╫Х ╫Ь╫Ю╫в╫Ш ╫а╫Ы╫б ╫Ц╫Ф. ╫Ф╫Р╫Э ╫Р╫к/╫Ф ╫С╫Ш╫Х╫Ч/╫Ф ╫й╫С╫и╫ж╫Х╫а╫Ъ ╫Ь╫Ф╫Ю╫й╫Щ╫Ъ?",
"confirm_password": "╫Р╫й╫и ╫б╫Щ╫б╫Ю╫Ф",
@@ -533,6 +538,7 @@
"delete_album": "╫Ю╫Ч╫з ╫Р╫Ь╫С╫Х╫Э",
"delete_api_key_prompt": "╫Ф╫Р╫Э ╫Р╫к/╫Ф ╫С╫Ш╫Х╫Ч/╫Ф ╫й╫С╫и╫ж╫Х╫а╫Ъ ╫Ь╫Ю╫Ч╫Х╫з ╫Ю╫д╫к╫Ч ╫Ф-API ╫Ф╫Ц╫Ф?",
"delete_duplicates_confirmation": "╫Ф╫Р╫Э ╫Р╫к/╫Ф ╫С╫Ш╫Х╫Ч/╫Ф ╫й╫С╫и╫ж╫Х╫а╫Ъ ╫Ь╫Ю╫Ч╫Х╫з ╫Ь╫ж╫Ю╫Щ╫к╫Х╫к ╫Р╫к ╫Ф╫Ы╫д╫Щ╫Ь╫Х╫Щ╫Х╫к ╫Ф╫Р╫Ь╫Ф?",
"delete_face": "╫Ю╫Ч╫з ╫д╫а╫Щ╫Э",
"delete_key": "╫Ю╫Ч╫з ╫Ю╫д╫к╫Ч",
"delete_library": "╫Ю╫Ч╫з ╫б╫д╫и╫Щ╫Щ╫Ф",
"delete_link": "╫Ю╫Ч╫з ╫з╫Щ╫й╫Х╫и",
@@ -600,6 +606,7 @@
"enabled": "╫Ю╫Х╫д╫в╫Ь",
"end_date": "╫к╫Р╫и╫Щ╫Ъ ╫б╫Щ╫Х╫Э",
"error": "╫й╫Т╫Щ╫Р╫Ф",
"error_delete_face": "╫й╫Т╫Щ╫Р╫Ф ╫С╫Ю╫Ч╫Щ╫з╫к ╫д╫а╫Щ╫Э ╫Ю╫а╫Ы╫б",
"error_loading_image": "╫й╫Т╫Щ╫Р╫Ф ╫С╫Ш╫в╫Щ╫а╫к ╫Ф╫к╫Ю╫Х╫а╫Ф",
"error_title": "╫й╫Т╫Щ╫Р╫Ф - ╫Ю╫й╫Ф╫Х ╫Ф╫й╫к╫С╫й",
"errors": {
@@ -884,6 +891,7 @@
"month": "╫Ч╫Х╫У╫й",
"more": "╫в╫Х╫У",
"moved_to_trash": "╫Ф╫Х╫в╫С╫и ╫Ь╫Р╫й╫д╫Ф",
"mute_memories": "╫Ф╫й╫к╫з╫к ╫Ц╫Щ╫Ы╫и╫Х╫а╫Х╫к",
"my_albums": "╫Ф╫Р╫Ь╫С╫Х╫Ю╫Щ╫Э ╫й╫Ь╫Щ",
"name": "╫й╫Э",
"name_or_nickname": "╫й╫Э ╫Р╫Х ╫Ы╫Щ╫а╫Х╫Щ",
@@ -979,6 +987,7 @@
"permanently_deleted_asset": "╫а╫Ы╫б ╫а╫Ю╫Ч╫з ╫Ь╫ж╫Ю╫Щ╫к╫Х╫к",
"permanently_deleted_assets_count": "{count, plural, one {╫а╫Ы╫б # ╫а╫Ю╫Ч╫з} other {# ╫а╫Ы╫б╫Щ╫Э ╫а╫Ю╫Ч╫з╫Х}} ╫Ь╫ж╫Ю╫Щ╫к╫Х╫к",
"person": "╫Р╫У╫Э",
"person_birthdate": "╫а╫Х╫Ь╫У ╫С╫к╫Р╫и╫Щ╫Ъ {date}",
"person_hidden": "{name}{hidden, select, true { (╫Ю╫Х╫б╫к╫и)} other {}}",
"photo_shared_all_users": "╫а╫и╫Р╫Ф ╫й╫Р╫к/╫Ф ╫й╫Щ╫к╫д╫к ╫Р╫к ╫Ф╫к╫Ю╫Х╫а╫Х╫к ╫й╫Ь╫Ъ ╫в╫Э ╫Ы╫Ь ╫Ф╫Ю╫й╫к╫Ю╫й╫Щ╫Э ╫Р╫Х ╫й╫Р╫Щ╫Я ╫Ь╫Ъ ╫Р╫г ╫Ю╫й╫к╫Ю╫й ╫Ь╫й╫к╫г ╫Р╫Щ╫к╫Х.",
"photos": "╫к╫Ю╫Х╫а╫Х╫к",
@@ -1070,12 +1079,16 @@
"remove_from_album": "╫Ф╫б╫и ╫Ю╫Р╫Ь╫С╫Х╫Э",
"remove_from_favorites": "╫Ф╫б╫и ╫Ю╫Ф╫Ю╫Х╫в╫У╫д╫Щ╫Э",
"remove_from_shared_link": "╫Ф╫б╫и ╫Ю╫з╫Щ╫й╫Х╫и ╫Ю╫й╫Х╫к╫г",
"remove_memory": "╫Ф╫б╫и ╫Ц╫Щ╫Ы╫и╫Х╫Я",
"remove_photo_from_memory": "╫Ф╫б╫и ╫к╫Ю╫Х╫а╫Ф ╫Ю╫Ц╫Щ╫Ы╫и╫Х╫Я ╫Ц╫Ф",
"remove_url": "╫Ф╫б╫и URL",
"remove_user": "╫Ф╫б╫и ╫Ю╫й╫к╫Ю╫й",
"removed_api_key": "╫Ю╫д╫к╫Ч API ╫Ф╫Х╫б╫и: {name}",
"removed_from_archive": "╫Ф╫Х╫б╫и ╫Ю╫Р╫и╫Ы╫Щ╫Х╫Я",
"removed_from_favorites": "╫Ф╫Х╫б╫и ╫Ю╫Ю╫Х╫в╫У╫д╫Щ╫Э",
"removed_from_favorites_count": "{count, plural, other {╫Ф╫Х╫б╫и╫Х #}} ╫Ю╫Ф╫Ю╫Х╫в╫У╫д╫Щ╫Э",
"removed_memory": "╫Ц╫Щ╫Ы╫и╫Х╫Я ╫Ф╫Х╫б╫и",
"removed_photo_from_memory": "╫Ф╫к╫Ю╫Х╫а╫Ф ╫Ф╫Х╫б╫и╫Ф ╫Ю╫Ф╫Ц╫Щ╫Ы╫и╫Х╫Я",
"removed_tagged_assets": "╫к╫Т ╫Ф╫Х╫б╫и ╫Ю{count, plural, one {╫а╫Ы╫б #} other {# ╫а╫Ы╫б╫Щ╫Э}}",
"rename": "╫й╫а╫Ф ╫й╫Э",
"repair": "╫к╫Щ╫з╫Х╫Я",
@@ -1084,6 +1097,7 @@
"repository": "╫Ю╫Р╫Т╫и",
"require_password": "╫У╫и╫Х╫й ╫б╫Щ╫б╫Ю╫Ф",
"require_user_to_change_password_on_first_login": "╫У╫и╫Х╫й ╫Ю╫Ф╫Ю╫й╫к╫Ю╫й ╫Ь╫й╫а╫Х╫к ╫б╫Щ╫б╫Ю╫Ф ╫С╫Ы╫а╫Щ╫б╫Ф ╫Ф╫и╫Р╫й╫Х╫а╫Ф",
"rescan": "╫б╫и╫Х╫з ╫Ю╫Ч╫У╫й",
"reset": "╫Р╫Щ╫д╫Х╫б",
"reset_password": "╫Р╫Щ╫д╫Х╫б ╫б╫Щ╫б╫Ю╫Ф",
"reset_people_visibility": "╫Р╫д╫б ╫Р╫к ╫а╫и╫Р╫Х╫к ╫Ф╫Р╫а╫й╫Щ╫Э",
@@ -1127,6 +1141,7 @@
"search_options": "╫Р╫д╫й╫и╫Х╫Щ╫Х╫к ╫Ч╫Щ╫д╫Х╫й",
"search_people": "╫Ч╫Щ╫д╫Х╫й ╫Р╫а╫й╫Щ╫Э",
"search_places": "╫Ч╫Щ╫д╫Х╫й ╫Ю╫з╫Х╫Ю╫Х╫к",
"search_rating": "╫Ч╫Щ╫д╫Х╫й ╫Ь╫д╫Щ ╫У╫Щ╫и╫Х╫Т...",
"search_settings": "╫Ф╫Т╫У╫и╫Х╫к ╫Ч╫Щ╫д╫Х╫й",
"search_state": "╫Ч╫Щ╫д╫Х╫й ╫Ю╫У╫Щ╫а╫Ф...",
"search_tags": "╫Ч╫Щ╫д╫Х╫й ╫к╫Т╫Щ╫Э...",
@@ -1136,6 +1151,7 @@
"searching_locales": "╫Ю╫Ч╫д╫й ╫Р╫Ц╫Х╫и╫Щ ╫й╫д╫Ф...",
"second": "╫й╫а╫Щ╫Щ╫Ф",
"see_all_people": "╫и╫Р╫Ф ╫Р╫к ╫Ы╫Ь ╫Ф╫Р╫а╫й╫Щ╫Э",
"select": "╫С╫Ч╫и",
"select_album_cover": "╫С╫Ч╫и ╫в╫Ш╫Щ╫д╫к ╫Р╫Ь╫С╫Х╫Э",
"select_all": "╫С╫Ч╫и ╫Ф╫Ы╫Ь",
"select_all_duplicates": "╫С╫Ч╫и ╫Р╫к ╫Ы╫Ь ╫Ф╫Ы╫д╫Щ╫Ь╫Х╫Щ╫Х╫к",
@@ -1250,6 +1266,7 @@
"tag_created": "╫а╫Х╫ж╫и ╫к╫Т: {tag}",
"tag_feature_description": "╫в╫Щ╫Х╫Я ╫С╫к╫Ю╫Х╫а╫Х╫к ╫Х╫б╫и╫Ш╫Х╫а╫Щ╫Э ╫й╫з╫Х╫С╫ж╫Х ╫в╫Ь ╫Щ╫У╫Щ ╫а╫Х╫й╫Р╫Щ ╫к╫Т ╫Ь╫Х╫Т╫Щ╫Щ╫Э",
"tag_not_found_question": "╫Ь╫Р ╫Ю╫ж╫Ь╫Щ╫Ч ╫Ь╫Ю╫ж╫Х╫Р ╫к╫Т? <link>╫ж╫Х╫и ╫к╫Т ╫Ч╫У╫й</link>",
"tag_people": "╫к╫Щ╫Щ╫Т ╫Р╫а╫й╫Щ╫Э",
"tag_updated": "╫к╫Т ╫Ю╫в╫Х╫У╫Ы╫Я: {tag}",
"tagged_assets": "╫к╫Х╫Щ╫Т╫Х {count, plural, one {╫а╫Ы╫б #} other {# ╫а╫Ы╫б╫Щ╫Э}}",
"tags": "╫к╫Т╫Щ╫Э",
@@ -1290,6 +1307,7 @@
"unlink_motion_video": "╫С╫Ш╫Ь ╫з╫Щ╫й╫Х╫и ╫б╫и╫Ш╫Х╫Я ╫к╫а╫Х╫в╫Ф",
"unlink_oauth": "╫С╫Ш╫Ь ╫з╫Щ╫й╫Х╫и OAuth",
"unlinked_oauth_account": "╫С╫Х╫Ш╫Ь ╫з╫Щ╫й╫Х╫и ╫Ч╫й╫С╫Х╫Я OAuth",
"unmute_memories": "╫С╫Ш╫Ь ╫Ф╫й╫к╫з╫к ╫Ц╫Щ╫Ы╫и╫Х╫а╫Х╫к",
"unnamed_album": "╫Р╫Ь╫С╫Х╫Э ╫Ь╫Ь╫Р ╫й╫Э",
"unnamed_album_delete_confirmation": "╫Р╫к/╫Ф ╫С╫Ш╫Х╫Ч/╫Ф ╫й╫С╫и╫ж╫Х╫а╫Ъ ╫Ь╫Ю╫Ч╫Х╫з ╫Р╫к ╫Ф╫Р╫Ь╫С╫Х╫Э ╫Ф╫Ц╫Ф?",
"unnamed_share": "╫й╫Щ╫к╫Х╫г ╫Ь╫Ь╫Р ╫й╫Э",
@@ -1343,6 +1361,7 @@
"view_all": "╫Ф╫ж╫Т ╫Ф╫Ы╫Ь",
"view_all_users": "╫Ф╫ж╫Т ╫Р╫к ╫Ы╫Ь ╫Ф╫Ю╫й╫к╫Ю╫й╫Щ╫Э",
"view_in_timeline": "╫и╫Р╫Ф ╫С╫ж╫Щ╫и ╫Ф╫Ц╫Ю╫Я",
"view_link": "╫Ф╫ж╫Т ╫з╫Щ╫й╫Х╫и",
"view_links": "╫Ф╫ж╫Т ╫з╫Щ╫й╫Х╫и╫Щ╫Э",
"view_name": "╫Ф╫ж╫Т",
"view_next_asset": "╫Ф╫ж╫Т ╫Р╫к ╫Ф╫а╫Ы╫б ╫Ф╫С╫Р",
+16 -3
View File
@@ -13,14 +13,14 @@
"add_a_location": "рдПрдХ рд╕реНрдерд╛рди рдЬреЛрдбрд╝реЗрдВ",
"add_a_name": "рдирд╛рдо рдЬреЛрдбрд╝реЗрдВ",
"add_a_title": "рдПрдХ рд╢реАрд░реНрд╖рдХ рдЬреЛрдбрд╝реЗрдВ",
"add_exclusion_pattern": "рдирд┐рд╖реЗрдз рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝реЗрдВ",
"add_exclusion_pattern": "рдЕрдкрд╡рд╛рдж рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝реЗрдВ",
"add_import_path": "рдЖрдпрд╛рдд рдкрде рдЬреЛрдбрд╝реЗрдВ",
"add_location": "рд╕реНрдерд╛рди рдЬреЛрдбрд╝реЗрдВ",
"add_more_users": "рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝реЗрдВ",
"add_partner": "рдЬреЛрдбрд╝реАрджрд╛рд░ рдЬреЛрдбрд╝реЗрдВ",
"add_path": "рдкрде рдЬреЛрдбрд╝реЗрдВ",
"add_photos": "рдлрд╝реЛрдЯреЛ рдЬреЛрдбрд╝реЗрдВ",
"add_to": "рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ..ред",
"add_to": "рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВтАж",
"add_to_album": "рдПрд▓реНрдмрдо рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ",
"add_to_shared_album": "рд╕рд╛рдЭрд╛ рдПрд▓реНрдмрдо рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ",
"add_url": "URL рдЬреЛрдбрд╝реЗрдВ",
@@ -29,11 +29,17 @@
"added_to_favorites_count": "рдкрд╕рдВрджреАрджрд╛ рдореЗрдВ {count, number} рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛",
"admin": {
"add_exclusion_pattern_description": "рдмрд╣рд┐рд╖реНрдХрд░рдг рдкреИрдЯрд░реНрди рдЬреЛрдбрд╝реЗрдВ. *, **, рдФрд░ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреНрд▓реЛрдмрд┐рдВрдЧ рдХрд░рдирд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред \"Raw\" рдирд╛рдордХ рдХрд┐рд╕реА рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, \"**/Raw/**\" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред \".tif\" рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, \"**/*.tif\" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдХрд┐рд╕реА рдкреВрд░реНрдг рдкрде рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, \"/path/to/ignore/**\" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред",
"asset_offline_description": "рдпрд╣ рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрд╕реЗрдЯ рдЕрдм рдбрд┐рд╕реНрдХ рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЯреНрд░реИрд╢ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рднреАрддрд░ рдХрд╣реАрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдирдИ рд╕рдВрдмрдВрдзрд┐рдд рдПрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЯрд╛рдЗрдорд▓рд╛рдЗрди рджреЗрдЦреЗрдВред рдЗрд╕ рдПрд╕реЗрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЛ рдЗрдореНрдорд┐рдЪ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕реНрдХреИрди рдХрд░реЗрдВред",
"authentication_settings": "рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕",
"authentication_settings_description": "рдкрд╛рд╕рд╡рд░реНрдб, OAuth рдФрд░ рдЕрдиреНрдп рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ",
"authentication_settings_disable_all": "рдХреНрдпрд╛ рдЖрдк рд╡рд╛рдХрдИ рд╕рднреА рд▓реЙрдЧрд┐рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рд▓реЙрдЧрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред",
"authentication_settings_reenable": "рдкреБрдирдГ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, <link>Server Command</link> рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗред",
"background_task_job": "рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп",
"backup_database": "рдмреИрдХрдЕрдк рдбрд╛рдЯрд╛рдмреЗрд╕",
"backup_database_enable_description": "рдмреИрдХрдЕрдк рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВ",
"backup_keep_last_amount": "рдкреВрд░реНрд╡ рдмреИрдХрдЕрдк рдХреНрд╖рдорддрд╛",
"backup_settings": "рдмреИрдХрдЕрдк рд╕реЗрдЯрд┐рдВрдЧреНрд╕",
"backup_settings_description": "рдбреЗрдЯрд╛рдмреЗрд╕ рдмреИрдХрдЕрдк рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреНрд░рдмрдВрдзрди",
"check_all": "рд╕рднреА рдЪреЗрдХ рдХрд░реЗрдВ",
"cleared_jobs": "{job}: рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдП рдЧрдП",
"config_set_by_file": "Config рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ config рдлрд╝рд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ",
@@ -42,22 +48,28 @@
"confirm_email_below": "рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ \"{email}\" рдЯрд╛рдЗрдк рдХрд░реЗрдВ",
"confirm_reprocess_all_faces": "рдХреНрдпрд╛ рдЖрдк рд╡рд╛рдХрдИ рд╕рднреА рдЪреЗрд╣рд░реЛрдВ рдХреЛ рджреЛрдмрд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЗрд╕рд╕реЗ рдирд╛рдорд┐рдд рд▓реЛрдЧ рднреА рд╕рд╛рдл рд╣реЛ рдЬрд╛рдпреЗрдВрдЧреЗред",
"confirm_user_password_reset": "рдХреНрдпрд╛ рдЖрдк рд╡рд╛рдХрдИ {user} рдХрд╛ рдкрд╛рд╕рд╡рд░реНрдб рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?",
"create_job": "рдЬреЙрдм рдмрдирд╛рдПрдБ",
"cron_expression": "рдХреНрд░реЙрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐",
"cron_expression_description": "рдХреНрд░реЙрди рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреИрдирд┐рдВрдЧ рдЕрдВрддрд░рд╛рд▓ рд╕реЗрдЯ рдХрд░реЗрдВред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ <link>рдХреНрд░реЛрдирдЯреИрдм рдЧреБрд░реБ</link> рджреЗрдЦреЗрдВ",
"disable_login": "рд▓реЙрдЧрд┐рди рдЕрдХреНрд╖рдо рдХрд░реЗрдВ",
"duplicate_detection_job_description": "рд╕рдорд╛рди рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдкрд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдЪрд▓рд╛рдПрдВред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрдорд╛рд░реНрдЯ рдЦреЛрдЬ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ",
"exclusion_pattern_description": "Exclusion рдкреИрдЯрд░реНрди рдЖрдкрдХреЛ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕реНрдХреИрди рдХрд░рддреЗ рд╕рдордп рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕реЗ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдРрд╕реА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ RAW рдлрд╝рд╛рдЗрд▓реЗрдВред",
"external_library_created_at": "рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА ({date} рдХреЛ рдмрдирд╛рдИ рдЧрдИ)",
"external_library_management": "рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рдмрдВрдзрди",
"face_detection": "рдЪреЗрд╣рд░реЗ рдХрд╛ рдкрд╣рдЪрд╛рди",
"face_detection": "рдореБрдЦ рд╕рдВрд╢реЛрдзрди",
"face_detection_description": "рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЪреЗрд╣рд░реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдердВрдмрдиреЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред \"рд╕рднреА\" рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ (рдкреБрдирдГ) рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред \"рд▓рд╛рдкрддрд╛\" рдЙрди рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрднреА рддрдХ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлреЗрд╕ рдбрд┐рдЯреЗрдХреНрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рдЪрд╛рдиреЗ рдЧрдП рдЪреЗрд╣рд░реЛрдВ рдХреЛ рдЪреЗрд╣рд░реЗ рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдореМрдЬреВрджрд╛ рдпрд╛ рдирдП рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕рдореВрд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред",
"facial_recognition_job_description": "рд╕рдореВрд╣ рдиреЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рдЪреЗрд╣рд░реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ред рдпрд╣ рдЪрд░рдг рдлреЗрд╕ рдбрд┐рдЯреЗрдХреНрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЪрд▓рддрд╛ рд╣реИред \"рд╕рднреА\" рдЪреЗрд╣рд░реЛрдВ рдХреЛ (рдкреБрдирдГ) рд╕рдореВрд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред \"рд▓рд╛рдкрддрд╛\" рдХрддрд╛рд░ рдореЗрдВ рд╡реЗ рдЪреЗрд╣рд░реЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдирд┐рдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред",
"failed_job_command": "рдХрд╛рд░реНрдп {job} рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ {command} рд╡рд┐рдлрд▓",
"force_delete_user_warning": "рдЪреЗрддрд╛рд╡рдиреА: рдЗрд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ рддреБрд░рдВрдд рд╣рдЯ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдкреВрд░реНрд╡рд╡рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдФрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреАрдВред",
"forcing_refresh_library_files": "рд╕рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬрдмрд░рди рд╕рд╛рдордпрд┐рдХ рдХрд░реЗрдВ",
"image_format": "рдкреНрд░рд╛рд░реВрдк",
"image_format_description": "рд╡реЗрдмрдкреА, рдЬреЗрдкреАрдИрдЬреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдирдХреЛрдб рдХрд░рдиреЗ рдореЗрдВ рдзреАрдорд╛ рд╣реИред",
"image_prefer_embedded_preview": "рдПрдореНрдмреЗрдбреЗрдб рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ",
"image_prefer_embedded_preview_setting_description": "рдЬрдм рдЙрдкрд▓рдмреНрдз рд╣реЛ рддреЛ RAW рдлрд╝реЛрдЯреЛ рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВред рдпрд╣ рдХреБрдЫ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░рдВрдЧ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреИрдорд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЫрд╡рд┐ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдВрдкреАрдбрд╝рди рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред",
"image_prefer_wide_gamut": "рд╡рд┐рд╕реНрддреГрдд рд╕рд░рдЧрдо рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ",
"image_prefer_wide_gamut_setting_description": "рдердВрдмрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдкреНрд▓реЗ P3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рд╡рд┐рд╕реНрддреГрдд рдХрд▓рд░рд╕реНрдкреЗрд╕ рд╡рд╛рд▓реА рдЫрд╡рд┐рдпреЛрдВ рдХреА рдЬреАрд╡рдВрддрддрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрд╕реНрдХрд░рдг рд╡рд╛рд▓реЗ рдкреБрд░рд╛рдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЫрд╡рд┐рдпрд╛рдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИрдВред рд░рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП sRGB рдЫрд╡рд┐рдпреЛрдВ рдХреЛ sRGB рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред",
"image_preview_description": "рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд░рд╣рд┐рдд рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХреА рдЫрд╡рд┐, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХрд▓ рд╕рдВрдкрддреНрддрд┐ рджреЗрдЦрдиреЗ рдФрд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ",
"image_preview_title": "рдкреВрд░реНрд╡рджрд░реНрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕",
"image_quality": "рдЧреБрдгрд╡рддреНрддрд╛",
"image_settings": "рдЫрд╡рд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕",
"image_settings_description": "рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐рдпреЛрдВ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдФрд░ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ",
@@ -1093,6 +1105,7 @@
"view_album": "рдПрд▓реНрдмрдо рджреЗрдЦреЗрдВ",
"view_all": "рд╕рднреА рдХреЛ рджреЗрдЦреЗрдВ",
"view_all_users": "рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдВ",
"view_in_timeline": "рдЯрд╛рдЗрдорд▓рд╛рдЗрди рдореЗрдВ рджреЗрдЦреЗрдВ",
"view_links": "рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ",
"view_next_asset": "рдЕрдЧрд▓реА рд╕рдВрдкрддреНрддрд┐ рджреЗрдЦреЗрдВ",
"view_previous_asset": "рдкрд┐рдЫрд▓реА рд╕рдВрдкрддреНрддрд┐ рджреЗрдЦреЗрдВ",

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