Compare commits

...

400 Commits

Author SHA1 Message Date
Jason Rasmussen
c0230ccf3b docs: remove old pages 2025-09-25 09:18:24 -04:00
Mert
224bb46b4a chore(deps): bump exoplayer to 1.8.0 (#22350)
bump exoplayer to 1.8.0
2025-09-24 01:06:19 +00:00
Mert
ad0b96a1e5 chore(deps): bump gradle deps (#22344)
bump deps
2025-09-23 20:47:23 -04:00
Mert
38226fd240 fix(server): update libmimalloc path (#22345)
update libmimalloc path
2025-09-23 21:10:56 +00:00
github-actions
f193c5a53f chore: version v1.143.1 2025-09-23 18:38:13 +00:00
bo0tzz
debc35a4d5 fix: set explicit ref in prepare-release (#22338) 2025-09-23 18:34:59 +00:00
Weblate (bot)
5de76dbaee chore(web): update translations (#22288)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/
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/hi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/id/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ms/
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/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ta/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich

Co-authored-by: Andreas Johansen <andreas@josern.com>
Co-authored-by: Ankur Mishra <ankurwidguitar@gmail.com>
Co-authored-by: Aqil Iskandar <aqil@tumbuk.com>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Hudio Hizari <hhizari@gmail.com>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Javier Villanueva García <jvg2203@gmail.com>
Co-authored-by: Jonas Merkel <merkel.joon@gmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Lluís Forns <enboig@disroot.org>
Co-authored-by: MaBeniu <runnerm@gmail.com>
Co-authored-by: Marcelo Popper Costa <marcelo_popper@hotmail.com>
Co-authored-by: Marcos lobo <weblate@1on1.aleeas.com>
Co-authored-by: MatjaÅž T <matjaz@moj-svet.si>
Co-authored-by: Michael Papadopoulos <papadopoulosmic@gmail.com>
Co-authored-by: Mohammed Alezi <mohammednalezi@gmail.com>
Co-authored-by: MārtiÅ†ÅĄ Bruņenieks <martinsb@gmail.com>
Co-authored-by: Oleks Povar <acc@zvirja.com>
Co-authored-by: Petri Hämäläinen <petri.hamalainen@mailbox.org>
Co-authored-by: Phil Jope <Phil.Jope@gmail.com>
Co-authored-by: PontusÖsterlindh <pontus@osterlindh.com>
Co-authored-by: Prasanth Baskar <bupdprasanth@gmail.com>
Co-authored-by: Remco <rpander93@gmail.com>
Co-authored-by: Rimas RaguliÅĢnas <rarimas@gmail.com>
Co-authored-by: Shawn <xiaxinx@gmail.com>
Co-authored-by: TV Box <realceday.tvbox@gmail.com>
Co-authored-by: Tage Lauritsen <tage@tunenet.dk>
Co-authored-by: Taiki M <vexingly-many-mace@duck.com>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: anton garcias <isaga.percompartir@gmail.com>
Co-authored-by: gablilli <gabriele.lilli0511@gmail.com>
Co-authored-by: kylo32 <kylo32@gmail.com>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: vzvl <lojewski.vitus@gmail.com>
Co-authored-by: Àlex Bravo <alexbravobosch@gmail.com>
Co-authored-by: МаĐēŅĐ¸Đŧ Đ“ĐžŅ€ĐŋиĐŊҖ҇ <gorpinicmaksim0@gmail.com>
2025-09-23 18:20:27 +00:00
shenlong
d4b110fc47 fix: migrate backup delay from old timeline (#22327) 2025-09-23 09:55:35 -05:00
bo0tzz
f7acf1886c chore: prepare-release workflow tweaks (#21833) 2025-09-22 23:27:10 +02:00
Weblate (bot)
ba0cfb76ed chore(web): update translations (#22022)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/af/
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/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/gl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hu/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/mk/
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_BR/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ro/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ta/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich

Co-authored-by: Cristi Bklash <bklash3@gmail.com>
Co-authored-by: D S <weblate.2w8z9@slmail.me>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Dino Janevski <dino.janevski@gmail.com>
Co-authored-by: Dmitry Banny <dj.icecore@gmail.com>
Co-authored-by: Erik Leijen <eleijen@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Florian Ostertag <florian.kuepper@gmail.com>
Co-authored-by: Giulio Librando <giuliolibrando@gmail.com>
Co-authored-by: Gustavo de LeÃŗn <alfonso.gus.deleon@gmail.com>
Co-authored-by: Heinrich Gerber <heinrichgerber@gmail.com>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Ivan Dimitrov <idimitrov08@gmail.com>
Co-authored-by: Jenny Koppers <jenny.koppers99@gmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Kiril Pan <eccyboo@protonmail.com>
Co-authored-by: Leo Bottaro <github@leobottaro.com>
Co-authored-by: Luca-Bogdan Grigorescu <bogdang@gmail.com>
Co-authored-by: Maj Mohar <maj.mohar4@gmail.com>
Co-authored-by: Marcelo Popper Costa <marcelo_popper@hotmail.com>
Co-authored-by: Marcos Castro <marcastroro@gmail.com>
Co-authored-by: MatjaÅž T <matjaz@moj-svet.si>
Co-authored-by: MārtiÅ†ÅĄ Bruņenieks <martinsb@gmail.com>
Co-authored-by: Pazystamas <pazystamas@gmail.com>
Co-authored-by: Prasanth Baskar <bupdprasanth@gmail.com>
Co-authored-by: Python Germany <pythongermanyrandom@proton.me>
Co-authored-by: Richard <906747215@qq.com>
Co-authored-by: Runskrift <anders@rimfrost.nu>
Co-authored-by: Steffen Strunge Mathiesen <steffenmathiesen@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: TV Box <realceday.tvbox@gmail.com>
Co-authored-by: Theodor Onarheim <thbo@startmail.com>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: Yaros <thedj.launchpadder.dmx512@gmail.com>
Co-authored-by: Yuki Ejima <ktd.gems@gmail.com>
Co-authored-by: kgerg <kgergelyzs@gmail.com>
Co-authored-by: oliva <github@teml.in>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: swever <swever@users.noreply.hosted.weblate.org>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: МаĐēŅĐ¸Đŧ Đ“ĐžŅ€ĐŋиĐŊҖ҇ <gorpinicmaksim0@gmail.com>
Co-authored-by: āŽ¤āŽŽāŽŋāŽ´ā¯āŽ¨ā¯‡āŽ°āŽŽā¯ <tamilneram247@gmail.com>
2025-09-22 02:41:25 +00:00
github-actions
cee6bcc5ef chore: version v1.143.0 2025-09-22 02:33:20 +00:00
Daniel Dietzler
b2f3bf7079 chore: bump svelte gestures (#22263) 2025-09-21 21:03:06 -05:00
shenlong
fe416b121c chore: additional logs to troubleshoot issues with synced album (#22285)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-21 20:46:14 -05:00
shenlong
35b62cd016 fix: prevent background worker when main app is running (#22252)
* fix: prevent background worker only when the main app is actively running

* handle ref disposals better

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-21 20:45:47 -05:00
Mert
b33e8abcdd fix(mobile): load original setting on android (#22277)
* fix load original setting with videos

* check in decodeImage too
2025-09-21 18:53:51 -05:00
renovate[bot]
0be71c82b3 chore(deps): update dependency pytest-cov to v7 (#22052)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-21 17:49:04 -04:00
shenlong
a582d3a03e fix: retain scroll position on scale update (#22237)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-21 14:42:30 -05:00
shenlong
6609e70fa8 fix: local share action not working on iPad (#22238)
fix: share photo not working on iPad

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-21 14:34:48 -05:00
Alex
7a0107fc79 feat: show preparing/hashing status in backup page (#22222)
* only show preparing information while hashing

* pr feedback

* use count

* use a single query for count

* use Mert's query
2025-09-21 14:34:19 -05:00
Jason Rasmussen
0bbeb20595 fix(web): only copy images via canvas (#22225) 2025-09-21 14:34:10 -05:00
renovate[bot]
afc4085b55 chore(deps): update base-image to v202509210934 (major) (#22258) 2025-09-21 12:28:18 -04:00
shenlong
02569d52f0 ci: mise mobile tasks (#21660)
* downgrade dcm to supported version

# Conflicts:
#	mise.lock

* add mobile tasks

* remove dart dependency

* add connectivity api changes

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-20 20:32:34 -04:00
Alex
aaeac2ab73 fix(web): revert do not upscale small pictures (#22191) (#22233) 2025-09-20 09:25:27 -05:00
Jason Rasmussen
de57fecb69 fix(web): copy to clipboard on safari (#22217) 2025-09-19 17:44:18 -04:00
renovate[bot]
1e0b4fac04 fix(deps): update typescript-projects (#21510)
* fix(deps): update typescript-projects

* chore: downgrade dependencies

* chore: downgrade svelte-gestures

* fix: svelte/no-navigation-without-resolve

* fix: dumb test

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Zack Pollard <zack@futo.org>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-09-19 12:29:01 -04:00
Jason Rasmussen
34339ea69f fix(web): show danger/warning when taken dates overlap (#22213) 2025-09-19 12:20:09 -04:00
Jason Rasmussen
6da039780e fix: automatically remove leading/trailing whitespace from search queâ€Ļ (#22214)
fix: automatically remove leading/trailing whitespace from search queries
2025-09-19 12:19:26 -04:00
Jason Rasmussen
3f2e0780d5 feat: availability checks (#22185) 2025-09-19 12:18:42 -04:00
Mert
52363cf0fb chore(mobile): ignore ios build folder (#22212)
ignore ios build folder
2025-09-19 09:50:24 -05:00
Jason Rasmussen
86df09a0e4 fix(mobile): smaller search page size (#22210) 2025-09-19 10:11:11 -04:00
shenlong
e1e24f3d60 fix: sqlite parameters limit (#22119)
* fix isNotIns

* fix isIns

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-19 09:47:56 -04:00
Alex
33d76fb386 fix: download feedback (#22178)
* fix: download feedback

* chore: use FAB for asset viewer as well
2025-09-19 00:47:01 -05:00
Alex
642065f506 fix: get scrubber in search view working (#22175)
* feat: add option to disable snapping

* handle offset when there is no appbar
2025-09-19 00:20:09 -05:00
Jason Rasmussen
de897f6069 fix(web): do not upscale small pictures (#22191) 2025-09-18 22:28:06 -04:00
Jason Rasmussen
68f3ed89c5 chore: remove unused init service (#22188) 2025-09-19 01:11:45 +00:00
Sergey Katsubo
78516a97b3 chore(server): proper log context formatting (#22173)
* Fix log formatting for logger.error(..., error)

Rewrite it to avoid printing error msg in [context]

* Fix log formatting for logger.warn(..., error?.stack)

Rewrite it to avoid printing stack in [context]

* Fix log formatting for logger.debug(..., error.message);

Rewrite it to avoid printing error msg in [context]

* Print error msg instead of literal "Error"
2025-09-18 19:56:05 -04:00
Alex
b8a17c3c26 fix: disable scrubbing mode on drag ended (#22186) 2025-09-18 16:42:33 -05:00
Alex
e42886b767 fix: display thumbnail while scrubbing paused (#22164)
* fix: display thumbnail while scrubbing paused

* pr feedback

* pr feedback

* tune timeout
2025-09-18 20:59:58 +00:00
Alex
d36c26bf97 chore: refresh backup stats when entering backup page (#21977)
* chore: refresh backup stats when entering backup page

* check for success status

* remove logs

* remove sync remote when toggle the button

* show status immediately after navigating to screen

* pr feedback
2025-09-18 15:36:43 -05:00
Brandon Wees
dcbc266b83 chore: disable mise lockfile (#22182) 2025-09-18 15:44:33 -04:00
bo0tzz
c37d13691b feat: shared pre-job action (#20011) 2025-09-18 11:21:06 +02:00
Mert
9ae42106cc fix(mobile): stack row blocking gestures and not showing up (#21854) 2025-09-18 06:16:14 +00:00
Alex
28e9892ed3 fix: show thumbnail instantly when jumping to top of the page (#22163)
* fix: show thumbnail instantly when jumping to top of the page

* pr feedback
2025-09-18 05:26:39 +00:00
shenlong
532ec10d5f refactor: hashing service (#21997)
* download only backup selected assets

* android impl

* fix tests

* limit concurrent hashing to 16

* extension cleanup

* optimized hashing

* hash only selected albums

* remove concurrency limit

* address review comments

* log more info on failure

* add native cancellation

* small batch size on ios, large on android

* fix: get correct resources

* cleanup getResource

* ios better hash cancellation

* handle graceful cancellation android

* do not trigger multiple hashing ops

* ios: fix circular reference, improve cancellation

* kotlin: more cancellation checks

* no need to create result

* cancel previous task

* avoid race condition

* ensure cancellation gets called

* fix cancellation not happening

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-17 23:42:37 -05:00
Alex
2411bf8374 fix: asset viewer background isn't shown (#22161)
* fix: asset viewer background isn't shown

* pr feedback
2025-09-17 23:26:16 -05:00
Mert
0b60cc8965 fix(mobile): thumbnail shimmering effect (#22158)
full opacity
2025-09-17 22:29:37 -05:00
Jason Rasmussen
2d816e89ad refactor(web): prefer modal manager (#22152) 2025-09-17 23:23:42 +02:00
Jason Rasmussen
eee94207ce refactor(web): album users modal (#22153) 2025-09-17 17:04:54 -04:00
Jason Rasmussen
dfa38ec3ef fix(web): download panel (#22150) 2025-09-17 15:40:11 -05:00
Jason Rasmussen
edc0698e2a refactor: album edit modal (#22151) 2025-09-17 16:34:12 -04:00
shenlong
0e987352bb fix: do not migrate existing users (#22146)
fix: do not migrate if already on 15+

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-17 13:20:43 -05:00
Jason Rasmussen
98ea3847e5 refactor: server-about-modal (#22138)
* refactor: server-about-modal

* fix: bits-ui scroll lock cleanup
2025-09-17 16:23:23 +00:00
shenlong
53c67f4d71 fix: show delete on device when asset has a local match (#22143)
* fix: show delete on device when asset has a local match

* change test description

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-17 21:48:54 +05:30
Mert
20733bd7df fix(mobile): load original image (#22142)
load original image
2025-09-17 12:14:16 -04:00
Jason Rasmussen
11e72a0f35 refactor: text-primary (#22141) 2025-09-17 12:12:51 -04:00
Jason Rasmussen
53a6724039 refactor: hot module reload component (#22135) 2025-09-17 12:12:37 -04:00
Jason Rasmussen
0b20d1df9f feat(web): toggle theme shortcut (#22139) 2025-09-17 12:12:23 -04:00
Alex
6bb8903b05 chore: revert poll counts from DB rather than using callbacks from library (#22117) (#22140)
Revert "fix: poll counts from DB rather than using callbacks from library (#22117)"

This reverts commit 29fd981587.
2025-09-17 15:41:33 +00:00
Stewart Rand
26e0cb3eb4 fix: Refresh photo after updating featured photo (#21971)
fix: Refresh person photo after setting featured photo

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-17 10:22:26 -05:00
shenlong
a8f683ed15 chore(dep): bump flutter to 3.35.4 (#22129)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-17 14:58:35 +00:00
Viktor Mykhailiv
4dfa011eef fix: initial size of bottom sheet (#22085) 2025-09-17 14:41:44 +00:00
Viktor Mykhailiv
0c0bec6ae2 fix: display album image in selection mode (#22087)
* fix: display album image in selection mode

* fix: align MultiSelectStatusButton to display instead of back button in album

* small styling tweak

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-17 14:38:25 +00:00
shenlong
61c3f27fdc feat: add configurable backup on charging only and delay settings for android (#22114)
* feat: add configurable on charging only and delay

* Segmented and style the settings

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-17 14:13:49 +00:00
Alex
b2ca208dbb fix: ensure background worker is scheduled when the app is dismissed (#22032)
* fix: ensure background worker is scheduled when the app is dismissed

* remove logs

* fix: use native locks (#22081)

* fix: native locks

* use atomicints

* change count check

---------

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

---------

Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-17 09:11:55 -05:00
shenlong
2e945281fc fix: beta migration check (#22092)
fix: beta migration

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-17 08:45:04 -05:00
shenlong
9ac120c772 chore: add mobile codeowner (#22130)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-17 14:08:35 +02:00
Min Idzelis
e6e8ae7c74 chore: remove suppressed warnings (#22120)
chore: remove supressed warnings
2025-09-17 00:06:27 -04:00
shenlong
29fd981587 fix: poll counts from DB rather than using callbacks from library (#22117)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-16 21:13:34 -05:00
Mert
585b74f233 chore(deps): bump flutter to 3.35.3 (#22054)
* bump flutter to 3.35.3

* migrate deprecated code

* linting

* disable custom_lint in ci

* disable custom_lint
2025-09-16 21:10:01 -05:00
Mert
f118bb7e08 fix(mobile): prevent concurrent refresh and processing tasks (#22111)
* task semaphore

* always call setTaskCompleted
2025-09-16 18:06:19 -04:00
renovate[bot]
1710230d61 chore(deps): update dependency @types/nodemailer to v7 (#22047)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-16 22:17:03 +01:00
Jason Rasmussen
2012b07645 refactor: admin settings (#22109) 2025-09-16 17:15:57 -04:00
renovate[bot]
a88a9a7d5e chore(deps): update dependency @faker-js/faker to v10 (#21514)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-16 21:13:09 +00:00
renovate[bot]
ae539dfdf3 chore(deps): update terraform cloudflare to v4.52.5 (#22044)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-16 22:01:44 +01:00
renovate[bot]
69bb8d834f chore(deps): update github-actions (#22041)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-16 21:59:58 +01:00
Jason Rasmussen
9693d07a8b refactor: components (#22106) 2025-09-16 16:58:47 -04:00
Jason Rasmussen
453b30069d chore: discord from simple icons (#22104) 2025-09-16 16:33:56 -04:00
Jason Rasmussen
c9daefccc4 refactor: loading spinner (#22103) 2025-09-16 16:22:13 -04:00
Jason Rasmussen
6ffd8e679e refactor: use immich/ui PasswordInput (#22099)
refactor: password-input
2025-09-16 16:09:09 -04:00
Daniel Dietzler
7fe2f19258 chore: migrate to UI lib icon (#22096) 2025-09-16 21:40:43 +02:00
Jason Rasmussen
dac545496e chore: bump immich/ui (#22100) 2025-09-16 15:39:56 -04:00
renovate[bot]
d5b112be53 chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.3.0 docker digest to 11ced39 (#22037)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-16 21:38:14 +02:00
Jason Rasmussen
75322179fd refactor: more elements (#22095) 2025-09-16 15:01:23 -04:00
Jason Rasmussen
3f4b6a8e7c refactor: move more elements (#22093) 2025-09-16 14:47:38 -04:00
Jason Rasmussen
7ce1d73c20 refactor: move components/elements to elements/ (#22091) 2025-09-16 18:31:22 +00:00
Jason Rasmussen
2bf484c91c refactor: timeline components (#22089) 2025-09-16 14:01:12 -04:00
Alex
4e9bdd5e6c fix: storage indicator (#22077) 2025-09-16 12:46:48 -05:00
Jason Rasmussen
f05ef81c4f fix(web): issue with modal locking the page (#22079) 2025-09-16 12:46:09 -05:00
Jason Rasmussen
c21860fb97 refactor: rename timeline actions (#22086) 2025-09-16 13:37:01 -04:00
linux-universe
449368eee7 chore(docs): add an updated Podman/Quadlets community guide (#20744)
* chore(docs): update Podman/Quadlets instructions link to a more up to date repo

* Update community-guides.tsx: additional guide instead of replacing the other podman one

* fix community-guides.tsx: fixed podman handbook entry

* chore: linting

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-09-16 17:05:54 +00:00
Jason Rasmussen
31e098517d chore: rename asset-grid to timeline (#22084) 2025-09-16 13:05:09 -04:00
Jason Rasmussen
b9e2590752 chore: simplify (#22082) 2025-09-16 12:48:44 -04:00
Jason Rasmussen
41641ec000 chore: build sdk while server is starting (#22083) 2025-09-16 12:48:31 -04:00
Alex
8821c251c3 fix: navigate to time (#22078) 2025-09-16 11:40:31 -05:00
Jason Rasmussen
1d6b98ff86 chore: remove prepare-volumes (#22071) 2025-09-16 10:19:09 -04:00
bo0tzz
4d00261bc1 chore(mobile): translate missing strings (#22057) 2025-09-16 08:51:03 -05:00
Tom Laermans
df7ea4d8ea docs: add community immich-birthday and immich-stack projects (#21934) 2025-09-16 04:01:18 +00:00
bo0tzz
1e7cb1165f fix: add pnpm setup to fix-format worflow (#21805) 2025-09-15 23:57:58 -04:00
Alex
d9ef041b87 chore: remove beta wording and badges (#22040)
* chore: remove beta wordings and badges

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

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

* chore: use first method

---------

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

* Add extra line break for clarity

* Fix formatting error: remove an asterisk

* chore: use admonitions

---------

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

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

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

* extension

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

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

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

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

* do not listen for store updates in isolates

---------

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

* fix: disable placeholders when not snapping

also moved month constant to constants.dart

---------

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

* reset flutterApi on cleanup

---------

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

* Remove comment

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

---------

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

* fix: lint

---------

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

* update usages

* stragglers

* use dcm

* formatting

* test ci

* Revert "test ci"

This reverts commit 8f864c4e4d.

* revert whitespace change
2025-09-12 18:56:00 -04:00
bo0tzz
23aa661324 fix: use mdq image with jq (#21860) 2025-09-12 21:46:39 +02:00
Min Idzelis
a10a946d1a fix: let dev docker compose service runs as root (#21579) 2025-09-12 16:20:41 +01:00
Stewart Rand
04c9531624 fix: format point count numbers on map view (#21848)
Format numbers on map view
2025-09-12 07:20:05 +00:00
Alex
d84cc450f1 chore: post release tasks (#21834) 2025-09-11 15:15:10 -05:00
github-actions
4153848c68 chore: version v1.142.0 2025-09-11 19:39:05 +00:00
Jason Rasmussen
f29230c8a6 fix(web): handle buckets before year 1000 (#21832) 2025-09-11 14:36:16 -05:00
Weblate (bot)
03af60e8eb chore(web): update translations (#21814)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translation: Immich/immich

Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Taiki M <vexingly-many-mace@duck.com>
2025-09-11 19:34:40 +00:00
bo0tzz
ae827e1406 fix: define call secrets in merge-translations (#21831) 2025-09-11 19:29:58 +00:00
shenlong
7893ac25fb fix: always use en locale for parsing timeline datetime (#21796)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-11 14:20:39 -05:00
Alex
42a03f2556 fix: concurrency issue (#21830) 2025-09-11 19:02:03 +00:00
shenlong
722a464e23 fix: android background backups (#21795)
* upload using dart client

* add connectivity api

* respect backup network setting

* comment as to why we need to wait for setForegroundAsync call

* log assets skipped due to network constraint

* dynamic spawning -> false

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-11 12:01:15 -05:00
bo0tzz
39c1ebf698 fix: proper triggers for weblate checks (#21818) 2025-09-11 14:31:02 +00:00
Jason Rasmussen
ef6e4f4699 docs: update tag details (#21815) 2025-09-11 10:09:18 -04:00
bo0tzz
0700e61d20 fix: trigger for weblate checks (#21816) 2025-09-11 14:07:36 +00:00
trommegutten
7e6cd48783 docs: improve and clarify XMP sidecar behavior (#20334)
* docs: improve and clarify XMP sidecar behavior

- Simplified and reorganized the documentation for XMP sidecars
- Clearly separated CLI import vs. external library behavior
- Clarified what metadata fields are stored in the database
- Documented filename rules and storage behavior
- Explained write-back behavior, including permission requirements

* Clarify sidecar write-back behavior for external libraries

Updated documentation to reflect that Immich does not write metadata to sidecar files in external libraries unless the mount is writable.

Mentions silent fail behavior as described in Issue #10538.

* Update xmp-sidecars.md

* Refactor section 1: clarify XMP fields Immich reads and writes

- Rewrote section 1 with a simplified 3-column table: Metadata ¡ Writes to ¡ Reads from
- Corrected date field logic with prioritized read order
- Clarified that Immich only updates fields that have changed
- Removed incorrect mention of dc:title

* docs: clarify tag reading priority (TagsList, HierarchicalSubject, IPTC:Keywords)

Updated the documentation for tag metadata extraction to clarify the prioritized order in which Immich reads tags from imported media:

1. digiKam:TagsList
2. lr:HierarchicalSubject
3. IPTC:Keywords

This reflects the actual logic used in the getTagList()
2025-09-11 14:00:53 +00:00
Daniel Dietzler
e524c59560 chore: @danieldietzler web codeowners (#21813)
I don't see web PRs otherwise
2025-09-11 14:28:20 +02:00
Jason Rasmussen
b4c72fb609 fix(server): validate token permission (#21802) 2025-09-11 08:09:58 -04:00
bo0tzz
74e14b6495 chore: 10 minute timeout for translations merge (#21810) 2025-09-11 13:22:25 +02:00
Weblate (bot)
03207a13ec chore(web): update translations (#21624)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/be/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/bg/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/da/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/et/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/eu/
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/id/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/mr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_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/sq/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ta/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich

Co-authored-by: Andrea Toska <toskaandrea@gmail.com>
Co-authored-by: Aravinth <aravinth@tuta.io>
Co-authored-by: Denis Pacquier <denis.pacquier@gmail.com>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: FarSniper <ozmatlik@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Gustavo de LeÃŗn <alfonso.gus.deleon@gmail.com>
Co-authored-by: Handkep <paulus.handke@gmail.com>
Co-authored-by: Hudio Hizari <hhizari@gmail.com>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Ivan Amela Caldeiro <ivanamca01@gmail.com>
Co-authored-by: Ivan Dimitrov <idimitrov08@gmail.com>
Co-authored-by: JPar99 <github.wad969@passmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Macgyver <macgyver@users.noreply.hosted.weblate.org>
Co-authored-by: Marcelo Popper Costa <marcelo_popper@hotmail.com>
Co-authored-by: MatjaÅž T <matjaz@moj-svet.si>
Co-authored-by: MārtiÅ†ÅĄ Bruņenieks <martinsb@gmail.com>
Co-authored-by: Oleks Povar <acc@zvirja.com>
Co-authored-by: Pajtim Rexhepi <pajtim.rexhepi@gmail.com>
Co-authored-by: Red Cyclops <shown-bleep-spiffy@duck.com>
Co-authored-by: Runskrift <anders@rimfrost.nu>
Co-authored-by: Santiago <santiwever@hotmail.com>
Co-authored-by: Saurabh Nandedkar <extremophilarum@gmail.com>
Co-authored-by: Sebastian <sebastiankiwidk@gmail.com>
Co-authored-by: Sergey Katsubo <skatsubo@gmail.com>
Co-authored-by: Simob98 <simobertuzzi98@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: TV Box <realceday.tvbox@gmail.com>
Co-authored-by: Taiki M <vexingly-many-mace@duck.com>
Co-authored-by: Tomi PÃļyskÃļ <tomi.poysko@gmail.com>
Co-authored-by: Urko Perez Azkarragaurizar <urkoperez16@gmail.com>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: anton garcias <isaga.percompartir@gmail.com>
Co-authored-by: gablilli <gabriele.lilli0511@gmail.com>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: shiuh67 <shiuh.cheng@gmail.com>
Co-authored-by: МаĐēŅĐ¸Đŧ Đ“ĐžŅ€ĐŋиĐŊҖ҇ <gorpinicmaksim0@gmail.com>
Co-authored-by: Đ¯ŅžĐŗĐĩĐŊ <lzref@protonmail.com>
2025-09-11 10:28:48 +00:00
bo0tzz
529b8c285d fix: only run weblate checks on review (#21809) 2025-09-11 10:20:49 +00:00
bo0tzz
1213f6df10 fix: use correct bot in weblate-checks (#21808) 2025-09-11 12:02:47 +02:00
bo0tzz
9e8132c363 fix: merge-translations workflow cleanup (#21789) 2025-09-11 08:27:49 +00:00
Alex
2d2673c114 fix: repeat timeline migration for first time user (#21794) 2025-09-10 16:27:00 -05:00
Alex
56e5236a39 chore: clean up background tasks (#21785) 2025-09-10 16:17:37 -05:00
Jason Rasmussen
8529f92ebc fix(web): map in album shared link (#21793) 2025-09-10 20:19:43 +00:00
Jason Rasmussen
761ac074c9 fix(web): asset refresh (#21788) 2025-09-10 20:08:15 +00:00
Jason Rasmussen
7e377d3e42 chore: deprecate (#21791) 2025-09-10 15:35:41 -04:00
bo0tzz
f7d9215464 fix: bad scripting in merge-translations (#21787) 2025-09-10 18:58:22 +00:00
Mert
9af44fbd69 chore(deps): update base image to trixie (#21786)
bump base image
2025-09-10 18:53:18 +00:00
renovate[bot]
170306af1a fix(deps): update machine-learning (#21704)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-10 14:51:11 -04:00
bo0tzz
417d3bbf50 fix: remove invalid read syntax (#21684) 2025-09-10 18:44:23 +00:00
shenlong
e239b8d2fa fix: android crash on app pause (#21768)
* revert service locks

* rename backgroundWorkerFgServiceProvider

* refactor: parallel background worker init (#21769)

* refactor: parallel background worker init

* fix: hashing not running from the background engine (#21773)

* init and dispose workmanager from background engine

* log message contend

---------

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

---------

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

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-10 17:15:42 +00:00
Alex
2c7b980eed chore: make beta timeline the default (#21751)
* chore: make beta timeline the default

* fix: logic

* awaiting

* refactor
2025-09-10 12:11:46 -05:00
Alex
9a5a3c0a1d chore: refactor life cycle events (#21781) 2025-09-10 11:50:31 -05:00
Yaros
027dab1487 fix(web): memory viewer arrow navigation (#19400)
* fix(web): memory viewer jumps down on arrow keys

* fix pnpm lockfile

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-09-10 09:47:38 -04:00
Noel S
e18e4c5962 fix(mobile): Change read-only mode activation method to remove double click lag (#21743)
* Change activation method to long press

* Update text to new method
2025-09-10 08:39:36 -05:00
shenlong
67a8cab286 feat: resurrect advanced info (#21633)
* feat: resurrect advanced info

* display null values as well

* add exif details

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-10 08:38:53 -05:00
Jason Rasmussen
39eee6a634 fix: welcome email password (#21732) 2025-09-10 09:11:42 -04:00
renovate[bot]
ee98e69097 chore(deps): update docker.io/valkey/valkey:8-bookworm docker digest to fea8b3e (#21281)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-10 08:36:44 -04:00
renovate[bot]
41c1d4d44b chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 docker digest to 8d292bd (#21287)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-10 08:36:27 -04:00
Sergey Katsubo
b21084b851 fix(server): correct immich-cli symlink in Immich docker image (#21318)
Fix immich-cli symlink in Immich docker image
2025-09-10 08:35:55 -04:00
Oleksandr Povar
8bf45eb718 chore: update README (#21718)
Enhance README UA translation
2025-09-10 08:28:01 -04:00
renovate[bot]
9d3ca3ad3f chore(deps): update dependency vite to v7.1.5 [security] (#21748)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-10 08:23:33 -04:00
Sergey Katsubo
0090b9db4a fix(docs): fix the SQL query for finding assets with missing thumbnails (#21770)
Fix the SQL query for missing thumbnails in docs
2025-09-10 08:22:55 -04:00
Jason Rasmussen
bee0ae430a fix(web): map popup accessibility (#21759) 2025-09-10 08:17:58 -04:00
Jason Rasmussen
cc08ebdf80 fix(web): website frozen after modal closes (#21752) 2025-09-10 08:17:41 -04:00
Jason Rasmussen
71578b76a7 chore: remove typeorm dependency (#21754) 2025-09-10 08:17:21 -04:00
Jason Rasmussen
8e5d52abbb fix(web): transparent background color (#21747) 2025-09-10 08:15:57 -04:00
Jason Rasmussen
e52cc259d5 fix(web): cancel uploads on logout (#21760) 2025-09-10 08:15:03 -04:00
MārtiÅ†ÅĄ Bruņenieks
00c88b2636 docs: add community immich drop uploader project (#21775) 2025-09-10 12:07:58 +00:00
Jason Rasmussen
e95096d14f fix: prefer Creation Date over Create Date (#21756) 2025-09-09 22:58:46 -04:00
David Koňařík
4c918254b9 fix: use relative path in start.sh (#20434)
Dehardcode path to Immich in start.sh
2025-09-10 02:02:23 +00:00
bo0tzz
b97d73d7a7 fix: handle missing checkbox in close-dupes (#21689) 2025-09-09 21:46:59 -04:00
per-review
2801b0953d docs: be explicit about which container exposes metrics (#20424)
* Be explicit about which container exposes metrics

* Update docs/docs/features/monitoring.md

Co-authored-by: bo0tzz <git@bo0tzz.me>

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: bo0tzz <git@bo0tzz.me>
2025-09-10 01:39:15 +00:00
Johann
7a1c45c364 feat(web): use timeline in geolocation manager (#21492) 2025-09-09 21:26:26 -04:00
bo0tzz
5acd6b70d0 feat: add button to unpause all queues (#21685)
* feat: add button to unpause all queues

* fix: const

* chore: simplify

* chore: pr feedback

---------

Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
2025-09-10 01:06:36 +00:00
renovate[bot]
edaedca03f chore(deps): update github-actions (#21295)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-09 21:02:27 -04:00
Ben McCann
7b3e1037b6 chore: remove unused dependencies (#21736) 2025-09-09 20:38:17 -04:00
renovate[bot]
27bc8eba7b chore(deps): update terraform cloudflare to v4.52.3 (#21701)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-09 10:18:26 +01:00
Sergey Katsubo
23fb2e0fae chore(server): fix logger context in StorageCore (#21534)
* Fix logging context in StorageCore

* Revert "Fix logging context in StorageCore"

This reverts commit 0aa540afd1.

* Fix logging context in StorageCore - one line change
2025-09-08 17:28:40 -04:00
Alex
59accbf32a fix: prevent isolate deadlock (#21692) 2025-09-08 19:18:13 +00:00
shenlong
059a0e8aa8 feat: sync AuthUserV1 (#21565)
* feat: sync AuthUserV1

* migration

* chore: fix analyze

* fix user updatedAt check

* fix: auth user sync query

* generate sql

* bump schema version and update migration

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-09-08 14:00:10 -05:00
bo0tzz
6a55c36762 fix: print errors in weblate merge job (#21683) 2025-09-08 17:37:10 +02:00
bo0tzz
c0bff4b493 fix: pass repo to gh cli in weblate checks job (#21681) 2025-09-08 17:32:44 +02:00
shenlong
fd4c2acde8 feat: handle SyncResetV1 (#20732)
* feat: handle SyncResetV1

* auto retry on reset and handle SyncCompleteV1

* fix tests

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-08 09:48:26 -05:00
bo0tzz
5acf909235 fix: gh cli needs explicit GH_TOKEN env var in gha (#21680) 2025-09-08 14:48:08 +00:00
bo0tzz
fb1458c720 fix: pre-job branch scope on weblate checks job (#21679) 2025-09-08 16:30:28 +02:00
Peter Buga
255dabc239 fix(server): valid backups with DB_URL env variable config (#21669) 2025-09-08 14:29:34 +00:00
Mert
27751f8fd4 fix(server): remove pcm from default accepted codecs (#21655)
remove pcm from default
2025-09-08 09:26:28 -05:00
bo0tzz
72ffa37dd9 feat: workflow for automated translations merge (#21639)
* feat: workflow for automated translations merge

* feat: dismiss review on merge failure

* chore: parameterize weblate URL

* fix: remove unnecessary CHANGES_REQUESTED review flow

* feat: leave weblate locked on failures

* chore: remove unnecessary merge timeout comment

The review dismissal already communicates this

* chore: remove todo

* feat: save api call

* fix: quotes
2025-09-08 09:25:31 -05:00
Jason Rasmussen
5a7042364b feat: add partner create endpoint (#21625) 2025-09-05 17:59:11 -04:00
github-actions
db0ea0f3a8 chore: version v1.141.1 2025-09-05 19:44:39 +00:00
Alex
88c0243a20 chore: robust isolation tasks coordination (#21605)
* chore: robust isolation tasks coordination

* give more time for database transaction to clean up

* chore: clean up logs

* chore: clean up logs

* fix: logs
2025-09-05 19:39:38 +00:00
Alex
3a29522df6 fix: memory not getting refreshed on new day (#21623) 2025-09-05 19:32:41 +00:00
bo0tzz
50eae23f3a fix: use specific uv version in ML dockerfile (#21611) 2025-09-05 20:15:29 +02:00
Weblate (bot)
95419750bb chore(web): update translations (#21464)
Co-authored-by: AbuKareem Tuffaha <abukareem.tuffaha@gmail.com>
Co-authored-by: Dawider10 <dawider110@gmail.com>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Felipe Garcia <garcia.o.felipe@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Gustavo de LeÃŗn <alfonso.gus.deleon@gmail.com>
Co-authored-by: Hyouhyan <hyouhyan@hyouhyan.com>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Isfan Nur Fauzi <isfannurfauzi@gmail.com>
Co-authored-by: Ivan Dimitrov <idimitrov08@gmail.com>
Co-authored-by: JPar99 <github.wad969@passmail.com>
Co-authored-by: Joseph <josephlegrand33+hosted.weblate.org@gmail.com>
Co-authored-by: JosÊ Rodrigues <j.rodrigues.pcmedic@gmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: Leigh van der merwe <palitu822@gmail.com>
Co-authored-by: Lenny Angst <lenny@familie-angst.ch>
Co-authored-by: Leon Fertig <leon.fertig2004@gmail.com>
Co-authored-by: MatjaÅž T <matjaz@moj-svet.si>
Co-authored-by: Mikko Asikainen <mikko@asikainen.com>
Co-authored-by: Murad Bashirov <carlsonmu@gmail.com>
Co-authored-by: MārtiÅ†ÅĄ Bruņenieks <martinsb@gmail.com>
Co-authored-by: Phantom0174 <darrenhsiou@gmail.com>
Co-authored-by: PontusÖsterlindh <pontus@osterlindh.com>
Co-authored-by: Sergey Katsubo <skatsubo@gmail.com>
Co-authored-by: Sneha George <snehavg94@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: Tage Lauritsen <tage@tunenet.dk>
Co-authored-by: Tomi PÃļyskÃļ <tomi.poysko@gmail.com>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: Xo <xocodokie@users.noreply.hosted.weblate.org>
Co-authored-by: albanobattistella <albano_battistella@hotmail.com>
Co-authored-by: anton garcias <isaga.percompartir@gmail.com>
Co-authored-by: czlevi7 <czlevi7@gmail.com>
Co-authored-by: gablilli <gabriele.lilli0511@gmail.com>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: МаĐēŅĐ¸Đŧ Đ“ĐžŅ€ĐŋиĐŊҖ҇ <gorpinicmaksim0@gmail.com>
2025-09-05 19:53:36 +02:00
renovate[bot]
5fb858a865 chore(deps): update node.js to v22.19.0 (#21509)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-05 08:43:58 -04:00
Jason Rasmussen
18084a49ec chore: mise tasks (#21597) 2025-09-04 18:10:36 -04:00
github-actions
f107cb044a chore: version v1.141.0 2025-09-04 19:42:02 +00:00
renovate[bot]
f4e7ea47a6 chore(deps): update dependency @types/node to ^22.18.0 (#21506)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-04 21:26:06 +02:00
Riccardo Ruspoli
8747fc4935 fix(server): consider asset creation date when EXIF is missing (#21586)
* fix(server): fallback to asset.fileCreatedAt when EXIF is missing

* merge main

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-04 19:18:12 +00:00
Alex
287fa79d75 fix: remove unnecessary call to create remote album (#21599) 2025-09-04 14:11:51 -05:00
Alex
bcfb5bee1f feat: album info sync (#21103)
* wip

* album creation

* fix: album api repository no invalidating after logging out

* add linkedRemoteAlbumId column and migration

* link/unlink remote album

* logic to find and add new assets to album

* pr feedback

* add toggle option to backup option page

* refactor: provider > service

* rename

* Handle page pop manually

* UI feedback for user creation and sync linked album

* uncomment migration

* remove unused method
2025-09-04 18:44:10 +00:00
Yaros
538263dc38 fix(mobile): location button map beta timeline (#21590)
fix(mobile): location button map
2025-09-04 13:26:16 -05:00
Maksim
51aec1e93d fix(mobile): Correction of image creation date by using mtime insteadâ€Ļ (#21508)
* fix(mobile): Correction of image creation date by using mtime instead of ctime.

* use the timestamps from the asset for uploads

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-04 18:26:02 +00:00
Mert
53825cc3d6 chore(deps): bump sharp to 0.34.3 (#21596)
* bump sharp to 0.34.3

* set unlimited
2025-09-04 13:23:13 -05:00
Jason Rasmussen
6e7c2817a3 fix: asset upload metadata validation (#21594) 2025-09-04 13:22:01 -05:00
bo0tzz
7bd79b551c feat: use mise for core dev tools (#21566)
* feat: use mise for core tools

* feat: mise handle dart

* feat: install dcm through mise

* fix: enable experimental in mise config

* feat: use mise.lock

* chore: always pin mise use

---------

Co-authored-by: bwees <brandonwees@gmail.com>
2025-09-04 12:58:42 -04:00
shenlong
5fe954b3c9 fix: use lock to synchronise foreground and background backup (#21522)
* fix: use lock to synchronise foreground and background backup

# Conflicts:
#	mobile/lib/domain/services/background_worker.service.dart
#	mobile/lib/platform/background_worker_api.g.dart
#	mobile/pigeon/background_worker_api.dart

* add timeout to the splash-screen acquire lock

* fix: null check on created date

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-04 11:44:33 -05:00
Jason Rasmussen
7f81a5bd6f fix: sidecar check job (#21312) 2025-09-04 16:23:58 +00:00
Arthur Normand
37a79292c0 feat: view similar photos (#21108)
* Enable filteing by example

* Drop `@GenerateSql` for `getEmbedding`?

* Improve error message

* PR Feedback

* Sort en.json

* Add SQL

* Fix lint

* Drop test that is no longer valid

* Fix i18n file sorting

* Fix TS error

* Add a `requireAccess` before pulling the embedding

* Fix decorators

* Run `make open-api`

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-09-04 09:22:09 -05:00
Brandon Wees
bf6211776f fix: retain filter and sort options when pulling to refresh (#21452)
* fix: retain filter and sort options when pulling to refresh

* chore: use classes to manage state

* chore: format

* chore: refactor to keep local state of filter/sorted albums instead of a global filteredAlbums

* fix: keep sort when page is navigated away and returned

* chore: lint

* chore: format

why is autoformat not working

* fix: default sort direction state

* fix: search clears sorting

we have to cache our sorted albums since sorting is very computationally expensive and cannot be run on every keystroke. For searches, instead of pulling from the list of albums, we now pull from the cached sorted list and then filter which is then shown to the user
2025-09-04 09:08:17 -05:00
waclaw66
6c178a04dc fix(mobile): pinch + move scale (#21332)
* fix: pinch + move scale

* added lost changes from #18744
2025-09-04 09:01:39 -05:00
Snowknight26
036d314cb6 fix(web): Make Manage location utility header responsive (#21480)
* fix(web): Make Manage location utility header responsive

* Consolidate <p> into <Text>
2025-09-04 08:59:26 -05:00
Noel S
1fc5da398a fix(mobile): Hide system UI when entering immersive mode in asset viewer (#21539)
Implement hiding system ui in asset viewer
2025-09-04 08:57:34 -05:00
Sudheer Reddy Puthana
4d84338086 fix(mobile): readonly mode fixes (#21545)
* fix: Enables videotimeline in readonly mode

- Enables only the video controls in the bottom bar when readonlyMode is enabled.
- Fixes the message on the app profile bar when readOnlyMode is enabled **but** betaTimeline is not enabled.

Fixes https://github.com/immich-app/immich/issues/21441

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

* cleanup bottom bar handling

---------

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>
Co-authored-by: bwees <brandonwees@gmail.com>
2025-09-04 08:50:38 -05:00
Yaros
0ac49b00ee feat(mobile): scrubber haptics (beta timeline) (#21351)
* feat(mobile): scrubber haptics beta timeline

* changed haptic to selectionClick
2025-09-04 08:47:16 -05:00
Mert
e427778a96 fix(mobile): pause image loading on inactive state (#21543)
* pause image loading

* make thumbhashes wait too
2025-09-04 08:40:38 -05:00
Pedro SimÃŖo
b82e29fbb4 feat(mobile): add to albums from existing albums (#21554)
* feat(mobile): add to albums from existing albums

* formatted files

* used the new t() method for translation

* removed unused import
2025-09-04 08:39:10 -05:00
shenlong
ff19aea4ac fix: keyboard not dismissed in places page (#21583)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-04 08:38:44 -05:00
Jason Rasmussen
28179a3a1d feat: audit cleanup (#21567) 2025-09-03 22:50:27 +00:00
Min Idzelis
af1e18d07e fix: docker upload_location perm fix for dev (#21501) 2025-09-03 18:27:30 +01:00
shenlong
270a0ff986 chore: log name and createdAt of asset on hash failures (#21546)
* chore: log name and createdAt of asset on hash failures

* add album name to hash failure logs

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-03 09:58:03 -05:00
shenlong
9d3f10372d refactor: simplify background worker (#21558)
* chore: log hash starting

* chore: android - bump the min worker delay

* remove local sync only task and always enqueue background workers

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-03 09:57:30 -05:00
bo0tzz
2f1385a236 chore: request LLM disclosure in PR template (#21553)
Suggestions for different wording/placeholder are welcome
2025-09-03 09:11:24 -05:00
renovate[bot]
183a285584 chore(deps): update base-image to v202509021104 (major) (#21513)
chore(deps): update base-image to v202509021104

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-02 21:20:21 -05:00
Alex
5ce946bb5b fix: null check (#21536) 2025-09-02 19:21:41 -05:00
shenlong
674faf2e57 fix: local sync task never runs on iOS (#21491)
* fix: local sync task never runs on iOS

* chore: rename ios register method

* refactor from using dart callback to dart entrypoint + more logs

* check if file exists before hashing

* reschedule local sync task

* chore: rename background worker logger

* refactor: move file exists check inside repo

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-03 02:05:58 +05:30
Alex
4f7702c6bf fix: iOS portrait photo saved as jpg extension (#21388)
remove bad merged settings

remove console log
2025-09-02 14:26:12 -05:00
bo0tzz
28edf5664d fix: set specific AssetUpload permission on checkBulkUpload endpoint (#21470)
* fix: set specific AssetUpload permission on checkBulkUpload endpoint

Fixes #21456

* fix: make open-api
2025-09-02 14:21:14 -05:00
shenlong
ec2f94cae8 fix: handle datetime outside the valid range supported by dart (#21526)
* fix: handle datetime outside the valid range supported by dart

* add tests for tryFromSecondsSinceEpoch

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-09-02 14:20:49 -05:00
Mert
873f7921da fix(mobile): ensure current asset is set in asset viewer (#21504) 2025-09-02 11:03:44 -04:00
Mert
f06b054087 fix(mobile): decoding at higher resolution than necessary (#21503) 2025-09-02 11:03:17 -04:00
bo0tzz
0df910c0cd fix: don't run close-dupes workflow unnecessarily (#21333) 2025-09-02 16:04:07 +02:00
Derock
5b8d72e91a fix: filter null duplicate assets (#21507) 2025-09-02 01:20:01 -04:00
Yaros
e7b0a47be2 feat(mobile): copy file name by long-press (#21469) 2025-09-01 20:43:18 -05:00
Brandon Wees
60af3a4003 fix: show TabShellRoute when cold starting from deeplink (#21376) 2025-09-01 20:42:54 -05:00
Mert
6a4b6699e3 fix(mobile): increase thumbnail resolution (#21502)
increase thumbnail resolution
2025-09-01 20:19:38 -05:00
renovate[bot]
7d57fd1320 fix(deps): update machine-learning (#21296) 2025-09-01 19:44:19 -04:00
Snowknight26
bbc1c8186c fix(web): Show full date when hovering over photos date groups (#21462) 2025-08-31 16:30:35 -05:00
Brandon Wees
b76d69c0e5 fix(mobile): readonly mode disable tabs when in landscape mode (#21475)
fix: readonly mode disable bottom tabs when in landscape mode
2025-08-31 16:28:29 -05:00
Dag Stuan
fd2b7a344c fix(web): wait for image to load before playing memories. (#19757) 2025-08-31 08:50:33 -05:00
Weblate (bot)
03dafba522 chore(web): update translations (#21130)
Co-authored-by: AR7YK <jias.smarthome@gmail.com>
Co-authored-by: AbuKareem Tuffaha <abukareem.tuffaha@gmail.com>
Co-authored-by: Alberto Serluca <alberto.ser11@gmail.com>
Co-authored-by: Alfred Makne Poulsen <alfred@omj.dk>
Co-authored-by: Amir <amirikmel@gmail.com>
Co-authored-by: Aravinth <aravinth@tuta.io>
Co-authored-by: Arnau Mora <arnyminer.z@gmail.com>
Co-authored-by: Bora AtÄącÄą <boratici.acc@gmail.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
Co-authored-by: Davide <bbrienza99@gmail.com>
Co-authored-by: Denis Pacquier <denis.pacquier@gmail.com>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Dmitry Banny <dj.icecore@gmail.com>
Co-authored-by: Dominique BÊgin <dominique.begin.0@gmail.com>
Co-authored-by: FarSniper <ozmatlik@gmail.com>
Co-authored-by: Felipe Garcia <garcia.o.felipe@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Florian Ostertag <florian.kuepper@gmail.com>
Co-authored-by: Gustavo de LeÃŗn <alfonso.gus.deleon@gmail.com>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Jane <asetmalik@gmail.com>
Co-authored-by: JarodSch <jarod@e-post.me>
Co-authored-by: Jordy H <jordy@hoebergen.net>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: Leo Bottaro <github@leobottaro.com>
Co-authored-by: Marc Casillas <mcasillassu@gmail.com>
Co-authored-by: Martin Popovski <martinkozle@yahoo.com>
Co-authored-by: MatjaÅž T <matjaz@moj-svet.si>
Co-authored-by: Mikko Asikainen <mikko@asikainen.com>
Co-authored-by: MārtiÅ†ÅĄ Bruņenieks <martinsb@gmail.com>
Co-authored-by: Nico Kaiser <nico@kaiser.me>
Co-authored-by: Olaf Nielsen <solluh@mail.de>
Co-authored-by: PontusÖsterlindh <pontus@osterlindh.com>
Co-authored-by: Sergey Katsubo <skatsubo@gmail.com>
Co-authored-by: Shihfu Juan <xlion@xlion.tw>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: Taiki M <vexingly-many-mace@duck.com>
Co-authored-by: Tijs-B <tijs.bergmans@telenet.be>
Co-authored-by: Tony Kindermann <tonykindermann@gmail.com>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: Xo <xocodokie@users.noreply.hosted.weblate.org>
Co-authored-by: Yuki Ejima <ktd.gems@gmail.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: chamdim <chamdim@protonmail.com>
Co-authored-by: gablilli <gabriele.lilli0511@gmail.com>
Co-authored-by: namdomnau <namdomnau@users.noreply.hosted.weblate.org>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: thestrudl <rok.vidmar1997@gmail.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: МаĐēŅĐ¸Đŧ Đ“ĐžŅ€ĐŋиĐŊҖ҇ <gorpinicmaksim0@gmail.com>
2025-08-31 00:52:11 +02:00
github-actions
f15376a107 chore: version v1.140.1 2025-08-30 19:13:06 +00:00
Brandon Wees
32955915dd fix: show "preparing" when sharing in beta timeline (#21390)
* fix: show "preparing" when sharing in beta timeline

* embed dialog inside of share_action_button

* dont await the share sheet so "preparing" dialog disappears once share sheet presents

this mimics old timeline behavior

* chore: lint
2025-08-30 13:51:32 -05:00
Alex
aacb27ea5f fix: network criteria for upload LivePhotos (#21386) 2025-08-30 18:45:42 +00:00
Alex
d6b8c0926f chore: post release tasks (#21385) 2025-08-30 13:45:29 -05:00
Snowknight26
225af973c1 fix(web): Prevent changing asset location triggering keyboard shortcuts (#21451)
fix(web): Prevent changing asset location triggering asset keyboard shortcuts
2025-08-30 13:39:25 -05:00
Brandon Wees
b3372064e0 fix: default zoom level when location is not set (#21428) 2025-08-30 13:33:11 -05:00
Mert
303307e1ac fix(mobile): memory lane query (#21422) 2025-08-29 19:33:58 -05:00
Aaron Liu
f75c9dfe37 fix(devcontainer): logging typo (#21415) 2025-08-29 20:54:42 +00:00
Sergey Katsubo
f5954f4c9b chore(docs): Avoid /data in external library examples (#21357)
* Avoid /data for external libraries

* Remove mention of microservice containers

* Update docs/docs/features/libraries.md

Co-authored-by: Matthew Momjian <50788000+mmomjian@users.noreply.github.com>

---------

Co-authored-by: Matthew Momjian <50788000+mmomjian@users.noreply.github.com>
2025-08-29 10:24:21 -05:00
Min Idzelis
147accd957 fix: fix docker perms for dev (#21359) 2025-08-28 22:07:29 -04:00
Mert
9487241481 fix(server): refresh faces query (#21380) 2025-08-28 20:23:40 -04:00
Sergey Katsubo
460e1d4715 fix(server): folder sort order (#21383) 2025-08-28 20:22:40 -04:00
github-actions
b6223af5ca chore: version v1.140.0 2025-08-28 18:50:45 +00:00
Sudheer Reddy Puthana
8853079c54 feat(mobile): add read only mode (#19368)
* feat(mobile): Add Kid (Readonly) Mode toggle

This commit introduces a "Kid (Readonly) Mode" feature.

- Adds a `KidModeProvider` to manage the state of Kid Mode.
- Implements a `KidModeCheckbox` widget in the app bar dialog to toggle Kid Mode.
- When Kid Mode is enabled,
  - Disables selecting the multigrid & the bottom bar
  - Removes the top bar from view

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

Reverts the changes to devtools_options.yaml file

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

refactor: replace Kid Mode with Readonly Mode

This commit replaces the "Kid Mode" feature with a more generic "Readonly Mode".

- Renamed `KidModeProvider` to `ReadonlyModeProvider`.
- Readonly Mode state is now persisted in app settings.
- Added a new app setting `allowUserAvatarOverride` to toggle read-only mode.
- Updated translations.
- Added a message in the app bar dialog indicating when read-only mode is active.

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

Address comments -

- Removes the `allowUserAvatarOverride` setting.
- Hides the bottom gallery bar when read-only mode is enabled.
- Adds an icon on the main app bar when read-only mode is enabled with a snackbar.

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

Update to snackbar

- When toggling readonly mode from either the settings or the app bar, a snackbar notification will now appear.
- The readonly mode message in the profile drawer has been restyled.
- The upload button in the app bar is now hidden when readonly mode is enabled.

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

Removes clearing of snackbar

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

Address Comments

- Consolidated snackbar messages for enabling/disabling readonly mode.
- Ensured the "Select All" icon in asset group titles is hidden in readonly mode.

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

Adds in the missing translation keys for readonly_mode

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

Fix translation

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

Fix check failure for BorderRadius

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

Changes:
- Adjusted AppBar background color in readonly mode.
- Removes cross-out pencil icon button in favor of above.
- Hides the "Edit" icon next to date/time, disable description and onTap for people and location when readonly mode is enabled.

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

Address comments from Alex

- Moved readonly mode check to `GalleryAppBar` to hide the entire `TopControlAppBar` when readonly mode is enabled.
- Changed `toggleReadonlyMode` in `ImmichAppBar` to directly toggle the state.

Signed-off-by: Sudheer Puthana <Sud-Puth@users.noreply.github.com>

migrate readonly mode to new beta timeline

remove readonly mode from legacy UI

only show readonly functionality when on beta timeline

simplify selection icon

update generated provider

chore: more formatting

* fix: bad merge

* chore: use Notifier for readonlyModeProvider

* fix: drag select now honors readonly mode

* fix: disable asset bottom sheet in readonly

* fix: disable editing user icon when in readonly

* chore: remove generated file

* fix: disable tabs instead entire tab bar

This solves the issues with the scrubber

* chore: remove unneeded import

* chore: lint

* remove unused condition in bottomsheet

---------

Co-authored-by: Brandon Wees <brandonwees@gmail.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-28 17:30:15 +00:00
Johann
662d44536e feat(web): add geolocation utility (#20758)
* feat(geolocation):  add geolocation utility

* feat(web): geolocation utility - fix code review - 1

* feat(web): geolocation utility - fix code review - 2

* chore: cleanup

* chore: feedback

* feat(web): add animation and text

animation on locations change and action text on thumbnail

* styling, messages and filtering

* selected color

* format i18n

* fix lint

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-28 16:54:11 +00:00
xCJPECKOVERx
80fa5ec198 fix(web): Slideshow fade occurs when not in slideshow (#21326)
- ensure slideshow transition only shows when both enabled and in a slideshow
2025-08-28 11:47:53 -05:00
shenlong
0df88fc22b feat: beta background sync (#21243)
* feat: ios background sync

# Conflicts:
#	mobile/ios/Runner/Info.plist

* feat: Android sync

* add local sync worker and rename stuff

* group upload notifications

* uncomment onresume beta handling

* rename methods

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-28 14:11:54 +00:00
Snowknight26
e78144ea31 fix(web): Translate confirmation modal header and action buttons (#21330)
fix(web): Translate confirmation modal
2025-08-27 22:00:50 -05:00
Mert
227789225a fix(mobile): allow gestures in asset viewer before image is loaded (#21354)
* allow gestures while loading

* disable zoom
2025-08-27 21:52:51 -05:00
renovate[bot]
1298a74230 chore(deps): pin busybox docker tag to ab33eac (#21280)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-27 21:44:19 -05:00
Yaros
a3808c26ce fix(web): middle click not working on videos (#21304)
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-27 21:43:39 -05:00
Yaros
e2169f5316 fix(mobile): fast animations when "disable animations" enabled (#21309)
* fix(mobile): disable animations speed android

* use animationBehavior instead of workaround
2025-08-27 21:42:38 -05:00
Alex
f65dabd43a chore: post release tasks (#21228) 2025-08-27 21:17:56 -05:00
Mert
a5841a8bf4 fix(mobile): memory lane rebuild (#21350)
* avoid unnecessary timeline rebuild

* add key

* handle disabled memories

* avoid rebuild if no memories
2025-08-27 21:16:41 -05:00
Mert
dc6ac3aaec fix(mobile): thumbnail requests not being cancelled (#21331)
* fix requests not being cancelled

* handle thumbhash
2025-08-27 17:40:45 -04:00
prajwal
ae104ad7cc fix(web): add primary text color to file upload toast (#21340)
* fix:add primary text color to file upload toast

* fix:make progress bar visible in dark mode

* fix:make it text-primary

---------

Co-authored-by: prajwal <prajwal@hopbox.in>
2025-08-27 15:51:43 -04:00
Jason Rasmussen
868d5f56e2 fix: motion video extraction race condition (#21285)
fix: motion video extraction race ccondition
2025-08-27 15:10:55 -04:00
Jason Rasmussen
88072910da feat: asset metadata (#20446) 2025-08-27 14:31:23 -04:00
Jason Rasmussen
25a94bd117 fix(web): sign up double click (#21349) 2025-08-27 14:21:34 -04:00
Jason Rasmussen
76eaee3657 fix: timeline scroll error handling (#21324) 2025-08-26 17:07:26 -05:00
Yaros
d5fec0edab fix(mobile): capitalize month & day labels in beta timeline (#21323)
fix(mobile): capitalize month & day labels
2025-08-26 21:32:40 +00:00
xCJPECKOVERx
a7821a0b79 feat(web): Album picker shortcut info (#21273)
* - add shortcut info to album modal footer

* styling

* translation

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-08-26 21:31:58 +00:00
xCJPECKOVERx
73e67ebfea fix(web): album multi-select filter doesn't include other selected albums (#21322)
- submit albums directly from selected ids instead of albumModalRows
2025-08-26 16:30:24 -05:00
Snowknight26
0eaa054218 feat(web): Refresh album page after sharing (#21283) 2025-08-26 16:23:21 -05:00
Alex
2024d06cb7 chore: faq commercial guidelines (#21320) 2025-08-26 20:47:42 +00:00
Yaros
204299d500 fix(mobile): user storage quota not showing (#21263) 2025-08-26 15:34:19 -05:00
Jason Rasmussen
70e59c00d5 fix: invalid storage quota with decimals (#21271) 2025-08-26 14:46:29 -04:00
Mert
5405810a38 fix(mobile): skip animation for offscreen thumbnails (#21277) 2025-08-26 11:49:20 -04:00
Mert
e67265cef2 fix(mobile): caching thumbnails to disk (#21275) 2025-08-26 11:49:12 -04:00
renovate[bot]
19c53609e1 chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.3.0 docker digest to 7a4469b (#21286)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-26 11:07:27 +02:00
Jason Rasmussen
0d0bb0e2d9 fix(web): suppress auto-play errors (#21282) 2025-08-25 23:51:56 -04:00
Jason Rasmussen
8f1b505ba0 fix: prevent an offline asset from being used as a person feature photo (#21278) 2025-08-25 22:40:56 -04:00
Jason Rasmussen
d04675fb41 fix: dev-scripts (#21270)
fix/dev-scripts
2025-08-25 17:10:59 -04:00
Jason Rasmussen
acfd40b77a fix: album start/end dates on shared links (#21268) 2025-08-25 17:10:31 -04:00
Jason Rasmussen
840e43430c fix: docs typo (#21269) 2025-08-25 22:43:37 +02:00
Jason Rasmussen
a3e0c6cef5 fix: ignore abort errors (#21262) 2025-08-25 16:42:30 -04:00
Jason Rasmussen
63088b22e0 fix(web): handle multiple downloads in safari (#21259) 2025-08-25 12:59:59 -05:00
xCJPECKOVERx
d9d8beb92f fix(web): Duplicate arrow shortcuts go to next/previous duplicate when viewing assets (#21200)
- get assetviewer state and don't handle next/previous duplicate if isViewing
2025-08-25 13:33:48 -04:00
Jason Rasmussen
38a8a67be9 fix(web): allow numeric input fields to be zero (#21258) 2025-08-25 13:31:32 -04:00
Jason Rasmussen
7531ffcbfb refactor: service worker (#21250) 2025-08-25 11:52:57 -05:00
xCJPECKOVERx
d5f3629c49 fix(web): Album multi-select 'm' shortcut prevents typing m in title box (#21249)
change album multi-select shortcut to ctrl
2025-08-25 11:52:26 -05:00
Alex
be5b4cb1d1 chore: patch createdAt in AssetResponseDto (#21254) 2025-08-25 16:33:21 +00:00
Wingy
5fb8d651ec feat: expose createdAt in getAssetInfo (#21184)
* Expose createdAt in getAssetInfo

* Add missing createdAt fields
2025-08-25 10:27:21 -05:00
Luke Hagar
c2313f7a99 feat: add support for custom headers to TS SDK (#21205)
* Add support for custom headers

* fix: added assertNoApiKey function
2025-08-25 10:25:21 -05:00
Min Idzelis
59627e2b4c fix: devcontainer after pnpm changes (#21227) 2025-08-25 10:24:31 -05:00
gablilli
530bf059ad docs: update italian README: better wording, add some important sections, fixed links and alt texts (#21221) 2025-08-25 15:15:39 +00:00
github-actions
b44d2a241d chore: version v1.139.4 2025-08-25 02:39:18 +00:00
Vietbao Tran
1af10ded74 fix: wait for watched files to finish being written (#17100) (#21180)
This makes the external library watcher wait for files in watched directories to finish being written before queuing jobs for each file.
2025-08-24 21:33:24 -05:00
xCJPECKOVERx
3f1e11afcc chore(server): Improve add to multiple albums via bulk checks and inserts (#21052)
* - add addAssetIdsToAlbums to album repo
- update albumService to determine all albums and assets with access and coalesce into one set of album_assets to insert

* - remove hasAsset check (unnecessary)

* - lint

* - cleanup

* - remove success counts from addAssetsToAlbums results
- Fix tests

* open-api

* await album update
2025-08-24 21:33:10 -05:00
shenlong
28dce2d0df fix: use composite cache key in user circle avatar (#21220)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-08-24 21:32:24 -05:00
Alex
605764f226 chore: post release tasks (#21191) 2025-08-24 21:31:56 -05:00
Min Idzelis
44e1c83c84 fix: isolate docker host/container filesystem for node_modules and build output (#21167) 2025-08-24 13:09:45 -05:00
Lorenzo Farnararo
0729887c9c fix(web): handle edge cases in timeToSeconds function to prevent crashes (#21019)
Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
2025-08-23 22:42:37 +02:00
Nicholas
3bfa8b7575 fix: border around dark theme button on onboarding page (#20846)
fix border around dark theme button
2025-08-23 15:28:00 -05:00
Alex
3138048b96 fix: cannot load thumbnail from unknown content length (#21192)
* fix: cannot load thumbnail from unknown content length

* pr feedback

* pr feedback
2025-08-23 15:25:12 -05:00
github-actions
f8b41ea8aa chore: version v1.139.3 2025-08-23 16:37:46 +00:00
pojlFDlxCOvZ4Kg8y1l4
1d33ed6bed docs: update oauth.md - Authentik link leads to Page Not Found error (#21186)
Update oauth.md

Updated Authentik link
2025-08-23 16:30:41 +00:00
shenlong
2be1a58c5b fix: prefer local video if available (#21119)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-23 11:18:57 -05:00
Jason Rasmussen
03e7922589 fix: local offset hours (#21147) 2025-08-23 11:09:36 -05:00
Alex
801af34d9a fix: sync flow block oAuth login page navigation (#21187) 2025-08-23 16:09:00 +00:00
Alex
bedaa729e9 chore: post release tasks (#21140) 2025-08-23 11:06:13 -05:00
Alex
13c8a6e61d fix: parse correct metadata to userDto for SQlite store implmentation (#21154) 2025-08-23 11:02:24 -05:00
Alex
01edf6533b fix: shared album asset count query (#21157) 2025-08-23 10:46:40 -05:00
DevServices
30d0bea4df fix(web): add to multiple albums translation doesn't have plural formatting (#21087)
Co-authored-by: xCJPECKOVERx <cjpeckover@hotmail.ca>
2025-08-22 18:52:40 +02:00
github-actions
571504aa5e chore: version v1.139.2 2025-08-21 22:35:59 +00:00
Alex
65fafcab37 chore: manually pump 1.139.1 (#21127) 2025-08-21 22:33:51 +00:00
Alex
2fe0d17fe1 chore: install pnpm in prepare-release GHA (#21126)
* Revert "chore: version v1.139.1"

This reverts commit 89533a858f.

* chore: install pnpm in prepare-release GHA
2025-08-21 17:19:42 -05:00
Alex
b6a91746d8 chore: Revert version v1.139.1 (#21125)
Revert "chore: version v1.139.1"

This reverts commit 89533a858f.
2025-08-21 17:15:11 -05:00
github-actions
89533a858f chore: version v1.139.1 2025-08-21 22:02:08 +00:00
Alex
dc5a0f8c33 chore: pump the pump script (#21122)
* chore: pump the pump script

* pump 1.139.0
2025-08-21 17:00:48 -05:00
Alex
c443ab854c chore: ignore queue retry error (#21069)
* chore: ignore queue retry error

* remove items
2025-08-21 21:22:36 +00:00
Weblate (bot)
379c73818a chore(web): update translations (#20449)
Co-authored-by: -J- <heyj0e@tuta.io>
Co-authored-by: Aaron Fort Garcia <aaronfortg@gmail.com>
Co-authored-by: Abdulaziz Algassem -AKA INTERSTELLAR <INTERSTELLARAG@proton.me>
Co-authored-by: Abhijeet Bonde <abhijeetbonde19@gmail.com>
Co-authored-by: AbuKareem Tuffaha <abukareem.tuffaha@gmail.com>
Co-authored-by: Adam HavrÃĄnek <adamhavra@seznam.cz>
Co-authored-by: AdÃĄn Martin <disadamsdsdnts@gmail.com>
Co-authored-by: Aldil Bhaskoro Anggito Isdwihardjo <aldilbhaskoro@gmail.com>
Co-authored-by: Alessandro Arcangeli <alessandroarcangeli.rm@gmail.com>
Co-authored-by: Alexandre Garnier <zigarn@users.noreply.hosted.weblate.org>
Co-authored-by: Andreas Johansen <andreas@josern.com>
Co-authored-by: Ankit <ankitkr177@gmail.com>
Co-authored-by: Bartłomiej <20731216+Jarsey45@users.noreply.github.com>
Co-authored-by: Bernardo <bernaamg@gmail.com>
Co-authored-by: Carina Chenot <carina.chenot@gmail.com>
Co-authored-by: Chun-Hei Lam <chun.lam18@imperial.ac.uk>
Co-authored-by: Clemens <clemensstouten@gmail.com>
Co-authored-by: Daniel Bar-Dagan <hfmsite@gmail.com>
Co-authored-by: Davide Ciaccia <davideccia@gmail.com>
Co-authored-by: Demartino Marco <marcodemartino23@gmail.com>
Co-authored-by: Denis Pacquier <denis.pacquier@gmail.com>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Emilio RisueÃąo <emiliojrg@hotmail.com>
Co-authored-by: Felipe Garcia <garcia.o.felipe@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Francis C <normitomf@gmail.com>
Co-authored-by: Gudkov Gleb <linegm@yandex.ru>
Co-authored-by: Happy <happy2452354@users.noreply.hosted.weblate.org>
Co-authored-by: Harun Al Rasyid <aarunalr@pm.me>
Co-authored-by: Harun Al Rasyid <harunbam3@gmail.com>
Co-authored-by: Hassan Latif <hafizhassanlatif@gmail.com>
Co-authored-by: Hurricane-32 <rodrigorimo@hotmail.com>
Co-authored-by: Háģ“ NháēĨt Duy <axicenia@gmail.com>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Ivan Dimitrov <idimitrov08@gmail.com>
Co-authored-by: Javier Villanueva García <jvg2203@gmail.com>
Co-authored-by: Jiri GrÃļnroos <jiri.gronroos@iki.fi>
Co-authored-by: Jochem Bruijns <j@bruijns.org>
Co-authored-by: Jordy H <jordy@hoebergen.net>
Co-authored-by: Joshua Dyck <joshua.dyck@gmx.de>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: JustRensio <debouwer741@gmail.com>
Co-authored-by: Kachelkaiser <kachelkaiser@htpst.de>
Co-authored-by: Khalid AlMalki <moshtarek@gmail.com>
Co-authored-by: Lauritz Tieste <lauritz6000000@gmail.com>
Co-authored-by: Lenny Angst <lenny@familie-angst.ch>
Co-authored-by: Leo Bottaro <github@leobottaro.com>
Co-authored-by: LeonardoCasarotto <leonardo.casar8@gmail.com>
Co-authored-by: Luiz Henrique Moreira de Souza <cloud.5623tumacacori@gmail.com>
Co-authored-by: MSDNicrosoft <wang3311835119@hotmail.com>
Co-authored-by: Malo_F <malofauchetpro@gmail.com>
Co-authored-by: Mate Tohai <admin@tmate6.com>
Co-authored-by: Mathias <mathkot59@gmail.com>
Co-authored-by: Mathias Peene <mathiaspeene@proton.me>
Co-authored-by: MatjaÅž T <matjaz@moj-svet.si>
Co-authored-by: Matteo Marchi <marchimatteo@gmail.com>
Co-authored-by: Matteo Morari <matteo.morari04@gmail.com>
Co-authored-by: Maximilian <maxi@kazba.eu>
Co-authored-by: Mazharul Islam <mazharkafi@gmail.com>
Co-authored-by: Md. Asifur Rahman <meblasif@gmail.com>
Co-authored-by: Mher Saribekyan <saribekyanmher@gmail.com>
Co-authored-by: Mikko Asikainen <mikko@asikainen.com>
Co-authored-by: MuxuTruk <musutruk.music@gmail.com>
Co-authored-by: MārtiÅ†ÅĄ Bruņenieks <martinsb@gmail.com>
Co-authored-by: Nguyen Huy <hyquaq@gmail.com>
Co-authored-by: Nick Huang <nick80322@gmail.com>
Co-authored-by: Nico Kaiser <nico@kaiser.me>
Co-authored-by: NicolÃ˛ <nicveronese@gmail.com>
Co-authored-by: Oleksandr Yurov <oyurov@icloud.com>
Co-authored-by: Olivier Berten <olivier.berten@gmail.com>
Co-authored-by: Pavel Kazutsin <kazyten@ya.ru>
Co-authored-by: Pavel Miniutka <pavel.miniutka@gmail.com>
Co-authored-by: Petri Hämäläinen <petri.hamalainen@mailbox.org>
Co-authored-by: PontusÖsterlindh <pontus@osterlindh.com>
Co-authored-by: Ravipas Charoenwari <ravipasch@gmail.com>
Co-authored-by: Red Cyclops <shown-bleep-spiffy@duck.com>
Co-authored-by: Ron Turner <admin@meetronturner.com>
Co-authored-by: Runskrift <anders@rimfrost.nu>
Co-authored-by: Santiago <santiwever@hotmail.com>
Co-authored-by: Sergey Katsubo <skatsubo@gmail.com>
Co-authored-by: Shawn <xiaxinx@gmail.com>
Co-authored-by: Shihfu Juan <xlion@xlion.tw>
Co-authored-by: Sil Klaasboer <silklaasboer@outlook.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: TC Kuo <cot@embraced.co>
Co-authored-by: Taiki M <vexingly-many-mace@duck.com>
Co-authored-by: Theodor Onarheim <thbo@startmail.com>
Co-authored-by: Tijs-B <tijs.bergmans@telenet.be>
Co-authored-by: Toasterfritzi <friedrichmaitre1@gmail.com>
Co-authored-by: Tomi PÃļyskÃļ <tomi.poysko@gmail.com>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: Vladimir Cazacu <faptdivers@gmail.com>
Co-authored-by: Wim Joostens <wim.joostens@gmail.com>
Co-authored-by: Xabier Blanch GÃŗrriz <xabierblanch@gmail.com>
Co-authored-by: Yago RaÃąa Gayoso <yago.rana.gayoso@gmail.com>
Co-authored-by: Yuvaraj J <jyuvaraj03@gmail.com>
Co-authored-by: Zvonimir <zzrakic@protonmail.com>
Co-authored-by: abb128 <abb128@sapples.net>
Co-authored-by: adri1m64 <adrien.melle@laposte.net>
Co-authored-by: bornacrncic98 <bornacrncic98@gmail.com>
Co-authored-by: chamdim <chamdim@protonmail.com>
Co-authored-by: dark&white <darkwhite@users.noreply.hosted.weblate.org>
Co-authored-by: eav5jhl0 <eav5jhl0@users.noreply.hosted.weblate.org>
Co-authored-by: fireflies38 <norm@jbehn.de>
Co-authored-by: gablilli <gabriele.lilli0511@gmail.com>
Co-authored-by: juan david Barreto <zerodarkzone@gmail.com>
Co-authored-by: labolstad <lasse.bolstad@gmail.com>
Co-authored-by: meep <meep@meeps.dev>
Co-authored-by: nazo6 <git@nazo6.dev>
Co-authored-by: nested-universe <ekzistadismo@gmail.com>
Co-authored-by: nosajthenitram <nosajthenitram@cafemartin.com>
Co-authored-by: pawel <Pikim@tlen.pl>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: therry47 <soulietherry@gmail.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: Đ’ŅŅ‡ĐĩҁĐģав Đ›ŅƒĐēŅŒŅĐŊĐĩĐŊĐēĐž <madeinchuguev@gmail.com>
Co-authored-by: ĐœÄ•Ņ‚Ņ€Đ¸ ХаĐŊŅ‚ÄƒŅ€ Ņ‹Đ˛Đ°Đģĕ ĐŖĐŋа-ĐœĐ¸Ņ‡Ņ‡Đ¸ <mefisteron@gmail.com>
Co-authored-by: МаĐēŅĐ¸Đŧ Đ“ĐžŅ€ĐŋиĐŊҖ҇ <gorpinicmaksim0@gmail.com>
Co-authored-by: МаĐēŅĐ¸Đŧ Đ“ĐžŅ€ĐŋиĐŊҖ҇ <gorpinicmaksim5@gmail.com>
Co-authored-by: ĐœĐ¸Ņ…Đ°Đ¸Đģ Đ—Đ°Ņ…Đ°Ņ€ĐžĐ˛ <mike.zaharov@gmail.com>
Co-authored-by: ė•ˆė„¸í›ˆ <on9686@gmail.com>
2025-08-21 20:48:05 +00:00
Alex
73bb05c5f9 chore: Revert version v1.139.0 (#21121)
Revert "chore: version v1.139.0"

This reverts commit b69470c69e.
2025-08-21 20:41:46 +00:00
github-actions
b69470c69e chore: version v1.139.0 2025-08-21 20:26:48 +00:00
Daniel Dietzler
34255453b1 chore: update docs to use pnpm (#21113) 2025-08-21 15:25:05 -05:00
Arthur Normand
4e03b06ff7 feat: add a counter to the duplicate utility (#21109)
Added a counter to the duplicate utility
2025-08-21 15:21:31 -05:00
Alex
9bb211f56f fix: thumbnail rendering on backup asset detail tile (#21120) 2025-08-21 20:20:29 +00:00
shenlong
6f4f79d8cc feat: migrate store to sqlite (#21078)
* add store entity and migration

* make store service take both isar and drift repos

* migrate and switch store on beta timeline state change

* chore: make drift variables final

* dispose old store before switching repos

* use store to update values for beta timeline

* change log service to use the proper store

* migrate store when beta already enabled

* use isar repository to check beta timeline in store service

* remove unused update method from store repo

* dispose after create

* change watchAll signature in store repo

* fix test

* rename init isar to initDB

* request user to close and reopen on beta migration

* fix tests

* handle empty version in migration

* wait for cache to be populated after migration

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-21 14:58:50 -05:00
shenlong
ed3997d844 fix: skip albums selected or excluded from backups from deletions (#21116)
* skip albums selected or excluded from backups from deletions

* filter empty local albums from library page

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-08-21 13:44:07 -05:00
Mert
fb59fa343d feat(mobile): optimized thumbnail widget (#21073)
* thumbnail widget

* use animation ticker, improvements

* use static thumbnail resolution for now

* fix android sample size

* free memory sooner

* formatting

* tweaks

* wait for disposal

* remove debug prints

* take two on animation

* fix

* remote constructor

* missed one

* unused imports

* unnecessary import

* formatting
2025-08-21 18:06:02 +00:00
Alex
ab2849781a feat: show remainder assets info (#21114)
* feat: show remainder assets info

* pr feedback
2025-08-21 17:18:31 +00:00
Jason Rasmussen
66c657ca8a chore: remove web/Dockerfile (#21096) 2025-08-21 12:55:23 -04:00
Alex
c245208106 fix: resume upload on launch (really fix it) (#21106) 2025-08-21 02:36:03 +00:00
Mert
99d6673503 feat(mobile): platform image providers (#20927)
* platform image providers

* use key

* fix cache manager

* more logs, cancel on dispose instead

* split into separate files

* fix saving to cache

* cancel multi-stage provider

* refactored `getInitialImage`

* only wait for disposal for full images

* cached image works

* formatting

* lower asset viewer ram usage

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-20 19:36:44 +00:00
Jason Rasmussen
9ff37b6870 chore: bump multer (#21100) 2025-08-20 14:16:22 -04:00
Alex
0e7816130b chore: use foreground service for uploading large file on Android (#21095)
* chore: use foreground service for uploading large file on Android

* Update main.dart

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

* Update mobile/lib/main.dart

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

---------

Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
2025-08-20 22:59:24 +05:30
shenlong
a1beb0a87d chore: update build and test mobile actions to not use npm (#21079)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-08-19 22:50:48 -05:00
xCJPECKOVERx
c4ac2e345f fix(web): add to multiple albums translation doesn't have plural formatting (#21076) 2025-08-20 01:55:09 +00:00
Alex
f422b341d1 chore: generate mobile translation file in GHA (#21070) 2025-08-19 16:13:35 -05:00
bo0tzz
90538d2535 chore: device input field for issue template (#21066) 2025-08-19 17:13:52 +00:00
Mert
abc7bfa0ba feat(mobile): platform thumbnail api (#20910) 2025-08-19 12:48:35 -04:00
renovate[bot]
60a809d7b4 fix(deps): update typescript-projects (#20879)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
2025-08-19 15:28:43 +01:00
Alex
cda7249a6a fix: add to multi album selection (#21061) 2025-08-19 09:21:18 -05:00
Thomas
47566c1a4a chore(web): make search result loading behaviour more consistent (#20741)
The current behaviour will intersect if the page is scrolled about 90% down
which works okay for a small number of assets, but does not scale well with
large amounts of assets. Instead of relying in proportional values, it may be
more sensible to use a consistent measure for loading more pages. A simple and
sensible suggestion may be to load another page when there is only one more
viewport worth of assets to display. It can be refined and revisited in future,
but it seems to work relatively well in my testing and prevents the issues
which occur with large amounts of assets.

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-19 09:09:39 -05:00
renovate[bot]
f08002d48f chore(deps): update docker.io/valkey/valkey:8-bookworm docker digest to a137a2b (#21043)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 09:13:24 -04:00
renovate[bot]
7186914531 chore(deps): update github-actions (#20875)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 09:12:27 -04:00
renovate[bot]
d38ab93484 chore(deps): update base-image to v202508191104 (major) (#21049)
chore(deps): update base-image to v202508191104

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 09:11:49 -04:00
Min Idzelis
845b0f2073 chore: use pnpm for builds (#19752)
* Migrate from npm to pnpm across entire project

â€ĸ Update all GitHub workflow files to use pnpm instead of npm
â€ĸ Replace npm commands with pnpm equivalents in devcontainer scripts
â€ĸ Remove package-lock.json files and update to use pnpm-lock.yaml
â€ĸ Consolidate node version references to use server/.nvmrc

* Refine pnpm migration based on review feedback

â€ĸ Replace SKIP_SHARP_FILTERING with SHARP_IGNORE_GLOBAL_LIBVIPS environment variable
â€ĸ Improve Sharp package filtering to include specific Linux architectures for Docker builds
â€ĸ Optimize Dockerfile dependency caching with improved layer structure
â€ĸ Clean up workspace configuration and remove redundant settings

* Address additional review feedback for pnpm migration

â€ĸ Fix node-version-file paths in GitHub workflow configurations
â€ĸ Refactor .pnpmfile.cjs to use switch statement for better code organization
â€ĸ Correct cache type typo in fix-format workflow
â€ĸ Simplify Vite configuration by merging configs inline
â€ĸ Update package description for consistency

* Use 'server/.nvmrc' for fix-format.yml GHA

* Delete npm locks

* Remove Docker volume isolation for node_modules directories

â€ĸ Remove volume mounts for node_modules and related directories
â€ĸ Allow shared access between host and container filesystem
â€ĸ Update init container to handle file ownership with conditional existence check

* Remove unused Docker volumes and volume mounts

â€ĸ Remove node_modules volume mounts from devcontainer configuration
â€ĸ Remove unused named volumes for pnpm-store, node_modules, and cache directories
â€ĸ Clean up Docker Compose configuration after removing volume isolation

* Fix typescript-sdk package issues

â€ĸ Remove unknown "build" dependency that was incorrectly added to package.json
â€ĸ Update pnpm-lock.yaml to reflect dependency removal

* Add pnpm setup to mobile workflow for translation formatting

â€ĸ Add pnpm action setup step to mobile unit tests workflow
â€ĸ Required for translation file formatting and sorting operations

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-08-19 08:55:24 -04:00
Alex
acb1e513a7 chore: post release tasks (#21042) 2025-08-19 08:37:17 -04:00
renovate[bot]
4d4e54967d chore(deps): update grafana/grafana docker tag to v12.1.1 (#21048)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 13:02:57 +01:00
renovate[bot]
e2dcebfe6c chore(deps): update dependency @types/node to ^22.17.1 (#21047)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 13:13:49 +02:00
Arthur Normand
d4f2b43f64 fix: improve duplicate utility text contrast (#21045) 2025-08-19 02:18:52 +00:00
Arthur Normand
f343b0e58f fix: always show resolution in details panel (#21046)
Always show resolution in details panel
2025-08-19 02:17:45 +00:00
Aaron Tulino
a8b4a5e856 fix(mobile): sort local album by most recently modified (#21038)
Sort with SQL instead

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-19 02:13:40 +00:00
renovate[bot]
e7e030279b fix(deps): update machine-learning (#21044) 2025-08-18 21:55:49 -04:00
xCJPECKOVERx
9ff664ed36 feat(web): Add to Multiple Albums (#20072)
* Multi add to album picker:
- update modal for multi select
- Update add-to-album and add-to-album-action to work with new array return from AlbumPickerModal
- Add asset-utils.addAssetsToAlbums (incomplete)

* initial addToAlbums endpoint

* - fix endpoint
- add test

* - update return type
- make open-api

* - simplify return dto
- handle notification

* - fix returns
- clean up

* - update i18n
- format & check

* - checks

* - correct successId count
- fix assets_cannot_be_added language call

* tests

* foromat

* refactor

* - update successful add message to included total attempted

* - fix web test
- format i18n

* - fix open-api

* - fix imports to resolve checks

* - PR suggestions

* open-api

* refactor addAssetsToAlbums

* refactor it again

* - fix error returns and tests

* - swap icon for IconButton
- don't nest the buttons

* open-api

* - Cleanup multi-select button to match Thumbnail

* merge and openapi

* - remove onclick from icon element

* - fix double onClose call with keyboard shortcuts

* - spelling and formatting
- apply new api permission

* - open-api

* chore: styling

* translation

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-19 00:42:47 +00:00
Jason Rasmussen
e00556a34a feat: get metadata about the current api key (#21027) 2025-08-18 18:15:03 -05:00
xCJPECKOVERx
a313e4338e feat(web): Skip duplicates (#20880)
* - add skip button to duplicates-compare-control

* - cleanup

* - change to next/previous
- move buttons to duplicates page, intead of compareControl
- add param based control/position

* - remove index param on keep/dedupe all

* - cleanup

* - cleanup index corrections

* - add left/right arrow keyboard shortcuts for previous/next
- cleanup

* - cleanup
2025-08-18 18:11:53 -05:00
Aaron Tulino
257b0c74af fix(mobile): show most recent image in album as thumbnail (#21037)
Show most recent image in album as thumbnail
Fixes #21004
2025-08-18 18:02:18 -05:00
github-actions
3d515f5072 chore: version v1.138.1 2025-08-18 15:23:35 +00:00
Alex
ec01db5c8b refactor: bottom sheet action button (#20964)
* fix: incorrect archive action shown in asset viewer'

* Refactor

* use enums syntax and add tests
2025-08-18 10:20:08 -05:00
bo0tzz
cd6d8fcdfe chore: elaborate dupe bot comment (#21025)
Hopefully this stops people opening new threads
2025-08-18 13:36:53 +00:00
Alex
1198311d64 fix: sync block login progress (#20939) 2025-08-14 19:08:04 -05:00
Alex
1a4eab9655 fix: locked photos shown in beta timeline favorite page (#20937) 2025-08-14 23:03:33 +00:00
Brandon Wees
1926c90780 feat(mobile): shared album activities (#20714)
* feat(mobile): shared album activities

* add like buttons and fix behavior of unliking

* fix: conditionally show activity button and fix title truncations

* fix(mobile): newest/oldest album sort (#20743)

* fix(mobile): newest/oldest album sort

* chore: use sqlite to determine album asset timestamps

* Fix missing future

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

* fix: async handling of sort

* chore: tests

* chore: code review changes

* fix: use created at for newest asset

* fix: use localDateTime for sorting

* chore: cleanup

* chore: use final

* feat: loading indicator

---------

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

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-14 22:50:56 +00:00
Alex
4d5975b717 fix: pinch in finished as zoomed in (#20936) 2025-08-14 17:39:14 -05:00
Alex
8cbd6b29c4 fix: sync remote before starting backup (#20906) 2025-08-14 17:19:08 -05:00
Alex
8c1b630a2b fix: backup resume more reliable on app start up (#20907) 2025-08-14 17:09:32 -05:00
Brandon Wees
c961d2aaf7 fix(mobile): don't show view in timeline button when opening cast dialog (#20934)
fix: don't show view in timeline button when opening cast dialog
2025-08-14 17:09:17 -05:00
Brandon Wees
41c75dc93e fix(mobile): always show cast button (#20935) 2025-08-14 17:09:01 -05:00
Daniel Dietzler
f92247c99b fix: oauth auto-login infinite loop (#20904) 2025-08-13 19:45:06 -04:00
renovate[bot]
53f9fc2d1c chore(deps): update docker.io/valkey/valkey:8-bookworm docker digest to 5b8f8c3 (#20874)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-13 21:49:38 +02:00
github-actions
bede19a3ca chore: version v1.138.0 2025-08-13 17:08:29 +00:00
Alex
aefa62b234 fix: asset_viewer page viewing experience (#20889)
* fix: zoomed in effect on swiped when bottom sheet is open

* fix: memory leaked

* fix: asset out of range when swiping in asset_viewer
2025-08-13 11:35:42 -05:00
renovate[bot]
b3fb831994 fix(deps): update machine-learning (#20878)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-13 11:24:09 -04:00
926 changed files with 91563 additions and 76154 deletions

View File

@@ -12,7 +12,6 @@ services:
- server_node_modules:/workspaces/immich/server/node_modules
- web_node_modules:/workspaces/immich/web/node_modules
- ${UPLOAD_LOCATION}/photos:/data
- ${UPLOAD_LOCATION}/photos/upload:/data/upload
- /etc/localtime:/etc/localtime:ro
database:

View File

@@ -49,10 +49,11 @@ fix_permissions() {
log "Fixing permissions for ${IMMICH_WORKSPACE}"
run_cmd sudo find "${IMMICH_WORKSPACE}/server/upload" -not -path "${IMMICH_WORKSPACE}/server/upload/postgres/*" -not -path "${IMMICH_WORKSPACE}/server/upload/postgres" -exec chown node {} +
# Change ownership for directories that exist
for dir in "${IMMICH_WORKSPACE}/.vscode" \
"${IMMICH_WORKSPACE}/server/upload" \
"${IMMICH_WORKSPACE}/.pnpm-store" \
"${IMMICH_WORKSPACE}/.github/node_modules" \
"${IMMICH_WORKSPACE}/cli/node_modules" \
"${IMMICH_WORKSPACE}/e2e/node_modules" \
"${IMMICH_WORKSPACE}/open-api/typescript-sdk/node_modules" \

View File

@@ -8,21 +8,23 @@ services:
- IMMICH_SERVER_URL=http://127.0.0.1:2283/
volumes: !override
- ..:/workspaces/immich
- cli_node_modules:/workspaces/immich/cli/node_modules
- e2e_node_modules:/workspaces/immich/e2e/node_modules
- open_api_node_modules:/workspaces/immich/open-api/typescript-sdk/node_modules
- server_node_modules:/workspaces/immich/server/node_modules
- web_node_modules:/workspaces/immich/web/node_modules
- ${UPLOAD_LOCATION:-upload1-devcontainer-volume}${UPLOAD_LOCATION:+/photos}:/data
- ${UPLOAD_LOCATION:-upload2-devcontainer-volume}${UPLOAD_LOCATION:+/photos/upload}:/data/upload
- ${UPLOAD_LOCATION:-upload-devcontainer-volume}${UPLOAD_LOCATION:+/photos}:/data
- /etc/localtime:/etc/localtime:ro
- pnpm-store:/usr/src/app/.pnpm-store
- server-node_modules:/usr/src/app/server/node_modules
- web-node_modules:/usr/src/app/web/node_modules
- github-node_modules:/usr/src/app/.github/node_modules
- cli-node_modules:/usr/src/app/cli/node_modules
- docs-node_modules:/usr/src/app/docs/node_modules
- e2e-node_modules:/usr/src/app/e2e/node_modules
- sdk-node_modules:/usr/src/app/open-api/typescript-sdk/node_modules
- app-node_modules:/usr/src/app/node_modules
- sveltekit:/usr/src/app/web/.svelte-kit
- coverage:/usr/src/app/web/coverage
immich-web:
env_file: !reset []
immich-machine-learning:
env_file: !reset []
database:
env_file: !reset []
environment: !override
@@ -33,17 +35,8 @@ services:
POSTGRES_HOST_AUTH_METHOD: md5
volumes:
- ${UPLOAD_LOCATION:-postgres-devcontainer-volume}${UPLOAD_LOCATION:+/postgres}:/var/lib/postgresql/data
redis:
env_file: !reset []
volumes:
# Node modules for each service to avoid conflicts and ensure consistent dependencies
cli_node_modules:
e2e_node_modules:
open_api_node_modules:
server_node_modules:
web_node_modules:
upload1-devcontainer-volume:
upload2-devcontainer-volume:
upload-devcontainer-volume:
postgres-devcontainer-volume:

View File

@@ -3,6 +3,11 @@
# shellcheck disable=SC1091
source /immich-devcontainer/container-common.sh
log "Preparing Immich Nest API Server"
log ""
export CI=1
run_cmd pnpm --filter immich install
log "Starting Nest API Server"
log ""
cd "${IMMICH_WORKSPACE}/server" || (
@@ -11,7 +16,7 @@ cd "${IMMICH_WORKSPACE}/server" || (
)
while true; do
run_cmd node ./node_modules/.bin/nest start --debug "0.0.0.0:9230" --watch
run_cmd pnpm --filter immich exec nest start --debug "0.0.0.0:9230" --watch
log "Nest API Server crashed with exit code $?. Respawning in 3s ..."
sleep 3
done

View File

@@ -3,6 +3,13 @@
# shellcheck disable=SC1091
source /immich-devcontainer/container-common.sh
export CI=1
log "Preparing Immich Web Frontend"
log ""
run_cmd pnpm --filter @immich/sdk install
run_cmd pnpm --filter @immich/sdk build
run_cmd pnpm --filter immich-web install
log "Starting Immich Web Frontend"
log ""
cd "${IMMICH_WORKSPACE}/web" || (
@@ -16,7 +23,7 @@ until curl --output /dev/null --silent --head --fail "http://127.0.0.1:${IMMICH_
done
while true; do
run_cmd node ./node_modules/.bin/vite dev --host 0.0.0.0 --port "${DEV_PORT}"
run_cmd pnpm --filter immich-web exec vite dev --host 0.0.0.0 --port "${DEV_PORT}"
log "Web crashed with exit code $?. Respawning in 3s ..."
sleep 3
done

View File

@@ -6,9 +6,6 @@ source /immich-devcontainer/container-common.sh
log "Setting up Immich dev container..."
fix_permissions
log "Installing npm dependencies (node_modules)..."
install_dependencies
log "Setup complete, please wait while backend and frontend services automatically start"
log
log "If necessary, the services may be manually started using"

2
.github/.nvmrc vendored
View File

@@ -1 +1 @@
22.18.0
22.19.0

View File

@@ -64,6 +64,11 @@ body:
- label: Web
- label: Mobile
- type: input
attributes:
label: Device make and model
placeholder: Samsung S25 Android 16
- type: textarea
validations:
required: true

1
.github/labeler.yml vendored
View File

@@ -6,7 +6,6 @@ cli:
documentation:
- changed-files:
- any-glob-to-any-file:
- docs/blob/**
- docs/docs/**
- docs/src/**
- docs/static/**

28
.github/package-lock.json generated vendored
View File

@@ -1,28 +0,0 @@
{
"name": ".github",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"devDependencies": {
"prettier": "^3.5.3"
}
},
"node_modules/prettier": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
"integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
"dev": true,
"license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
}
}
}

View File

@@ -34,3 +34,7 @@ The `/api/something` endpoint is now `/api/something-else`
- [ ] 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/`)
## Please describe to which degree, if any, an LLM was used in creating this pull request.
...

View File

@@ -32,24 +32,18 @@ jobs:
permissions:
contents: read
outputs:
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
mobile:
- 'mobile/**'
workflow:
- '.github/workflows/build-mobile.yml'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
force-filters: |
- '.github/workflows/build-mobile.yml'
force-events: 'workflow_call,workflow_dispatch'
build-sign-android:
name: Build and sign Android
@@ -57,11 +51,11 @@ jobs:
permissions:
contents: read
# Skip when PR from a fork
if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && needs.pre-job.outputs.should_run == 'true' }}
if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' && fromJSON(needs.pre-job.outputs.should_run).mobile == true }}
runs-on: mich
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
ref: ${{ inputs.ref || github.sha }}
persist-credentials: false
@@ -79,7 +73,7 @@ jobs:
- name: Restore Gradle Cache
id: cache-gradle-restore
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4
uses: actions/cache/restore@0400d5f644dc74513175e3cd8d07132dd4860809 # v4
with:
path: |
~/.gradle/caches
@@ -106,7 +100,7 @@ jobs:
run: flutter pub get
- name: Generate translation file
run: make translation
run: dart run easy_localization:generate -S ../i18n && dart run bin/generate_keys.dart
working-directory: ./mobile
- name: Generate platform APIs
@@ -136,7 +130,7 @@ jobs:
- name: Save Gradle Cache
id: cache-gradle-save
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4
uses: actions/cache/save@0400d5f644dc74513175e3cd8d07132dd4860809 # v4
if: github.ref == 'refs/heads/main'
with:
path: |

View File

@@ -19,7 +19,7 @@ jobs:
actions: write
steps:
- name: Check out code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false

View File

@@ -29,25 +29,28 @@ jobs:
working-directory: ./cli
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
# Setup .npmrc file to publish to npm
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './cli/.nvmrc'
registry-url: 'https://registry.npmjs.org'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Prepare SDK
run: npm ci --prefix ../open-api/typescript-sdk/
- name: Build SDK
run: npm run build --prefix ../open-api/typescript-sdk/
- run: npm ci
- run: npm run build
- run: npm publish
- name: Setup typescript-sdk
run: pnpm install && pnpm run build
working-directory: ./open-api/typescript-sdk
- run: pnpm install --frozen-lockfile
- run: pnpm build
- run: pnpm publish
if: ${{ github.event_name == 'release' }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -62,7 +65,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
@@ -73,7 +76,7 @@ jobs:
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
- name: Login to GitHub Container Registry
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
if: ${{ !github.event.pull_request.head.repo.fork }}
with:
registry: ghcr.io
@@ -88,7 +91,7 @@ jobs:
- name: Generate docker image tags
id: metadata
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0
with:
flavor: |
latest=false

View File

@@ -8,8 +8,18 @@ name: Close likely duplicates
permissions: {}
jobs:
should_run:
runs-on: ubuntu-latest
outputs:
should_run: ${{ steps.should_run.outputs.run }}
steps:
- id: should_run
run: echo "run=${{ github.event_name == 'issues' || github.event.discussion.category.name == 'Feature Request' }}" >> $GITHUB_OUTPUT
get_body:
runs-on: ubuntu-latest
needs: should_run
if: ${{ needs.should_run.outputs.should_run == 'true' }}
env:
EVENT: ${{ toJSON(github.event) }}
outputs:
@@ -22,23 +32,24 @@ jobs:
get_checkbox_json:
runs-on: ubuntu-latest
needs: get_body
needs: [get_body, should_run]
if: ${{ needs.should_run.outputs.should_run == 'true' }}
container:
image: yshavit/mdq:0.7.2
image: ghcr.io/immich-app/mdq:main@sha256:d8ae47cf2e6cf4e2559bd57a60b73674fe44f897cba2c2bddff2987a05be10a4
outputs:
json: ${{ steps.get_checkbox.outputs.json }}
checked: ${{ steps.get_checkbox.outputs.checked }}
steps:
- id: get_checkbox
env:
BODY: ${{ needs.get_body.outputs.body }}
run: |
JSON=$(echo "$BODY" | base64 -d | /mdq --output json '# I have searched | - [?] Yes')
echo "json=$JSON" >> $GITHUB_OUTPUT
CHECKED=$(echo "$BODY" | base64 -d | /mdq --output json '# I have searched | - [?] Yes' | jq '.items[0].list[0].checked // false')
echo "checked=$CHECKED" >> $GITHUB_OUTPUT
close_and_comment:
runs-on: ubuntu-latest
needs: get_checkbox_json
if: ${{ !fromJSON(needs.get_checkbox_json.outputs.json).items[0].list[0].checked }}
needs: [get_checkbox_json, should_run]
if: ${{ needs.should_run.outputs.should_run == 'true' && needs.get_checkbox_json.outputs.checked != 'true' }}
permissions:
issues: write
discussions: write
@@ -51,7 +62,7 @@ jobs:
run: |
gh api graphql \
-f issueId="$NODE_ID" \
-f body="This issue has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one." \
-f body="This issue has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one. If you're sure this is not a duplicate, please leave a comment and we will reopen the thread if necessary." \
-f query='
mutation CommentAndCloseIssue($issueId: ID!, $body: String!) {
addComment(input: {
@@ -77,7 +88,7 @@ jobs:
run: |
gh api graphql \
-f discussionId="$NODE_ID" \
-f body="This discussion has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one." \
-f body="This discussion has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one. If you're sure this is not a duplicate, please leave a comment and we will reopen the thread if necessary." \
-f query='
mutation CommentAndCloseDiscussion($discussionId: ID!, $body: String!) {
addDiscussionComment(input: {

View File

@@ -44,13 +44,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
uses: github/codeql-action/init@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -63,7 +63,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
uses: github/codeql-action/autobuild@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3
# â„šī¸ 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
@@ -76,6 +76,6 @@ jobs:
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
uses: github/codeql-action/analyze@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3
with:
category: '/language:${{matrix.language}}'

View File

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

View File

@@ -18,32 +18,28 @@ jobs:
permissions:
contents: read
outputs:
should_run: ${{ steps.found_paths.outputs.docs == 'true' || steps.found_paths.outputs.open-api == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
docs:
- 'docs/**'
workflow:
- '.github/workflows/docs-build.yml'
open-api:
- 'open-api/immich-openapi-specs.json'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' || github.ref_name == 'main' }}" >> "$GITHUB_OUTPUT"
force-filters: |
- '.github/workflows/docs-build.yml'
force-events: 'release'
force-branches: 'main'
build:
name: Docs Build
needs: pre-job
permissions:
contents: read
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).docs == true }}
runs-on: ubuntu-latest
defaults:
run:
@@ -51,25 +47,28 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './docs/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run npm install
run: npm ci
- name: Run install
run: pnpm install
- name: Check formatting
run: npm run format
run: pnpm format
- name: Run build
run: npm run build
run: pnpm build
- name: Upload build output
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2

View File

@@ -20,7 +20,7 @@ jobs:
run: echo 'The triggering workflow did not succeed' && exit 1
- name: Get artifact
id: get-artifact
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
with:
script: |
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
@@ -38,7 +38,7 @@ jobs:
return { found: true, id: matchArtifact.id };
- name: Determine deploy parameters
id: parameters
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
env:
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
with:
@@ -108,13 +108,13 @@ jobs:
if: ${{ fromJson(needs.checks.outputs.artifact).found && fromJson(needs.checks.outputs.parameters).shouldDeploy }}
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Load parameters
id: parameters
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
env:
PARAM_JSON: ${{ needs.checks.outputs.parameters }}
with:
@@ -125,7 +125,7 @@ jobs:
core.setOutput("shouldDeploy", parameters.shouldDeploy);
- name: Download artifact
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
env:
ARTIFACT_JSON: ${{ needs.checks.outputs.artifact }}
with:

View File

@@ -14,7 +14,7 @@ jobs:
pull-requests: write
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false

View File

@@ -16,24 +16,27 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6
uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: 'Checkout'
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ steps.generate-token.outputs.token }}
persist-credentials: true
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './server/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Fix formatting
run: make install-all && make format-all
@@ -45,7 +48,7 @@ jobs:
message: 'chore: fix formatting'
- name: Remove label
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
if: always()
with:
script: |

128
.github/workflows/merge-translations.yml vendored Normal file
View File

@@ -0,0 +1,128 @@
name: Merge translations
on:
workflow_dispatch:
workflow_call:
secrets:
PUSH_O_MATIC_APP_ID:
required: true
PUSH_O_MATIC_APP_KEY:
required: true
WEBLATE_TOKEN:
required: true
inputs:
skip:
description: 'Skip translations'
required: false
type: boolean
permissions: {}
env:
WEBLATE_HOST: 'https://hosted.weblate.org'
WEBLATE_COMPONENT: 'immich/immich'
jobs:
merge:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: Find translation PR
id: find_pr
if: ${{ inputs.skip != true }}
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
PR=$(gh pr list --repo $GITHUB_REPOSITORY --author weblate --json number,mergeable)
echo "$PR"
PR_NUMBER=$(echo "$PR" | jq '
if length == 1 then
.[0].number
else
error("Expected exactly 1 entry, got \(length)")
end
' 2>&1) || exit 1
echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_OUTPUT
echo "Selected PR $PR_NUMBER"
if ! echo "$PR" | jq -e '.[0].mergeable == "MERGEABLE"'; then
echo "PR is not mergeable"
exit 1
fi
- name: Generate a token
id: generate_token
if: ${{ inputs.skip != true }}
uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Lock weblate
if: ${{ inputs.skip != true }}
env:
WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }}
run: |
curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/lock/" -d lock=true
- name: Commit translations
if: ${{ inputs.skip != true }}
env:
WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }}
run: |
curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/repository/" -d operation=commit
curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/repository/" -d operation=push
- name: Merge PR
id: merge_pr
if: ${{ inputs.skip != true }}
env:
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
PR_NUMBER: ${{ steps.find_pr.outputs.PR_NUMBER }}
run: |
set -euo pipefail
REVIEW_ID=$(gh api -X POST "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/reviews" --field event='APPROVE' --field body='Automatically merging translations PR' \
| jq '.id')
echo "REVIEW_ID=$REVIEW_ID" >> $GITHUB_OUTPUT
gh pr merge "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --auto --squash
- name: Wait for PR to merge
if: ${{ inputs.skip != true }}
env:
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
PR_NUMBER: ${{ steps.find_pr.outputs.PR_NUMBER }}
REVIEW_ID: ${{ steps.merge_pr.outputs.REVIEW_ID }}
run: |
# So we clean up no matter what
set +e
for i in {1..100}; do
if gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json state | jq -e '.state == "MERGED"'; then
echo "PR merged"
exit 0
else
echo "PR not merged yet, waiting..."
sleep 6
fi
done
echo "PR did not merge in time"
gh api -X PUT "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/reviews/$REVIEW_ID/dismissals" --field message='Merge attempt timed out' --field event='DISMISS'
gh pr merge "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --disable-auto
exit 1
- name: Unlock weblate
if: ${{ inputs.skip != true }}
env:
WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }}
run: |
curl --fail-with-body -X POST -H "Authorization: Token $WEBLATE_TOKEN" "$WEBLATE_HOST/api/components/$WEBLATE_COMPONENT/lock/" -d lock=false
- name: Report success
run: |
echo "Workflow completed successfully (or was skipped)"

View File

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

View File

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

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

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

View File

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

View File

@@ -10,12 +10,17 @@ on:
type: choice
options:
- 'false'
- major
- minor
- patch
mobileBump:
description: 'Bump mobile build number'
required: false
type: boolean
skipTranslations:
description: 'Skip translations'
required: false
type: boolean
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-root
@@ -24,28 +29,51 @@ concurrency:
permissions: {}
jobs:
merge_translations:
uses: ./.github/workflows/merge-translations.yml
with:
skip: ${{ inputs.skipTranslations }}
permissions:
pull-requests: write
secrets:
PUSH_O_MATIC_APP_ID: ${{ secrets.PUSH_O_MATIC_APP_ID }}
PUSH_O_MATIC_APP_KEY: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
WEBLATE_TOKEN: ${{ secrets.WEBLATE_TOKEN }}
bump_version:
runs-on: ubuntu-latest
needs: [merge_translations]
outputs:
ref: ${{ steps.push-tag.outputs.commit_long_sha }}
permissions: {} # No job-level permissions are needed because it uses the app-token
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6
uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
token: ${{ steps.generate-token.outputs.token }}
persist-credentials: true
ref: main
- name: Install uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './server/.nvmrc'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Bump version
env:
SERVER_BUMP: ${{ inputs.serverBump }}
@@ -83,13 +111,13 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6
uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
token: ${{ steps.generate-token.outputs.token }}
persist-credentials: false
@@ -100,7 +128,7 @@ jobs:
name: release-apk-signed
- name: Create draft release
uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8 # v2.3.2
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836 # v2.3.3
with:
draft: true
tag_name: ${{ env.IMMICH_VERSION }}

View File

@@ -24,7 +24,7 @@ jobs:
permissions:
pull-requests: write
steps:
- uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
- uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0
with:
script: |
github.rest.issues.removeLabel({

View File

@@ -16,22 +16,25 @@ jobs:
run:
working-directory: ./open-api/typescript-sdk
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
# Setup .npmrc file to publish to npm
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './open-api/typescript-sdk/.nvmrc'
registry-url: 'https://registry.npmjs.org'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Install deps
run: npm ci
run: pnpm install --frozen-lockfile
- name: Build
run: npm run build
run: pnpm build
- name: Publish
run: npm publish
run: pnpm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@@ -17,28 +17,23 @@ jobs:
permissions:
contents: read
outputs:
should_run: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
mobile:
- 'mobile/**'
workflow:
- '.github/workflows/static_analysis.yml'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'release' }}" >> "$GITHUB_OUTPUT"
force-filters: |
- '.github/workflows/static_analysis.yml'
force-events: 'workflow_dispatch,release'
mobile-dart-analyze:
name: Run Dart Code Analysis
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).mobile == true }}
runs-on: ubuntu-latest
permissions:
contents: read
@@ -47,7 +42,7 @@ jobs:
working-directory: ./mobile
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
@@ -68,7 +63,7 @@ jobs:
working-directory: ./mobile
- name: Generate translation file
run: make translation
run: dart run easy_localization:generate -S ../i18n && dart run bin/generate_keys.dart
- name: Run Build Runner
run: make build
@@ -100,36 +95,10 @@ jobs:
- name: Run dart format
run: make format
- name: Run dart custom_lint
run: dart run custom_lint
# TODO: Re-enable after upgrading custom_lint
# - name: Run dart custom_lint
# run: dart run custom_lint
# TODO: Use https://github.com/CQLabs/dcm-action
- name: Run DCM
run: dcm analyze lib --fatal-style --fatal-warnings
zizmor:
name: zizmor
runs-on: ubuntu-latest
permissions:
security-events: write
contents: read
actions: read
steps:
- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- name: Install the latest version of uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
- name: Run zizmor 🌈
run: uvx zizmor --format=sarif . > results.sarif
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload SARIF file
uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5
with:
sarif_file: results.sarif
category: zizmor

View File

@@ -4,37 +4,21 @@ on:
pull_request:
push:
branches: [main]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions: {}
jobs:
pre-job:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
should_run_i18n: ${{ steps.found_paths.outputs.i18n == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_web: ${{ steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_server: ${{ steps.found_paths.outputs.server == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_cli: ${{ steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e: ${{ steps.found_paths.outputs.e2e == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_mobile: ${{ steps.found_paths.outputs.mobile == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_ml: ${{ steps.found_paths.outputs.machine-learning == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e_web: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.web == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_e2e_server_cli: ${{ steps.found_paths.outputs.e2e == 'true' || steps.found_paths.outputs.server == 'true' || steps.found_paths.outputs.cli == 'true' || steps.should_force.outputs.should_force == 'true' }}
should_run_.github: ${{ steps.found_paths.outputs['.github'] == 'true' || steps.should_force.outputs.should_force == 'true' }} # redundant to have should_force but if someone changes the trigger then this won't have to be changed
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
i18n:
@@ -54,260 +38,225 @@ jobs:
- 'mobile/**'
machine-learning:
- 'machine-learning/**'
workflow:
- '.github/workflows/test.yml'
.github:
- '.github/**'
- name: Check if we should force jobs to run
id: should_force
run: echo "should_force=${{ steps.found_paths.outputs.workflow == 'true' || github.event_name == 'workflow_dispatch' }}" >> "$GITHUB_OUTPUT"
force-filters: |
- '.github/workflows/test.yml'
force-events: 'workflow_dispatch'
server-unit-tests:
name: Test & Lint Server
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }}
runs-on: ubuntu-latest
permissions:
contents: read
defaults:
run:
working-directory: ./server
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './server/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
- name: Run npm install
run: npm ci
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run package manager install
run: pnpm install
- name: Run linter
run: npm run lint
run: pnpm lint
if: ${{ !cancelled() }}
- name: Run formatter
run: npm run format
run: pnpm format
if: ${{ !cancelled() }}
- name: Run tsc
run: npm run check
run: pnpm check
if: ${{ !cancelled() }}
- name: Run small tests & coverage
run: npm test
run: pnpm test
if: ${{ !cancelled() }}
cli-unit-tests:
name: Unit Test CLI
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).cli == true }}
runs-on: ubuntu-latest
permissions:
contents: read
defaults:
run:
working-directory: ./cli
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './cli/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Setup typescript-sdk
run: npm ci && npm run build
run: pnpm install && pnpm run build
working-directory: ./open-api/typescript-sdk
- name: Install deps
run: npm ci
run: pnpm install
- name: Run linter
run: npm run lint
run: pnpm lint
if: ${{ !cancelled() }}
- name: Run formatter
run: npm run format
run: pnpm format
if: ${{ !cancelled() }}
- name: Run tsc
run: npm run check
run: pnpm check
if: ${{ !cancelled() }}
- name: Run unit tests & coverage
run: npm run test
run: pnpm test
if: ${{ !cancelled() }}
cli-unit-tests-win:
name: Unit Test CLI (Windows)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_cli == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).cli == true }}
runs-on: windows-latest
permissions:
contents: read
defaults:
run:
working-directory: ./cli
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './cli/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Setup typescript-sdk
run: npm ci && npm run build
run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk
- name: Install deps
run: npm ci
run: pnpm install --frozen-lockfile
# Skip linter & formatter in Windows test.
- name: Run tsc
run: npm run check
run: pnpm check
if: ${{ !cancelled() }}
- name: Run unit tests & coverage
run: npm run test
run: pnpm test
if: ${{ !cancelled() }}
web-lint:
name: Lint Web
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_web == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).web == true }}
runs-on: mich
permissions:
contents: read
defaults:
run:
working-directory: ./web
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './web/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run setup typescript-sdk
run: npm ci && npm run build
run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk
- name: Run npm install
run: npm ci
- name: Run pnpm install
run: pnpm rebuild && pnpm install --frozen-lockfile
- name: Run linter
run: npm run lint:p
run: pnpm lint:p
if: ${{ !cancelled() }}
- name: Run formatter
run: npm run format
run: pnpm format
if: ${{ !cancelled() }}
- name: Run svelte checks
run: npm run check:svelte
run: pnpm check:svelte
if: ${{ !cancelled() }}
web-unit-tests:
name: Test Web
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_web == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).web == true }}
runs-on: ubuntu-latest
permissions:
contents: read
defaults:
run:
working-directory: ./web
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './web/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run setup typescript-sdk
run: npm ci && npm run build
run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk
- name: Run npm install
run: npm ci
run: pnpm install --frozen-lockfile
- name: Run tsc
run: npm run check:typescript
run: pnpm check:typescript
if: ${{ !cancelled() }}
- name: Run unit tests & coverage
run: npm run test
run: pnpm test
if: ${{ !cancelled() }}
i18n-tests:
name: Test i18n
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_i18n == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).i18n == true }}
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './web/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Install dependencies
run: npm --prefix=web ci
run: pnpm --filter=immich-web install --frozen-lockfile
- name: Format
run: npm --prefix=web run format:i18n
run: pnpm --filter=immich-web format:i18n
- name: Find file changes
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
id: verify-changed-files
with:
files: |
i18n/**
- name: Verify files have not changed
if: steps.verify-changed-files.outputs.files_changed == 'true'
env:
@@ -316,87 +265,77 @@ jobs:
echo "ERROR: i18n files not up to date!"
echo "Changed files: ${CHANGED_FILES}"
exit 1
e2e-tests-lint:
name: End-to-End Lint
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true }}
runs-on: ubuntu-latest
permissions:
contents: read
defaults:
run:
working-directory: ./e2e
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './e2e/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run setup typescript-sdk
run: npm ci && npm run build
run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk
if: ${{ !cancelled() }}
- name: Install dependencies
run: npm ci
run: pnpm install --frozen-lockfile
if: ${{ !cancelled() }}
- name: Run linter
run: npm run lint
run: pnpm lint
if: ${{ !cancelled() }}
- name: Run formatter
run: npm run format
run: pnpm format
if: ${{ !cancelled() }}
- name: Run tsc
run: npm run check
run: pnpm check
if: ${{ !cancelled() }}
server-medium-tests:
name: Medium Tests (Server)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }}
runs-on: ubuntu-latest
permissions:
contents: read
defaults:
run:
working-directory: ./server
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './server/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
- name: Run npm install
run: npm ci
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run pnpm install
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile
- name: Run medium tests
run: npm run test:medium
run: pnpm test:medium
if: ${{ !cancelled() }}
e2e-tests-server-cli:
name: End-to-End Tests (Server & CLI)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e_server_cli == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true || fromJSON(needs.pre-job.outputs.should_run).server == true || fromJSON(needs.pre-job.outputs.should_run).cli == true }}
runs-on: ${{ matrix.runner }}
permissions:
contents: read
@@ -406,47 +345,45 @@ jobs:
strategy:
matrix:
runner: [ubuntu-latest, ubuntu-24.04-arm]
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
submodules: 'recursive'
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './e2e/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run setup typescript-sdk
run: npm ci && npm run build
run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk
if: ${{ !cancelled() }}
- name: Run setup web
run: pnpm install --frozen-lockfile && pnpm exec svelte-kit sync
working-directory: ./web
if: ${{ !cancelled() }}
- name: Run setup cli
run: npm ci && npm run build
run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./cli
if: ${{ !cancelled() }}
- name: Install dependencies
run: npm ci
run: pnpm install --frozen-lockfile
if: ${{ !cancelled() }}
- name: Docker build
run: docker compose build
if: ${{ !cancelled() }}
- name: Run e2e tests (api & cli)
run: npm run test
run: pnpm test
if: ${{ !cancelled() }}
e2e-tests-web:
name: End-to-End Tests (Web)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e_web == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).e2e == true || fromJSON(needs.pre-job.outputs.should_run).web == true }}
runs-on: ${{ matrix.runner }}
permissions:
contents: read
@@ -456,42 +393,36 @@ jobs:
strategy:
matrix:
runner: [ubuntu-latest, ubuntu-24.04-arm]
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
submodules: 'recursive'
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './e2e/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run setup typescript-sdk
run: npm ci && npm run build
run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk
if: ${{ !cancelled() }}
- name: Install dependencies
run: npm ci
run: pnpm install --frozen-lockfile
if: ${{ !cancelled() }}
- name: Install Playwright Browsers
run: npx playwright install chromium --only-shell
if: ${{ !cancelled() }}
- name: Docker build
run: docker compose build
if: ${{ !cancelled() }}
- name: Run e2e tests (web)
run: npx playwright test
if: ${{ !cancelled() }}
success-check-e2e:
name: End-to-End Tests Success
needs: [e2e-tests-server-cli, e2e-tests-web]
@@ -502,37 +433,32 @@ jobs:
- uses: immich-app/devtools/actions/success-check@68f10eb389bb02a3cf9d1156111964c549eb421b # 0.0.4
with:
needs: ${{ toJSON(needs) }}
mobile-unit-tests:
name: Unit Test Mobile
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_mobile == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).mobile == true }}
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup Flutter SDK
uses: subosito/flutter-action@fd55f4c5af5b953cc57a2be44cb082c8f6635e8e # v2.21.0
with:
channel: 'stable'
flutter-version-file: ./mobile/pubspec.yaml
- name: Generate translation file
run: make translation
run: dart run easy_localization:generate -S ../i18n && dart run bin/generate_keys.dart
working-directory: ./mobile
- name: Run tests
working-directory: ./mobile
run: flutter test -j 1
ml-unit-tests:
name: Unit Test ML
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).machine-learning == true }}
runs-on: ubuntu-latest
permissions:
contents: read
@@ -540,10 +466,9 @@ jobs:
run:
working-directory: ./machine-learning
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Install uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
@@ -566,56 +491,48 @@ jobs:
- name: Run tests and coverage
run: |
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' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run)['.github'] == true }}
runs-on: ubuntu-latest
permissions:
contents: read
defaults:
run:
working-directory: ./.github
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './.github/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
- name: Run npm install
run: npm ci
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run pnpm install
run: pnpm install --frozen-lockfile
- name: Run formatter
run: npm run format
run: pnpm format
if: ${{ !cancelled() }}
shellcheck:
name: ShellCheck
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Run ShellCheck
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0
with:
ignore_paths: >-
**/open-api/**
**/openapi**
**/node_modules/**
**/open-api/** **/openapi** **/node_modules/**
generated-api-up-to-date:
name: OpenAPI Clients
runs-on: ubuntu-latest
@@ -623,26 +540,24 @@ jobs:
contents: read
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './server/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Install server dependencies
run: npm --prefix=server ci
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm --filter immich install --frozen-lockfile
- name: Build the app
run: npm --prefix=server run build
run: pnpm --filter immich build
- name: Run API generation
run: make open-api
run: ./bin/generate-open-api.sh
working-directory: open-api
- name: Find file changes
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
id: verify-changed-files
@@ -651,7 +566,6 @@ jobs:
mobile/openapi
open-api/typescript-sdk
open-api/immich-openapi-specs.json
- name: Verify files have not changed
if: steps.verify-changed-files.outputs.files_changed == 'true'
env:
@@ -660,7 +574,6 @@ jobs:
echo "ERROR: Generated files not up to date!"
echo "Changed files: ${CHANGED_FILES}"
exit 1
sql-schema-up-to-date:
name: SQL Schema Checks
runs-on: ubuntu-latest
@@ -668,51 +581,42 @@ jobs:
contents: read
services:
postgres:
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:ec713143dca1a426eba2e03707c319e2ec3cc9d304ef767f777f8e297dee820c
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3@sha256:da52bbead5d818adaa8077c8dcdaad0aaf93038c31ad8348b51f9f0ec1310a4d
env:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: immich
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
ports:
- 5432:5432
defaults:
run:
working-directory: ./server
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: './server/.nvmrc'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
cache: 'pnpm'
cache-dependency-path: '**/pnpm-lock.yaml'
- name: Install server dependencies
run: npm ci
run: SHARP_IGNORE_GLOBAL_LIBVIPS=true pnpm install --frozen-lockfile
- name: Build the app
run: npm run build
run: pnpm build
- name: Run existing migrations
run: npm run migrations:run
run: pnpm migrations:run
- name: Test npm run schema:reset command works
run: npm run schema:reset
run: pnpm schema:reset
- name: Generate new migrations
continue-on-error: true
run: npm run migrations:generate src/TestMigration
run: pnpm migrations:generate src/TestMigration
- name: Find file changes
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
id: verify-changed-files
@@ -728,19 +632,16 @@ jobs:
echo "Changed files: ${CHANGED_FILES}"
cat ./src/*-TestMigration.ts
exit 1
- name: Run SQL generation
run: npm run sync:sql
run: pnpm sync:sql
env:
DB_URL: postgres://postgres:postgres@localhost:5432/immich
- name: Find file changes
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
id: verify-changed-sql-files
with:
files: |
server/src/queries
- name: Verify SQL files have not changed
if: steps.verify-changed-sql-files.outputs.files_changed == 'true'
env:
@@ -751,77 +652,77 @@ jobs:
git diff
exit 1
# mobile-integration-tests:
# name: Run mobile end-to-end integration tests
# runs-on: macos-latest
# steps:
# - uses: actions/checkout@v4
# - uses: actions/setup-java@v3
# with:
# distribution: 'zulu'
# java-version: '12.x'
# cache: 'gradle'
# - name: Cache android SDK
# uses: actions/cache@v3
# id: android-sdk
# with:
# key: android-sdk
# path: |
# /usr/local/lib/android/
# ~/.android
# - name: Cache Gradle
# uses: actions/cache@v3
# with:
# path: |
# ./mobile/build/
# ./mobile/android/.gradle/
# key: ${{ runner.os }}-flutter-${{ hashFiles('**/*.gradle*', 'pubspec.lock') }}
# - name: Setup Android SDK
# if: steps.android-sdk.outputs.cache-hit != 'true'
# uses: android-actions/setup-android@v2
# - name: AVD cache
# uses: actions/cache@v3
# id: avd-cache
# with:
# path: |
# ~/.android/avd/*
# ~/.android/adb*
# key: avd-29
# - name: create AVD and generate snapshot for caching
# if: steps.avd-cache.outputs.cache-hit != 'true'
# uses: reactivecircus/android-emulator-runner@v2.27.0
# with:
# working-directory: ./mobile
# cores: 2
# api-level: 29
# arch: x86_64
# profile: pixel
# target: default
# force-avd-creation: false
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# disable-animations: false
# script: echo "Generated AVD snapshot for caching."
# - name: Setup Flutter SDK
# uses: subosito/flutter-action@v2
# with:
# channel: 'stable'
# flutter-version: '3.7.3'
# cache: true
# - name: Run integration tests
# uses: Wandalen/wretry.action@master
# with:
# action: reactivecircus/android-emulator-runner@v2.27.0
# with: |
# working-directory: ./mobile
# cores: 2
# api-level: 29
# arch: x86_64
# profile: pixel
# target: default
# force-avd-creation: false
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# disable-animations: true
# script: |
# flutter pub get
# flutter test integration_test
# attempt_limit: 3
# mobile-integration-tests:
# name: Run mobile end-to-end integration tests
# runs-on: macos-latest
# steps:
# - uses: actions/checkout@v4
# - uses: actions/setup-java@v3
# with:
# distribution: 'zulu'
# java-version: '12.x'
# cache: 'gradle'
# - name: Cache android SDK
# uses: actions/cache@v3
# id: android-sdk
# with:
# key: android-sdk
# path: |
# /usr/local/lib/android/
# ~/.android
# - name: Cache Gradle
# uses: actions/cache@v3
# with:
# path: |
# ./mobile/build/
# ./mobile/android/.gradle/
# key: ${{ runner.os }}-flutter-${{ hashFiles('**/*.gradle*', 'pubspec.lock') }}
# - name: Setup Android SDK
# if: steps.android-sdk.outputs.cache-hit != 'true'
# uses: android-actions/setup-android@v2
# - name: AVD cache
# uses: actions/cache@v3
# id: avd-cache
# with:
# path: |
# ~/.android/avd/*
# ~/.android/adb*
# key: avd-29
# - name: create AVD and generate snapshot for caching
# if: steps.avd-cache.outputs.cache-hit != 'true'
# uses: reactivecircus/android-emulator-runner@v2.27.0
# with:
# working-directory: ./mobile
# cores: 2
# api-level: 29
# arch: x86_64
# profile: pixel
# target: default
# force-avd-creation: false
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# disable-animations: false
# script: echo "Generated AVD snapshot for caching."
# - name: Setup Flutter SDK
# uses: subosito/flutter-action@v2
# with:
# channel: 'stable'
# flutter-version: '3.7.3'
# cache: true
# - name: Run integration tests
# uses: Wandalen/wretry.action@master
# with:
# action: reactivecircus/android-emulator-runner@v2.27.0
# with: |
# working-directory: ./mobile
# cores: 2
# api-level: 29
# arch: x86_64
# profile: pixel
# target: default
# force-avd-creation: false
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# disable-animations: true
# script: |
# flutter pub get
# flutter test integration_test
# attempt_limit: 3

View File

@@ -3,48 +3,52 @@ name: Weblate checks
on:
pull_request:
branches: [main]
types:
- opened
- synchronize
- ready_for_review
- auto_merge_enabled
- auto_merge_disabled
permissions: {}
env:
BOT_NAME: immich-push-o-matic
jobs:
pre-job:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
should_run: ${{ steps.found_paths.outputs.i18n == 'true' && github.head_ref != 'chore/translations'}}
should_run: ${{ steps.check.outputs.should_run }}
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- id: found_paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- name: Check what should run
id: check
uses: immich-app/devtools/actions/pre-job@24820aa4ef67959b0dcf69a438cccf00d7c7042b # pre-job-action-v1.0.1
with:
filters: |
i18n:
- 'i18n/!(en)**\.json'
exclude-branches: 'chore/translations'
skip-force-logic: 'true'
enforce-lock:
name: Check Weblate Lock
needs: [pre-job]
runs-on: ubuntu-latest
permissions: {}
if: ${{ needs.pre-job.outputs.should_run == 'true' }}
if: ${{ fromJSON(needs.pre-job.outputs.should_run).i18n == true }}
steps:
- name: Check weblate lock
- name: Bot review status
env:
PR_NUMBER: ${{ github.event.pull_request.number || github.event.pull_request_review.pull_request.number }}
GH_TOKEN: ${{ github.token }}
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@952b3bb1ddb2dcc0aa3479e98bb1c2d1a922f096 # v1.10.0
id: find-pr
with:
branch: chore/translations
- name: Fail if existing weblate PR
if: ${{ steps.find-pr.outputs.number }}
run: exit 1
# Then check for APPROVED by the bot, if absent fail
gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json reviews | jq -e '.reviews | map(select(.author.login == env.BOT_NAME and .state == "APPROVED")) | length > 0' \
|| (echo "The push-o-matic bot has not approved this PR yet" && exit 1)
success-check-lock:
name: Weblate Lock Check Success
needs: [enforce-lock]

3
.gitignore vendored
View File

@@ -18,6 +18,7 @@ mobile/libisar.dylib
mobile/openapi/test
mobile/openapi/doc
mobile/openapi/.openapi-generator/FILES
mobile/ios/build
open-api/typescript-sdk/build
mobile/android/fastlane/report.xml
@@ -25,3 +26,5 @@ mobile/ios/fastlane/report.xml
vite.config.js.timestamp-*
.pnpm-store
.devcontainer/library
.devcontainer/.env*

18
.pnpmfile.cjs Normal file
View File

@@ -0,0 +1,18 @@
module.exports = {
hooks: {
readPackage: (pkg) => {
if (!pkg.name) {
return pkg;
}
if (pkg.name === "exiftool-vendored") {
if (pkg.optionalDependencies["exiftool-vendored.pl"]) {
// make exiftool-vendored.pl a regular dependency
pkg.dependencies["exiftool-vendored.pl"] =
pkg.optionalDependencies["exiftool-vendored.pl"];
delete pkg.optionalDependencies["exiftool-vendored.pl"];
}
}
return pkg;
},
},
};

View File

@@ -56,7 +56,8 @@
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
"*.ts": "${capture}.spec.ts,${capture}.mock.ts"
"*.ts": "${capture}.spec.ts,${capture}.mock.ts",
"package.json": "package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb, bun.lock, pnpm-workspace.yaml, .pnpmfile.cjs"
},
"svelte.enable-ts-plugin": true,
"typescript.preferences.importModuleSpecifier": "non-relative"

View File

@@ -1,5 +1,7 @@
/.github/ @bo0tzz
/docker/ @bo0tzz
/server/ @danieldietzler
/web/ @danieldietzler
/machine-learning/ @mertalev
/e2e/ @danieldietzler
/mobile/ @shenlong-tanwen

View File

@@ -8,14 +8,14 @@ dev-update:
@trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans
dev-scale:
@trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --scale immich-server=3 --remove-orphans
@trap 'make dev-down' EXIT; COMPOSE_BAKE=true docker compose -f ./docker/docker-compose.dev.yml up --build -V --scale immich-server=3 --remove-orphans
dev-docs:
npm --prefix docs run start
.PHONY: e2e
e2e:
@trap 'make e2e-down' EXIT; COMPOSE_BAKE=true docker compose -f ./e2e/docker-compose.yml up --build -V --remove-orphans
@trap 'make e2e-down' EXIT; COMPOSE_BAKE=true docker compose -f ./e2e/docker-compose.yml up --remove-orphans
e2e-update:
@trap 'make e2e-down' EXIT; COMPOSE_BAKE=true docker compose -f ./e2e/docker-compose.yml up --build -V --remove-orphans
@@ -43,7 +43,7 @@ open-api-typescript:
cd ./open-api && bash ./bin/generate-open-api.sh typescript
sql:
npm --prefix server run sync:sql
pnpm --filter immich run sync:sql
attach-server:
docker exec -it docker_immich-server_1 sh
@@ -51,33 +51,59 @@ attach-server:
renovate:
LOG_LEVEL=debug npx renovate --platform=local --repository-cache=reset
# Directories that need to be created for volumes or build output
VOLUME_DIRS = \
./.pnpm-store \
./web/.svelte-kit \
./web/node_modules \
./web/coverage \
./e2e/node_modules \
./docs/node_modules \
./server/node_modules \
./open-api/typescript-sdk/node_modules \
./.github/node_modules \
./node_modules \
./cli/node_modules
# Include .env file if it exists
-include docker/.env
MODULES = e2e server web cli sdk docs .github
# directory to package name mapping function
# cli = @immich/cli
# docs = documentation
# e2e = immich-e2e
# open-api/typescript-sdk = @immich/sdk
# server = immich
# web = immich-web
map-package = $(subst sdk,@immich/sdk,$(subst cli,@immich/cli,$(subst docs,documentation,$(subst e2e,immich-e2e,$(subst server,immich,$(subst web,immich-web,$1))))))
audit-%:
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) audit fix
pnpm --filter $(call map-package,$*) audit fix
install-%:
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) i
ci-%:
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) ci
pnpm --filter $(call map-package,$*) install $(if $(FROZEN),--frozen-lockfile) $(if $(OFFLINE),--offline)
build-cli: build-sdk
build-web: build-sdk
build-%: install-%
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) run build
pnpm --filter $(call map-package,$*) run build
format-%:
npm --prefix $* run format:fix
pnpm --filter $(call map-package,$*) run format:fix
lint-%:
npm --prefix $* run lint:fix
pnpm --filter $(call map-package,$*) run lint:fix
lint-web:
pnpm --filter $(call map-package,$*) run lint:p
check-%:
npm --prefix $* run check
pnpm --filter $(call map-package,$*) run check
check-web:
npm --prefix web run check:typescript
npm --prefix web run check:svelte
pnpm --filter immich-web run check:typescript
pnpm --filter immich-web run check:svelte
test-%:
npm --prefix $* run test
pnpm --filter $(call map-package,$*) run test
test-e2e:
docker compose -f ./e2e/docker-compose.yml build
npm --prefix e2e run test
npm --prefix e2e run test:web
pnpm --filter immich-e2e run test
pnpm --filter immich-e2e run test:web
test-medium:
docker run \
--rm \
@@ -87,27 +113,39 @@ test-medium:
-v ./server/tsconfig.json:/usr/src/app/tsconfig.json \
-e NODE_ENV=development \
immich-server:latest \
-c "npm ci && npm run test:medium -- --run"
-c "pnpm test:medium -- --run"
test-medium-dev:
docker exec -it immich_server /bin/sh -c "npm run test:medium"
docker exec -it immich_server /bin/sh -c "pnpm run test:medium"
build-all: $(foreach M,$(filter-out e2e .github,$(MODULES)),build-$M) ;
install-all: $(foreach M,$(MODULES),install-$M) ;
ci-all: $(foreach M,$(filter-out .github,$(MODULES)),ci-$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 .github,$(MODULES)),test-$M) ;
install-all:
pnpm -r --filter '!documentation' install
build-all: $(foreach M,$(filter-out e2e docs .github,$(MODULES)),build-$M) ;
check-all:
pnpm -r --filter '!documentation' run "/^(check|check\:svelte|check\:typescript)$/"
lint-all:
pnpm -r --filter '!documentation' run lint:fix
format-all:
pnpm -r --filter '!documentation' run format:fix
audit-all:
pnpm -r --filter '!documentation' audit fix
hygiene-all: audit-all
pnpm -r --filter '!documentation' run "/(format:fix|check|check:svelte|check:typescript|sql)/"
test-all:
pnpm -r --filter '!documentation' run "/^test/"
clean:
find . -name "node_modules" -type d -prune -exec rm -rf {} +
find . -name "dist" -type d -prune -exec rm -rf '{}' +
find . -name "build" -type d -prune -exec rm -rf '{}' +
find . -name "svelte-kit" -type d -prune -exec rm -rf '{}' +
command -v docker >/dev/null 2>&1 && docker compose -f ./docker/docker-compose.dev.yml rm -v -f || true
command -v docker >/dev/null 2>&1 && docker compose -f ./e2e/docker-compose.yml rm -v -f || true
find . -name ".svelte-kit" -type d -prune -exec rm -rf '{}' +
find . -name "coverage" -type d -prune -exec rm -rf '{}' +
find . -name ".pnpm-store" -type d -prune -exec rm -rf '{}' +
command -v docker >/dev/null 2>&1 && docker compose -f ./docker/docker-compose.dev.yml down -v --remove-orphans || true
command -v docker >/dev/null 2>&1 && docker compose -f ./e2e/docker-compose.yml down -v --remove-orphans || true
setup-server-dev: install-server
setup-web-dev: install-sdk build-sdk install-web

View File

@@ -1 +1 @@
22.18.0
22.19.0

View File

@@ -1,19 +1,14 @@
FROM node:22.16.0-alpine3.20@sha256:2289fb1fba0f4633b08ec47b94a89c7e20b829fc5679f9b7b298eaa2f1ed8b7e AS core
WORKDIR /usr/src/open-api/typescript-sdk
COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./
RUN npm ci
COPY open-api/typescript-sdk/ ./
RUN npm run build
WORKDIR /usr/src/app
COPY cli/package.json cli/package-lock.json ./
RUN npm ci
COPY cli .
RUN npm run build
COPY package* pnpm* .pnpmfile.cjs ./
COPY ./cli ./cli/
COPY ./open-api/typescript-sdk ./open-api/typescript-sdk/
RUN corepack enable pnpm && \
pnpm install --filter @immich/sdk --filter @immich/cli --frozen-lockfile && \
pnpm --filter @immich/sdk build && \
pnpm --filter @immich/cli build
WORKDIR /import
ENTRYPOINT ["node", "/usr/src/app/dist"]
ENTRYPOINT ["node", "/usr/src/app/cli/dist"]

4600
cli/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "@immich/cli",
"version": "2.2.77",
"version": "2.2.92",
"description": "Command Line Interface (CLI) for Immich",
"type": "module",
"exports": "./dist/index.js",
@@ -13,7 +13,6 @@
"cli"
],
"devDependencies": {
"@eslint/eslintrc": "^3.1.0",
"@eslint/js": "^9.8.0",
"@immich/sdk": "file:../open-api/typescript-sdk",
"@types/byte-size": "^8.1.0",
@@ -21,7 +20,7 @@
"@types/lodash-es": "^4.17.12",
"@types/micromatch": "^4.0.9",
"@types/mock-fs": "^4.13.1",
"@types/node": "^22.17.0",
"@types/node": "^22.18.1",
"@vitest/coverage-v8": "^3.0.0",
"byte-size": "^9.0.0",
"cli-progress": "^3.12.0",
@@ -69,6 +68,6 @@
"micromatch": "^4.0.8"
},
"volta": {
"node": "22.18.0"
"node": "22.19.0"
}
}

View File

@@ -2,37 +2,37 @@
# Manual edits may be lost in future updates.
provider "registry.opentofu.org/cloudflare/cloudflare" {
version = "4.52.1"
constraints = "4.52.1"
version = "4.52.5"
constraints = "4.52.5"
hashes = [
"h1:2lHvafwGbLdmc9lYkuJFw3nsInaQjRpjX/JfIRKmq/M=",
"h1:596JomwjrtUrOSreq9NNCS+rj70+jOV+0pfja5MXiTI=",
"h1:7mBOA5TVAIt3qAwPXKCtE0RSYeqij9v30mnksuBbpEg=",
"h1:ELVgzh4kHKBCYdL+2A8JjWS0E1snLUN3Mmz3Vo6qSfw=",
"h1:FGGM5yLFf72g3kSXM3LAN64Gf/AkXr5WCmhixgnP+l4=",
"h1:JupkJbQALcIVoMhHImrLeLDsQR1ET7VJLGC7ONxjqGU=",
"h1:KsaE4JNq+1uV1nJsuTcYar/8lyY6zKS5UBEpfYg3wvc=",
"h1:NHZ5RJIzQDLhie/ykl3uI6UPfNQR9Lu5Ti7JPR6X904=",
"h1:NfAuMbn6LQPLDtJhbzO1MX9JMIGLMa8K6CpekvtsuX8=",
"h1:e+vNKokamDsp/kJvFr2pRudzwEz2r49iZ/oSggw+1LY=",
"h1:jnb4VdfNZ79I3yj7Q8x+JmOT+FxbfjjRfrF0dL0yCW8=",
"h1:kmF//O539d7NuHU7qIxDj7Wz4eJmLKFiI5glwQivldU=",
"h1:s6XriaKwOgV4jvKAGPXkrxhhOQxpNU5dceZwi9Z/1k8=",
"h1:wt3WBEBAeSGTlC9OlnTlAALxRiK4SQgLy0KgBIS7qzs=",
"zh:2fb95e1d3229b9b6c704e1a413c7481c60f139780d9641f657b6eb9b633b90f2",
"zh:379c7680983383862236e9e6e720c3114195c40526172188e88d0ffcf50dfe2e",
"zh:55533beb6cfc02d22ffda8cba8027bc2c841bb172cd637ed0d28323d41395f8f",
"zh:5abd70760e4eb1f37a1c307cbd2989ea7c9ba0afb93818c67c1d363a31f75703",
"zh:699f1c8cd66129176fe659ebf0e6337632a8967a28d2630b6ae5948665c0c2ae",
"zh:69c15acd73c451e89de6477059cda2f3ec200b48ae4b9ff3646c4d389fd3205e",
"zh:6e02b687de21b844f8266dff99e93e7c61fc8eb688f4bbb23803caceb251839e",
"zh:7a51d17b87ed87b7bebf2ad9fc7c3a74f16a1b44eee92c779c08eb89258c0496",
"zh:88ad84436837b0f55302f22748505972634e87400d6902260fd6b7ba1610f937",
"h1:+rfzF+16ZcWZWnTyW/p1HHTzYbPKX8Zt2nIFtR/+f+E=",
"h1:18bXaaOSq8MWKuMxo/4y7EB7/i7G90y5QsKHZRmkoDo=",
"h1:4vZVOpKeEQZsF2VrARRZFeL37Ed/gD4rRMtfnvWQres=",
"h1:BZOsTF83QPKXTAaYqxPKzdl1KRjk/L2qbPpFjM0w28A=",
"h1:CDuC+HXLvc1z6wkCRsSDcc/+QENIHEtssYshiWg3opA=",
"h1:DE+YFzLnqSe79pI2R4idRGx5QzLdrA7RXvngTkGfZ30=",
"h1:DfaJwH3Ml4yrRbdAY4AcDVy0QTQk5T3A622TXzS/u2E=",
"h1:EIDXP0W3kgIv2pecrFmqtK/DnlqkyckzBzhxKaXU+4A=",
"h1:EV4kYyaOnwGA0bh/3hU6Ezqnt1PFDxopH7i85e48IzY=",
"h1:M0iXabfzamU+MPDi0G9XACpbacFKMakmM+Z9HZ8HrsM=",
"h1:YWmCbGF/KbsrUzcYVBLscwLizidbp95TDQa0N2qpmVo=",
"h1:cxPcCB5gbrpUO1+IXkQYs1YTY50/0IlApCzGea0cwuQ=",
"h1:g6DldikTV2HXUu9uoeNY5FuLufgaYWF4ufgZg7wq62s=",
"h1:oi/Hrx9pwoQ+Z52CBC+rrowVH387EIj0qvnxQgDeI+0=",
"zh:1a3400cb38863b2585968d1876706bcfc67a148e1318a1d325c6c7704adc999b",
"zh:4c5062cb9e9da1676f06ae92b8370186d98976cc4c7030d3cd76df12af54282a",
"zh:52110f493b5f0587ef77a1cfd1a67001fd4c617b14c6502d732ab47352bdc2f7",
"zh:5aa536f9eaeb43823aaf2aa80e7d39b25ef2b383405ed034aa16a28b446a9238",
"zh:5cc39459a1c6be8a918f17054e4fbba573825ed5597dcada588fe99614d98a5b",
"zh:629ae6a7ba298815131da826474d199312d21cec53a4d5ded4fa56a692e6f072",
"zh:719cc7c75dc1d3eb30c22ff5102a017996d9788b948078c7e1c5b3446aeca661",
"zh:8698635a3ca04383c1e93b21d6963346bdae54d27177a48e4b1435b7f731731c",
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
"zh:8d46c3d9f4f7ad20ac6ef01daa63f4e30a2d16dcb1bb5c7c7ee3dc6be38e9ca1",
"zh:913d64e72a4929dae1d4793e2004f4f9a58b138ea337d9d94fa35cafbf06550a",
"zh:c8d93cf86e2e49f6cec665cfe78b82c144cce15a8b2e30f343385fadd1251849",
"zh:cc4f69397d9bc34a528a5609a024c3a48f54f21616c0008792dd417297add955",
"zh:df99cdb8b064aad35ffea77e645cf6541d0b1b2ebc51b6d26c42031de60ab69e",
"zh:8a9993f1dcadf1dd6ca43b23348abe374605d29945a2fafc07fb3457644e6a54",
"zh:b1b9a1e6bcc24d5863a664a411d2dc906373ae7a2399d2d65548ce7377057852",
"zh:b270184cdeec277218e84b94cb136fead753da717f9b9dc378e51907f3f00bb0",
"zh:dff2bc10071210181726ce270f954995fe42c696e61e2e8f874021fed02521e5",
"zh:e8e87b40b6a87dc097b0fdc20d3f725cec0d82abc9cc3755c1f89f8f6e8b0036",
"zh:ee964a6573d399a5dd22ce328fb38ca1207797a02248f14b2e4913ee390e7803",
]
}

View File

@@ -5,7 +5,7 @@ terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "4.52.1"
version = "4.52.5"
}
}
}

View File

@@ -2,37 +2,37 @@
# Manual edits may be lost in future updates.
provider "registry.opentofu.org/cloudflare/cloudflare" {
version = "4.52.1"
constraints = "4.52.1"
version = "4.52.5"
constraints = "4.52.5"
hashes = [
"h1:2lHvafwGbLdmc9lYkuJFw3nsInaQjRpjX/JfIRKmq/M=",
"h1:596JomwjrtUrOSreq9NNCS+rj70+jOV+0pfja5MXiTI=",
"h1:7mBOA5TVAIt3qAwPXKCtE0RSYeqij9v30mnksuBbpEg=",
"h1:ELVgzh4kHKBCYdL+2A8JjWS0E1snLUN3Mmz3Vo6qSfw=",
"h1:FGGM5yLFf72g3kSXM3LAN64Gf/AkXr5WCmhixgnP+l4=",
"h1:JupkJbQALcIVoMhHImrLeLDsQR1ET7VJLGC7ONxjqGU=",
"h1:KsaE4JNq+1uV1nJsuTcYar/8lyY6zKS5UBEpfYg3wvc=",
"h1:NHZ5RJIzQDLhie/ykl3uI6UPfNQR9Lu5Ti7JPR6X904=",
"h1:NfAuMbn6LQPLDtJhbzO1MX9JMIGLMa8K6CpekvtsuX8=",
"h1:e+vNKokamDsp/kJvFr2pRudzwEz2r49iZ/oSggw+1LY=",
"h1:jnb4VdfNZ79I3yj7Q8x+JmOT+FxbfjjRfrF0dL0yCW8=",
"h1:kmF//O539d7NuHU7qIxDj7Wz4eJmLKFiI5glwQivldU=",
"h1:s6XriaKwOgV4jvKAGPXkrxhhOQxpNU5dceZwi9Z/1k8=",
"h1:wt3WBEBAeSGTlC9OlnTlAALxRiK4SQgLy0KgBIS7qzs=",
"zh:2fb95e1d3229b9b6c704e1a413c7481c60f139780d9641f657b6eb9b633b90f2",
"zh:379c7680983383862236e9e6e720c3114195c40526172188e88d0ffcf50dfe2e",
"zh:55533beb6cfc02d22ffda8cba8027bc2c841bb172cd637ed0d28323d41395f8f",
"zh:5abd70760e4eb1f37a1c307cbd2989ea7c9ba0afb93818c67c1d363a31f75703",
"zh:699f1c8cd66129176fe659ebf0e6337632a8967a28d2630b6ae5948665c0c2ae",
"zh:69c15acd73c451e89de6477059cda2f3ec200b48ae4b9ff3646c4d389fd3205e",
"zh:6e02b687de21b844f8266dff99e93e7c61fc8eb688f4bbb23803caceb251839e",
"zh:7a51d17b87ed87b7bebf2ad9fc7c3a74f16a1b44eee92c779c08eb89258c0496",
"zh:88ad84436837b0f55302f22748505972634e87400d6902260fd6b7ba1610f937",
"h1:+rfzF+16ZcWZWnTyW/p1HHTzYbPKX8Zt2nIFtR/+f+E=",
"h1:18bXaaOSq8MWKuMxo/4y7EB7/i7G90y5QsKHZRmkoDo=",
"h1:4vZVOpKeEQZsF2VrARRZFeL37Ed/gD4rRMtfnvWQres=",
"h1:BZOsTF83QPKXTAaYqxPKzdl1KRjk/L2qbPpFjM0w28A=",
"h1:CDuC+HXLvc1z6wkCRsSDcc/+QENIHEtssYshiWg3opA=",
"h1:DE+YFzLnqSe79pI2R4idRGx5QzLdrA7RXvngTkGfZ30=",
"h1:DfaJwH3Ml4yrRbdAY4AcDVy0QTQk5T3A622TXzS/u2E=",
"h1:EIDXP0W3kgIv2pecrFmqtK/DnlqkyckzBzhxKaXU+4A=",
"h1:EV4kYyaOnwGA0bh/3hU6Ezqnt1PFDxopH7i85e48IzY=",
"h1:M0iXabfzamU+MPDi0G9XACpbacFKMakmM+Z9HZ8HrsM=",
"h1:YWmCbGF/KbsrUzcYVBLscwLizidbp95TDQa0N2qpmVo=",
"h1:cxPcCB5gbrpUO1+IXkQYs1YTY50/0IlApCzGea0cwuQ=",
"h1:g6DldikTV2HXUu9uoeNY5FuLufgaYWF4ufgZg7wq62s=",
"h1:oi/Hrx9pwoQ+Z52CBC+rrowVH387EIj0qvnxQgDeI+0=",
"zh:1a3400cb38863b2585968d1876706bcfc67a148e1318a1d325c6c7704adc999b",
"zh:4c5062cb9e9da1676f06ae92b8370186d98976cc4c7030d3cd76df12af54282a",
"zh:52110f493b5f0587ef77a1cfd1a67001fd4c617b14c6502d732ab47352bdc2f7",
"zh:5aa536f9eaeb43823aaf2aa80e7d39b25ef2b383405ed034aa16a28b446a9238",
"zh:5cc39459a1c6be8a918f17054e4fbba573825ed5597dcada588fe99614d98a5b",
"zh:629ae6a7ba298815131da826474d199312d21cec53a4d5ded4fa56a692e6f072",
"zh:719cc7c75dc1d3eb30c22ff5102a017996d9788b948078c7e1c5b3446aeca661",
"zh:8698635a3ca04383c1e93b21d6963346bdae54d27177a48e4b1435b7f731731c",
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
"zh:8d46c3d9f4f7ad20ac6ef01daa63f4e30a2d16dcb1bb5c7c7ee3dc6be38e9ca1",
"zh:913d64e72a4929dae1d4793e2004f4f9a58b138ea337d9d94fa35cafbf06550a",
"zh:c8d93cf86e2e49f6cec665cfe78b82c144cce15a8b2e30f343385fadd1251849",
"zh:cc4f69397d9bc34a528a5609a024c3a48f54f21616c0008792dd417297add955",
"zh:df99cdb8b064aad35ffea77e645cf6541d0b1b2ebc51b6d26c42031de60ab69e",
"zh:8a9993f1dcadf1dd6ca43b23348abe374605d29945a2fafc07fb3457644e6a54",
"zh:b1b9a1e6bcc24d5863a664a411d2dc906373ae7a2399d2d65548ce7377057852",
"zh:b270184cdeec277218e84b94cb136fead753da717f9b9dc378e51907f3f00bb0",
"zh:dff2bc10071210181726ce270f954995fe42c696e61e2e8f874021fed02521e5",
"zh:e8e87b40b6a87dc097b0fdc20d3f725cec0d82abc9cc3755c1f89f8f6e8b0036",
"zh:ee964a6573d399a5dd22ce328fb38ca1207797a02248f14b2e4913ee390e7803",
]
}

View File

@@ -5,7 +5,7 @@ terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "4.52.1"
version = "4.52.5"
}
}
}

View File

@@ -23,16 +23,24 @@ services:
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
build:
context: ../
dockerfile: server/Dockerfile
dockerfile: server/Dockerfile.dev
target: dev
restart: unless-stopped
volumes:
- ../server:/usr/src/app/server
- ../open-api:/usr/src/app/open-api
- ..:/usr/src/app
- ${UPLOAD_LOCATION}/photos:/data
- ${UPLOAD_LOCATION}/photos/upload:/data/upload
- /usr/src/app/server/node_modules
- /etc/localtime:/etc/localtime:ro
- pnpm-store:/usr/src/app/.pnpm-store
- server-node_modules:/usr/src/app/server/node_modules
- web-node_modules:/usr/src/app/web/node_modules
- github-node_modules:/usr/src/app/.github/node_modules
- cli-node_modules:/usr/src/app/cli/node_modules
- docs-node_modules:/usr/src/app/docs/node_modules
- e2e-node_modules:/usr/src/app/e2e/node_modules
- sdk-node_modules:/usr/src/app/open-api/typescript-sdk/node_modules
- app-node_modules:/usr/src/app/node_modules
- sveltekit:/usr/src/app/web/.svelte-kit
- coverage:/usr/src/app/web/coverage
env_file:
- .env
environment:
@@ -58,19 +66,20 @@ services:
- 9231:9231
- 2283:2283
depends_on:
- redis
- database
redis:
condition: service_started
database:
condition: service_started
healthcheck:
disable: false
immich-web:
container_name: immich_web
image: immich-web-dev:latest
# Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919
# user: 0:0
build:
context: ../
dockerfile: web/Dockerfile
dockerfile: server/Dockerfile.dev
target: dev
command: ['immich-web']
env_file:
- .env
@@ -78,18 +87,26 @@ services:
- 3000:3000
- 24678:24678
volumes:
- ../web:/usr/src/app/web
- ../i18n:/usr/src/app/i18n
- ../open-api/:/usr/src/app/open-api/
# - ../../ui:/usr/ui
- /usr/src/app/web/node_modules
- ..:/usr/src/app
- pnpm-store:/usr/src/app/.pnpm-store
- server-node_modules:/usr/src/app/server/node_modules
- web-node_modules:/usr/src/app/web/node_modules
- github-node_modules:/usr/src/app/.github/node_modules
- cli-node_modules:/usr/src/app/cli/node_modules
- docs-node_modules:/usr/src/app/docs/node_modules
- e2e-node_modules:/usr/src/app/e2e/node_modules
- sdk-node_modules:/usr/src/app/open-api/typescript-sdk/node_modules
- app-node_modules:/usr/src/app/node_modules
- sveltekit:/usr/src/app/web/.svelte-kit
- coverage:/usr/src/app/web/coverage
ulimits:
nofile:
soft: 1048576
hard: 1048576
restart: unless-stopped
depends_on:
- immich-server
immich-server:
condition: service_started
immich-machine-learning:
container_name: immich_machine_learning
@@ -117,13 +134,13 @@ services:
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571
healthcheck:
test: redis-cli ping || exit 1
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107
env_file:
- .env
environment:
@@ -161,3 +178,14 @@ volumes:
model-cache:
prometheus-data:
grafana-data:
pnpm-store:
server-node_modules:
web-node_modules:
github-node_modules:
cli-node_modules:
docs-node_modules:
e2e-node_modules:
sdk-node_modules:
app-node_modules:
sveltekit:
coverage:

View File

@@ -56,14 +56,14 @@ services:
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107
env_file:
- .env
environment:
@@ -95,7 +95,7 @@ services:
command: ['./run.sh', '-disable-reporting']
ports:
- 3000:3000
image: grafana/grafana:12.1.0-ubuntu@sha256:397aa30dd1af16cb6c5c9879498e467973a7f87eacf949f6d5a29407a3843809
image: grafana/grafana:12.1.1-ubuntu@sha256:d1da838234ff2de93e0065ee1bf0e66d38f948dcc5d718c25fa6237e14b4424a
volumes:
- grafana-data:/var/lib/grafana

View File

@@ -49,14 +49,14 @@ services:
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:8-bookworm@sha256:facc1d2c3462975c34e10fccb167bfa92b0e0dbd992fc282c29a61c3243afb11
image: docker.io/valkey/valkey:8-bookworm@sha256:fea8b3e67b15729d4bb70589eb03367bab9ad1ee89c876f54327fc7c6e618571
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}

View File

@@ -1 +1 @@
22.18.0
22.19.0

View File

@@ -5,13 +5,13 @@ This website is built using [Docusaurus](https://docusaurus.io/), a modern stati
### Installation
```
$ npm install
$ pnpm install
```
### Local Development
```
$ npm run start
$ pnpm run start
```
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
@@ -19,7 +19,7 @@ This command starts a local development server and opens up a browser window. Mo
### Build
```
$ npm run build
$ pnpm run build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.
@@ -29,13 +29,13 @@ This command generates static content into the `build` directory and can be serv
Using SSH:
```
$ USE_SSH=true npm run deploy
$ USE_SSH=true pnpm run deploy
```
Not using SSH:
```
$ GIT_USER=<Your GitHub username> npm run deploy
$ GIT_USER=<Your GitHub username> pnpm run deploy
```
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.

View File

@@ -1,110 +0,0 @@
---
slug: release-1-36
title: Release v1.36.0
authors: [alextran]
tags: [release]
date: 2022-11-10
---
Hello everyone, it is my pleasure to deliver the new release of Immich to you. The team has been working hard to bring you the new features and improvements. This release includes some big features that the community has been asking since the beginning of Immich. We hope you will enjoy it.
Some notable features are:
- OAuth integration
- LivePhoto support on iOS
- User config system
<!--truncate-->
## LivePhoto iOS Support 🎉
LivePhoto on iOS is now supported in Immich.
The motion part will now be uploaded and can be played on the mobile app and the web.
:::caution
- The server and the app has to be on version **1.36.x** for the application to work correctly.
- Previous uploaded photos will not be updated automatically, you will have to remove and reupload them if you want to keep the LivePhoto functionality.
:::
<img
src="https://media.giphy.com/media/fTrGceZd7t1ewi8ESc/giphy.gif"
width="100%"
style={{
borderRadius: '10px',
boxShadow: 'rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px',
}}
title="LivePhoto playback on the web"
/>
## OAuth Integration 🎉
I want to borrow this chance to express my gratitude to [@EnricoBilla](https://github.com/EnricoBilla), who has been the trailblazer for this feature since the beginning days of Immich. His PR has sparked ideas, suggestions, and discussion among the team member on how to integrate this feature successfully into the app. Thank you so much for your work and your time.
OAuth is now integrated into the system. Please follow the guide [here](https://immich.app/docs/usage/oauth) to set up your OAuth integration
After setting up the correct environment variables in the `.env` file, as shown below
| Key | Type | Default | Description |
| ------------------- | ------- | -------------------- | ------------------------------------------------------------------------- |
| OAUTH_ENABLED | boolean | false | Enable/disable OAuth2 |
| OAUTH_ISSUER_URL | URL | (required) | Required. Self-discovery URL for client |
| OAUTH_CLIENT_ID | string | (required) | Required. Client ID |
| OAUTH_CLIENT_SECRET | string | (required) | Required. Client Secret |
| OAUTH_SCOPE | string | openid email profile | Full list of scopes to send with the request (space delimited) |
| OAUTH_AUTO_REGISTER | boolean | true | When true, will automatically register a user the first time they sign in |
| OAUTH_BUTTON_TEXT | string | Login with OAuth | Text for the OAuth button on the web |
```bash title="Authentik Example"
OAUTH_ENABLED=true
OAUTH_ISSUER_URL=http://10.1.15.216:9000/application/o/immich-test/
OAUTH_CLIENT_ID=30596v8f78a4b6a97d5985c3076b6b4c4d12ddc33
OAUTH_CLIENT_SECRET=50f1eafdec353b95b1c638db390db4ab67ef035a51212dbec2f56175e2eb272b5d572c099176e6fe116ecf47ffdd544bgdb9e2edc588307ee0339d25eeccd88
OAUTH_BUTTON_TEXT=Login with Authentik
```
The web will have the option to sign in with OAuth.
<img
src="https://user-images.githubusercontent.com/27055614/202923726-f43fa148-47f5-4182-8f29-b0b87e4586fa.png"
width="50%"
title="Web Sign in with OAuth"
style={{
borderRadius: '10px',
boxShadow: 'rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px',
}}
/>
The mobile app will check if the server has OAuth enabled before displaying the OAuth
sign-in button.
<img
src="https://media.giphy.com/media/3iy3SaNkVYtlkEiw06/giphy.gif"
title="Mobile sign in with OAuth"
style={{
borderRadius: '10px',
boxShadow: 'rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px',
}}
/>
## Support
<img
src="https://media.giphy.com/media/LStqgGESXW8XnuCv5y/giphy.gif"
width="300"
style={{
borderRadius: '10px',
boxShadow: 'rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px',
}}
title="Support the project"
/>
If you find the project helpful and it helps you in some ways, you can support the project [one time](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) or [monthly](https://github.com/sponsors/alextran1502) from GitHub Sponsor
It is a great way to let me know that you want me to continue developing and working on this project for years to come.
## Details
For more details, please check out the [release note](https://github.com/immich-app/immich/releases/tag/v1.36.0_55-dev)

View File

@@ -1,103 +0,0 @@
---
title: Immich Update - June 2023
authors: [alextran]
tags: [update]
---
Hello everybody, Alex here!
I am back with another update on Immich. It has been only a month since my last update (May 18th, 2023), but it seems forever. I think the rapid releases of Immich and the amount of work make the perspective of time change in Immich’s world. We have some exciting updates that I think you will like.
Before going into detail, on behalf of the core team, I would like to thank all of you for loving Immich and contributing to the project. Thank you for helping me make Immich an enjoyable alternative solution to Google Photos so that you have complete control of your data and privacy. I know we are still young and have a lot of work to do, but I am confident we will get there with help from the community. I appreciate all of you from the bottom of my heart!
<!--truncate-->
And now, to the exciting part, what is new in Immich’s world?
- Initial support for existing gallery.
- Memory feature.
- Support XMP sidecar.
- Support more raw formats.
- Justified layout for web timeline and blurred thumbnail hash.
- Mechanism to host machine learning on a completely different machine.
## Support for existing gallery
I know this is the most controversial feature when it comes to Immich’s way of ingesting photos and videos. For many users, having to upload photos and videos to Immich is simply not working. We listen, discuss, and digest this feature internally more than you imagine because it is not a simple feature to tackle while keeping the performance and the user experience at the top level, which is Immich’s primary goal.
Thankfully, we have many great contributors and developers that want to make this come true. So we came up with an initial implementation of this feature in the form of a supporting read-only gallery.
To be concise, Immich can now read in the gallery files, register the path into the database, and then generate necessary files and put them through Immich’s machine learning pipeline so you can use all the goodness of Immich without the need to upload them. Since this is the initial implementation, some actions/behavior are not yet supported, and we aim to build toward them in future releases, namely:
- Assets are not automatically synced and must instead be manually synced with the CLI tool.
- Only new files that are added to the gallery will be detected.
- Deleted and moved files will not be detected.
## Memory feature
This is considered a fun feature that the team and I wanted to build for so long, but we had to put it off because of the refactoring of the code base. The code base is now in a good enough form to circle back and add more exciting features.
This memory feature is very much similar to GPhotos' implementation of “x years sinceâ€Ļ”. We are aiming to add more categories of memories in the future, such as “Spotlight of the day” or “Day of the Week highlights”
<iframe
width="560"
height="315"
src="https://www.youtube.com/embed/j5XZKvViPew"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
This feature is now available on the web and will be ported to the mobile app in the near future.
## Support XMP Sidecar
Immich can now import/upload XMP sidecars from the CLI and use the information as the metadata of assets.
## Support more raw formats.
With the recent updates on the dependencies of Immich, we are now extending and hardening support for multiple raw formats. So users with DSLR or mirrorless cameras can now upload their original files to Immich and have them displayed in high-quality thumbnails on the web and mobile view.
## Justified layout for web timeline and blurred thumbnail hash
This is an aesthetic improvement in user experience when browsing the timeline. Photos and videos are now displayed correctly with perspective orientation, making the browsing experience more pleasurable.
To further improve the browsing experience, we now added a blur hash to the thumbnail, so the transition is more natural with a dreamy fade in effect, similar to how our brain goes from faded to vivid memory
<iframe
width="560"
height="315"
src="https://www.youtube.com/embed/b95FLmGHRFc"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
## Hosting machine learning container on a different machine
With more capabilities Immich is building toward, machine learning will get more powerful and therefore require more resources to run effectively. However, we understand that users might not have the best server resources where they host the Immich instance. Therefore, we changed how machine learning interacts and receives the photos and videos to run through its inference pipeline.
The machine learning container is now a headless system that can run on any machine. As long as your Immich instance can communicate with the system running the machine learning container, it can send the files and receive the required information to make Immich powerful in terms of searching and intelligence. This helps you to utilize a more powerful machine in your home/infrastructure to perform the CPU-intensive tasks while letting Immich only handle the I/O operations for a pleasant and smooth experience.
---
So, those are the highlights for the team and the community after a busy month. There are a lot more changes and improvements. I encourage you to read some release notes, starting from version [v1.57.0](https://github.com/immich-app/immich/releases/tag/v1.57.0) to now.
Thank you, and I am asking for your support for the project. I hope to be a full-time maintainer of Immich one day to dedicate myself to the project as my life works for the community and my family. You can find the support channels below:
- Monthly donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502)
- One-time donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502)
- [Liberapay](https://liberapay.com/alex.tran1502/)
- [buymeacoffee](https://www.buymeacoffee.com/altran1502)
- Bitcoin: 3QVAb9dCHutquVejeNXitPqZX26Yg5kxb7
- Give a project a star - the contributors love gazing at the stars and seeing their creations shining in the sky.
Join our friendly [Discord](https://discord.immich.app) to talk and discuss Immich, tech, or anything
Cheer!
Until next time!
Alex

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

View File

@@ -1,151 +0,0 @@
---
title: Immich Update - July 2023
authors: [alextran]
tags: [update, v1.64.0-v1.71.0]
---
Hello, Immich fans, another month, another milestone. We hope you are staying cool and safe in this scorching hot summer across the globe.
Immich recently got some good recognition when getting to the front page of HackerNews, which helped to let more people know about the project's existence. The project will help more and more people find a solution to control the privacy of their most precious moments. And with the gain in popularity and recognition, we have gotten new users and more questions from the community than ever.
I want to express my gratitude to all the contributors and the community who have been tremendously helpful to new users' questions and provided technical support.
Below are the highlights of new features we added to the application over the past month, along with countless bug fixes and improvements across the board, from developer experience to resource optimization and UI/UX improvement. I hope you find these topics as exciting as I am.
## Highlights
- Memories feature.
- Facial recognition improvements.
- Improvements on multi selection behavior on the web.
- Shortcuts for common actions on the web.
- Support viewer for 360-panorama photos.
<!--truncate-->
---
### Memories feature
We've added the memory feature on the mobile app, so you can reminisce about your past memories.
<iframe
width="560"
height="315"
src="https://youtube.com/embed/c7OTl-RqNRE"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
### Facial recognition improvements
Over the past few releases, we have added many UI improvements to the facial recognition feature to help you manage the recognized people better. Some of the highlights:
#### Choose a new feature photo for a person.
<iframe
width="560"
height="315"
src="https://youtube.com/embed/PmJp8DmSh1U"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
#### Hide and show faces.
You can now select irrelevant faces to hide them. The hidden faces won’t be displayed in search results and the people section in the info panel.
#### Merge faces.
This is useful when you have multiple faces of the same person in your photos, and you want to merge them into one.
<iframe
width="560"
height="315"
src="https://youtube.com/embed/-Xskhw-vpc4"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
We also added a nifty mechanism that when naming a face, similar names will prompt you a merge face option for the convenience.
<iframe
width="560"
height="315"
src="https://youtube.com/embed/XzE6wficbl4"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
### Improvements on multi selection behavior on the web
We have added a new multi selection behavior on the web to help you select multiple items easier. You can now select a range of photos and videos by holding the `Shift` key.
<iframe
width="560"
height="315"
src="https://youtube.com/embed/e_SiuHpVnmM"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
### Shortcuts for common actions on the web.
Some of us only navigate the world and the web with a keyboard (looking at you, Vim and Emacs users). So it would take away the sacred weapon of choice to require many clicks to perform repetitive actions. So we added quick shortcuts for the following action on the web.
<img
src={require('./images/web-shortcuts-panel.png').default}
width="100%"
style={{ borderRadius: '25px' }}
alt="Dot Env Example"
/>
### Support viewer for 360-panorama photos.
Photos with the EXIF property of `ProjectionType` will now have a special viewer on the web to view all the angles of the panorama.
The thumbnail of the 360 degrees panoramas will have a special icon on the top right of the thumbnail
<img
src="https://github.com/immich-app/immich/assets/61410067/728ca1b0-375c-4631-8081-a609843e702f"
width="50%"
style={{ borderRadius: '25px' }}
alt="Dot Env Example"
/>
Panorama in the detail view
<img
src="https://github.com/immich-app/immich/assets/61410067/3c89dac4-395d-45fa-9bc5-98a6248fd476"
width="50%"
style={{ borderRadius: '25px' }}
alt="Dot Env Example"
/>
---
Thank you, and I am asking for your support for the project. I hope to be a full-time maintainer of Immich one day to dedicate myself to the project as my life's work for the community and my family. You can find the support channels below:
- Monthly donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502)
- One-time donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502)
- [Liberapay](https://liberapay.com/alex.tran1502/)
- [buymeacoffee](https://www.buymeacoffee.com/altran1502)
- Bitcoin: 3QVAb9dCHutquVejeNXitPqZX26Yg5kxb7
- Give a project a star - the contributors love gazing at the stars and seeing their creations shining in the sky.
Join our friendly [Discord](https://discord.immich.app) to talk and discuss Immich, tech, or anything
Cheer!
Until next time!
Alex

View File

@@ -1,71 +0,0 @@
---
title: Immich Recap 2023
authors: [alextran]
tags: [update, recap-2023]
date: 2023-12-30T00:00
---
Hi everyone,
Alex from Immich here.
We are entering the last few weeks of 2023, and it has been quite a year for Immich. The project has grown so much in terms of users, developers, features, maturity, and the community around it. When I started working on Immich, it was simply a challenge for myself and an opportunity to learn new technologies, crafting something fun and useful for my wife during my free time to satisfy my urge to build and create things. I never thought it would become so popular and help so many people. At the end of the day, all we have is memory. I am proud that the team and I have created something to make storing and viewing those precious memories easier without restrictions and without sacrificing our privacy. As the year closes, here’s a recap of everything the project accomplished in 2023.
# Milestones
- Public shared links
- Favorites page
- Immich turned 1
- Material Design 3 on the mobile app
- Auto-link LivePhotos server-side
- iOS background backup
- Explore page
- CLIP search
- Search by metadata
- Responsive web app
- Archive page
- Asset descriptions
- 10,000 stars on GitHub
- Manage auth devices
- Map view
- Facial recognition, clustering, searching, renaming, and person management
- Partner sharing and unifying timeline between partners' users
- Custom storage label
- XMP sidecar reading
- RAW file formats
- Justified layout on the web
- Memories
- Multi-select via SHIFT
- Android Motion Photos
- 360° Photos
- Album description
- Album performance improvements (time buckets)
- Video hardware transcoding
- Slideshow mode on the web
- Configuration file
- External libraries
- Trash page
- Custom theme
- Asset Stacking
- 20,000 stars on GitHub
- Shared album activity and comments
- CLI v2
- Down to 5 containers (from 8)
# Fun Statistics
- We have gone from the release version `1.41.0` to `1.90.0` at the time of writing. On average, we see a release every 7 days.
- According to GitHub's metrics, the `immich-server` container image has been pulled almost _4 million_ times.
- According to mobile app store metrics, we have 22,000 installations on Android and 6700 installation units on iOS (opt-in only).
- Immich is making around $1200/month on average from donations. (Thank you all so much!)
- We were guests on two podcasts:
- [Self-hosted](https://selfhosted.show/110)
- [The Vergecast](https://www.theverge.com/23938533/self-hosting-local-first-software-vergecast)
- There are over 4,500 members on the Discord server.
- We have over 22,000 stars on the main GitHub repository, gaining 15,000 stars since January 2023.
Diving into the next year, the team will continue to build on the foundation we have laid out over the past year, implementing more advanced features for searching, organizing, and sharing between users. Bugs will continue to be squashed and conquered. “Shit Alex wrote'' code will continue to be replaced by beautiful, clean code from Jason, Zack, Boet, Daniel, Osorin, Mert, Fynn, Marty, Martin, and Jonathan. The team has my eternal gratitude for creating a welcoming environment for new contributors, helping, teaching, and learning from each other. I’ve realized that hardly a day has gone by where the team hasn’t been in communication about Immich related topics over the past year.
My long-term goal is to help hone Immich into a diamond in the FOSS space, where the UI, UX, development experiences, documentation, and quality are at a high standard while remaining free for everybody to use.
I hope you enjoy Immich and have a happy and peaceful holiday.

View File

@@ -1,75 +0,0 @@
---
title: The Immich core team goes full-time
authors: [alextran]
tags: [update, announcement, FUTO]
date: 2024-05-01T00:00
---
**Immich is joining [FUTO](https://futo.org/)!**
Since the beginning of this adventure, my goal has always been to create a better world for my children. Memories are priceless, and privacy should not be a luxury. However, building quality open source has its challenges. Over the past two years, it has taken significant dedication, time, and effort.
Recently, a company in Austin, Texas, called FUTO contacted the team. FUTO strives to develop quality and sustainable open software. They build software alternatives that focus on giving control to users. From their mission statement:
“Computers should belong to you, the people. We develop and fund technology to give them back.”
FUTO loved Immich and wanted to see if we’d consider working with them to take the project to the next level. In short, FUTO offered to:
- Pay the core team to work on Immich full-time
- Let us keep full autonomy about the project’s direction and leadership
- Continue to license Immich under AGPL
- Keep Immich’s development direction with no paywalled features
- Keep Immich “built for the people” (no ads, data mining/selling, or alternative motives)
- Provide us with financial, technical, legal, and administrative support
After careful deliberation, the team decided that FUTO’s vision closely aligns with our own: to build a better future by providing a polished, performant, and privacy-preserving open-source software solution for photo and video management delivered in a sustainable way.
Immich’s future has never looked brighter, and we look forward to realizing our vision for Immich as part of FUTO.
If you have more questions, we’ll host a Q&A live stream on May 9th at 3PM UTC (10AM CST). [You can ask questions here](https://www.live-ask.com/event/01HWP2SB99A1K8EXFBDKZ5Z9CF), and the stream will be live [here on our YouTube channel](https://youtube.com/live/cwz2iZwYpgg).
Cheers,
The Immich Team
---
## FAQs
### What is FUTO?
[https://futo.org/what-is-futo/](https://futo.org/what-is-futo/)
### Will the license change?
No. Immich will continue to be licensed under AGPL without a CLA.
### Will Immich continue to be free?
Yes. The Immich source code will remain freely available under the AGPL license.
### Is Immich getting VC funding?
No. Venture capital implies investment in a business, often with the expectation of a future payout (exit plan). Immich is neither a business that can be acquired nor comes with a money-making exit plan.
### I am currently supporting Immich through GitHub sponsors. What will happen to my donation?
Effective immediately, all donations to the Immich organization will be canceled. In the future, we will offer an optional, modest payment option instead. Thank you to everyone who donated to help us get this far!
### How is funding sustainable?
Immich and FUTO believe a sustainable future requires a model that does not rely on users-as-a-product. To this end, FUTO advocates that users pay for good, open software. In keeping with this model, we will adopt a purchase price. This means we no longer accept donations, but — _without limiting features for those who do not pay_ — we will soon allow you to purchase Immich through a modest payment. We encourage you to pay for the high-quality software you use to foster a healthy software culture where developers build great applications without hidden motives for their users.
### When does this change take effect?
This change takes effect immediately.
### What will change?
The following things will change as Immich joins FUTO:
- The brand, logo, and other Immich trademarks will be transferred to FUTO.
- We will stop all donations to the project.
- The core team can now dedicate our full attention to Immich
- Before the end of the year, we plan to have a roadmap for what it will take to get Immich to a stable release.
- Bugs will be squashed, and features will be delivered faster.

View File

@@ -1,91 +0,0 @@
---
title: Licensing announcement - Purchase a license to support Immich
authors: [alextran]
tags: [update, announcement, FUTO]
date: 2024-07-18T00:00
---
Hello everybody,
Firstly, on behalf of the Immich team, I'd like to thank everybody for your continuous support of Immich since the very first day! Your contributions, encouragement, and community engagement have helped bring Immich to its current state. The team and I are forever grateful for that.
Since our [last announcement of the core team joining FUTO to work on Immich full-time](https://immich.app/blog/2024/immich-core-team-goes-fulltime), one of the goals of our new position is to foster a healthy relationship between the developers and the users. We believe that this enables us to create great software, establish transparent policies and build trust.
We want to build a great software application that brings value to you and your loved ones' lives. We are not using you as a product, i.e., selling or tracking your data. We are not putting annoying ads into our software. We respect your privacy. We want to be compensated for the hard work we put in to build Immich for you.
With those notes, we have enabled a way for you to financially support the continued development of Immich, ensuring the software can move forward and will be maintained, by offering a lifetime license of the software. We think if you like and use software, you should pay for it, but _we're never going to force anyone to pay or try to limit Immich for those who don't._
There are two types of license that you can choose to purchase: **Server License** and **Individual License**.
### Server License
This is a lifetime license costing **$99.99**. The license is applied to the whole server. You and all users that use your server are licensed.
### Individual License
This is a lifetime license costing **$24.99**. The license is applied to a single user, and can be used on any server they choose to connect to.
<img
width="837"
alt="license-social-gh"
src="https://github.com/user-attachments/assets/241932ed-ef3b-44ec-a9e2-ee80754e0cca"
/>
You can purchase the license on [our page - https://buy.immich.app](https://buy.immich.app).
Starting with release `v1.109.0` you can purchase and enter your purchased license key directly in the app.
<img
width="1414"
alt="license-page-gh"
src="https://github.com/user-attachments/assets/364fc32a-f6ef-4594-9fea-28d5a26ad77c"
/>
## Thank you
Thank you again for your support, this will help create a strong foundation and stability for the Immich team to continue developing and maintaining the project that you love to use.
<p align="center">
<img
src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExbjY2eWc5Y2F0ZW56MmR4aWE0dDhzZXlidXRmYWZyajl1bWZidXZpcyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/87CKDqErVfMqY/giphy.gif"
width="550"
title="SUPPORT THE PROJECT!"
/>
</p>
<br />
<br />
Cheers! 🎉
Immich team
# FAQ
### 1. Where can I purchase a license?
There are several places where you can purchase the license from
- [https://buy.immich.app](https://buy.immich.app)
- [https://pay.futo.org](https://pay.futo.org/)
- or directly from the app.
### 2. Do I need both _Individual License_ and _Server License_?
No,
If you are the admin and the sole user, or your instance has less than a total of 4 users, you can buy the **Individual License** for each user.
If your instance has more than 4 users, it is more cost-effective to buy the **Server License**, which will license all the users on your instance.
### 3. What do I do if I don't pay?
You can continue using Immich without any restriction.
### 4. Will there be any paywalled features?
No, there will never be any paywalled features.
### 5. Where can I get support regarding payment issues?
You can email us with your `orderId` and your email address `billing@futo.org` or on our Discord server.

View File

@@ -1,78 +0,0 @@
---
title: Immich Update - July 2024
authors: [alextran]
date: 2024-07-01T00:00
tags: [update, v1.106.0]
---
Hello everybody! Alex from Immich here and I am back with another development progress update for the project.
Summer has returned once again, and the night sky is filled with stars, thank you for **38_000 shining stars** you have sent to our [GitHub repo](https://github.com/immich-app/immich)! Since the last announcement several core contributors have started full time. Everything is going great with development, PRs get merged with _brrrrrrr_ rate, conversation exchange between team members is on a new high, we met and are working with the great engineers at FUTO. The spirit is high and we have a lot of things brewing that we think you will like.
Let's go over some of the updates we had since the last post.
### Container consolidation
Reduced the number of total containers from 5 to 4 by making the microservices thread get spawned directly in the server container. Woohoo, remember when Immich had 7 containers?
### Email notifications
![smtp](https://github.com/immich-app/immich/assets/27055614/949cba85-d3f1-4cd3-b246-a6f5fb5d3ae8)
We added email notifications to the app with SMTP settings that you can configure for the following events
- A new account is created for you.
- You are added to a shared album.
- New media is added to an album.
### Versioned docs
You can now jump back into the past or take a peek at the unreleased version of the documentation by selecting the version on the website.
![version-doc](https://github.com/immich-app/immich/assets/27055614/6d22898a-5093-41ad-b416-4573d7ce6e03)
### Similarity deduplication
With more machine learning and CLIP magic, we now have similarity deduplication built into the application where it will search for closely similar images and let you decide what to do with them; i.e keep or trash.
![similarity-deduplication](https://github.com/immich-app/immich/assets/27055614/3cac8478-fbf7-47ea-acb6-0146901dc67e)
### Permanent URL for asset on the web
The detail view for an asset now has a permanent URL so you can easily share them with your loved ones.
### Web app translations
We now have a public Weblate project which the community can use to translate the webapp to their native languages. We are planning to port the mobile app translation to this platform as well. If you would like to contribute, you can take a look [here](https://hosted.weblate.org/projects/immich/immich/). We're already close to 50% translations -- we really appreciate everyone contributing to that!
![web-translation](https://github.com/immich-app/immich/assets/27055614/363df2ed-656c-4584-bd82-0708a693c5bc)
### Read-only/Editor mode on shared album
As the owner of the album, you can choose if the shared user can edit the album or to only view the content of the album without any modification.
![read-only-album](https://github.com/immich-app/immich/assets/27055614/c6f66375-b869-495a-9a86-3e87b316d109)
### Better video thumbnails
Immich now tries to find a descriptive video thumbnail instead of simply using the first frame. No more black images for thumbnails!
### Public Roadmap
We now have a [public roadmap](https://immich.app/roadmap), giving you a high-level overview of things the team is working on. The first goal of this roadmap is to bring Immich to a stable release, which is expected sometime later this year. Some of the highlights include
- Auto stacking - Auto stacking of burst photos
- Basic editor - Basic photo editing capabilities
- Workflows - Automate tasks with workflows
- Fine grained access controls - Granular access controls for users and api keys
- Better background backups - Rework background backups to be more reliable
- Private/locked photos - Private assets with extra protections
Beyond the items in the roadmap, we have _many many_ more ideas for Immich. The team and I hope that you are enjoying the application, find it helpful in your life and we have nothing but the intention of building out great software for you all!
Have an amazing Summer or Winter for those in the southern hemisphere! :D
Until next time,
Cheers!
Alex

View File

@@ -1,5 +0,0 @@
alextran:
name: Alex Tran
title: Maintainer of Immich
url: https://github.com/alextran1502
image_url: https://github.com/alextran1502.png

View File

@@ -1,5 +1,31 @@
# FAQ
## Commercial Guidelines
### Are you open to commercial partnerships and collaborations?
We are working to commercialize Immich and we'd love for you to help us by making Immich better. FUTO is dedicated to developing sustainable models for developing open source software for our customers. We want our customers to be delighted by the products our engineers deliver, and we want our engineers to be paid when they succeed.
If you wish to use Immich in a commercial product not owned by FUTO, we have the following requirements:
- Plugin Integrations: Integrations for other platforms are typically approved, provided proper notification is given.
- Reseller Partnerships: Must adhere to the guidelines outlined below regarding trademark usage, and proper representation.
- Strategic Collaborations: We welcome discussions about mutually beneficial partnerships that enhance the value proposition for both organizations.
### What are your guidelines for resellers and trademark usage?
For organizations seeking to resell Immich, we have established the following guidelines to protect our brand integrity and ensure proper representation.
- We request that resellers do not display our trademarks on their websites or marketing materials. If such usage is discovered, we will contact you to request removal.
- Do not misrepresent your reseller site or services as being officially affiliated with or endorsed by Immich or our development team.
- For small resellers who wish to contribute financially to Immich's development, we recommend directing your customers to purchase licenses directy from us rather than attempting to broker revenue-sharing arrangements. We ask that you refrain from misrepresenting reseller activities as directly supporting our development work.
When in doubt or if you have an edge case scenario, we encourage you to contact us directly via email to discuss the use of our trademark. We can provide clear guidance on what is acceptable and what is not. You can reach out at: questions@immich.app
## User
### How can I reset the admin password?

View File

@@ -10,7 +10,7 @@ Unable to set `app.immich:///oauth-callback` as a valid redirect URI? See [Mobil
Immich supports 3rd party authentication via [OpenID Connect][oidc] (OIDC), an identity layer built on top of OAuth2. OIDC is supported by most identity providers, including:
- [Authentik](https://goauthentik.io/integrations/sources/oauth/#openid-connect)
- [Authentik](https://integrations.goauthentik.io/media/immich/)
- [Authelia](https://www.authelia.com/integration/openid-connect/immich/)
- [Okta](https://www.okta.com/openid-connect/)
- [Google](https://developers.google.com/identity/openid-connect/openid-connect)
@@ -88,7 +88,7 @@ The `.well-known/openid-configuration` part of the url is optional and will be a
## Auto Launch
When Auto Launch is enabled, the login page will automatically redirect the user to the OAuth authorization url, to login with OAuth. To access the login screen again, use the browser's back button, or navigate directly to `/auth/login?autoLaunch=0`.
Auto Launch can also be enabled on a per-request basis by navigating to `/auth/login?authLaunch=1`, this can be useful in situations where Immich is called from e.g. Nextcloud using the _External sites_ app and the _oidc_ app so as to enable users to directly interact with a logged-in instance of Immich.
Auto Launch can also be enabled on a per-request basis by navigating to `/auth/login?autoLaunch=1`, this can be useful in situations where Immich is called from e.g. Nextcloud using the _External sites_ app and the _oidc_ app so as to enable users to directly interact with a logged-in instance of Immich.
## Mobile Redirect URI

View File

@@ -5,7 +5,7 @@ After making any changes in the `server/src/schema`, a database migration need t
1. Run the command
```bash
npm run migrations:generate <migration-name>
pnpm run migrations:generate <migration-name>
```
2. Check if the migration file makes sense.

View File

@@ -204,8 +204,8 @@ When the Dev Container starts, it automatically:
1. **Runs post-create script** (`container-server-post-create.sh`):
- Adjusts file permissions for the `node` user
- Installs dependencies: `npm install` in all packages
- Builds TypeScript SDK: `npm run build` in `open-api/typescript-sdk`
- Installs dependencies: `pnpm install` in all packages
- Builds TypeScript SDK: `pnpm run build` in `open-api/typescript-sdk`
2. **Starts development servers** via VS Code tasks:
- `Immich API Server (Nest)` - API server with hot-reloading on port 2283
@@ -243,7 +243,7 @@ To connect the mobile app to your Dev Container:
- **Server code** (`/server`): Changes trigger automatic restart
- **Web code** (`/web`): Changes trigger hot module replacement
- **Database migrations**: Run `npm run sync:sql` in the server directory
- **Database migrations**: Run `pnpm run sync:sql` in the server directory
- **API changes**: Regenerate TypeScript SDK with `make open-api`
## Testing
@@ -273,19 +273,19 @@ make test-medium-dev # End-to-end tests
```bash
# Server tests
cd /workspaces/immich/server
npm test # Run all tests
npm run test:watch # Watch mode
npm run test:cov # Coverage report
pnpm test # Run all tests
pnpm run test:watch # Watch mode
pnpm run test:cov # Coverage report
# Web tests
cd /workspaces/immich/web
npm test # Run all tests
npm run test:watch # Watch mode
pnpm test # Run all tests
pnpm run test:watch # Watch mode
# E2E tests
cd /workspaces/immich/e2e
npm run test # Run API tests
npm run test:web # Run web UI tests
pnpm run test # Run API tests
pnpm run test:web # Run web UI tests
```
### Code Quality Commands
@@ -476,5 +476,5 @@ Recommended minimums:
- Read the [architecture overview](/docs/developer/architecture)
- Learn about [database migrations](/docs/developer/database-migrations)
- Explore [API documentation](/docs/api)
- Explore [API documentation](https://api.immich.app/)
- Join `#immich` on [Discord](https://discord.immich.app)

View File

@@ -1,6 +1,6 @@
# OpenAPI
Immich uses the [OpenAPI](https://swagger.io/specification/) standard to generate API documentation. To view the published docs see [here](/docs/api).
Immich uses the [OpenAPI](https://swagger.io/specification/) standard to generate API documentation. To view the published docs see [here](https://api.immich.app/).
## Generator

View File

@@ -8,34 +8,34 @@ When contributing code through a pull request, please check the following:
## Web Checks
- [ ] `npm run lint` (linting via ESLint)
- [ ] `npm run format` (formatting via Prettier)
- [ ] `npm run check:svelte` (Type checking via SvelteKit)
- [ ] `npm run check:typescript` (check typescript)
- [ ] `npm test` (unit tests)
- [ ] `pnpm run lint` (linting via ESLint)
- [ ] `pnpm run format` (formatting via Prettier)
- [ ] `pnpm run check:svelte` (Type checking via SvelteKit)
- [ ] `pnpm run check:typescript` (check typescript)
- [ ] `pnpm test` (unit tests)
## Documentation
- [ ] `npm run format` (formatting via Prettier)
- [ ] `pnpm run format` (formatting via Prettier)
- [ ] Update the `_redirects` file if you have renamed a page or removed it from the documentation.
:::tip AIO
Run all web checks with `npm run check:all`
Run all web checks with `pnpm run check:all`
:::
## Server Checks
- [ ] `npm run lint` (linting via ESLint)
- [ ] `npm run format` (formatting via Prettier)
- [ ] `npm run check` (Type checking via `tsc`)
- [ ] `npm test` (unit tests)
- [ ] `pnpm run lint` (linting via ESLint)
- [ ] `pnpm run format` (formatting via Prettier)
- [ ] `pnpm run check` (Type checking via `tsc`)
- [ ] `pnpm test` (unit tests)
:::tip AIO
Run all server checks with `npm run check:all`
Run all server checks with `pnpm run check:all`
:::
:::info Auto Fix
You can use `npm run __:fix` to potentially correct some issues automatically for `npm run format` and `lint`.
You can use `pnpm run __:fix` to potentially correct some issues automatically for `pnpm run format` and `lint`.
:::
## Mobile Checks

View File

@@ -54,20 +54,20 @@ You can access the web from `http://your-machine-ip:3000` or `http://localhost:3
If you only want to do web development connected to an existing, remote backend, follow these steps:
1. Build the Immich SDK - `cd open-api/typescript-sdk && npm i && npm run build && cd -`
1. Build the Immich SDK - `cd open-api/typescript-sdk && pnpm i && pnpm run build && cd -`
2. Enter the web directory - `cd web/`
3. Install web dependencies - `npm i`
3. Install web dependencies - `pnpm i`
4. Start the web development server
```bash
IMMICH_SERVER_URL=https://demo.immich.app/ npm run dev
IMMICH_SERVER_URL=https://demo.immich.app/ pnpm run dev
```
If you're using PowerShell on Windows you may need to set the env var separately like so:
```powershell
$env:IMMICH_SERVER_URL = "https://demo.immich.app/"
npm run dev
pnpm run dev
```
#### `@immich/ui`
@@ -75,12 +75,12 @@ npm run dev
To see local changes to `@immich/ui` in Immich, do the following:
1. Install `@immich/ui` as a sibling to `immich/`, for example `/home/user/immich` and `/home/user/ui`
2. Build the `@immich/ui` project via `npm run build`
2. Build the `@immich/ui` project via `pnpm run build`
3. Uncomment the corresponding volume in web service of the `docker/docker-compose.dev.yaml` file (`../../ui:/usr/ui`)
4. Uncomment the corresponding alias in the `web/vite.config.js` file (`'@immich/ui': path.resolve(\_\_dirname, '../../ui')`)
5. Uncomment the import statement in `web/src/app.css` file `@import '/usr/ui/dist/theme/default.css';` and comment out `@import '@immich/ui/theme/default.css';`
6. Start up the stack via `make dev`
7. After making changes in `@immich/ui`, rebuild it (`npm run build`)
7. After making changes in `@immich/ui`, rebuild it (`pnpm run build`)
### Mobile app

View File

@@ -4,8 +4,8 @@
### Unit tests
Unit are run by calling `npm run test` from the `server/` directory.
You need to run `npm install` (in `server/`) before _once_.
Unit are run by calling `pnpm run test` from the `server/` directory.
You need to run `pnpm install` (in `server/`) before _once_.
### End to end tests
@@ -17,14 +17,14 @@ make e2e
Before you can run the tests, you need to run the following commands _once_:
- `npm install` (in `e2e/`)
- `pnpm install` (in `e2e/`)
- `make open-api` (in the project root `/`)
Once the test environment is running, the e2e tests can be run via:
```bash
cd e2e/
npm test
pnpm test
```
The tests check various things including:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -33,7 +33,7 @@ Sometimes, an external library will not scan correctly. This can happen if Immic
- Are the permissions set correctly?
- Make sure you are using forward slashes (`/`) and not backward slashes.
To validate that Immich can reach your external library, start a shell inside the container. Run `docker exec -it immich_server bash` to a bash shell. If your import path is `/data/import/photos`, check it with `ls /data/import/photos`. Do the same check for the same in any microservices containers.
To validate that Immich can reach your external library, start a shell inside the container. Run `docker exec -it immich_server bash` to a bash shell. If your import path is `/mnt/photos`, check it with `ls /mnt/photos`. If you are using a dedicated microservices container, make sure to add the same mount point and check for availability within the microservices container as well.
### Exclusion Patterns

View File

@@ -66,7 +66,7 @@ The provided file is just a starting point. There are a ton of ways to configure
After bringing down the containers with `docker compose down` and back up with `docker compose up -d`, a Prometheus instance will now collect metrics from the immich server and microservices containers. Note that we didn't need to expose any new ports for these containers - the communication is handled in the internal Docker network.
:::note
To see exactly what metrics are made available, you can additionally add `8081:8081` to the server container's ports and `8082:8082` to the microservices container's ports.
To see exactly what metrics are made available, you can additionally add `8081:8081` (API metrics) and `8082:8082` (microservices metrics) to the immich_server container's ports.
Visiting the `/metrics` endpoint for these services will show the same raw data that Prometheus collects.
To configure these ports see [`IMMICH_API_METRICS_PORT` & `IMMICH_MICROSERVICES_METRICS_PORT`](/docs/install/environment-variables/#general).
:::

View File

@@ -1,6 +1,6 @@
# Tags
Immich supports hierarchical tags, with the ability to read existing tags from the `TagList` and `Keywords` EXIF properties. Any changes to tags made through Immich are also written back to a [sidecar](/docs/features/xmp-sidecars) file. You can re-run the metadata extraction jobs for all assets to import your existing tags.
Immich supports hierarchical tags, with the ability to read existing tags from the XMP `TagsList` field and IPTC `Keywords` field. Any changes to tags made through Immich are also written back to a [sidecar](/docs/features/xmp-sidecars) file. You can re-run the metadata extraction jobs for all assets to import your existing tags.
## Enable tags feature

View File

@@ -1,13 +1,68 @@
# XMP Sidecars
Immich can ingest XMP sidecars on file upload (via the CLI) as well as detect new sidecars that are placed in the filesystem for existing images.
Immich supports XMP sidecar files — external `.xmp` files that store metadata for an image or video in XML format. During the metadata extraction job Immich will read & import metadata from `.xmp` files, and during the Sidecar Write job it will _write_ metadata back to `.xmp`.
<img src={require('./img/xmp-sidecars.webp').default} title='XMP sidecars' />
:::tip
Tools like Lightroom, Darktable, digiKam and other applications can also be configured to write changes to `.xmp` files, in order to avoid modifying the original file.
:::
XMP sidecars are external XML files that contain metadata related to media files. Many applications read and write these files either exclusively or in addition to the metadata written to image files. They can be a powerful tool for editing and storing metadata of a media file without modifying the media file itself. When Immich receives or detects an XMP sidecar for a media file, it will attempt to extract the metadata from both the sidecar as well as the media file. It will prioritize the metadata for fields in the sidecar but will fall back and use the metadata in the media file if necessary.
## Metadata Fields
When importing files via the CLI bulk uploader or parsing photo metadata for external libraries, Immich will automatically detect XMP sidecar files as files that exist next to the original media file. Immich will look files that have the same name as the photo, but with the `.xmp` file extension. The same name can either include the photo's file extension or without the photo's file extension. For example, for a photo named `PXL_20230401_203352928.MP.jpg`, Immich will look for an XMP file named either `PXL_20230401_203352928.MP.jpg.xmp` or `PXL_20230401_203352928.MP.xmp`. If both `PXL_20230401_203352928.MP.jpg.xmp` and `PXL_20230401_203352928.MP.xmp` are present, Immich will prefer `PXL_20230401_203352928.MP.jpg.xmp`.
Immich does not support _all_ metadata fields. Below is a table showing what fields Immich can _read_ and _write_. It's important to note that writes do not replace the entire file contents, but are merged together with any existing fields.
There are 2 administrator jobs associated with sidecar files: `SYNC` and `DISCOVER`. The sync job will re-scan all media with existing sidecar files and queue them for a metadata refresh. This is a great use case when third-party applications are used to modify the metadata of media. The discover job will attempt to scan the filesystem for new sidecar files for all media that does not currently have a sidecar file associated with it.
:::info
Immich automatically queues a Sidecar Write job after editing the description, rating, or updating tags.
:::
<img src={require('./img/sidecar-jobs.webp').default} title='Sidecar Administrator Jobs' />
| Metadata | Immich writes to XMP | Immich reads from XMP |
| --------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Description** | `dc:description`, `tiff:ImageDescription` | `dc:description`, `tiff:ImageDescription` |
| **Rating** | `xmp:Rating` | `xmp:Rating` |
| **DateTime** | `exif:DateTimeOriginal`, `photoshop:DateCreated` | In prioritized order:<br/>`exif:SubSecDateTimeOriginal`<br/>`exif:DateTimeOriginal`<br/>`xmp:SubSecCreateDate`<br/>`xmp:CreateDate`<br/>`xmp:CreationDate`<br/>`xmp:MediaCreateDate`<br/>`xmp:SubSecMediaCreateDate`<br/>`xmp:DateTimeCreated` |
| **Location** | `exif:GPSLatitude`, `exif:GPSLongitude` | `exif:GPSLatitude`, `exif:GPSLongitude` |
| **Tags** | `digiKam:TagsList` | In prioritized order: <br/>`digiKam:TagsList`<br/>`lr:HierarchicalSubject`<br/>`IPTC:Keywords` |
:::note
All other fields (e.g. `Creator`, `Source`, IPTC, Lightroom edits) remain in the `.xmp` file and are **not searchable** in Immich.
:::
## File Naming Rules
A sidecar must share the base name of the media file:
- ✅ `IMG_0001.jpg.xmp` ← preferred
- ✅ `IMG_0001.xmp` ← fallback
- ❌ `myphoto_meta.xmp` ← not recognized
If both `.jpg.xmp` and `.xmp` are present, Immich uses the **`.jpg.xmp`** file.
## CLI Support
1. **Detect** – Immich looks for a `.xmp` file placed next to each media file during upload.
2. **Copy** – Both the media and the sidecar file are copied into Immich’s internal library folder.
The sidecar is renamed to match the internal filename template, e.g.:
`upload/library/<user>/YYYY/YYYY-MM-DD/IMG_0001.jpg`
`upload/library/<user>/YYYY/YYYY-MM-DD/IMG_0001.jpg.xmp`
3. **Extract** – Selected metadata (title, description, date, rating, tags) is parsed from the sidecar and saved to the database.
4. **Write-back** – If you later update tags, rating, or description in the web UI, Immich will update **both** the database _and_ the copied `.xmp` file to stay in sync.
## External Library (Mounted Folder) Support
1. **Detect** – The `DISCOVER` job automatically associates `.xmp` files that sit next to existing media files in your mounted folder. No files are moved or renamed.
2. **Extract** – Immich reads and saves the same metadata fields from the sidecar to the database.
3. **Write-back** – If Immich has **write access** to the mount, any future metadata edits (e.g., rating or tags) are also written back to the original `.xmp` file on disk.
:::danger
If the mount is **read-only**, Immich cannot update either the sidecar **or** the database — **metadata edits will silently fail** with no warning see issue [#10538](https://github.com/immich-app/immich/issues/10538) for more details.
:::
## Admin Jobs
Immich provides two admin jobs for managing sidecars:
| Job | What it does |
| ---------- | ------------------------------------------------------------------------------------------------- |
| `DISCOVER` | Finds new `.xmp` files next to media that don’t already have one linked |
| `SYNC` | Re-reads existing `.xmp` files and refreshes metadata in the database (e.g. after external edits) |
![Sidecar Admin Jobs](./img/sidecar-jobs.webp)

View File

@@ -147,7 +147,10 @@ SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config';
### File properties
```sql title="Without thumbnails"
SELECT * FROM "asset" WHERE "asset"."previewPath" IS NULL OR "asset"."thumbnailPath" IS NULL;
SELECT * FROM "asset"
WHERE (NOT EXISTS (SELECT 1 FROM "asset_file" WHERE "asset"."id" = "asset_file"."assetId" AND "asset_file"."type" = 'thumbnail')
OR NOT EXISTS (SELECT 1 FROM "asset_file" WHERE "asset"."id" = "asset_file"."assetId" AND "asset_file"."type" = 'preview'))
AND "asset"."visibility" = 'timeline';
```
```sql title="Failed file movements"

View File

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

View File

@@ -42,8 +42,8 @@ const config = {
],
presets: [
[
'docusaurus-preset-openapi',
/** @type {import('docusaurus-preset-openapi').Options} */
'classic',
/** @type {import('@docusaurus/preset-classic').Options} */
({
docs: {
showLastUpdateAuthor: true,
@@ -54,14 +54,6 @@ const config = {
// Remove this to remove the "edit this page" links.
editUrl: 'https://github.com/immich-app/immich/tree/main/docs/',
},
api: {
path: '../open-api/immich-openapi-specs.json',
routeBasePath: '/docs/api',
},
// blog: {
// showReadingTime: true,
// editUrl: "https://github.com/immich-app/immich/tree/main/docs/",
// },
theme: {
customCss: require.resolve('./src/css/custom.css'),
},
@@ -100,12 +92,12 @@ const config = {
label: 'Docs',
},
{
to: '/roadmap',
href: 'https://immich.app/roadmap',
position: 'right',
label: 'Roadmap',
},
{
to: '/docs/api',
href: 'https://api.immich.app/',
position: 'right',
label: 'API',
},
@@ -161,15 +153,15 @@ const config = {
items: [
{
label: 'Roadmap',
to: '/roadmap',
href: 'https://immich.app/roadmap',
},
{
label: 'API',
to: '/docs/api',
href: 'https://api.immich.app/',
},
{
label: 'Cursed Knowledge',
to: '/cursed-knowledge',
href: 'https://immich.app/cursed-knowledge',
},
],
},

20545
docs/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -24,10 +24,7 @@
"@mdi/react": "^1.6.1",
"@mdx-js/react": "^3.0.0",
"autoprefixer": "^10.4.17",
"classnames": "^2.3.2",
"clsx": "^2.0.0",
"docusaurus-lunr-search": "^3.3.2",
"docusaurus-preset-openapi": "^0.7.5",
"lunr": "^2.3.9",
"postcss": "^8.4.25",
"prism-react-renderer": "^2.3.1",
@@ -60,6 +57,6 @@
"node": ">=20"
},
"volta": {
"node": "22.18.0"
"node": "22.19.0"
}
}

View File

@@ -28,6 +28,12 @@ const guides: CommunityGuidesProps[] = [
description: `synchronize folders in imported library with albums having the folders name.`,
url: 'https://github.com/immich-app/immich/discussions/3382',
},
{
title: 'Immich Podman Quadlets Handbook',
description:
'A rewrite of the original Immich Docker Compose file using Podman Quadlets, with a set of extra guides in the repository’s wiki.',
url: 'https://github.com/linux-universe/immich-podman-quadlets/blob/main/README.md',
},
{
title: 'Podman/Quadlets Install',
description: 'Documentation for simple podman setup using quadlets.',

View File

@@ -105,6 +105,21 @@ const projects: CommunityProjectProps[] = [
description: 'Speed up your machine learning by load balancing your requests to multiple computers',
url: 'https://github.com/apetersson/immich_ml_balancer',
},
{
title: 'Immich Drop Uploader',
description: 'A tiny, zero-login web app for collecting photos/videos from anyone into your Immich server.',
url: 'https://github.com/Nasogaa/immich-drop',
},
{
title: 'Immich Birthday Sync',
description: 'Bulk-upload and -download birthdays, with CardDAV sync support',
url: 'https://github.com/sid3windr/immich-birthday',
},
{
title: 'Immich Stack',
description: 'Auto-stack photos with identical filenames and differing extensions (i.e. JPG+RAW)',
url: 'https://github.com/sid3windr/immich-stack',
},
];
function CommunityProject({ title, description, url }: CommunityProjectProps): JSX.Element {

View File

@@ -1,273 +0,0 @@
import {
mdiBug,
mdiCalendarToday,
mdiCrosshairsOff,
mdiCrop,
mdiDatabase,
mdiLeadPencil,
mdiLockOff,
mdiLockOutline,
mdiMicrosoftWindows,
mdiSecurity,
mdiSpeedometerSlow,
mdiTrashCan,
mdiWeb,
mdiWrap,
mdiCloudKeyOutline,
mdiRegex,
mdiCodeJson,
mdiClockOutline,
mdiAccountOutline,
mdiRestart,
} from '@mdi/js';
import Layout from '@theme/Layout';
import React from 'react';
import { Timeline, Item as TimelineItem } from '../components/timeline';
const withLanguage = (date: Date) => (language: string) => date.toLocaleDateString(language);
type Item = Omit<TimelineItem, 'done' | 'getDateLabel'> & { date: Date };
const items: Item[] = [
{
icon: mdiClockOutline,
iconColor: 'gray',
title: 'setTimeout is cursed',
description:
'The setTimeout method in JavaScript is cursed when used with small values because the implementation may or may not actually wait the specified time.',
link: {
url: 'https://github.com/immich-app/immich/pull/20655',
text: '#20655',
},
date: new Date(2025, 7, 4),
},
{
icon: mdiAccountOutline,
iconColor: '#DAB1DA',
title: 'PostgreSQL USER is cursed',
description:
'The USER keyword in PostgreSQL is cursed because you can select from it like a table, which leads to confusion if you have a table name user as well.',
link: {
url: 'https://github.com/immich-app/immich/pull/19891',
text: '#19891',
},
date: new Date(2025, 7, 4),
},
{
icon: mdiRestart,
iconColor: '#8395e3',
title: 'PostgreSQL RESET is cursed',
description:
'PostgreSQL RESET is cursed because it is impossible to RESET a PostgreSQL extension parameter if the extension has been uninstalled.',
link: {
url: 'https://github.com/immich-app/immich/pull/19363',
text: '#19363',
},
date: new Date(2025, 5, 20),
},
{
icon: mdiRegex,
iconColor: 'purple',
title: 'Zitadel Actions are cursed',
description:
"Zitadel is cursed because its custom scripting feature is executed with a JS engine that doesn't support regex named capture groups.",
link: {
url: 'https://github.com/dop251/goja',
text: 'Go JS engine',
},
date: new Date(2025, 5, 4),
},
{
icon: mdiCloudKeyOutline,
iconColor: '#0078d4',
title: 'Entra is cursed',
description:
"Microsoft Entra supports PKCE, but doesn't include it in its OpenID discovery document. This leads to clients thinking PKCE isn't available.",
link: {
url: 'https://github.com/immich-app/immich/pull/18725',
text: '#18725',
},
date: new Date(2025, 4, 30),
},
{
icon: mdiCrop,
iconColor: 'tomato',
title: 'Image dimensions in EXIF metadata are cursed',
description:
'The dimensions in EXIF metadata can be different from the actual dimensions of the image, causing issues with cropping and resizing.',
link: {
url: 'https://github.com/immich-app/immich/pull/17974',
text: '#17974',
},
date: new Date(2025, 4, 5),
},
{
icon: mdiCodeJson,
iconColor: 'yellow',
title: 'YAML whitespace is cursed',
description: 'YAML whitespaces are often handled in unintuitive ways.',
link: {
url: 'https://github.com/immich-app/immich/pull/17309',
text: '#17309',
},
date: new Date(2025, 3, 1),
},
{
icon: mdiMicrosoftWindows,
iconColor: '#357EC7',
title: 'Hidden files in Windows are cursed',
description:
'Hidden files in Windows cannot be opened with the "w" flag. That, combined with SMB option "hide dot files" leads to a lot of confusion.',
link: {
url: 'https://github.com/immich-app/immich/pull/12812',
text: '#12812',
},
date: new Date(2024, 8, 20),
},
{
icon: mdiWrap,
iconColor: 'gray',
title: 'Carriage returns in bash scripts are cursed',
description: 'Git can be configured to automatically convert LF to CRLF on checkout and CRLF breaks bash scripts.',
link: {
url: 'https://github.com/immich-app/immich/pull/11613',
text: '#11613',
},
date: new Date(2024, 7, 7),
},
{
icon: mdiLockOff,
iconColor: 'red',
title: 'Fetch inside Cloudflare Workers is cursed',
description:
'Fetch requests in Cloudflare Workers use http by default, even if you explicitly specify https, which can often cause redirect loops.',
link: {
url: 'https://community.cloudflare.com/t/does-cloudflare-worker-allow-secure-https-connection-to-fetch-even-on-flexible-ssl/68051/5',
text: 'Cloudflare',
},
date: new Date(2024, 7, 7),
},
{
icon: mdiCrosshairsOff,
iconColor: 'gray',
title: 'GPS sharing on mobile is cursed',
description:
'Some phones will silently strip GPS data from images when apps without location permission try to access them.',
link: {
url: 'https://github.com/immich-app/immich/discussions/11268',
text: '#11268',
},
date: new Date(2024, 6, 21),
},
{
icon: mdiLeadPencil,
iconColor: 'gold',
title: 'PostgreSQL NOTIFY is cursed',
description:
'PostgreSQL does everything in a transaction, including NOTIFY. This means using the socket.io postgres-adapter writes to WAL every 5 seconds.',
link: { url: 'https://github.com/immich-app/immich/pull/10801', text: '#10801' },
date: new Date(2024, 6, 3),
},
{
icon: mdiWeb,
iconColor: 'lightskyblue',
title: 'npm scripts are cursed',
description:
'npm scripts make a http call to the npm registry each time they run, which means they are a terrible way to execute a health check.',
link: { url: 'https://github.com/immich-app/immich/issues/10796', text: '#10796' },
date: new Date(2024, 6, 3),
},
{
icon: mdiSpeedometerSlow,
iconColor: 'brown',
title: '50 extra packages are cursed',
description:
'There is a user in the JavaScript community who goes around adding "backwards compatibility" to projects. They do this by adding 50 extra package dependencies to your project, which are maintained by them.',
link: { url: 'https://github.com/immich-app/immich/pull/10690', text: '#10690' },
date: new Date(2024, 5, 28),
},
{
icon: mdiLockOutline,
iconColor: 'gold',
title: 'Long passwords are cursed',
description:
'The bcrypt implementation only uses the first 72 bytes of a string. Any characters after that are ignored.',
// link: GHSA-4p64-9f7h-3432
date: new Date(2024, 5, 25),
},
{
icon: mdiCalendarToday,
iconColor: 'greenyellow',
title: 'JavaScript Date objects are cursed',
description: 'JavaScript date objects are 1 indexed for years and days, but 0 indexed for months.',
link: { url: 'https://github.com/immich-app/immich/pull/6787', text: '#6787' },
date: new Date(2024, 0, 31),
},
{
icon: mdiBug,
iconColor: 'green',
title: 'ESM imports are cursed',
description:
'Prior to Node.js v20.8 using --experimental-vm-modules in a CommonJS project that imported an ES module that imported a CommonJS modules would create a segfault and crash Node.js',
link: {
url: 'https://github.com/immich-app/immich/pull/6719',
text: '#6179',
},
date: new Date(2024, 0, 9),
},
{
icon: mdiDatabase,
iconColor: 'gray',
title: 'PostgreSQL parameters are cursed',
description: `PostgresSQL has a limit of ${Number(65535).toLocaleString()} parameters, so bulk inserts can fail with large datasets.`,
link: {
url: 'https://github.com/immich-app/immich/pull/6034',
text: '#6034',
},
date: new Date(2023, 11, 28),
},
{
icon: mdiSecurity,
iconColor: 'gold',
title: 'Secure contexts are cursed',
description: `Some web features like the clipboard API only work in "secure contexts" (ie. https or localhost)`,
link: {
url: 'https://github.com/immich-app/immich/issues/2981',
text: '#2981',
},
date: new Date(2023, 5, 26),
},
{
icon: mdiTrashCan,
iconColor: 'gray',
title: 'TypeORM deletes are cursed',
description: `The remove implementation in TypeORM mutates the input, deleting the id property from the original object.`,
link: {
url: 'https://github.com/typeorm/typeorm/issues/7024#issuecomment-948519328',
text: 'typeorm#6034',
},
date: new Date(2023, 1, 23),
},
];
export default function CursedKnowledgePage(): JSX.Element {
return (
<Layout title="Cursed Knowledge" description="Things we wish we didn't know">
<section className="my-8">
<h1 className="md:text-6xl text-center mb-10 text-immich-primary dark:text-immich-dark-primary px-2">
Cursed Knowledge
</h1>
<p className="text-center text-xl px-2">
Cursed knowledge we have learned as a result of building Immich that we wish we never knew.
</p>
<div className="flex justify-around mt-8 w-full max-w-full">
<Timeline
items={items
.sort((a, b) => b.date.getTime() - a.date.getTime())
.map((item) => ({ ...item, getDateLabel: withLanguage(item.date) }))}
/>
</div>
</section>
</Layout>
);
}

View File

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

View File

@@ -1,123 +1,5 @@
import React from 'react';
import Link from '@docusaurus/Link';
import Layout from '@theme/Layout';
import { discordPath, discordViewBox } from '@site/src/components/svg-paths';
import ThemedImage from '@theme/ThemedImage';
import Icon from '@mdi/react';
function HomepageHeader() {
return (
<header>
<div className="top-[calc(12%)] md:top-[calc(30%)] h-screen w-full absolute -z-10">
<img src={'img/immich-logo.svg'} className="h-[110%] w-[110%] mb-2 antialiased -z-10" alt="Immich logo" />
<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">
<a href="https://futo.org" target="_blank" rel="noopener noreferrer">
<ThemedImage
sources={{ dark: 'img/logomark-dark-with-futo.svg', light: 'img/logomark-light-with-futo.svg' }}
className="h-[125px] w-[125px] mb-2 antialiased rounded-none"
alt="Immich logo"
/>
</a>
<div className="mt-8">
<p className="text-3xl md:text-5xl sm:leading-tight mb-1 font-extrabold text-black/90 dark:text-white px-4">
Self-hosted{' '}
<span className="text-immich-primary dark:text-immich-dark-primary">
photo and <span className="block"></span>
video management{' '}
</span>
solution<span className="block"></span>
</p>
<p className="max-w-1/4 m-auto mt-4 px-4 text-lg text-gray-700 dark:text-gray-100">
Easily back up, organize, and manage your photos on your own server. Immich helps you
<span className="sm:block"></span> browse, search and organize your photos and videos with ease, without
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"
to="docs/overview/quick-start"
>
Get Started
</Link>
<Link
className="flex place-items-center place-content-center py-3 px-8 border bg-white/90 dark:bg-gray-300 rounded-xl hover:no-underline text-immich-primary dark:text-immich-dark-bg font-bold"
to="https://demo.immich.app/"
>
Open Demo
</Link>
</div>
<div className="my-8 flex gap-1 font-medium place-items-center place-content-center text-immich-primary dark:text-immich-dark-primary">
<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>
<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>
<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">
Download the Immich app and start backing up your photos and videos securely to your own server
</p>
</div>
<div className="flex flex-col sm:flex-row place-items-center place-content-center mt-4 gap-1">
<div className="h-24">
<a href="https://play.google.com/store/apps/details?id=app.alextran.immich">
<img className="h-24" alt="Get it on Google Play" src="/img/google-play-badge.png" />
</a>
</div>
<div className="h-24">
<a href="https://apps.apple.com/sg/app/immich/id1613945652">
<img className="h-24 sm:p-3.5 p-3" alt="Download on the App Store" src="/img/ios-app-store-badge.svg" />
</a>
</div>
<div className="h-24">
<a href="https://github.com/immich-app/immich/releases/latest">
<img className="h-24 sm:p-3.5 p-3" alt="Download APK" src="/img/download-apk-github.svg" />
</a>
</div>
</div>
<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 "
/>
</section>
</header>
);
}
import { Redirect } from '@docusaurus/router';
export default function Home(): JSX.Element {
return (
<Layout title="Home" description="Self-hosted photo and video management solution" noFooter={true}>
<HomepageHeader />
<div className="flex flex-col place-items-center text-center place-content-center dark:bg-immich-dark-bg py-8">
<p>This project is available under GNU AGPL v3 license.</p>
<p className="text-sm">Privacy should not be a luxury</p>
</div>
</Layout>
);
return <Redirect to="/docs/overview/welcome" />;
}

View File

@@ -1,944 +0,0 @@
import {
mdiAccountGroup,
mdiAccountGroupOutline,
mdiAndroid,
mdiAppleIos,
mdiArchiveOutline,
mdiBash,
mdiBookSearchOutline,
mdiBookmark,
mdiCakeVariant,
mdiCameraBurst,
mdiChartBoxMultipleOutline,
mdiCheckAll,
mdiCheckboxMarked,
mdiCloudUploadOutline,
mdiCollage,
mdiContentDuplicate,
mdiCrop,
mdiDevices,
mdiEmailOutline,
mdiExpansionCard,
mdiEyeOutline,
mdiEyeRefreshOutline,
mdiFaceMan,
mdiFaceManOutline,
mdiFile,
mdiFileSearch,
mdiFlash,
mdiFolder,
mdiFolderMultiple,
mdiForum,
mdiHandshakeOutline,
mdiHeart,
mdiHistory,
mdiImage,
mdiImageAlbum,
mdiImageEdit,
mdiImageMultipleOutline,
mdiImageSearch,
mdiKeyboardSettingsOutline,
mdiLicense,
mdiLockOutline,
mdiMagnify,
mdiMagnifyScan,
mdiMap,
mdiMaterialDesign,
mdiMatrix,
mdiMerge,
mdiMonitor,
mdiMotionPlayOutline,
mdiPalette,
mdiPanVertical,
mdiPartyPopper,
mdiPencil,
mdiRaw,
mdiRocketLaunch,
mdiRotate360,
mdiScaleBalance,
mdiSecurity,
mdiServer,
mdiShare,
mdiShareAll,
mdiShareCircle,
mdiStar,
mdiStarOutline,
mdiTableKey,
mdiTag,
mdiTagMultiple,
mdiText,
mdiThemeLightDark,
mdiTrashCanOutline,
mdiVectorCombine,
mdiFolderSync,
mdiFaceRecognition,
mdiVideo,
mdiWeb,
mdiDatabaseOutline,
mdiLinkEdit,
mdiTagFaces,
mdiMovieOpenPlayOutline,
mdiCast,
} from '@mdi/js';
import Layout from '@theme/Layout';
import React from 'react';
import { Item, Timeline } from '../components/timeline';
const releases = {
'v1.135.0': new Date(2025, 5, 18),
'v1.133.0': new Date(2025, 4, 21),
'v1.130.0': new Date(2025, 2, 25),
'v1.127.0': new Date(2025, 1, 26),
'v1.122.0': new Date(2024, 11, 5),
'v1.120.0': new Date(2024, 10, 6),
'v1.114.0': new Date(2024, 8, 6),
'v1.113.0': new Date(2024, 7, 30),
'v1.112.0': new Date(2024, 7, 14),
'v1.111.0': new Date(2024, 6, 26),
'v1.110.0': new Date(2024, 5, 11),
'v1.109.0': new Date(2024, 6, 18),
'v1.106.1': new Date(2024, 5, 11),
'v1.104.0': new Date(2024, 4, 13),
'v1.103.0': new Date(2024, 3, 29),
'v1.102.0': new Date(2024, 3, 15),
'v1.99.0': new Date(2024, 2, 20),
'v1.98.0': new Date(2024, 2, 7),
'v1.95.0': new Date(2024, 1, 20),
'v1.94.0': new Date(2024, 0, 31),
'v1.93.0': new Date(2024, 0, 19),
'v1.91.0': new Date(2023, 11, 15),
'v1.90.0': new Date(2023, 11, 7),
'v1.88.0': new Date(2023, 10, 20),
'v1.84.0': new Date(2023, 10, 1),
'v1.83.0': new Date(2023, 9, 28),
'v1.82.0': new Date(2023, 9, 17),
'v1.79.0': new Date(2023, 8, 21),
'v1.76.0': new Date(2023, 7, 29),
'v1.75.0': new Date(2023, 7, 26),
'v1.72.0': new Date(2023, 7, 6),
'v1.71.0': new Date(2023, 6, 29),
'v1.69.0': new Date(2023, 6, 23),
'v1.68.0': new Date(2023, 6, 20),
'v1.67.0': new Date(2023, 6, 14),
'v1.66.0': new Date(2023, 6, 4),
'v1.65.0': new Date(2023, 5, 30),
'v1.63.0': new Date(2023, 5, 24),
'v1.61.0': new Date(2023, 5, 16),
'v1.58.0': new Date(2023, 4, 28),
'v1.57.0': new Date(2023, 4, 23),
'v1.56.0': new Date(2023, 4, 18),
'v1.55.0': new Date(2023, 4, 9),
'v1.54.0': new Date(2023, 3, 18),
'v1.52.0': new Date(2023, 2, 29),
'v1.51.0': new Date(2023, 2, 20),
'v1.48.0': new Date(2023, 1, 21),
'v1.47.0': new Date(2023, 1, 13),
'v1.46.0': new Date(2023, 1, 9),
'v1.43.0': new Date(2023, 1, 3),
'v1.41.0': new Date(2023, 0, 10),
'v1.39.0': new Date(2022, 11, 19),
'v1.36.0': new Date(2022, 10, 20),
'v1.33.1': new Date(2022, 9, 26),
'v1.32.0': new Date(2022, 9, 14),
'v1.27.0': new Date(2022, 8, 6),
'v1.24.0': new Date(2022, 7, 19),
'v1.10.0': new Date(2022, 4, 29),
'v1.7.0': new Date(2022, 3, 24),
'v1.3.0': new Date(2022, 2, 22),
'v1.2.0': new Date(2022, 1, 8),
} as const;
const weirdTags = {
'v1.41.0': 'v1.41.1_64-dev',
'v1.39.0': 'v1.39.0_61-dev',
'v1.36.0': 'v1.36.0_55-dev',
'v1.33.1': 'v1.33.0_52-dev',
'v1.32.0': 'v1.32.0_50-dev',
'v1.27.0': 'v1.27.0_37-dev',
'v1.24.0': 'v1.24.0_34-dev',
'v1.10.0': 'v1.10.0_15-dev',
'v1.7.0': 'v1.7.0_11-dev ',
'v1.3.0': 'v1.3.0-dev ',
'v1.2.0': 'v0.2-dev ',
};
const title = 'Roadmap';
const description = 'A list of future plans and goals, as well as past achievements and milestones.';
const withLanguage = (date: Date) => (language: string) => date.toLocaleDateString(language);
type Base = { icon: string; iconColor?: React.CSSProperties['color']; title: string; description: string };
const withRelease = ({
icon,
iconColor,
title,
description,
release: version,
}: Base & { release: keyof typeof releases }) => {
return {
icon,
iconColor: iconColor ?? 'gray',
title,
description,
link: {
url: `https://github.com/immich-app/immich/releases/tag/${weirdTags[version] ?? version}`,
text: version,
},
getDateLabel: withLanguage(releases[version]),
};
};
const roadmap: Item[] = [
{
done: false,
icon: mdiFlash,
iconColor: 'gold',
title: 'Workflows',
description: 'Automate tasks with workflows',
getDateLabel: () => 'Planned for 2025',
},
{
done: false,
icon: mdiImageEdit,
iconColor: 'rebeccapurple',
title: 'Basic editor',
description: 'Basic photo editing capabilities',
getDateLabel: () => 'Planned for 2025',
},
{
done: false,
icon: mdiRocketLaunch,
iconColor: 'indianred',
title: 'Stable release',
description: 'Immich goes stable',
getDateLabel: () => 'Planned for 2025',
},
{
done: false,
icon: mdiCloudUploadOutline,
iconColor: 'cornflowerblue',
title: 'Better background backups',
description: 'Rework background backups to be more reliable',
getDateLabel: () => 'Planned for 2025',
},
{
done: false,
icon: mdiCameraBurst,
iconColor: 'rebeccapurple',
title: 'Auto stacking',
description: 'Auto stack burst photos',
getDateLabel: () => 'Planned for 2025',
},
];
const milestones: Item[] = [
{
icon: mdiStar,
iconColor: 'gold',
title: '70,000 Stars',
description: 'Reached 70K Stars on GitHub!',
getDateLabel: withLanguage(new Date(2025, 6, 9)),
},
withRelease({
icon: mdiTableKey,
iconColor: 'gray',
title: 'Fine grained access controls',
description: 'Granular access controls for api keys',
release: 'v1.135.0',
}),
withRelease({
icon: mdiCast,
iconColor: 'aqua',
title: 'Google Cast (web and mobile)',
description: 'Cast assets to Google Cast/Chromecast compatible devices',
release: 'v1.135.0',
}),
withRelease({
icon: mdiLockOutline,
iconColor: 'sandybrown',
title: 'Private/locked photos',
description: 'Private assets with extra protections',
release: 'v1.133.0',
}),
withRelease({
icon: mdiFolderMultiple,
iconColor: 'brown',
title: 'Folders view in the mobile app',
description: 'Browse your photos and videos in their folder structure inside the mobile app',
release: 'v1.130.0',
}),
{
icon: mdiStar,
iconColor: 'gold',
title: '60,000 Stars',
description: 'Reached 60K Stars on GitHub!',
getDateLabel: withLanguage(new Date(2025, 2, 4)),
},
withRelease({
icon: mdiTagFaces,
iconColor: 'teal',
title: 'Manual face tagging',
description:
'Manually tag or remove faces in photos and videos, even when automatic detection misses or misidentifies them.',
release: 'v1.127.0',
}),
withRelease({
icon: mdiLinkEdit,
iconColor: 'crimson',
title: 'Automatic URL switching',
description: 'The mobile app now supports automatic switching between different server URLs',
release: 'v1.122.0',
}),
withRelease({
icon: mdiMovieOpenPlayOutline,
iconColor: 'darksalmon',
title: 'Native video player',
description: 'HDR videos are now fully supported using the Immich native video player',
release: 'v1.122.0',
}),
withRelease({
icon: mdiDatabaseOutline,
iconColor: 'brown',
title: 'Automatic database dumps',
description: 'Database dumps are now integrated into the Immich server',
release: 'v1.120.0',
}),
{
icon: mdiStar,
iconColor: 'gold',
title: '50,000 Stars',
description: 'Reached 50K Stars on GitHub!',
getDateLabel: withLanguage(new Date(2024, 10, 1)),
},
withRelease({
icon: mdiFaceRecognition,
title: 'Metadata Face Import',
description: 'Read face metadata in Digikam format during import',
release: 'v1.114.0',
}),
withRelease({
icon: mdiTagMultiple,
iconColor: 'orange',
title: 'Tags',
description: 'Tag your photos and videos',
release: 'v1.113.0',
}),
withRelease({
icon: mdiFolderSync,
iconColor: 'green',
title: 'Album sync (mobile)',
description: 'Sync or mirror an album from your phone to the Immich server',
release: 'v1.113.0',
}),
withRelease({
icon: mdiFolderMultiple,
iconColor: 'brown',
title: 'Folders view',
description: 'Browse your photos and videos in their folder structure',
release: 'v1.113.0',
}),
withRelease({
icon: mdiPalette,
title: 'Theming (mobile)',
description: 'Pick a primary color for the mobile app',
release: 'v1.112.0',
}),
withRelease({
icon: mdiStarOutline,
iconColor: 'gold',
title: 'Star rating',
description: 'Rate your photos and videos',
release: 'v1.112.0',
}),
withRelease({
icon: mdiCrop,
iconColor: 'royalblue',
title: 'Editor (mobile)',
description: 'Crop and rotate on mobile',
release: 'v1.111.0',
}),
withRelease({
icon: mdiMap,
iconColor: 'green',
title: 'Deploy tiles.immich.cloud',
description: 'Dedicated tile server for Immich',
release: 'v1.111.0',
}),
{
icon: mdiStar,
iconColor: 'gold',
title: '40,000 Stars',
description: 'Reached 40K Stars on GitHub!',
getDateLabel: withLanguage(new Date(2024, 6, 21)),
},
withRelease({
icon: mdiShare,
title: 'Deploy my.immich.app',
description: 'Url router for immich links',
release: 'v1.109.0',
}),
withRelease({
icon: mdiLicense,
iconColor: 'gold',
title: 'Supporter Badge',
description: 'The option to buy Immich to support its development!',
release: 'v1.109.0',
}),
withRelease({
icon: mdiHistory,
title: 'Versioned documentation',
description: 'View documentation as it was at the time of past releases',
release: 'v1.106.1',
}),
withRelease({
icon: mdiWeb,
iconColor: 'royalblue',
title: 'Web translations',
description: 'Translate the web application to multiple languages',
release: 'v1.106.1',
}),
withRelease({
icon: mdiContentDuplicate,
title: 'Similar image detection',
description: "Detect duplicate assets that aren't exactly identical",
release: 'v1.106.1',
}),
withRelease({
icon: mdiVectorCombine,
title: 'Container consolidation',
description:
'The microservices container can be run as a worker within the server image, allowing us to remove it from the default stack.',
release: 'v1.106.1',
}),
withRelease({
icon: mdiPencil,
iconColor: 'saddlebrown',
title: 'Read-write external libraries',
description: 'Edit, update, and delete files in external libraries',
release: 'v1.104.0',
}),
withRelease({
icon: mdiEmailOutline,
iconColor: 'crimson',
title: 'Email notifications',
description: 'Send emails for important events',
release: 'v1.104.0',
}),
{
icon: mdiHandshakeOutline,
iconColor: 'magenta',
title: 'Immich joins FUTO!',
description: 'Joined Futo and Immich core team goes full-time',
getDateLabel: withLanguage(new Date(2024, 4, 1)),
},
withRelease({
icon: mdiEyeOutline,
iconColor: 'darkslategray',
title: 'Read-only albums',
description: 'Share albums with other users as read-only',
release: 'v1.103.0',
}),
withRelease({
icon: mdiBookmark,
iconColor: 'orangered',
title: 'Permanent URLs (Web)',
description: 'Assets on the web now have permanent URLs',
release: 'v1.103.0',
}),
withRelease({
icon: mdiStar,
iconColor: 'gold',
title: '30,000 Stars',
description: 'Reached 30K Stars on GitHub!',
release: 'v1.102.0',
}),
withRelease({
icon: mdiChartBoxMultipleOutline,
iconColor: 'mediumvioletred',
title: 'OpenTelemetry metrics',
description: 'OpenTelemetry metrics for local evaluation and advanced debugging',
release: 'v1.99.0',
}),
withRelease({
icon: 'immich',
title: 'New logo',
description: 'Immich got its new logo',
release: 'v1.98.0',
}),
withRelease({
icon: mdiMagnifyScan,
title: 'Search enhancement with advanced filters',
description: 'Advanced search with filters by date, location and more',
release: 'v1.95.0',
}),
withRelease({
icon: mdiScaleBalance,
iconColor: 'gold',
title: 'AGPL License',
description: 'Immich switches to AGPLv3 license',
release: 'v1.95.0',
}),
withRelease({
icon: mdiEyeRefreshOutline,
title: 'Library watching',
description: 'Automatically import files in external libraries when the operating system detects changes.',
release: 'v1.94.0',
}),
withRelease({
icon: mdiExpansionCard,
iconColor: 'green',
title: 'GPU acceleration for machine-learning',
description: 'Hardware acceleration support for Nvidia and Intel devices through CUDA and OpenVINO.',
release: 'v1.94.0',
}),
withRelease({
icon: mdiAccountGroupOutline,
iconColor: 'gray',
title: '250 unique contributors',
description: '250 amazing people contributed to Immich',
release: 'v1.93.0',
}),
withRelease({
icon: mdiMatrix,
title: 'Search improvement with pgvecto.rs',
description: 'Moved the search from typesense to pgvecto.rs',
release: 'v1.91.0',
}),
withRelease({
icon: mdiPencil,
iconColor: 'saddlebrown',
title: 'Edit metadata',
description: "Edit a photo or video's date, time, hours, timezone, and GPS information",
release: 'v1.90.0',
}),
withRelease({
icon: mdiVectorCombine,
title: 'Container consolidation',
description:
'The serving of the web app is merged into the server image, allowing us to remove two containers from the stack.',
release: 'v1.88.0',
}),
withRelease({
icon: mdiBash,
iconColor: 'gray',
title: 'CLI v2',
description: 'Version 2 of the Immich CLI is released, replacing the legacy v1 CLI.',
release: 'v1.88.0',
}),
withRelease({
icon: mdiForum,
iconColor: 'dodgerblue',
title: 'Activity',
description: 'Comment a photo or a video in a shared album',
release: 'v1.84.0',
}),
withRelease({
icon: mdiStar,
iconColor: 'gold',
title: '20,000 Stars',
description: 'Reached 20K Stars on GitHub!',
release: 'v1.83.0',
}),
withRelease({
icon: mdiCameraBurst,
iconColor: 'rebeccapurple',
title: 'Stack assets',
description: 'Manual asset stacking for grouping and hiding related assets in the main timeline.',
release: 'v1.83.0',
}),
withRelease({
icon: mdiPalette,
iconColor: 'magenta',
title: 'Custom theme',
description: 'Apply your custom CSS for modifying fonts, colors, and styles in the web application.',
release: 'v1.83.0',
}),
withRelease({
icon: mdiTrashCanOutline,
iconColor: 'brown',
title: 'Trash feature',
description: 'Trash, restore from trash, and automatically empty the recycle bin after 30 days.',
release: 'v1.82.0',
}),
withRelease({
icon: mdiBookSearchOutline,
title: 'External libraries',
description: 'Automatically import media into Immich based on imports paths and ignore patterns.',
release: 'v1.79.0',
}),
withRelease({
icon: mdiMap,
iconColor: 'darksalmon',
title: 'Map view (mobile)',
description: 'Heat map implementation in the mobile app.',
release: 'v1.76.0',
}),
withRelease({
icon: mdiFile,
iconColor: 'lightblue',
title: 'Configuration file',
description: 'Auto-configure an Immich installation via a configuration file.',
release: 'v1.75.0',
}),
withRelease({
icon: mdiMonitor,
iconColor: 'darkcyan',
title: 'Slideshow mode (web)',
description: 'Start a full-screen slideshow from an Album on the web.',
release: 'v1.75.0',
}),
withRelease({
icon: mdiServer,
iconColor: 'lightskyblue',
title: 'Hardware transcoding',
description: 'Support hardware acceleration (QuickSync, VAAPI, and Nvidia) for video transcoding.',
release: 'v1.72.0',
}),
withRelease({
icon: mdiImageAlbum,
iconColor: 'olivedrab',
title: 'View albums via time buckets',
description: 'Upgrade albums to use time buckets, an optimized virtual viewport.',
release: 'v1.72.0',
}),
withRelease({
icon: mdiImageAlbum,
iconColor: 'olivedrab',
title: 'Album description',
description: 'Save an album description.',
release: 'v1.72.0',
}),
withRelease({
icon: mdiRotate360,
title: '360° Photos (web)',
description: 'View 360° Photos on the web.',
release: 'v1.71.0',
}),
withRelease({
icon: mdiMotionPlayOutline,
title: 'Android motion photos',
description: 'Add support for Android Motion Photos.',
release: 'v1.69.0',
}),
withRelease({
icon: mdiFaceManOutline,
iconColor: 'mistyrose',
title: 'Show/hide faces',
description: 'Add the options to show or hide faces.',
release: 'v1.68.0',
}),
withRelease({
icon: mdiMerge,
iconColor: 'forestgreen',
title: 'Merge faces',
description: 'Add the ability to merge multiple faces together.',
release: 'v1.67.0',
}),
withRelease({
icon: mdiImage,
iconColor: 'rebeccapurple',
title: 'Feature photo',
description: 'Add the option to change the feature photo for a person.',
release: 'v1.66.0',
}),
withRelease({
icon: mdiKeyboardSettingsOutline,
iconColor: 'darkslategray',
title: 'Multi-select via SHIFT',
description: 'Add the option to multi-select while holding SHIFT.',
release: 'v1.66.0',
}),
withRelease({
icon: mdiImageMultipleOutline,
iconColor: 'rebeccapurple',
title: 'Memories (mobile)',
description: 'View "On this day..." memories in the mobile app.',
release: 'v1.65.0',
}),
withRelease({
icon: mdiFaceMan,
iconColor: 'mistyrose',
title: 'Facial recognition (mobile)',
description: 'View detected faces in the mobile app.',
release: 'v1.63.0',
}),
withRelease({
icon: mdiImageMultipleOutline,
iconColor: 'rebeccapurple',
title: 'Memories (web)',
description: 'View pictures taken in past years on this day on the web.',
release: 'v1.61.0',
}),
withRelease({
icon: mdiCollage,
iconColor: 'deeppink',
title: 'Justified layout (web)',
description: 'Implement justified layout (collage) on the web.',
release: 'v1.61.0',
}),
withRelease({
icon: mdiRaw,
title: 'RAW file formats',
description: 'Support for RAW file formats.',
release: 'v1.61.0',
}),
withRelease({
icon: mdiShareAll,
iconColor: 'darkturquoise',
title: 'Partner sharing (mobile)',
description: 'View shared partner photos in the mobile app.',
release: 'v1.58.0',
}),
withRelease({
icon: mdiFile,
iconColor: 'lightblue',
title: 'XMP sidecar',
description: 'Attach XMP sidecar files to assets.',
release: 'v1.58.0',
}),
withRelease({
icon: mdiFolder,
iconColor: 'brown',
title: 'Custom storage label',
description: 'Replace the user UUID in the storage template with a custom label.',
release: 'v1.57.0',
}),
withRelease({
icon: mdiShareCircle,
title: 'Partner sharing',
description: 'Share your entire collection with another user.',
release: 'v1.56.0',
}),
withRelease({
icon: mdiFaceMan,
iconColor: 'mistyrose',
title: 'Facial recognition',
description: 'Detect faces in pictures and cluster them together as people, which can be named.',
release: 'v1.56.0',
}),
withRelease({
icon: mdiMap,
iconColor: 'darksalmon',
title: 'Map view (web)',
description: 'View a global map, with clusters of photos based on corresponding GPS data.',
release: 'v1.55.0',
}),
withRelease({
icon: mdiDevices,
iconColor: 'slategray',
title: 'Manage auth devices',
description: 'Manage logged-in devices and revoke access from User Settings.',
release: 'v1.55.0',
}),
withRelease({
icon: mdiStar,
iconColor: 'gold',
title: '10,000 Stars',
description: 'Reached 10K stars on GitHub!',
release: 'v1.54.0',
}),
withRelease({
icon: mdiText,
title: 'Asset descriptions',
description: 'Save an asset description',
release: 'v1.54.0',
}),
withRelease({
icon: mdiArchiveOutline,
title: 'Archiving',
description: 'Remove assets from the main timeline by archiving them.',
release: 'v1.54.0',
}),
withRelease({
icon: mdiDevices,
iconColor: 'slategray',
title: 'Responsive web app',
description: 'Optimize the web app for small screen.',
release: 'v1.54.0',
}),
withRelease({
icon: mdiFileSearch,
iconColor: 'brown',
title: 'Search by metadata',
description: 'Search images by filename, description, tagged people, make, model, and other metadata.',
release: 'v1.52.0',
}),
withRelease({
icon: mdiImageSearch,
iconColor: 'rebeccapurple',
title: 'CLIP search',
description: 'Search images with free-form text like "Sunset at the beach".',
release: 'v1.51.0',
}),
withRelease({
icon: mdiMagnify,
iconColor: 'lightblue',
title: 'Explore page',
description: 'View tagged places, object, and people.',
release: 'v1.51.0',
}),
withRelease({
icon: mdiAppleIos,
title: 'iOS background uploads',
description: 'Automatically backup pictures in the background on iOS.',
release: 'v1.48.0',
}),
withRelease({
icon: mdiMotionPlayOutline,
title: 'Auto-Link live photos',
description: 'Automatically link live photos, even when uploaded as separate files.',
release: 'v1.48.0',
}),
withRelease({
icon: mdiMaterialDesign,
iconColor: 'blue',
title: 'Material design 3 (mobile)',
description: 'Upgrade the mobile app to Material Design 3.',
release: 'v1.47.0',
}),
withRelease({
icon: mdiHeart,
iconColor: 'red',
title: 'Favorites (mobile)',
description: 'Show favorites on the mobile app.',
release: 'v1.46.0',
}),
withRelease({
icon: mdiCakeVariant,
iconColor: 'deeppink',
title: 'Immich turns 1',
description: 'Immich is officially one year old.',
release: 'v1.43.0',
}),
withRelease({
icon: mdiHeart,
iconColor: 'red',
title: 'Favorites page (web)',
description: 'Favorite and view favorites on the web.',
release: 'v1.43.0',
}),
withRelease({
icon: mdiShareCircle,
title: 'Public share links',
description: 'Share photos and albums publicly via a shared link.',
release: 'v1.41.0',
}),
withRelease({
icon: mdiFolder,
iconColor: 'lightblue',
title: 'User-defined storage structure',
description: 'Support custom storage structures.',
release: 'v1.39.0',
}),
withRelease({
icon: mdiMotionPlayOutline,
title: 'iOS live photos',
description: 'Backup and display iOS Live Photos.',
release: 'v1.36.0',
}),
withRelease({
icon: mdiSecurity,
iconColor: 'green',
title: 'OAuth integration',
description: 'Support OAuth2 and OIDC capable identity providers.',
release: 'v1.36.0',
}),
withRelease({
icon: mdiWeb,
iconColor: 'royalblue',
title: 'Documentation site',
description: 'Release an official documentation website.',
release: 'v1.33.1',
}),
withRelease({
icon: mdiThemeLightDark,
iconColor: 'slategray',
title: 'Dark mode (web)',
description: 'Dark mode on the web.',
release: 'v1.32.0',
}),
withRelease({
icon: mdiPanVertical,
title: 'Virtual scrollbar (web)',
description: 'View the main timeline with a virtual scrollbar, allowing to jump to any point in time, instantly.',
release: 'v1.27.0',
}),
withRelease({
icon: mdiCheckAll,
iconColor: 'green',
title: 'Checksum duplication check',
description: 'Enforce per user sha1 checksum uniqueness.',
release: 'v1.27.0',
}),
withRelease({
icon: mdiAndroid,
iconColor: 'greenyellow',
title: 'Android background backup',
description: 'Automatic backup in the background on Android.',
release: 'v1.24.0',
}),
withRelease({
icon: mdiAccountGroup,
iconColor: 'gray',
title: 'Admin portal',
description: 'Manage users and admin settings from the web.',
release: 'v1.10.0',
}),
withRelease({
icon: mdiShareCircle,
title: 'Album sharing',
description: 'Share albums with other users.',
release: 'v1.7.0',
}),
withRelease({
icon: mdiTag,
iconColor: 'coral',
title: 'Image tagging',
description: 'Tag images with custom values.',
release: 'v1.7.0',
}),
withRelease({
icon: mdiImage,
iconColor: 'rebeccapurple',
title: 'View exif',
description: 'View metadata about assets.',
release: 'v1.3.0',
}),
withRelease({
icon: mdiCheckboxMarked,
iconColor: 'green',
title: 'Multi select',
description: 'Select and execute actions on multiple assets at the same time.',
release: 'v1.2.0',
}),
withRelease({
icon: mdiVideo,
iconColor: 'slategray',
title: 'Video player',
description: 'Play videos in the web and on mobile.',
release: 'v1.2.0',
}),
{
icon: mdiPartyPopper,
iconColor: 'deeppink',
title: 'First commit',
description: 'First commit on GitHub, Immich is born.',
getDateLabel: withLanguage(new Date(2022, 1, 3)),
},
];
export default function MilestonePage(): JSX.Element {
return (
<Layout title={title} description={description}>
<section className="my-8">
<h1 className="md:text-6xl text-center mb-10 text-immich-primary dark:text-immich-dark-primary px-2">
{title}
</h1>
<p className="text-center text-xl px-2">{description}</p>
<div className="flex justify-around mt-8 w-full max-w-full">
<Timeline items={[...roadmap, ...milestones]} />
</div>
</section>
</Layout>
);
}

View File

@@ -1,5 +0,0 @@
Policy: https://github.com/immich-app/immich/blob/main/SECURITY.md
Contact: mailto:security@immich.app
Preferred-Languages: en
Expires: 2026-05-01T23:59:00.000Z
Canonical: https://immich.app/.well-known/security.txt

View File

@@ -1,4 +1,56 @@
[
{
"label": "v1.143.1",
"url": "https://v1.143.1.archive.immich.app"
},
{
"label": "v1.143.0",
"url": "https://v1.143.0.archive.immich.app"
},
{
"label": "v1.142.1",
"url": "https://v1.142.1.archive.immich.app"
},
{
"label": "v1.142.0",
"url": "https://v1.142.0.archive.immich.app"
},
{
"label": "v1.141.1",
"url": "https://v1.141.1.archive.immich.app"
},
{
"label": "v1.141.0",
"url": "https://v1.141.0.archive.immich.app"
},
{
"label": "v1.140.1",
"url": "https://v1.140.1.archive.immich.app"
},
{
"label": "v1.140.0",
"url": "https://v1.140.0.archive.immich.app"
},
{
"label": "v1.139.4",
"url": "https://v1.139.4.archive.immich.app"
},
{
"label": "v1.139.3",
"url": "https://v1.139.3.archive.immich.app"
},
{
"label": "v1.139.2",
"url": "https://v1.139.2.archive.immich.app"
},
{
"label": "v1.138.1",
"url": "https://v1.138.1.archive.immich.app"
},
{
"label": "v1.138.0",
"url": "https://v1.138.0.archive.immich.app"
},
{
"label": "v1.137.3",
"url": "https://v1.137.3.archive.immich.app"

1
e2e/.gitignore vendored
View File

@@ -3,3 +3,4 @@ node_modules/
/playwright-report/
/blob-report/
/playwright/.cache/
/dist

View File

@@ -1 +1 @@
22.18.0
22.19.0

View File

@@ -38,7 +38,7 @@ services:
image: redis:6.2-alpine@sha256:7fe72c486b910f6b1a9769c937dad5d63648ddee82e056f47417542dd40825bb
database:
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:0e763a2383d56f90364fcd72767ac41400cd30d2627f407f7e7960c9f1923c21
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0@sha256:11ced39d65a92a54d12890ced6a26cc2003f92697d6f0d4d944b98459dba7138
command: -c fsync=off -c shared_preload_libraries=vchord.so -c config_file=/var/lib/postgresql/data/postgresql.conf
environment:
POSTGRES_PASSWORD: postgres

7419
e2e/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "immich-e2e",
"version": "1.137.3",
"version": "1.143.1",
"description": "",
"main": "index.js",
"type": "module",
@@ -19,19 +19,17 @@
"author": "",
"license": "GNU Affero General Public License version 3",
"devDependencies": {
"@eslint/eslintrc": "^3.1.0",
"@eslint/js": "^9.8.0",
"@immich/cli": "file:../cli",
"@immich/sdk": "file:../open-api/typescript-sdk",
"@playwright/test": "^1.44.1",
"@socket.io/component-emitter": "^3.1.2",
"@types/luxon": "^3.4.2",
"@types/node": "^22.17.0",
"@types/node": "^22.18.1",
"@types/oidc-provider": "^9.0.0",
"@types/pg": "^8.15.1",
"@types/pngjs": "^6.0.4",
"@types/supertest": "^6.0.2",
"@vitest/coverage-v8": "^3.0.0",
"eslint": "^9.14.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.1.3",
@@ -45,7 +43,7 @@
"pngjs": "^7.0.0",
"prettier": "^3.2.5",
"prettier-plugin-organize-imports": "^4.0.0",
"sharp": "^0.34.0",
"sharp": "^0.34.3",
"socket.io-client": "^4.7.4",
"supertest": "^7.0.0",
"typescript": "^5.3.3",
@@ -54,6 +52,6 @@
"vitest": "^3.0.0"
},
"volta": {
"node": "22.18.0"
"node": "22.19.0"
}
}

View File

@@ -1466,10 +1466,10 @@ describe('/asset', () => {
expectedDate: '2023-04-04T04:00:00.000Z',
},
{
name: 'CreateDate when DateTimeOriginal missing',
name: 'CreationDate when DateTimeOriginal missing',
exifData: {
CreateDate: '2023:05:05 05:00:00', // TESTABLE
CreationDate: '2023:07:07 07:00:00', // TESTABLE
CreationDate: '2023:05:05 05:00:00', // TESTABLE
CreateDate: '2023:07:07 07:00:00', // TESTABLE
GPSDateTime: '2023:10:10 10:00:00', // TESTABLE
},
expectedDate: '2023-05-05T05:00:00.000Z',

View File

@@ -23,8 +23,8 @@ describe('/partners', () => {
]);
await Promise.all([
createPartner({ id: user2.userId }, { headers: asBearerAuth(user1.accessToken) }),
createPartner({ id: user1.userId }, { headers: asBearerAuth(user2.accessToken) }),
createPartner({ partnerCreateDto: { sharedWithId: user2.userId } }, { headers: asBearerAuth(user1.accessToken) }),
createPartner({ partnerCreateDto: { sharedWithId: user1.userId } }, { headers: asBearerAuth(user2.accessToken) }),
]);
});

View File

@@ -79,7 +79,7 @@ export const tempDir = tmpdir();
export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
export const asKeyAuth = (key: string) => ({ 'x-api-key': key });
export const immichCli = (args: string[]) =>
executeCommand('node', ['node_modules/.bin/immich', '-d', `/${tempDir}/immich/`, ...args]).promise;
executeCommand('pnpm', ['exec', 'immich', '-d', `/${tempDir}/immich/`, ...args], { cwd: '../cli' }).promise;
export const immichAdmin = (args: string[]) =>
executeCommand('docker', ['exec', '-i', 'immich-e2e-server', '/bin/bash', '-c', `immich-admin ${args.join(' ')}`]);
export const specialCharStrings = ["'", '"', ',', '{', '}', '*'];
@@ -462,7 +462,8 @@ export const utils = {
updateLibrary: (accessToken: string, id: string, dto: UpdateLibraryDto) =>
updateLibrary({ id, updateLibraryDto: dto }, { headers: asBearerAuth(accessToken) }),
createPartner: (accessToken: string, id: string) => createPartner({ id }, { headers: asBearerAuth(accessToken) }),
createPartner: (accessToken: string, id: string) =>
createPartner({ partnerCreateDto: { sharedWithId: id } }, { headers: asBearerAuth(accessToken) }),
updateMyPreferences: (accessToken: string, userPreferencesUpdateDto: UserPreferencesUpdateDto) =>
updateMyPreferences({ userPreferencesUpdateDto }, { headers: asBearerAuth(accessToken) }),

View File

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

View File

@@ -1,5 +1,5 @@
{
"about": "ØšŲ†",
"about": "Ø­ŲŽŲˆŲ’Ų„",
"account": "Ø­ØŗØ§Ø¨",
"account_settings": "ØĨؚداداØĒ Ø§Ų„Ø­ØŗØ§Ø¨",
"acknowledge": "ØŖŲØ¯ØąŲƒ Ø°Ų„Ųƒ",
@@ -14,6 +14,7 @@
"add_a_location": "ØĨØļØ§ŲØŠ Ų…ŲˆŲ‚Øš",
"add_a_name": "ØĨØļØ§ŲØŠ ØĨØŗŲ…",
"add_a_title": "ØĨØļØ§ŲØŠ ØšŲ†ŲˆØ§Ų†",
"add_birthday": "ØŖØļ؁ ØĒØ§ØąŲŠØŽ Ø§Ų„Ų…ŲŠŲ„Ø§Ø¯",
"add_endpoint": "اØļ؁ Ų†Ų‚ØˇØŠ Ų†Ų‡Ø§ŲŠØŠ",
"add_exclusion_pattern": "ØĨØļØ§ŲØŠ Ų†Ų…Øˇ ØĨØŗØĒØĢŲ†Ø§ØĄ",
"add_import_path": "ØĨØļØ§ŲØŠ Ų…ØŗØ§Øą Ø§Ų„ØĨØŗØĒŲŠØąØ§Ø¯",
@@ -25,8 +26,11 @@
"add_tag": "اØļ؁ ØšŲ„Ø§Ų…ØŠ",
"add_to": "ØĨØļØ§ŲØŠ ØĨŲ„Ų‰â€Ļ",
"add_to_album": "ØĨØļØ§ŲØŠ ØĨŲ„Ų‰ ØŖŲ„Ø¨ŲˆŲ…",
"add_to_album_bottom_sheet_added": "ØĒŲ…ØĒ Ø§Ų„Ø§ØļØ§ŲØŠ{album}",
"add_to_album_bottom_sheet_already_exists": "Ų…ŲˆØŦŲˆØ¯ØŠ Ų…ØŗØ¨Ų‚Ø§ {album}",
"add_to_album_bottom_sheet_added": "ØĒŲ…ØĒ Ø§Ų„Ø§ØļØ§ŲØŠ Ø§Ų„Ų‰ {album}",
"add_to_album_bottom_sheet_already_exists": "Ų…ŲˆØŦŲˆØ¯ Ų…ØŗØ¨Ų‚Ø§ ؁؊ {album}",
"add_to_album_toggle": "ØĒØ¨Ø¯ŲŠŲ„ Ø§Ų„ØĒØ­Ø¯ŲŠØ¯ Ų„Ų€{album}",
"add_to_albums": "ØĨØļØ§ŲØŠ Ø§Ų„Ų‰ Ø§Ų„Ø¨ŲˆŲ…Ø§ØĒ",
"add_to_albums_count": "ØĨØļØ§ŲŲ‡ ØĨŲ„Ų‰ Ø§Ų„Ø¨ŲˆŲ…Ø§ØĒ ({count})",
"add_to_shared_album": "ØĨØļØ§ŲØŠ ØĨŲ„Ų‰ ØŖŲ„Ø¨ŲˆŲ… Ų…Ø´Ø§ØąŲƒ",
"add_url": "ØĨØļØ§ŲØŠ ØąØ§Ø¨Øˇ",
"added_to_archive": "ØŖŲØļ؊؁ØĒ Ų„Ų„ØŖØąØ´ŲŠŲ",
@@ -34,16 +38,23 @@
"added_to_favorites_count": "ØĒŲ… ØĨØļØ§ŲØŠ {count, number} ØĨŲ„Ų‰ Ø§Ų„Ų…ŲØļŲ„Ø§ØĒ",
"admin": {
"add_exclusion_pattern_description": "ØĨØļØ§ŲØŠ ØŖŲ†Ų…Ø§Øˇ Ø§Ų„Ø§ØŗØĒبؚاد. ŲŠØ¯ØšŲ… Ø§Ų„ØĒŲ…ŲˆŲŠŲ‡ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… *، **، ŲˆØŸ. Ų„ØĒØŦØ§Ų‡Ų„ ØŦŲ…ŲŠØš Ø§Ų„Ų…Ų„ŲØ§ØĒ ؁؊ ØŖŲŠ Ø¯Ų„ŲŠŲ„ ŲŠØŗŲ…Ų‰ \"Raw\"، Ø§ØŗØĒØŽØ¯Ų… \"**/Raw/**\". Ų„ØĒØŦØ§Ų‡Ų„ ØŦŲ…ŲŠØš Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„ØĒ؊ ØĒŲ†ØĒŲ‡ŲŠ Ø¨Ų€ \".tif\"، Ø§ØŗØĒØŽØ¯Ų… \"**/*.tif\". Ų„ØĒØŦØ§Ų‡Ų„ Ų…ØŗØ§Øą Ų…ØˇŲ„Ų‚ØŒ Ø§ØŗØĒØŽØ¯Ų… \"/path/to/ignore/**\".",
"admin_user": "Ų…ØŗØĒØŽØ¯Ų… Ų…Ø¯ŲŠØą",
"admin_user": "Ų…ØŗØĒØŽØ¯Ų… Ų…ØŗØ¤ŲˆŲ„",
"asset_offline_description": "Ų„Ų… ŲŠØšØ¯ Ų‡Ø°Ø§ Ø§Ų„ØŖØĩŲ„ Ø§Ų„ØŽØ§Øĩ Ø¨Ø§Ų„Ų…ŲƒØĒب؊ Ø§Ų„ØŽØ§ØąØŦŲŠØŠ Ų…ŲˆØŦŲˆØ¯Ų‹Ø§ ØšŲ„Ų‰ Ø§Ų„Ų‚ØąØĩ ؈ØĒŲ… Ų†Ų‚Ų„Ų‡ ØĨŲ„Ų‰ ØŗŲ„ØŠ Ø§Ų„Ų…Ų‡Ų…Ų„Ø§ØĒ. ØĨذا ØĒŲ… Ų†Ų‚Ų„ Ø§Ų„Ų…Ų„Ų Ø¯Ø§ØŽŲ„ Ø§Ų„Ų…ŲƒØĒب؊، ؁ØĒØ­Ų‚Ų‚ Ų…Ų† Ø§Ų„ØŦØ¯ŲˆŲ„ Ø§Ų„Ø˛Ų…Ų†ŲŠ Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ Ų„Ų…ØšØąŲØŠ Ø§Ų„ØŖØĩŲ„ Ø§Ų„ØŦØ¯ŲŠØ¯ Ø§Ų„Ų…Ų‚Ø§Ø¨Ų„. Ų„Ø§ØŗØĒؚاد؊ Ų‡Ø°Ø§ Ø§Ų„ØŖØĩŲ„ØŒ ŲŠØąØŦŲ‰ Ø§Ų„ØĒØŖŲƒØ¯ Ų…Ų† ØĨŲ…ŲƒØ§Ų†ŲŠØŠ Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ų…ØŗØ§Øą Ø§Ų„Ų…Ų„Ų ØŖØ¯Ų†Ø§Ų‡ Ø¨ŲˆØ§ØŗØˇØŠ Immich ŲˆŲ…Ų† ØĢŲ… Ų‚Ų… Ø¨Ų…ØŗØ­ Ø§Ų„Ų…ŲƒØĒب؊.",
"authentication_settings": "ØĨؚداداØĒ Ø§Ų„Ų…ØĩØ§Ø¯Ų‚ØŠ",
"authentication_settings_description": "ØĨØ¯Ø§ØąØŠ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą ؈OAuth ؈ØĨؚداداØĒ Ø§Ų„Ų…ØĩØ§Ø¯Ų‚ØŠ Ø§Ų„ØŖŲØŽØąŲ‰",
"authentication_settings_disable_all": "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ ØŖŲ†Ųƒ ØĒØąŲŠØ¯ ØĒØšØˇŲŠŲ„ ØŦŲ…ŲŠØš ŲˆØŗØ§ØĻŲ„ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ØŸ ØŗŲŠØĒŲ… ØĒØšØˇŲŠŲ„ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ø§Ų„ŲƒØ§Ų…Ų„.",
"authentication_settings_reenable": "Ų„ØĨؚاد؊ Ø§Ų„ØĒŲØšŲŠŲ„ØŒ Ø§ØŗØĒØŽØ¯Ų… <link>ØŖŲ…Øą Ø§Ų„ØŽØ§Ø¯Ų…</link>.",
"background_task_job": "Ø§Ų„Ų…Ų‡Ø§Ų… Ø§Ų„ØŽŲ„ŲŲŠØŠ",
"background_task_job": "Ø§Ų„Ų…Ų‡Ø§Ų… ؁؊ Ø§Ų„ØŽŲ„ŲŲŠØŠ",
"backup_database": "Ø§Ų†Ø´Ø§ØĄ ØĒŲØąŲŠØē Ų‚Ø§ØšØ¯ØŠ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ",
"backup_database_enable_description": "ØĒŲ…ŲƒŲŠŲ† ØĒŲØąŲŠØē Ų‚Ø§ØšØ¯ØŠ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ",
"backup_keep_last_amount": "Ų…Ų‚Ø¯Ø§Øą Ø§Ų„ØĒŲØąŲŠØēاØĒ Ø§Ų„ØŗØ§Ø¨Ų‚ØŠ Ų„Ų„Ø§Ø­ØĒŲØ§Ø¸ Ø¨Ų‡Ø§",
"backup_onboarding_1_description": "Ų†ØŗØŽØŠ ØŽØ§ØąØŦ Ø§Ų„Ų…ŲˆŲ‚Øš ؁؊ Ų…ŲˆŲ‚Øš ØĸØŽØą.",
"backup_onboarding_2_description": "Ų†ØŗØŽ Ų…Ø­Ų„ŲŠØŠ ØšŲ„Ų‰ ØŖØŦŲ‡Ø˛ØŠ Ų…ØŽØĒŲ„ŲØŠ. ŲŠØ´Ų…Ų„ Ø°Ų„Ųƒ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ŲˆŲ†ØŗØŽØŠ احØĒŲŠØ§ØˇŲŠØŠ Ų…Ø­Ų„ŲŠØŠ Ų…Ų†Ų‡Ø§.",
"backup_onboarding_3_description": "ØĨØŦŲ…Ø§Ų„ŲŠ Ų†ØŗØŽ Ø¨ŲŠØ§Ų†Ø§ØĒŲƒØŒ Ø¨Ų…Ø§ ؁؊ Ø°Ų„Ųƒ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„ØŖØĩŲ„ŲŠØŠ. ŲŠØ´Ų…Ų„ Ø°Ų„Ųƒ Ų†ØŗØŽØŠŲ‹ ŲˆØ§Ø­Ø¯ØŠŲ‹ ØŽØ§ØąØŦ Ø§Ų„Ų…ŲˆŲ‚Øš ŲˆŲ†ØŗØŽØĒŲŠŲ† Ų…Ø­Ų„ŲŠØĒŲŠŲ†.",
"backup_onboarding_description": "ŲŠŲŲ†ØĩØ­ باØĒباؚ <backblaze-link>Ø§ØŗØĒØąØ§ØĒ؊ØŦŲŠØŠ Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ 3-2-1</backblaze-link> Ų„Ø­Ų…Ø§ŲŠØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ؃. احØĒŲØ¸ Ø¨Ų†ØŗØŽ احØĒŲŠØ§ØˇŲŠØŠ Ų…Ų† ØĩŲˆØąŲƒ/ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ؃ Ø§Ų„Ų…Ø­Ų…Ų‘Ų„ØŠØŒ Ø¨Ø§Ų„ØĨØļØ§ŲØŠ ØĨŲ„Ų‰ Ų‚Ø§ØšØ¯ØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ Immich، Ų„ØļŲ…Ø§Ų† Ø­Ų„ Ų†ØŗØŽ احØĒŲŠØ§ØˇŲŠ Ø´Ø§Ų…Ų„.",
"backup_onboarding_footer": "Ų„Ų…Ø˛ŲŠØ¯ Ų…Ų† Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ Ø­ŲˆŲ„ Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ Ų„Ų€ Immich، ŲŠØąØŦŲ‰ Ø§Ų„ØąØŦŲˆØš ØĨŲ„Ų‰ <link> Ø§Ų„ØĒØšŲ„ŲŠŲ…Ø§ØĒ </link>.",
"backup_onboarding_parts_title": "؊ØĒØļŲ…Ų† Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ 3-2-1 Ų…Ø§ ŲŠŲ„ŲŠ:",
"backup_onboarding_title": "Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠØŠ",
"backup_settings": "ØĨؚداداØĒ ØĒŲØąŲŠØē Ų‚Ø§ØšØ¯ØŠ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ",
"backup_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØĒŲØąŲŠØē Ų‚Ø§ØšØ¯ØŠ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ.",
"cleared_jobs": "ØĒŲ… ØĨØŽŲ„Ø§ØĄ Ų…Ų‡Ø§Ų…: {job}",
@@ -112,6 +123,7 @@
"logging_enable_description": "ØĒŲØšŲŠŲ„ ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŖØ­Ø¯Ø§ØĢ",
"logging_level_description": "ØšŲ†Ø¯ Ø§Ų„ØĒŲØšŲŠŲ„ØŒ ØŖŲŠ Ų…ØŗØĒŲˆŲ‰ ØĒØŗØŦŲŠŲ„ ØŗŲŠØŗØĒØŽØ¯Ų….",
"logging_settings": "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø§Ø­Ø¯Ø§ØĢ",
"machine_learning_availability_checks": "ØĒØ­Ų‚Ų‚ Ų…Ų† Ø§Ų„ØĒŲˆŲØą",
"machine_learning_clip_model": "Ų†Ų…ŲˆØ°ØŦ CLIP",
"machine_learning_clip_model_description": "Ø§ØŗŲ… Ų†Ų…ŲˆØ°ØŦ CLIP Ų…Ø¯ØąØŦ، <link>Ų‡Ų†Ø§</link>. ŲŠØąØŦŲ‰ Ų…Ų„Ø§Ø­Ø¸ØŠ ØŖŲ†Ų‡ ؊ØŦب ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ ŲˆØ¸ŲŠŲØŠ \"Ø§Ų„Ø¨Ø­ØĢ Ø§Ų„Ø°ŲƒŲŠ\" Ų„ØŦŲ…ŲŠØš Ø§Ų„ØĩŲˆØą بؚد ØĒØēŲŠŲŠØą Ø§Ų„Ų†Ų…ŲˆØ°ØŦ.",
"machine_learning_duplicate_detection": "ŲƒØ´Ų Ø§Ų„ØĒŲƒØąØ§Øą",
@@ -210,6 +222,8 @@
"oauth_mobile_redirect_uri": "ØšŲ†ŲˆØ§Ų† URI Ų„ØĨؚاد؊ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ØšŲ„Ų‰ Ø§Ų„Ų‡Ø§ØĒ؁",
"oauth_mobile_redirect_uri_override": "ØĒØŦØ§ŲˆØ˛ ØšŲ†ŲˆØ§Ų† URI Ų„ØĨؚاد؊ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ØšŲ„Ų‰ Ø§Ų„Ų‡Ø§ØĒ؁",
"oauth_mobile_redirect_uri_override_description": "Ų‚Ų… بØĒŲØšŲŠŲ„Ų‡ ØšŲ†Ø¯Ų…Ø§ Ų„Ø§ ŲŠØŗŲ…Ø­ Ų…ŲˆŲØą OAuth Ø¨Ų…ØšØąŲ URI Ų„Ų„ØŦŲˆØ§Ų„ØŒ Ų…ØĢŲ„ ''{callback}''",
"oauth_role_claim": "Ø§Ų„Ų…ØˇØ§Ų„Ø¨ØŠ Ø¨Ø§Ų„Ø¯ŲˆØą(ØĩŲ„Ø§Ø­ŲŠØ§ØĒ)",
"oauth_role_claim_description": "Ų…Ų†Ø­ ؈ØĩŲˆŲ„ Ø§Ų„Ų…ØŗØ¤ŲˆŲ„ ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§ Ø¨Ų†Ø§ØĄŲ‹ ØšŲ„Ų‰ ؈ØŦŲˆØ¯ Ų‡Ø°Ø§ Ø§Ų„ØˇŲ„Ø¨. Ų‚Ø¯ ŲŠŲƒŲˆŲ† Ø§Ų„ØˇŲ„Ø¨ ØĨŲ…Ø§ 'Ų…ØŗØĒØŽØ¯Ų…' ØŖŲˆ 'Ų…ØŗØ¤ŲˆŲ„'.",
"oauth_settings": "OAuth",
"oauth_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ OAuth",
"oauth_settings_more_details": "Ų„Ų…Ø˛ŲŠØ¯ Ų…Ų† Ø§Ų„ØĒŲØ§ØĩŲŠŲ„ Ø­ŲˆŲ„ Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠØŒ ŲŠØąØŦŲ‰ Ø§Ų„ØąØŦŲˆØš ØĨŲ„Ų‰ <link>Ø§Ų„ŲˆØĢاØĻŲ‚</link>.",
@@ -345,6 +359,9 @@
"trash_number_of_days_description": "ؚدد ØŖŲŠØ§Ų… Ø§Ų„Ø§Ø­ØĒŲØ§Ø¸ Ø¨Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ ؁؊ ØŗŲ„ØŠ Ø§Ų„Ų…Ų‡Ų…Ų„Ø§ØĒ Ų‚Ø¨Ų„ Ø­Ø°ŲŲ‡Ø§ Ų†Ų‡Ø§ØĻŲŠŲ‹Ø§",
"trash_settings": "ØĨؚداداØĒ ØŗŲ„ØŠ Ø§Ų„Ų…Ų‡Ų…Ų„Ø§ØĒ",
"trash_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØŗŲ„ØŠ Ø§Ų„Ų…Ų‡Ų…Ų„Ø§ØĒ",
"unlink_all_oauth_accounts": "Ø§Ø˛Ø§Ų„ØŠ ØąØ¨Øˇ ØŦŲ…ŲŠØš Ø­ØŗØ§Ø¨Ø§ØĒ OAuth",
"unlink_all_oauth_accounts_description": "ØĒØ°ŲƒŲ‘Øą Ø§Ų† ØĒØ˛ŲŠŲ„ ØąØ¨Øˇ ØŦŲ…ŲŠØš Ø­ØŗØ§Ø¨Ø§ØĒ OAuth Ų‚Ø¨Ų„ Ø§Ų† ØĒŲ†Ų‚Ų„ Ø§Ų„Ų‰ Ų…Ø˛ŲˆØ¯ ØŦØ¯ŲŠØ¯.",
"unlink_all_oauth_accounts_prompt": "Ų‡Ų„ Ø§Ų†ØĒ Ų…ØĒØŖŲƒØ¯ Ų…Ų† Ø§Ø˛Ø§Ų„ØŠ ØąØ¨Øˇ ØŦŲ…ŲŠØš Ø­ØŗØ§Ø¨Ø§ØĒ OAuth؟ Ų‡Ø°Ø§ ØŗŲŠŲ‚ŲˆŲ… باؚاد؊ ØļØ¨Øˇ Ø§Ų„ID Ø§Ų„ØŽØ§Øĩ Ø¨Ø§Ų„OAuth Ų„ŲƒŲ„ Ų…ØŗØĒØŽØ¯Ų… ŲˆŲ„Ø§ ŲŠŲ…ŲƒŲ† Ø§Ų„ØĒØąØ§ØŦØš ØšŲ† Ø§Ų„ØšŲ…Ų„ŲŠØŠ.",
"user_cleanup_job": "ØĒŲ†Ø¸ŲŠŲ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…",
"user_delete_delay": "ØŗŲŠØĒŲ… ØŦØ¯ŲˆŲ„ØŠ Ø­ØŗØ§Ø¨ <b>{user}</b> ŲˆŲ…Ø­ØĒŲˆŲŠØ§ØĒŲ‡ Ų„Ų„Ø­Ø°Ų Ø§Ų„Ų†Ų‡Ø§ØĻ؊ ؁؊ ØēØļŲˆŲ† {delay, plural, one {# ŲŠŲˆŲ…} other {# ØŖŲŠØ§Ų…}}.",
"user_delete_delay_settings": "؁ØĒØąØŠ Ø§Ų„ØĒØŖØŽŲŠØą Ų‚Ø¨Ų„ Ø§Ų„Ø­Ø°Ų",
@@ -374,10 +391,11 @@
"advanced_settings_enable_alternate_media_filter_subtitle": "Ø§ØŗØĒØŽØ¯Ų… Ų‡Ø°Ø§ Ø§Ų„ØŽŲŠØ§Øą Ų„ØĒØĩŲŲŠØŠ Ø§Ų„ŲˆØŗØ§ØĻØˇ اØĢŲ†Ø§ØĄ Ø§Ų„Ų…Ø˛Ø§Ų…Ų†Ų‡ Ø¨Ų†Ø§ØĄ ØšŲ„Ų‰ Ų…ØšØ§ŲŠŲŠØą Ø¨Ø¯ŲŠŲ„ØŠ. ØŦØąØ¨ Ų‡Ø°Ø§ Ø§Ų„ØŽŲŠØ§Øą ŲŲ‚Øˇ ŲƒØ§Ų† Ų„Ø¯ŲŠŲƒ Ų…Ø´Ø§ŲƒŲ„ Ų…Øš Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ Ø¨Ø§Ų„ŲƒØ´Ų ØšŲ† ØŦŲ…ŲŠØš Ø§Ų„Ø§Ų„Ø¨ŲˆŲ…Ø§ØĒ.",
"advanced_settings_enable_alternate_media_filter_title": "[ØĒØŦØąŲŠØ¨ŲŠ] Ø§ØŗØĒØŽØ¯Ų… ØŦŲ‡Ø§Ø˛ ØĒØĩŲŲŠØŠ Ų…Ø˛Ø§Ų…Ų†Ų‡ Ø§Ų„Ø¨ŲˆŲ…Ø§ØĒ Ø¨Ø¯ŲŠŲ„",
"advanced_settings_log_level_title": "Ų…ØŗØĒŲˆŲ‰ Ø§Ų„ØŗØŦŲ„: {level}",
"advanced_settings_prefer_remote_subtitle": "ØĒŲƒŲˆŲ† بؚØļ Ø§Ų„ØŖØŦŲ‡Ø˛ØŠ Ø¨ØˇŲŠØĻØŠ Ų„Ų„ØēØ§ŲŠØŠ ؁؊ ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲˆØą Ø§Ų„Ų…ØĩØēØąØŠ Ų…Ų† Ø§Ų„ØŖØĩŲˆŲ„ Ø§Ų„Ų…ŲˆØŦŲˆØ¯ØŠ ØšŲ„Ų‰ Ø§Ų„ØŦŲ‡Ø§Ø˛. Ų‚Ų… بØĒŲ†Ø´ŲŠØˇ Ų‡Ø°Ø§ Ø§Ų„ØĨؚداد Ų„ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲˆØą Ø§Ų„Ø¨ØšŲŠØ¯ØŠ Ø¨Ø¯Ų„Ø§Ų‹ Ų…Ų† Ø°Ų„Ųƒ.",
"advanced_settings_prefer_remote_subtitle": "ØĒŲƒŲˆŲ† بؚØļ Ø§Ų„ØŖØŦŲ‡Ø˛ØŠ Ø¨ØˇŲŠØĻØŠ Ų„Ų„ØēØ§ŲŠØŠ ؁؊ ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲˆØą Ø§Ų„Ų…ØĩØēØąØŠ Ų…Ų† Ø§Ų„ØŖØĩŲˆŲ„ Ø§Ų„Ų…Ø­Ų„ŲŠØŠ. Ų‚Ų… بØĒŲØšŲŠŲ„ Ų‡Ø°Ø§ Ø§Ų„ØŽŲŠØ§Øą Ų„ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲˆØą Ø§Ų„Ø¨ØšŲŠØ¯ØŠ Ø¨Ø¯Ų„Ø§Ų‹ Ų…Ų† Ø°Ų„Ųƒ.",
"advanced_settings_prefer_remote_title": "ØĒ؁ØļŲ„ Ø§Ų„ØĩŲˆØą Ø§Ų„Ø¨ØšŲŠØ¯ØŠ",
"advanced_settings_proxy_headers_subtitle": "ØšØąŲ ØšŲ†Ø§ŲˆŲŠŲ† Ø§Ų„ŲˆŲƒŲŠŲ„ Ø§Ų„ØĒ؊ ŲŠØŗØĒØŽØ¯Ų…Ų‡Ø§ Immich Ų„Ø§ØąØŗØ§Ų„ ŲƒŲ„ ØˇŲ„Ø¨ Ø´Ø¨ŲƒŲŠ",
"advanced_settings_proxy_headers_title": "ØšŲ†Ø§ŲˆŲŠŲ† Ø§Ų„ŲˆŲƒŲŠŲ„",
"advanced_settings_readonly_mode_title": "؈ØļØš Ø§Ų„Ų‚ØąØ§ØĄØŠ ŲŲ‚Øˇ",
"advanced_settings_self_signed_ssl_subtitle": "ØĒØŽØˇŲŠ Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† Ø´Ų‡Ø§Ø¯ØŠ SSL Ų„ØŽØ§Ø¯Ų… Ø§Ų„Ų†Ų‚ØˇØŠ Ø§Ų„Ų†Ų‡Ø§ØĻ؊. Ų…ŲƒŲ„ŲˆØ¨ Ų„Ų„Ø´Ų‡Ø§Ø¯Ø§ØĒ Ø§Ų„Ų…ŲˆŲ‚ØšØŠ ذاØĒŲŠØ§.",
"advanced_settings_self_signed_ssl_title": "Ø§Ų„ØŗŲ…Ø§Ø­ Ø¨Ø´Ų‡Ø§Ø¯Ø§ØĒ SSL Ø§Ų„Ų…ŲˆŲ‚ØšØŠ ذاØĒŲŠŲ‹Ø§",
"advanced_settings_sync_remote_deletions_subtitle": "Ø­Ø°Ų Ø§Ųˆ Ø§ØŗØĒؚاد؊ ØĒŲ„Ų‚Ø§ØĻ؊ Ų„Ų„Ø§ØĩŲˆŲ„ ØšŲ„Ų‰ Ų‡Ø°Ø§ Ø§Ų„ØŦŲ‡Ø§Ø˛ ØšŲ†Ø¯ ØĒŲ†ŲŲŠØ° Ø§Ų„ØšŲ…Ų„ŲŠØŠ ØšŲ„Ų‰ Ø§Ų„ŲˆŲŠØ¨",
@@ -507,7 +525,7 @@
"back_close_deselect": "Ø§Ų„ØąØŦŲˆØš ØŖŲˆ Ø§Ų„ØĨØēŲ„Ø§Ų‚ ØŖŲˆ ØĨŲ„ØēØ§ØĄ Ø§Ų„ØĒØ­Ø¯ŲŠØ¯",
"background_location_permission": "Ø§Ø°Ų† Ø§Ų„ŲˆØĩŲˆŲ„ Ų„Ų„Ų…ŲˆŲ‚Øš ؁؊ Ø§Ų„ØŽŲ„ŲŲŠØŠ",
"background_location_permission_content": "Ų„Ų„ØĒŲ…ŲƒŲ† Ų…Ų† ØĒØ¨Ø¯ŲŠŲ„ Ø§Ų„Ø´Ø¨ŲƒŲ‡ Ø¨Ø§Ų„ØŽŲ„ŲŲŠØŠØŒ Immich ŲŠØ­ØĒاØŦ*داØĻŲ…Ø§* Ų„Ų„Ø­ØĩŲˆŲ„ ØšŲ„Ų‰ Ų…ŲˆŲ‚Øš Ø¯Ų‚ŲŠŲ‚ Ų„ŲŠØĒŲ…ŲƒŲ† Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ Ų…Ų† Ų‚ØąØ§ØĻØŠ Ø§ØŗŲ… Ø´Ø¨ŲƒØŠ Ø§Ų„Wi-Fi",
"backup": "Ø¯ØšŲ…",
"backup": "Ų†ØŗØŽ احØĒŲŠØ§ØˇŲŠ",
"backup_album_selection_page_albums_device": "Ø§Ų„Ø§Ų„Ø¨ŲˆŲ…Ø§ØĒ ØšŲ„Ų‰ Ø§Ų„ØŦŲ‡Ø§Ø˛ ({count})",
"backup_album_selection_page_albums_tap": "Ø§Ų†Ų‚Øą Ų„Ų„ØĒØļŲ…ŲŠŲ†ØŒ ŲˆØ§Ų†Ų‚Øą Ų†Ų‚ØąŲ‹Ø§ Ų…Ø˛Ø¯ŲˆØŦŲ‹Ø§ Ų„Ų„Ø§ØŗØĒØĢŲ†Ø§ØĄ",
"backup_album_selection_page_assets_scatter": "ŲŠŲ…ŲƒŲ† ØŖŲ† ØĒŲ†ØĒØ´Øą Ø§Ų„ØŖØĩŲˆŲ„ ØšØ¨Øą ØŖŲ„Ø¨ŲˆŲ…Ø§ØĒ Ų…ØĒؚدد؊. ŲˆØ¨Ø§Ų„ØĒØ§Ų„ŲŠØŒ ŲŠŲ…ŲƒŲ† ØĒØļŲ…ŲŠŲ† Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…Ø§ØĒ ØŖŲˆ Ø§ØŗØĒØ¨ØšØ§Ø¯Ų‡Ø§ ØŖØĢŲ†Ø§ØĄ ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ.",
@@ -568,11 +586,11 @@
"backup_manual_in_progress": "Ų‚ŲŠØ¯ Ø§Ų„ØĒØ­Ų…ŲŠŲ„ Ø­Ø§ŲˆŲ„ Ų…ØąŲ‡ Ø§ØŽØąŲ‰",
"backup_manual_success": "Ų†ØŦاح",
"backup_manual_title": "Ø­Ø§Ų„ØŠ Ø§Ų„ØĒØ­Ų…ŲŠŲ„",
"backup_options": "ØŽŲŠØ§ØąØ§ØĒ Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ",
"backup_options_page_title": "ØŽŲŠØ§ØąØ§ØĒ Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ",
"backup_setting_subtitle": "Ø§Ø¯Ø§ØąØŠ اؚداداØĒ Ø§Ų„ØĒØ­Ų…ŲŠŲ„ ؁؊ Ø§Ų„ØŽŲ„ŲŲŠØŠ ŲˆØ§Ų„Ų…Ų‚Ø¯Ų…ØŠ",
"backup_settings_subtitle": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ Ø§Ų„ØĒØ­Ų…ŲŠŲ„",
"backward": "Ø§Ų„Ų‰ Ø§Ų„ŲˆØąØ§ØĄ",
"beta_sync": "Ø­Ø§Ų„ØŠ Ø§Ų„Ų…Ø˛Ø§Ų…Ų†ØŠ Ø§Ų„ØĒØŦØąŲŠØ¨ŲŠØŠ",
"beta_sync_subtitle": "Ø§Ø¯Ø§ØąØŠ Ų†Ø¸Ø§Ų… Ø§Ų„Ų…Ø˛Ø§Ų…Ų†ØŠ Ø§Ų„ØŦØ¯ŲŠØ¯",
"biometric_auth_enabled": "Ø§Ų„Ų…ØĩØ§Ø¯Ų‚ØŠ Ø§Ų„Ø¨Ø§ŲŠŲˆŲ…ØĒØąŲŠØŠ Ų…ŲØšŲ„Ų‡",
"biometric_locked_out": "Ų„Ų‚Ø¯ ؂؁؄ØĒ ØšŲ†Ųƒ Ø§Ų„Ų…ØĩØ§Ø¯Ų‚ØŠ Ø§Ų„Ø¨ŲŠŲˆŲ…ØĒØąŲŠØŠ",
"biometric_no_options": "Ų„Ø§ ØĒ؈ØŦد ØŽŲŠØ§ØąØ§ØĒ Ø¨Ø§ŲŠŲˆŲ…ØĒØąŲŠØŠ Ų…ØĒŲˆŲØąØŠ",
@@ -639,6 +657,7 @@
"clear": "ØĨØŽŲ„Ø§ØĄ",
"clear_all": "ØĨØŽŲ„Ø§ØĄ Ø§Ų„ŲƒŲ„",
"clear_all_recent_searches": "Ų…ØŗØ­ ØŦŲ…ŲŠØš ØšŲ…Ų„ŲŠØ§ØĒ Ø§Ų„Ø¨Ø­ØĢ Ø§Ų„ØŖØŽŲŠØąØŠ",
"clear_file_cache": "Ų…ØŗØ­ Ø°Ø§ŲƒØąØŠ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų…Ø¤Ų‚ØĒ Ų„Ų„Ų…Ų„ŲØ§ØĒ",
"clear_message": "ØĨØŽŲ„Ø§ØĄ Ø§Ų„ØąØŗØ§Ų„ØŠ",
"clear_value": "ØĨØŽŲ„Ø§ØĄ Ø§Ų„Ų‚ŲŠŲ…ØŠ",
"client_cert_dialog_msg_confirm": "Ø­ØŗŲ†Ø§",
@@ -709,6 +728,7 @@
"create_new_user": "ØĨŲ†Ø´Ø§ØĄ Ų…ØŗØĒØŽØ¯Ų… ØŦØ¯ŲŠØ¯",
"create_shared_album_page_share_add_assets": "ØĨØļØ§ŲØŠ Ø§Ų„ØŖØĩŲˆŲ„",
"create_shared_album_page_share_select_photos": "حدد Ø§Ų„ØĩŲˆØą",
"create_shared_link": "Ø§Ų†Ø´Ø§ØĄ ØąØ§Ø¨Øˇ Ų…Ø´ØĒØąŲƒ",
"create_tag": "ØĨŲ†Ø´Ø§ØĄ ØšŲ„Ø§Ų…ØŠ",
"create_tag_description": "ØŖŲ†Ø´ØĻ ØšŲ„Ø§Ų…ØŠ ØŦØ¯ŲŠØ¯ØŠ. Ø¨Ø§Ų„Ų†ØŗØ¨ØŠ Ų„Ų„ØšŲ„Ø§Ų…Ø§ØĒ Ø§Ų„Ų…ØĒØ¯Ø§ØŽŲ„ØŠØŒ ŲŠØąØŦŲ‰ ØĨØ¯ØŽØ§Ų„ Ø§Ų„Ų…ØŗØ§Øą Ø§Ų„ŲƒØ§Ų…Ų„ Ų„Ų„ØšŲ„Ø§Ų…ØŠ Ø¨Ų…Ø§ ؁؊ Ø°Ų„Ųƒ Ø§Ų„ØŽØˇŲˆØˇ Ø§Ų„Ų…Ø§ØĻŲ„ØŠ Ų„Ų„ØŖŲ…Ø§Ų….",
"create_user": "ØĨŲ†Ø´Ø§ØĄ Ų…ØŗØĒØŽØ¯Ų…",
@@ -721,6 +741,7 @@
"current_server_address": "ØšŲ†ŲˆØ§Ų† Ø§Ų„ØŽØ§Ø¯Ų… Ø§Ų„Ø­Ø§Ų„ŲŠ",
"custom_locale": "Ų„ØēØŠ Ų…ØŽØĩØĩØŠ",
"custom_locale_description": "ØĒŲ†ØŗŲŠŲ‚ Ø§Ų„ØĒŲˆØ§ØąŲŠØŽ ŲˆØ§Ų„ØŖØąŲ‚Ø§Ų… Ø¨Ų†Ø§ØĄŲ‹ ØšŲ„Ų‰ Ø§Ų„Ų„ØēØŠ ŲˆØ§Ų„Ų…Ų†ØˇŲ‚ØŠ",
"custom_url": "ØąØ§Ø¨Øˇ Ų…ØŽØĩØĩ",
"daily_title_text_date": "E ، MMM DD",
"daily_title_text_date_year": "E ، MMM DD ، yyyy",
"dark": "Ų…ØšØĒŲ…",
@@ -732,6 +753,7 @@
"date_of_birth_saved": "ØĒŲ… Ø­ŲØ¸ ØĒØ§ØąŲŠØŽ Ø§Ų„Ų…ŲŠŲ„Ø§Ø¯ Ø¨Ų†ØŦاح",
"date_range": "Ų†ØˇØ§Ų‚ Ø§Ų„Ų…ŲˆØšØ¯",
"day": "ŲŠŲˆŲ…",
"days": "Ø§ŲŠØ§Ų…",
"deduplicate_all": "ØĨŲ„ØēØ§ØĄ ØĒŲƒØąØ§Øą Ø§Ų„ŲƒŲ„",
"deduplication_criteria_1": "Ø­ØŦŲ… Ø§Ų„ØĩŲˆØąØŠ Ø¨ŲˆØ­Ø¯Ø§ØĒ Ø§Ų„Ø¨Ø§ŲŠØĒ",
"deduplication_criteria_2": "ؚدد Ø¨ŲŠØ§Ų†Ø§ØĒ EXIF",
@@ -816,8 +838,12 @@
"edit": "ØĒØšØ¯ŲŠŲ„",
"edit_album": "ØĒØšØ¯ŲŠŲ„ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…",
"edit_avatar": "ØĒØšØ¯ŲŠŲ„ Ø§Ų„ØĩŲˆØąØŠ Ø§Ų„Ø´ØŽØĩŲŠØŠ",
"edit_birthday": "ØĒØšØ¯ŲŠŲ„ ØĒØ§ØąŲŠØŽ Ø§Ų„Ų…ŲŠŲ„Ø§Ø¯",
"edit_date": "ØĒØšØ¯ŲŠŲ„ Ø§Ų„ØĒØ§ØąŲŠØŽ",
"edit_date_and_time": "ØĒØšØ¯ŲŠŲ„ Ø§Ų„ØĒØ§ØąŲŠØŽ ŲˆØ§Ų„ŲˆŲ‚ØĒ",
"edit_date_and_time_action_prompt": "ØĒŲ… ØĒØšØ¯ŲŠŲ„ Ø§Ų„ØĒØ§ØąŲŠØŽ ŲˆØ§Ų„ŲˆŲ‚ØĒ Ų„{count} ؅؄؁(اØĒ)",
"edit_date_and_time_by_offset": "ØĒØšØ¯ŲŠŲ„ Ø§Ų„ØĒØ§ØąŲŠØŽ Ø­ØŗØ¨ Ų‚ŲŠŲ…ØŠ Ø§Ø˛Ø§Ø­ØŠ Ų…ØšŲŠŲ†ØŠ",
"edit_date_and_time_by_offset_interval": "Ų†ØˇØ§Ų‚ Ø§Ų„ØĒØ§ØąŲŠØŽ Ø§Ų„ØŦØ¯ŲŠØ¯: {from} - {to}",
"edit_description": "ØĒØšØ¯ŲŠŲ„ Ø§Ų„ŲˆØĩ؁",
"edit_description_prompt": "Ø§Ų„ØąØŦØ§ØĄ ا؎ØĒŲŠØ§Øą ؈Øĩ؁ ØŦØ¯ŲŠØ¯:",
"edit_exclusion_pattern": "ØĒØšØ¯ŲŠŲ„ Ų†Ų…Øˇ Ø§Ų„Ø§ØŗØĒبؚاد",
@@ -890,6 +916,7 @@
"failed_to_load_notifications": "ŲØ´Ų„ ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĨØ´ØšØ§ØąØ§ØĒ",
"failed_to_load_people": "ŲØ´Ų„ ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØŖØ´ØŽØ§Øĩ",
"failed_to_remove_product_key": "ØĒØšØ°Øą ØĨØ˛Ø§Ų„ØŠ ؅؁ØĒاح Ø§Ų„Ų…Ų†ØĒØŦ",
"failed_to_reset_pin_code": "ŲØ´Ų„ اؚاد؊ ØĒØšŲŠŲŠŲ† ØąŲ…Ø˛ Ø§Ų„PIN",
"failed_to_stack_assets": "ŲØ´Ų„ ؁؊ ØĒŲƒØ¯ŲŠØŗ Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ",
"failed_to_unstack_assets": "ŲØ´Ų„ ؁؊ ؁ØĩŲ„ Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ",
"failed_to_update_notification_status": "ŲØ´Ų„ ؁؊ ØĒØ­Ø¯ŲŠØĢ Ø­Ø§Ų„ØŠ Ø§Ų„ØĨØ´ØšØ§Øą",
@@ -898,6 +925,7 @@
"paths_validation_failed": "ŲØ´Ų„ ؁؊ Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† {paths, plural, one {# Ų…ØŗØ§Øą} other {# Ų…ØŗØ§ØąØ§ØĒ}}",
"profile_picture_transparent_pixels": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØŖŲ† ØĒØ­ØĒ؈؊ ØĩŲˆØą Ø§Ų„Ų…Ų„Ų Ø§Ų„Ø´ØŽØĩ؊ ØšŲ„Ų‰ ØŖØŦØ˛Ø§ØĄ/Ø¨ŲƒØŗŲ„Ø§ØĒ Ø´ŲØ§ŲØŠ. ŲŠØąØŦŲ‰ Ø§Ų„ØĒŲƒØ¨ŲŠØą ؈/ØŖŲˆ ØĒØ­ØąŲŠŲƒ Ø§Ų„ØĩŲˆØąØŠ.",
"quota_higher_than_disk_size": "Ų„Ų‚Ø¯ Ų‚Ų…ØĒ بØĒØšŲŠŲŠŲ† Ø­ØĩØŠ Ų†ØŗØ¨ŲŠØŠ ØŖØšŲ„Ų‰ Ų…Ų† Ø­ØŦŲ… Ø§Ų„Ų‚ØąØĩ",
"something_went_wrong": "حدØĢ ØŽØˇØŖ Ų…Ø§",
"unable_to_add_album_users": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ† ØĨŲ„Ų‰ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…",
"unable_to_add_assets_to_shared_link": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ ØĨŲ„Ų‰ Ø§Ų„ØąØ§Ø¨Øˇ Ø§Ų„Ų…Ø´ØĒØąŲƒ",
"unable_to_add_comment": "ØĒØšØ°Øą ØĨØļØ§ŲØŠ Ø§Ų„ØĒØšŲ„ŲŠŲ‚",
@@ -983,13 +1011,11 @@
},
"exif": "Exif (Øĩ؊ØēØŠ ؅؄؁ ØĩŲˆØąŲŠ Ų‚Ø§Ø¨Ų„ Ų„Ų„ØĒØ¨Ø§Ø¯Ų„)",
"exif_bottom_sheet_description": "اØļ؁ ؈ØĩŲØ§...",
"exif_bottom_sheet_description_error": "ØŽØˇØŖ ؁؊ ØĒØ­Ø¯ŲŠØĢ Ø§Ų„ŲˆØĩ؁",
"exif_bottom_sheet_details": "ØĒŲØ§ØĩŲŠŲ„",
"exif_bottom_sheet_location": "Ų…ŲˆŲ‚Øš",
"exif_bottom_sheet_people": "Ø§Ų„Ų†Ø§Øŗ",
"exif_bottom_sheet_person_add_person": "اØļ؁ Ø§ØŗŲ…Ø§",
"exif_bottom_sheet_person_age_months": "Ø§Ų„ØšŲ…Øą {months} Ø§Ø´Ų‡Øą",
"exif_bottom_sheet_person_age_year_months": "Ø§Ų„ØšŲ…Øą ŲĄ ØŗŲ†ØŠØŒ{months} Ø§Ø´Ų‡Øą",
"exif_bottom_sheet_person_age_years": "Ø§Ų„ØšŲ…Øą {years}",
"exit_slideshow": "ØŽØąŲˆØŦ Ų…Ų† Ø§Ų„ØšØąØļ Ø§Ų„ØĒŲ‚Ø¯ŲŠŲ…ŲŠ",
"expand_all": "ØĒŲˆØŗŲŠØš Ø§Ų„ŲƒŲ„",
"experimental_settings_new_asset_list_subtitle": "ØŖØšŲ…Ø§Ų„ ØŦØ§ØąŲŠØŠ",
@@ -1031,11 +1057,13 @@
"filter_people": "ØĒØĩŲŲŠØŠ Ø§Ų„Ø§Ø´ØŽØ§Øĩ",
"filter_places": "ØĒØĩŲŲŠØŠ Ø§Ų„Ø§Ų…Ø§ŲƒŲ†",
"find_them_fast": "ŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØšØĢŲˆØą ØšŲ„ŲŠŲ‡Ø§ Ø¨ØŗØąØšØŠ Ø¨Ø§Ų„Ø§ØŗŲ… Ų…Ų† ØŽŲ„Ø§Ų„ Ø§Ų„Ø¨Ø­ØĢ",
"first": "Ø§Ų„Ø§ŲˆŲ„",
"fix_incorrect_match": "ØĨØĩŲ„Ø§Ø­ Ø§Ų„Ų…ØˇØ§Ø¨Ų‚ØŠ ØēŲŠØą Ø§Ų„ØĩØ­ŲŠØ­ØŠ",
"folder": "Ų…ØŦŲ„Ø¯",
"folder_not_found": "Ų„Ų… ؊ØĒŲ… Ø§Ų„ØšØĢŲˆØą ØšŲ„Ų‰ Ø§Ų„Ų…ØŦŲ„Ø¯",
"folders": "Ø§Ų„Ų…ØŦŲ„Ø¯Ø§ØĒ",
"folders_feature_description": "ØĒØĩŲØ­ ØšØąØļ Ø§Ų„Ų…ØŦŲ„Ø¯ Ų„Ų„ØĩŲˆØą ŲˆŲ…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…ŲˆØŦŲˆØ¯ØŠ ØšŲ„Ų‰ Ų†Ø¸Ø§Ų… Ø§Ų„Ų…Ų„ŲØ§ØĒ",
"forgot_pin_code_question": "Ų‡Ų„ Ų†ØŗŲŠØĒ ØąŲ…Ø˛ Ø§Ų„PIN Ø§Ų„ØŽØ§Øĩ Ø¨ŲƒØŸ",
"forward": "ØĨŲ„Ų‰ Ø§Ų„ØŖŲ…Ø§Ų…",
"gcast_enabled": "ŲƒŲˆŲƒŲ„ ŲƒØ§ØŗØĒ",
"gcast_enabled_description": "ØĒŲ‚ŲˆŲ… Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠ بØĒØ­Ų…ŲŠŲ„ Ø§Ų„Ų…ŲˆØ§ØąØ¯ Ø§Ų„ØŽØ§ØąØŦŲŠØŠ Ų…Ų† Google Ø­ØĒŲ‰ ØĒØšŲ…Ų„.",
@@ -1056,6 +1084,9 @@
"haptic_feedback_switch": "ØĒŲ…ŲƒŲŠŲ† ØąØ¯ŲˆØ¯ Ø§Ų„ŲØšŲ„ Ø§Ų„Ų„Ų…ØŗŲŠØŠ",
"haptic_feedback_title": "ØąØ¯ŲˆØ¯ ŲØšŲ„ Ų„Ų…ØŗŲŠØŠ",
"has_quota": "Ų…Ø­Ø¯Ø¯ بحØĩØŠ",
"hash_asset": "ØšŲ…Ų„ Hash Ų„Ų„ØŖØĩŲ„ (؄؄؅؄؁)",
"hashed_assets": "ØŖØĩŲˆŲ„ (Ų…Ų„ŲØ§ØĒ) ØĒŲ… ØšŲ…Ų„ Hash Ų„Ų‡Ø§",
"hashing": "؊ØĒŲ… ØšŲ…Ų„ Hash",
"header_settings_add_header_tip": "اØļØ§Ų ØąØ§Øŗ",
"header_settings_field_validator_msg": "Ø§Ų„Ų‚ŲŠŲ…ØŠ Ų„Ø§ ŲŠŲ…ŲƒŲ† Ø§Ų† ØĒŲƒŲˆŲ† ŲØ§ØąØēØŠ",
"header_settings_header_name_input": "Ø§ØŗŲ… Ø§Ų„ØąØŖØŗ",
@@ -1069,9 +1100,9 @@
"hide_password": "Ø§ØŽŲØ§ØĄ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą",
"hide_person": "Ø§ØŽŲØ§ØĄ Ø§Ų„Ø´ØŽØĩ",
"hide_unnamed_people": "ØĨØŽŲØ§ØĄ Ø§Ų„ØŖØ´ØŽØ§Øĩ Ø¨Ø¯ŲˆŲ† ØĨØŗŲ…",
"home_page_add_to_album_conflicts": "ØĒŲ…ØĒ ØĨØļØ§ŲØŠ {ØĒŲ…ØĒ ØĨØļØ§ŲØŠ} Ø§Ų„ØŖØĩŲˆŲ„ ØĨŲ„Ų‰ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ… {Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…}.{ŲØ´Ų„} Ø§Ų„ØŖØĩŲˆŲ„ Ų…ŲˆØŦŲˆØ¯ØŠ Ø¨Ø§Ų„ŲØšŲ„ ؁؊ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ….",
"home_page_add_to_album_conflicts": "ØĒŲ…ØĒ ØĨØļØ§ŲØŠ {added} ØŖØĩŲˆŲ„ ØĨŲ„Ų‰ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ… {album}. {failed} ØŖØĩŲˆŲ„ Ų…ŲˆØŦŲˆØ¯ØŠ Ø¨Ø§Ų„ŲØšŲ„ ؁؊ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ….",
"home_page_add_to_album_err_local": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØĨØļØ§ŲØŠ Ø§Ų„ØŖØĩŲˆŲ„ Ø§Ų„Ų…Ø­Ų„ŲŠØŠ ØĨŲ„Ų‰ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…Ø§ØĒ Ø­ØĒŲ‰ Ø§Ų„ØĸŲ† ، ØŗŲˆŲ ؊ØĒØŽØˇŲ‰",
"home_page_add_to_album_success": "ØĒŲ…ØĒ ØĨØļØ§ŲØŠ {ØĒŲ…ØĒ ØĨØļØ§ŲØŠ} Ø§Ų„ØŖØĩŲˆŲ„ ØĨŲ„Ų‰ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ… {Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…}.",
"home_page_add_to_album_success": "ØĒŲ…ØĒ ØĨØļØ§ŲØŠ {added} ØŖØĩŲˆŲ„ ØĨŲ„Ų‰ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ… {album}.",
"home_page_album_err_partner": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØĨØļØ§ŲØŠ ØŖØĩŲˆŲ„ Ø´ØąŲŠŲƒØŠ ØĨŲ„Ų‰ ØŖŲ„Ø¨ŲˆŲ… Ø­ØĒŲ‰ Ø§Ų„ØĸŲ† ، ØŗŲˆŲ ؊ØĒØŽØˇŲ‰",
"home_page_archive_err_local": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØŖØąØ´ŲØŠ Ø§Ų„ØŖØĩŲˆŲ„ Ø§Ų„Ų…Ø­Ų„ŲŠØŠ Ø­ØĒŲ‰ Ø§Ų„ØĸŲ† ، ØŗŲˆŲ ؊ØĒØŽØˇŲ‰",
"home_page_archive_err_partner": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØŖØąØ´ŲØŠ Ø§Ų„ØŖØĩŲˆŲ„ Ø§Ų„Ø´ØąŲŠŲƒØŠ ، ØŗŲˆŲ ؊ØĒØŽØˇŲ‰",
@@ -1087,7 +1118,9 @@
"home_page_upload_err_limit": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØĨŲ„Ø§ ØĒØ­Ų…ŲŠŲ„ 30 ØŖØ­Ø¯ Ø§Ų„ØŖØĩŲˆŲ„ ؁؊ ŲˆŲ‚ØĒ ŲˆØ§Ø­Ø¯ ، ØŗŲˆŲ ؊ØĒØŽØˇŲ‰",
"host": "Ø§Ų„Ų…Øļ؊؁",
"hour": "ØŗØ§ØšØŠ",
"hours": "ØŗØ§ØšØ§ØĒ",
"id": "Ø§Ų„Ų…ØšØąŲ",
"idle": "ØŽØ§Ų…Ų„",
"ignore_icloud_photos": "ØĒØŦØ§Ų‡Ų„ ØĩŲˆØą iCloud",
"ignore_icloud_photos_description": "Ø§Ų„ØĩŲˆØą Ø§Ų„Ų…ØŽØ˛Ų†ØŠ ؁؊ Cloud Ų„Ų† ؊ØĒŲ… ØĒØ­Ų…ŲŠŲ„Ų‡Ø§ ØĨŲ„Ų‰ ØŽØ§Ø¯Ų… Immich",
"image": "ØĩŲˆØąØŠ",
@@ -1145,10 +1178,13 @@
"language_no_results_title": "Ų„Ų… ؊ØĒŲ… Ø§Ų„ØšØĢŲˆØą ØšŲ„Ų‰ Ų„ØēاØĒ",
"language_search_hint": "Ø§Ų„Ø¨Ø­ØĢ ØšŲ† Ų„ØēاØĒ...",
"language_setting_description": "ا؎ØĒØą Ų„ØēØĒ؃ Ø§Ų„Ų…ŲØļŲ„ØŠ",
"large_files": "Ų…Ų„ŲØ§ØĒ ŲƒØ¨ŲŠØąØŠ",
"last": "Ø§Ų„Ø§ØŽŲŠØą",
"last_seen": "Ø§ØŽØą Ø¸Ų‡ŲˆØą",
"latest_version": "احدØĢ اØĩØ¯Ø§Øą",
"latitude": "ØŽØˇ Ø§Ų„ØšØąØļ",
"leave": "Ų…ØēØ§Ø¯ØąØŠ",
"leave_album": "اØĒØąŲƒ Ø§Ų„Ø§Ų„Ø¨ŲˆŲ…",
"lens_model": "Ų†Ų…ŲˆØ°ØŦ Ø§Ų„ØšØ¯ØŗØ§ØĒ",
"let_others_respond": "دؚ Ø§Ų„ØĸØŽØąŲŠŲ† ŲŠØŗØĒØŦŲŠØ¨ŲˆŲ†",
"level": "Ø§Ų„Ų…ØŗØĒŲˆŲ‰",
@@ -1160,7 +1196,9 @@
"library_page_sort_created": "ØĒØ§ØąŲŠØŽ Ø§Ų„ØĨŲ†Ø´Ø§ØĄ",
"library_page_sort_last_modified": "ØĸØŽØą ØĒØšØ¯ŲŠŲ„",
"library_page_sort_title": "ØšŲ†ŲˆØ§Ų† Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…",
"licenses": "ØąŲØŽŲŽØĩ",
"light": "Ø§Ų„Ų…Øļ؊ØĻ",
"like": "اؚØŦاب",
"like_deleted": "ØĒŲ… Ø­Ø°Ų Ø§Ų„ØĨØšØŦاب",
"link_motion_video": "ØąØ§Ø¨Øˇ ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ø­ØąŲƒØŠ",
"link_to_oauth": "Ø§Ų„ØąØ¨Øˇ Ų…Øš OAuth",
@@ -1168,7 +1206,9 @@
"list": "Ų‚Ø§ØĻŲ…ØŠ",
"loading": "ØĒØ­Ų…ŲŠŲ„",
"loading_search_results_failed": "ŲØ´Ų„ ØĒØ­Ų…ŲŠŲ„ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ",
"local": "Ų…Ø­Ų„Ų‘ŲŠ",
"local_asset_cast_failed": "ØēŲŠØą Ų‚Ø§Ø¯Øą ØšŲ„Ų‰ بØĢ ØŖØĩŲ„ Ų„Ų… ؊ØĒŲ… ØĒØ­Ų…ŲŠŲ„Ų‡ ØĨŲ„Ų‰ Ø§Ų„ØŽØ§Ø¯Ų…",
"local_assets": "ØŖŲØĩŲˆŲ„ (Ų…Ų„ŲØ§ØĒ) Ų…Ø­Ų„ŲŠØŠ",
"local_network": "Ø´Ø¨ŲƒØŠ Ų…Ø­Ų„ŲŠØŠ",
"local_network_sheet_info": "ØŗŲŠØĒØĩŲ„ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ Ø¨Ø§Ų„ØŽØ§Ø¯Ų… Ų…Ų† ØŽŲ„Ø§Ų„ ØšŲ†ŲˆØ§Ų† URL Ų‡Ø°Ø§ ØšŲ†Ø¯ Ø§ØŗØĒØŽØ¯Ø§Ų… Ø´Ø¨ŲƒØŠ Wi-Fi Ø§Ų„Ų…Ø­Ø¯Ø¯ØŠ",
"location_permission": "Ø§Ø°Ų† Ø§Ų„Ų…ŲˆŲ‚Øš",
@@ -1225,7 +1265,7 @@
"manage_your_devices": "ØĨØ¯Ø§ØąØŠ Ø§Ų„ØŖØŦŲ‡Ø˛ØŠ Ø§Ų„ØĒ؊ ØĒŲ… ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ ØĨŲ„ŲŠŲ‡Ø§",
"manage_your_oauth_connection": "ØĨØ¯Ø§ØąØŠ اØĒØĩØ§Ų„ OAuth Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ",
"map": "Ø§Ų„ØŽØąŲŠØˇØŠ",
"map_assets_in_bounds": "{count} ØĩŲˆØą",
"map_assets_in_bounds": "{count, plural, =0 {Ų„Ø§ŲŠŲˆØŦد ØĩŲˆØą ؁؊ Ų‡Ø°Ų‡ Ø§Ų„Ų…Ų†ØˇŲ‚ØŠ} one {# ØĩŲˆØąØŠ} other {# ØĩŲˆØą}}",
"map_cannot_get_user_location": "Ų„Ø§ ŲŠŲ…ŲƒŲ† Ø§Ų„Ø­ØĩŲˆŲ„ ØšŲ„Ų‰ Ų…ŲˆŲ‚Øš Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…",
"map_location_dialog_yes": "Ų†ØšŲ…",
"map_location_picker_page_use_location": "Ø§ØŗØĒØŽØ¯Ų… Ų‡Ø°Ø§ Ø§Ų„Ų…ŲˆŲ‚Øš",
@@ -1233,7 +1273,6 @@
"map_location_service_disabled_title": "ØŽØ¯Ų…ØŠ Ø§Ų„Ų…ŲˆŲ‚Øš Ų…ØšØˇŲ„",
"map_marker_for_images": "ØšŲ„Ø§Ų…ØŠ Ø§Ų„ØŽØąŲŠØˇØŠ Ų„Ų„ØĩŲˆØą Ø§Ų„Ų…Ų„ØĒŲ‚ØˇØŠ ؁؊ {city}، {country}",
"map_marker_with_image": "ØšŲ„Ø§Ų…ØŠ Ø§Ų„ØŽØąŲŠØˇØŠ Ų…Øš Ø§Ų„ØĩŲˆØąØŠ",
"map_no_assets_in_bounds": "Ų„Ø§ ØĒ؈ØŦد ØĩŲˆØą ؁؊ Ų‡Ø°Ø§ Ø§Ų„Ų…ØŦØ§Ų„",
"map_no_location_permission_content": "Ų‡Ų†Ø§Ųƒ حاØŦØŠ ØĨŲ„Ų‰ ØĨØ°Ų† Ø§Ų„Ų…ŲˆŲ‚Øš Ų„ØšØąØļ Ø§Ų„ØŖØĩŲˆŲ„ Ų…Ų† Ų…ŲˆŲ‚ØšŲƒ Ø§Ų„Ø­Ø§Ų„ŲŠ.Ų‡Ų„ ØĒØąŲŠØ¯ Ø§Ų„ØŗŲ…Ø§Ø­ Ø¨Ų‡ Ø§Ų„ØĸŲ†ØŸ",
"map_no_location_permission_title": "ØĒŲ… ØąŲØļ ØĨØ°Ų† Ø§Ų„Ų…ŲˆŲ‚Øš",
"map_settings": "ØĨؚداداØĒ Ø§Ų„ØŽØąŲŠØˇØŠ",
@@ -1270,6 +1309,7 @@
"merged_people_count": "Ø¯Ų…ØŦ {count, plural, one {Ø´ØŽØĩ ŲˆØ§Ø­Ø¯} other {# ØŖØ´ØŽØ§Øĩ}}",
"minimize": "ØĒØĩØēŲŠØą",
"minute": "Ø¯Ų‚ŲŠŲ‚ØŠ",
"minutes": "Ø¯Ų‚Ø§ØĻŲ‚",
"missing": "Ø§Ų„Ų…ŲŲ‚ŲˆØ¯ØŠ",
"model": "Ų†Ų…ŲˆØ°ØŦ",
"month": "Ø´Ų‡Øą",
@@ -1289,6 +1329,9 @@
"my_albums": "ØŖŲ„Ø¨ŲˆŲ…Ø§ØĒ؊",
"name": "Ø§Ų„Ø§ØŗŲ…",
"name_or_nickname": "Ø§Ų„Ø§ØŗŲ… ØŖŲˆ Ø§Ų„Ų„Ų‚Ø¨",
"network_requirement_photos_upload": "Ø§ØŗØĒØŽØ¯Ø§Ų… Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„Ų‡Ø§ØĒ؁ Ø§Ų„Ų…Ø­Ų…ŲˆŲ„ Ų„ØšŲ…Ų„ Ų†ØŗØŽØŠ احØĒŲŠØ§ØˇŲŠØŠ Ų„Ų„ØĩŲˆØą",
"network_requirement_videos_upload": "Ø§ØŗØĒØŽØ¯Ø§Ų… Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„Ų‡Ø§ØĒ؁ Ø§Ų„Ų…Ø­Ų…ŲˆŲ„ Ų„ØšŲ…Ų„ Ų†ØŗØŽØŠ احØĒŲŠØ§ØˇŲŠØŠ Ų„Ų…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ",
"network_requirements_updated": "ØĒŲ… ØĒØēŲŠŲŠØą Ų…ØĒØˇŲ„Ø¨Ø§ØĒ Ø§Ų„Ø´Ø¨ŲƒØŠØŒ ؊ØĒŲ… ØĨؚاد؊ ØĒØšŲŠŲŠŲ† Ų‚Ø§ØĻŲ…ØŠ Ø§Ų†ØĒØ¸Ø§Øą Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ",
"networking_settings": "Ø§Ų„Ø´Ø¨ŲƒØ§ØĒ",
"networking_subtitle": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ Ų†Ų‚ØˇØŠ Ø§Ų„ØŽØ§Ø¯Ų… Ø§Ų„Ų†Ų‡Ø§ØĻŲŠØŠ",
"never": "ØŖØ¨Ø¯Ø§Ų‹",
@@ -1324,6 +1367,7 @@
"no_results": "Ų„Ø§ ؊؈ØŦد Ų†ØĒاØĻØŦ",
"no_results_description": "ØŦØąØ¨ ŲƒŲ„Ų…ØŠ ØąØĻŲŠØŗŲŠØŠ Ų…ØąØ§Ø¯ŲØŠ ØŖŲˆ ØŖŲƒØĢØą ØšŲ…ŲˆŲ…ŲŠØŠ",
"no_shared_albums_message": "Ų‚Ų… بØĨŲ†Ø´Ø§ØĄ ØŖŲ„Ø¨ŲˆŲ… Ų„Ų…Ø´Ø§ØąŲƒØŠ Ø§Ų„ØĩŲˆØą ŲˆŲ…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ų…Øš Ø§Ų„ØŖØ´ØŽØ§Øĩ ؁؊ Ø´Ø¨ŲƒØĒ؃",
"no_uploads_in_progress": "Ų„Ø§ ؊؈ØŦد Ø§ŲŠ Ų…Ų„ŲØ§ØĒ Ų‚ŲŠØ¯ Ø§Ų„ØąŲØš",
"not_in_any_album": "Ų„ŲŠØŗØĒ ؁؊ ØŖŲŠ ØŖŲ„Ø¨ŲˆŲ…",
"not_selected": "Ų„Ų… ŲŠØŽØĒØ§Øą",
"note_apply_storage_label_to_previously_uploaded assets": "Ų…Ų„Ø§Ø­Ø¸ØŠ: Ų„ØĒØˇØ¨ŲŠŲ‚ ØŗŲ…ØŠ Ø§Ų„ØĒØŽØ˛ŲŠŲ† ØšŲ„Ų‰ Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ Ø§Ų„ØĒ؊ ØĒŲ… ØąŲØšŲ‡Ø§ Ų…ØŗØ¨Ų‚Ų‹Ø§ØŒ Ų‚Ų… بØĒØ´ØēŲŠŲ„",
@@ -1339,6 +1383,7 @@
"oauth": "OAuth",
"official_immich_resources": "Ø§Ų„Ų…ŲˆØ§ØąØ¯ Ø§Ų„ØąØŗŲ…ŲŠØŠ Ų„Ø´ØąŲƒØŠ Immich",
"offline": "ØēŲŠØą Ų…ØĒØĩŲ„",
"offset": "Ø§Ø˛Ø§Ø­ØŠ",
"ok": "Ų†ØšŲ…",
"oldest_first": "Ø§Ų„ØŖŲ‚Ø¯Ų… ØŖŲˆŲ„Ø§",
"on_this_device": "ØšŲ„Ų‰ Ų‡Ø°Ø§ Ø§Ų„ØŦŲ‡Ø§Ø˛",
@@ -1361,6 +1406,7 @@
"original": "ØŖØĩŲ„ŲŠ",
"other": "ØŖØŽØąŲ‰",
"other_devices": "ØŖØŦŲ‡Ø˛ØŠ ØŖØŽØąŲ‰",
"other_entities": "ŲƒŲŠØ§Ų†Ø§ØĒ ØŖØŽØąŲ‰",
"other_variables": "Ų…ØĒØēŲŠØąØ§ØĒ ØŖØŽØąŲ‰",
"owned": "Ų…Ų…Ų„ŲˆŲƒØŠ",
"owner": "Ø§Ų„Ų…Ø§Ų„Ųƒ",
@@ -1415,7 +1461,10 @@
"permission_onboarding_permission_limited": "ØĨØ°Ų† Ų…Ø­Ø¯ŲˆØ¯. Ų„Ų„ØŗŲ…Ø§Ø­ Ø¨Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ Ų„Ų„ØĒØˇØ¨ŲŠŲ‚ ؈ØĨØ¯Ø§ØąØŠ Ų…ØŦŲ…ŲˆØšØŠ Ø§Ų„Ų…ØšØąØļ Ø¨Ø§Ų„ŲƒØ§Ų…Ų„ØŒ Ø§Ų…Ų†Ø­ ØŖØ°ŲˆŲ†Ø§ØĒ Ø§Ų„ØĩŲˆØą ŲˆØ§Ų„ŲŲŠØ¯ŲŠŲˆ ؁؊ Ø§Ų„ØĨؚداداØĒ.",
"permission_onboarding_request": "؊ØĒØˇŲ„Ø¨ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ ØĨØ°Ų†Ų‹Ø§ Ų„ØšØąØļ Ø§Ų„ØĩŲˆØą ŲˆŲ…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ.",
"person": "Ø´ØŽØĩ",
"person_birthdate": "ØĒØ§ØąŲŠØŽ Ø§Ų„Ų…ŲŠŲ„Ø§Ø¯ {Ø§Ų„ØĒØ§ØąŲŠØŽ}",
"person_age_months": "{months, plural, one {# Ø´Ų‡Øą} other {# Ø§Ø´Ų‡Øą}} Ų…Ų† Ø§Ų„ØšŲ…Øą",
"person_age_year_months": "1 ØšØ§Ų…, {months, plural, one {# Ø´Ų‡Øą} other {# Ø§Ø´Ų‡Øą}} Ų…Ų† Ø§Ų„ØšŲ…Øą",
"person_age_years": "{years, plural, other {# Ø§ØšŲˆØ§Ų…}} Ų…Ų† Ø§Ų„ØšŲ…Øą",
"person_birthdate": "ŲˆŲ„Ø¯ ؁؊ {date}",
"person_hidden": "{name}{hidden, select, true { (Ų…ØŽŲŲŠ)} other {}}",
"photo_shared_all_users": "ŲŠØ¨Ø¯Ųˆ ØŖŲ†Ųƒ Ø´Ø§ØąŲƒØĒ ØĩŲˆØąŲƒ Ų…Øš ØŦŲ…ŲŠØš Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ† ØŖŲˆ Ų„ŲŠØŗ Ų„Ø¯ŲŠŲƒ ØŖŲŠ Ų…ØŗØĒØŽØ¯Ų… Ų„Ų„Ų…Ø´Ø§ØąŲƒØŠ Ų…ØšŲ‡.",
"photos": "Ø§Ų„ØĩŲˆØą",
@@ -1492,6 +1541,7 @@
"purchase_server_description_2": "Ø­Ø§Ų„ØŠ Ø§Ų„Ø¯Ø§ØšŲ…",
"purchase_server_title": "Ø§Ų„ØŽØ§Ø¯Ų…",
"purchase_settings_server_activated": "؊ØĒŲ… ØĨØ¯Ø§ØąØŠ ؅؁ØĒاح Ų…Ų†ØĒØŦ Ø§Ų„ØŽØ§Ø¯Ų… Ų…Ų† Ų‚Ø¨Ų„ Ų…Ø¯ŲŠØą Ø§Ų„Ų†Ø¸Ø§Ų…",
"queue_status": "؊ØĒŲ… Ø§Ų„Ø§ØļØ§ŲØŠ Ø§Ų„Ų‰ Ų‚Ø§ØĻŲ…ØŠ Ø§Ų†ØĒØ¸Ø§Øą Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ {count}/{total}",
"rating": "ØĒŲ‚ŲŠŲŠŲ… Ų†ØŦŲ…ŲŠ",
"rating_clear": "Ų…ØŗØ­ Ø§Ų„ØĒŲ‚ŲŠŲŠŲ…",
"rating_count": "{count, plural, one {# Ų†ØŦŲ…ØŠ} other {# Ų†ØŦŲˆŲ…}}",
@@ -1520,6 +1570,8 @@
"refreshing_faces": "ØŦØ§ØąŲŠ ØĒØ­Ø¯ŲŠØĢ Ø§Ų„ŲˆØŦŲˆŲ‡",
"refreshing_metadata": "ØŦØ§ØąŲ ØĒØ­Ø¯ŲŠØĢ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ŲˆØĩŲŲŠØŠ",
"regenerating_thumbnails": "ØŦØ§ØąŲ ØĒØŦØ¯ŲŠØ¯ Ø§Ų„ØĩŲˆØą Ø§Ų„Ų…ØĩØēØąØŠ",
"remote": "Ø¨ØšŲŠØ¯",
"remote_assets": "Ø§Ų„ØŖŲØĩŲˆŲ„ Ø§Ų„Ø¨ØšŲŠØ¯ØŠ",
"remove": "ØĨØ˛Ø§Ų„ØŠ",
"remove_assets_album_confirmation": "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ ØŖŲ†Ųƒ ØĒØąŲŠØ¯ ØĨØ˛Ø§Ų„ØŠ {count, plural, one {# Ø§Ų„Ų…Ø­ØĒŲˆŲ‰} other {# Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ}} Ų…Ų† Ø§Ų„ØŖŲ„Ø¨ŲˆŲ… ؟",
"remove_assets_shared_link_confirmation": "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ ØŖŲ†Ųƒ ØĒØąŲŠØ¯ ØĨØ˛Ø§Ų„ØŠ {count, plural, one {# Ø§Ų„Ų…Ø­ØĒŲˆŲ‰} other {# Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ}} Ų…Ų† ØąØ§Ø¨Øˇ Ø§Ų„Ų…Ø´Ø§ØąŲƒØŠ Ų‡Ø°Ø§ØŸ",
@@ -1527,6 +1579,7 @@
"remove_custom_date_range": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„Ų†ØˇØ§Ų‚ Ø§Ų„Ø˛Ų…Ų†ŲŠ Ø§Ų„Ų…ØŽØĩØĩ",
"remove_deleted_assets": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„ØēŲŠØą Ų…ØĒØĩŲ„ØŠ",
"remove_from_album": "ØĨØ˛Ø§Ų„ØŠ Ų…Ų† Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…",
"remove_from_album_action_prompt": "ØĒŲ… Ø§Ø˛Ø§Ų„ØŠ {count} Ų…Ų† Ø§Ų„Ø§Ų„Ø¨ŲˆŲ…",
"remove_from_favorites": "ØĨØ˛Ø§Ų„ØŠ Ų…Ų† Ø§Ų„Ų…ŲØļŲ„ØŠ",
"remove_from_lock_folder_action_prompt": "{count} ØŖŲˆŲŠŲ„ Ų…Ų† Ø§Ų„Ų…ØŦŲ„Ø¯ Ø§Ų„Ų…Ų‚ŲŲ„",
"remove_from_locked_folder": "Ø§Ø˛Ø§Ų„ØŠ Ų…Ų† Ø§Ų„Ų…ØŦŲ„Ø¯ Ø§Ų„Ų…Ų‚ŲŲ„",
@@ -1556,19 +1609,28 @@
"reset_password": "ØĨؚاد؊ ØĒØšŲŠŲŠŲ† ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą",
"reset_people_visibility": "ØĨؚاد؊ ØļØ¨Øˇ Ø¸Ų‡ŲˆØą Ø§Ų„ØŖØ´ØŽØ§Øĩ",
"reset_pin_code": "اؚاد؊ ØĒØšŲŠŲŠŲ† ØąŲ…Ø˛ PIN",
"reset_pin_code_description": "اذا Ų†ØŗŲŠØĒ ØąŲ…Ø˛ Ø§Ų„PIN Ø§Ų„ØŽØ§Øĩ Ø¨ŲƒØŒ Ø¨Ø§Ų…ŲƒØ§Ų†Ųƒ Ø§Ų„ØĒŲˆØ§ØĩŲ„ Ų…Øš Ų…Ø¯ŲŠØą Ø§Ų„ØŽØ§Ø¯Ų… Ų„Ø¯ŲŠŲƒ Ų„Ø§ØšØ§Ø¯ØŠ ØĒØšŲŠŲŠŲ†Ų‡",
"reset_pin_code_success": "ØĒŲ… اؚاد؊ ØĒØšŲŠŲŠŲ† ØąŲ…Ø˛ Ø§Ų„PIN Ø¨Ų†ØŦاح",
"reset_pin_code_with_password": "ŲŠŲ…ŲƒŲ†Ųƒ داØĻŲ…Ø§ اؚاد؊ ØĒØšŲŠŲŠŲ† ØąŲ…Ø˛ Ø§Ų„PIN Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ ØšŲ† ØˇØąŲŠŲ‚ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ",
"reset_sqlite": "ØĨؚاد؊ ØĒØšŲŠŲŠŲ† Ų‚Ø§ØšØ¯ØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ SQLite",
"reset_sqlite_confirmation": "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ Ų…Ų† ØąØēبØĒ؃ ؁؊ ØĨؚاد؊ ØļØ¨Øˇ Ų‚Ø§ØšØ¯ØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ SQLite؟ ØŗØĒØ­ØĒاØŦ ØĨŲ„Ų‰ ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ ØĢŲ… ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ų…ØąØŠ ØŖØŽØąŲ‰ Ų„ØĨؚاد؊ Ų…Ø˛Ø§Ų…Ų†ØŠ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ",
"reset_sqlite_success": "ØĒŲ… ØĨؚاد؊ ØĒØšŲŠŲŠŲ† Ų‚Ø§ØšØ¯ØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ SQLite Ø¨Ų†ØŦاح",
"reset_to_default": "ØĨؚاد؊ Ø§Ų„ØĒØšŲŠŲŠŲ† ØĨŲ„Ų‰ Ø§Ų„Ø§ŲØĒØąØ§Øļ؊",
"resolve_duplicates": "Ų…ØšØ§Ų„ØŦØŠ Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ų…ŲƒØąØąØŠ",
"resolved_all_duplicates": "ØĒŲ… Ø­Ų„ ØŦŲ…ŲŠØš Ø§Ų„ØĒŲƒØąØ§ØąØ§ØĒ",
"restore": "Ø§Ų„Ø§ØŗØĒØšØ§Ø¯Ų‡ Ų…Ų† ØŗŲ„ØŠ Ø§Ų„Ų…Ų‡Ų…Ų„Ø§ØĒ",
"restore_all": "Ø§ØŗØĒؚاد؊ Ø§Ų„ŲƒŲ„",
"restore_trash_action_prompt": "ØĒŲ… Ø§ØŗØĒؚاد؊ {count} Ų…Ų† Ø§Ų„Ų…Ų‡Ų…Ų„Ø§ØĒ",
"restore_user": "Ø§ØŗØĒؚاد؊ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…",
"restored_asset": "Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ Ø§Ų„Ų…ØŗØĒؚاد؊",
"resume": "Ø§ØŗØĒØĻŲ†Ø§Ų",
"retry_upload": "ØŖØšØ¯ Ų…Ø­Ø§ŲˆŲ„ØŠ Ø§Ų„ØąŲØš",
"review_duplicates": "Ų…ØąØ§ØŦؚ؊ Ø§Ų„ØĒŲƒØąØ§ØąØ§ØĒ",
"review_large_files": "Ų…ØąØ§ØŦؚ؊ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„ŲƒØ¨ŲŠØąØŠ",
"role": "Ø§Ų„Ø¯ŲˆØą",
"role_editor": "Ø§Ų„Ų…Ø­ØąØą",
"role_viewer": "Ø§Ų„ØšØ§ØąØļ",
"running": "Ų‚ŲŠØ¯ Ø§Ų„ØĒØ´ØēŲŠŲ„",
"save": "Ø­ŲØ¸",
"save_to_gallery": "Ø­ŲØ¸ Ø§Ų„Ų‰ Ø§Ų„Ų…ØšØąØļ",
"saved_api_key": "ØĒŲ… Ø­ŲØ¸ ؅؁ØĒاح Ø§Ų„Ų€ API",
@@ -1700,6 +1762,7 @@
"settings_saved": "ØĒŲ… Ø­ŲØ¸ Ø§Ų„ØĨؚداداØĒ",
"setup_pin_code": "ØĒØ­Ø¯ŲŠØ¯ ØąŲ…Ø˛ PIN",
"share": "Ų…Ø´Ø§ØąŲƒØŠ",
"share_action_prompt": "ØĒŲ… Ų…Ø´Ø§ØąŲƒØŠ {count} ØŖØĩŲ„ (؅؄؁)",
"share_add_photos": "ØĨØļØ§ŲØŠ Ø§Ų„ØĩŲˆØą",
"share_assets_selected": "ا؎ØĒŲŠØ§Øą {count}",
"share_dialog_preparing": "ØĒØ­ØļŲŠØą...",
@@ -1721,6 +1784,7 @@
"shared_link_clipboard_copied_massage": "Ų†ØŗØŽ ØĨŲ„Ų‰ Ø§Ų„Ø­Ø§ŲØ¸ØŠ",
"shared_link_clipboard_text": "ØąØ§Ø¨Øˇ: {link}\nŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą: {password}",
"shared_link_create_error": "ØŽØˇØŖ ØŖØĢŲ†Ø§ØĄ ØĨŲ†Ø´Ø§ØĄ ØąØ§Ø¨Øˇ Ų…Ø´ØĒØąŲƒ",
"shared_link_custom_url_description": "Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ų‡Ø°Ø§ Ø§Ų„ØąØ§Ø¨Øˇ Ø§Ų„Ų…Ø´ØĒØąŲƒ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… ØšŲ†ŲˆØ§Ų† URL Ų…ØŽØĩØĩ",
"shared_link_edit_description_hint": "ØŖØ¯ØŽŲ„ ؈Øĩ؁ Ø§Ų„Ų…Ø´Ø§ØąŲƒØŠ",
"shared_link_edit_expire_after_option_day": "ŲŠŲˆŲ… 1",
"shared_link_edit_expire_after_option_days": "{count} Ø§ŲŠØ§Ų…",
@@ -1746,6 +1810,7 @@
"shared_link_info_chip_metadata": "EXIF",
"shared_link_manage_links": "ØĨØ¯Ø§ØąØŠ Ø§Ų„ØąŲˆØ§Ø¨Øˇ Ø§Ų„Ų…Ø´ØĒØąŲƒØŠ",
"shared_link_options": "ØŽŲŠØ§ØąØ§ØĒ Ø§Ų„ØąØ§Ø¨Øˇ Ø§Ų„Ų…Ø´ØĒØąŲƒ",
"shared_link_password_description": "ØˇŲ„Ø¨ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Ų„Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ų‡Ø°Ø§ Ø§Ų„ØąØ§Ø¨Øˇ Ø§Ų„Ų…Ø´ØĒØąŲƒ",
"shared_links": "ØąŲˆØ§Ø¨Øˇ Ų…Ø´ØĒØąŲƒØŠ",
"shared_links_description": "؈Øĩ؁ Ø§Ų„ØąŲˆØ§Ø¨Øˇ Ø§Ų„Ų…Ø´ØĒØąŲƒØŠ",
"shared_photos_and_videos_count": "{assetCount, plural, other {# Ø§Ų„ØĩŲˆØą ŲˆŲ…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…ŲØ´Ø§ØąŲŽŲƒØŠ.}}",
@@ -1795,12 +1860,14 @@
"sort_created": "ØĒØ§ØąŲŠØŽ Ø§Ų„ØĨŲ†Ø´Ø§ØĄ",
"sort_items": "ؚدد Ø§Ų„ØšŲ†Ø§ØĩØą",
"sort_modified": "ØĒŲ… ØĒØšØ¯ŲŠŲ„ Ø§Ų„ØĒØ§ØąŲŠØŽ",
"sort_newest": "احدØĢ ØĩŲˆØąØŠ",
"sort_oldest": "ØŖŲ‚Ø¯Ų… ØĩŲˆØąØŠ",
"sort_people_by_similarity": "ØąØĒب Ø§Ų„ØŖØ´ØŽØ§Øĩ Ø­ØŗØ¨ Ø§Ų„ØĒØ´Ø§Ø¨Ų‡",
"sort_recent": "ØŖØ­Ø¯ØĢ ØĩŲˆØąØŠ",
"sort_title": "Ø§Ų„ØšŲ†ŲˆØ§Ų†",
"source": "Ø§Ų„Ų…ØĩØ¯Øą",
"stack": "ØĒØŦŲ…ŲŠØš",
"stack_action_prompt": "{count} Ų…ŲƒØ¯ØŗØŠ",
"stack_duplicates": "ØĒØŦŲ…ŲŠØš Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ų…ŲƒØąØąØŠ",
"stack_select_one_photo": "حدد ØĩŲˆØąØŠ ØąØĻŲŠØŗŲŠØŠ ŲˆØ§Ø­Ø¯ØŠ Ų„Ų„Ų…ØŦŲ…ŲˆØšØŠ",
"stack_selected_photos": "ŲƒØ¯Øŗ Ø§Ų„ØĩŲˆØą Ø§Ų„Ų…Ø­Ø¯Ø¯ØŠ",
@@ -1820,6 +1887,7 @@
"storage_quota": "Ø­ØĩØŠ Ø§Ų„ØŽØ˛Ų†",
"storage_usage": "{used} Ų…Ų† {available} Ų…ŲØŗØĒØŽŲ’Ø¯Ų…",
"submit": "ØĨØąØŗØ§Ų„",
"success": "ØĒŲ… Ø¨Ų†ØŦاح",
"suggestions": "Ø§Ų‚ØĒØąØ§Ø­Ø§ØĒ",
"sunrise_on_the_beach": "Ø´ØąŲˆŲ‚ Ø§Ų„Ø´Ų…Øŗ ØšŲ„Ų‰ Ø§Ų„Ø´Ø§ØˇØĻ",
"support": "Ø§Ų„Ø¯ØšŲ…",
@@ -1829,6 +1897,8 @@
"sync": "Ų…Ø˛Ø§Ų…Ų†ØŠ",
"sync_albums": "Ų…Ø˛Ø§Ų…Ų†ØŠ Ø§Ų„Ø§Ų„Ø¨ŲˆŲ…Ø§ØĒ",
"sync_albums_manual_subtitle": "Ų…Ø˛Ø§Ų…Ų†ØŠ ØŦŲ…ŲŠØš Ø§Ų„ŲØ¯ŲŠŲˆŲ‡Ø§ØĒ ŲˆØ§Ų„ØĩŲˆØą Ø§Ų„Ų…ØąŲŲˆØšØŠ Ø§Ų„Ų‰ Ø§Ų„Ø¨ŲˆŲ…Ø§ØĒ Ø§Ų„ØŽØ˛Ų† Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ Ø§Ų„Ų…ØŽØĒØ§ØąØŠ",
"sync_local": "Ų…Ø˛Ø§Ų…Ų†ØŠ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„Ų…Ø­Ų„ŲŠØŠ",
"sync_remote": "Ų…Ø˛Ø§Ų…Ų†ØŠ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„Ø¨ØšŲŠØ¯ØŠ",
"sync_upload_album_setting_subtitle": "Ø§Ų†Ø´ØĻ ؈ Ø§ØąŲØš ØĩŲˆØąŲƒ ؈ ŲØ¯ŲŠŲˆŲ‡Ø§ØĒ؃ Ø§Ų„Ø§Ų„Ø¨ŲˆŲ…Ø§ØĒ Ø§Ų„Ų…ØŽØĒØ§ØąØŠ ؁؊ Immich",
"tag": "Ø§Ų„ØšŲ„Ø§Ų…ØŠ",
"tag_assets": "ØŖØĩŲˆŲ„ Ø§Ų„ØšŲ„Ø§Ų…ØŠ",
@@ -1839,6 +1909,7 @@
"tag_updated": "ØĒŲ… ØĒØ­Ø¯ŲŠØĢ Ø§Ų„ØšŲ„Ø§Ų…ØŠ: {tag}",
"tagged_assets": "ØĒŲ… ؈ØļØš ØšŲ„Ø§Ų…ØŠ {count, plural, one {# asset} other {# assets}}",
"tags": "Ø§Ų„ØšŲ„Ø§Ų…Ø§ØĒ",
"tap_to_run_job": "Ø§Ų†Ų‚Øą Ų„ØĒØ´ØēŲŠŲ„ Ø§Ų„Ų…Ų‡Ų…ØŠ",
"template": "Ø§Ų„Ų†Ų…ŲˆØ°ØŦ",
"theme": "Ų…Ø¸Ų‡Øą",
"theme_selection": "ا؎ØĒŲŠØ§Øą Ø§Ų„ØŗŲ…ØŠ",
@@ -1911,15 +1982,20 @@
"unselect_all_duplicates": "ØĨŲ„ØēØ§ØĄ ØĒØ­Ø¯ŲŠØ¯ ŲƒØ§ŲØŠ Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ų…ŲƒØąØąØŠ",
"unselect_all_in": "ØĨŲ„ØēØ§ØĄ ØĒØ­Ø¯ŲŠØ¯ Ø§Ų„ŲƒŲ„ ؁؊ {group}",
"unstack": "؁؃ Ø§Ų„ŲƒŲˆŲ…Ų‡",
"unstack_action_prompt": "ØĒŲ… Ø§Ø˛Ø§Ų„ØŠ ØĒŲƒØ¯ŲŠØŗ {count}",
"unstacked_assets_count": "ØĒŲ… ØĨØŽØąØ§ØŦ {count, plural, one {# Ø§Ų„ØŖØĩŲ„} other {# Ø§Ų„ØŖØĩŲˆŲ„}} Ų…Ų† Ø§Ų„ØĒŲƒØ¯ŲŠØŗ",
"untagged": "ØēŲŠØą Ų…ŲØšŲŽŲ„ŲŽŲ‘Ų…",
"up_next": "Ø§Ų„ØĒØ§Ų„ŲŠ",
"updated_at": "ØĒŲ… Ø§Ų„ØĒØ­Ø¯ŲŠØĢ",
"updated_password": "ØĒŲ… ØĒØ­Ø¯ŲŠØĢ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą",
"upload": "ØąŲØš",
"upload_action_prompt": "{count} ؅؄؁ ؁؊ Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„Ø§Ų†ØĒØ¸Ø§Øą Ų„Ų„ØąŲØš",
"upload_concurrency": "Ø§Ų„ØąŲØš Ø§Ų„Ų…ØĒØ˛Ø§Ų…Ų†",
"upload_details": "ØĒŲØ§ØĩŲŠŲ„ Ø§Ų„ØąŲØš",
"upload_dialog_info": "Ų‡Ų„ ØĒØąŲŠØ¯ Ø§Ų„Ų†ØŗØŽ Ø§Ų„Ø§Ø­ØĒŲŠØ§ØˇŲŠ Ų„Ų„ØŖØĩŲˆŲ„ (Ø§Ų„ØŖØĩŲˆŲ„) Ø§Ų„Ų…Ø­Ø¯Ø¯ØŠ ØĨŲ„Ų‰ Ø§Ų„ØŽØ§Ø¯Ų…ØŸ",
"upload_dialog_title": "ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØŖØĩŲˆŲ„",
"upload_errors": "ØĨ؃ØĒŲ…Ų„ Ø§Ų„ØąŲØš Ų…Øš {count, plural, one {# ØŽØˇØŖ} other {# ØŖØŽØˇØ§ØĄ}}, Ų‚Ų… بØĒØ­Ø¯ŲŠØĢ Ø§Ų„ØĩŲØ­ØŠ Ų„ØąØ¤ŲŠØŠ Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ Ø§Ų„ØŦØ¯ŲŠØ¯ØŠ Ø§Ų„ØĒ؊ ØĒŲ… ØąŲØšŲ‡Ø§.",
"upload_finished": "ØĒŲ… Ø§Ų„Ø§Ų†ØĒŲ‡Ø§ØĄ Ų…Ų† Ø§Ų„ØąŲØš",
"upload_progress": "Ų…ØĒØ¨Ų‚ŲŠØŠ {remaining, number} - Ų…ØšØ§Ų„ØŦØŠ {processed, number}/{total, number}",
"upload_skipped_duplicates": "ØĒŲ… ØĒØŽØˇŲŠ {count, plural, one {# Ų…Ø­ØĒŲˆŲ‰ Ų…ŲƒØąØą} other {# Ų…Ø­ØĒŲˆŲŠØ§ØĒ Ų…ŲƒØąØąØŠ }}",
"upload_status_duplicates": "Ø§Ų„ØĒŲƒØąØ§ØąØ§ØĒ",
@@ -1928,6 +2004,7 @@
"upload_success": "ØĒŲ… Ø§Ų„ØąŲØš Ø¨Ų†ØŦاح، Ų‚Ų… بØĒØ­Ø¯ŲŠØĢ Ø§Ų„ØĩŲØ­ØŠ Ų„ØąØ¤ŲŠØŠ Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ Ø§Ų„Ų…ØąŲŲˆØšØŠ Ø§Ų„ØŦØ¯ŲŠØ¯ØŠ.",
"upload_to_immich": "Ø§Ų„ØąŲØš Ø§Ų„Ų‰Immich ‎ ‏ ({count})",
"uploading": "ØŦØ§ØąŲŠ Ø§Ų„ØąŲØš",
"uploading_media": "ØąŲØš Ø§Ų„ŲˆØŗØ§ØĻØˇ",
"url": "ØšŲ†ŲˆØ§Ų† URL",
"usage": "Ø§Ų„Ø§ØŗØĒØŽØ¯Ø§Ų…",
"use_biometric": "Ø§ØŗØĒØŽØ¯Ų… Ø§Ų„Ø¨Ø§ŲŠŲˆŲ…ØĒØąŲŠ",
@@ -1948,6 +2025,7 @@
"user_usage_stats_description": "ØšØąØļ ØĨØ­ØĩاØĻŲŠØ§ØĒ Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Ø­ØŗØ§Ø¨",
"username": "Ø§ØŗŲ… Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…",
"users": "Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ†",
"users_added_to_album_count": "ØĒŲ… اØļØ§ŲØŠ{count, plural, one {# Ų…ØŗØĒØŽØ¯Ų…} other {# Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ†}} Ø§Ų„Ų‰ Ø§Ų„Ø§Ų„Ø¨ŲˆŲ…",
"utilities": "ØŖØ¯ŲˆØ§ØĒ",
"validate": "ØĒØ­Ų‚Ų’Ų‚",
"validate_endpoint_error": "Ø§Ų„ØąØŦØ§ØĄ Ø§Ø¯ØŽØ§Ų„ ØšŲ†ŲˆØ§Ų† URL ØĩØ§Ų„Ø­",
@@ -1966,6 +2044,7 @@
"view_album": "ØšØąØļ Ø§Ų„ØŖŲ„Ø¨ŲˆŲ…",
"view_all": "ØšØąØļ Ø§Ų„ŲƒŲ„",
"view_all_users": "ØšØąØļ ŲƒØ§ŲØŠ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ†",
"view_details": "ØąØ¤ŲŠØŠ Ø§Ų„ØĒŲØ§ØĩŲŠŲ„",
"view_in_timeline": "ØšØąØļ ؁؊ Ø§Ų„ØŦØ¯ŲˆŲ„ Ø§Ų„Ø˛Ų…Ų†ŲŠ",
"view_link": "ØšØąØļ Ø§Ų„ØąØ§Ø¨Øˇ",
"view_links": "ØšØąØļ Ø§Ų„ØąŲˆØ§Ø¨Øˇ",

View File

@@ -1,37 +1,53 @@
{
"about": "Haqqinda",
"about": "HaqqÄąnda",
"account": "Hesab",
"account_settings": "Hesab parametrləri",
"acknowledge": "Təsdiq et",
"action": "Əməliyyat",
"action_common_update": "Yenilə",
"actions": "Əməliyyatlar",
"active": "Aktiv",
"activity": "Fəaliyyət",
"activity_changed": "Fəaliyyət {enabled, select, true {aktivdir} other {aktiv deyil}}",
"add": "Əlavə et",
"add_a_description": "Təsviri əlavə et",
"add_a_location": "Məkan əlavə et",
"add_a_name": "Ad əlavə et",
"add_a_title": "BaşlÄąq əlavə et",
"add_birthday": "Doğum gÃŧnÃŧ əlavə et",
"add_endpoint": "Son nÃļqtə əlavə et",
"add_exclusion_pattern": "İstisna nÃŧmunəsi əlavə et",
"add_import_path": "Import yolunu əlavə et",
"add_location": "Məkanı əlavə et",
"add_location": "Məkan əlavə et",
"add_more_users": "Daha çox istifadəçi əlavə et",
"add_partner": "Partnyor əlavə et",
"add_path": "Yol əlavə et",
"add_photos": "Şəkilləri əlavə et",
"add_to": "... əlavə et",
"add_photos": "Şəkillər əlavə et",
"add_tag": "Etiket əlavə et",
"add_to": "Bura əlavə etâ€Ļ",
"add_to_album": "Albom əlavə et",
"add_to_album_bottom_sheet_added": "{album} albomuna əlavə edildi",
"add_to_album_bottom_sheet_already_exists": "ArtÄąq {album} albomunda var",
"add_to_album_toggle": "{album} ÃŧçÃŧn seçimi dəyişin",
"add_to_albums": "Albomlara əlavə et",
"add_to_albums_count": "Albomlara əlavə et ({count})",
"add_to_shared_album": "PaylaÅŸÄąlan alboma əlavə et",
"add_url": "URL əlavə et",
"added_to_archive": "Arxivə əlavə edildi",
"added_to_favorites": "Sevimlilələrə əlavə edildi",
"added_to_favorites_count": "{count, number} şəkil sevimlilələrə əlavə edildi",
"admin": {
"add_exclusion_pattern_description": "İstisna şablonlarÄąnÄą əlavə edin. *, ** və ? ilə Globbing dəstəklənir. Məs.: \"Raw\" adlanan hər hansÄąsa bir qovluqda bÃŧtÃŧn fayllarÄą saymamaq ÃŧçÃŧn \"**/Raw/**\"-dan istifadə edin. \".tif\" ilə bitən bÃŧtÃŧn fayllarÄą saymamaq ÃŧçÃŧn \"**/*.tif\"-dən istifadə edin. FaylÄą mÃŧtləq yoldan istifadə etməklə saymamaq istəyirsinizsə \"/path/to/ignore/**\"-dan istifadə edin.",
"admin_user": "Admin İstifadəçi",
"asset_offline_description": "Bu xarici kitabxana varlığı diskdə artÄąq tapÄąlmadÄą və zibil qutusuna kÃļçÃŧrÃŧldÃŧ. Əgər fayl kitabxana içərisində kÃļçÃŧrÃŧlÃŧbsə, zaman şkalanÄązÄą yeni uyğun gələn varlÄąq ÃŧçÃŧn yoxlayÄąn. Varlığı yenidən qaytarmaq ÃŧçÃŧn aşağıda verilmiş fayl yolunun Immich tərəfindən əlçatan olduğundan əmin olduqdan sonra kitabxananÄą skan edin.",
"authentication_settings": "Səlahiyyətləndirmə parametrləri",
"authentication_settings_description": "Şifrə, OAuth və digər səlahiyyətləndirmə parametrləri",
"authentication_settings_disable_all": "BÃŧtÃŧn giriş etmə metodlarÄąnÄą sÃļndÃŧrmək istədiyinizdən əminsinizmi? Giriş etmə funksiyasÄą tamamilə sÃļndÃŧrÃŧləcəkdir.",
"authentication_settings_reenable": "Yenidən aktiv etmək ÃŧçÃŧn <link> Server Əmri</link> -ni istifadə edin.",
"background_task_job": "Arxa plan tapÅŸÄąrÄąqlarÄą",
"backup_database_enable_description": "Verilənlər bazasÄąnÄąn ehtiyat nÃŧsxələrini aktiv et",
"backup_database": "Verilənlər bazasının dump-ını yaradın",
"backup_database_enable_description": "Verilənlər bazasÄąnÄąn artÄąq nÃŧsxələrini aktiv et",
"backup_keep_last_amount": "TutulmasÄą gərəkən nÃŧsxələrin sayÄą",
"backup_settings": "Ehtiyat NÃŧsxə Parametrləri",
"backup_settings_description": "Verilənlər bazasÄąnÄąn ehtiyat nÃŧsxə parametrlərini idarə et",
"config_set_by_file": "Konfiqurasiya hal-hazırda konfiqurasiya faylı ilə təyin olunub",
@@ -84,5 +100,6 @@
"machine_learning_facial_recognition": "Üz TanÄąma",
"machine_learning_facial_recognition_description": "Şəkillərdəki Ãŧzləri aşkarla, tanÄą və qruplaşdÄąr",
"machine_learning_facial_recognition_model": "Üz tanÄąma modeli"
}
},
"timeline": "Zaman şkalasÄą"
}

View File

@@ -14,6 +14,7 @@
"add_a_location": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ĐŧĐĩŅŅ†Đ°",
"add_a_name": "Đ”Đ°Đ´Đ°Ņ†ŅŒ Ņ–ĐŧŅ",
"add_a_title": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ĐˇĐ°ĐŗĐ°ĐģОваĐē",
"add_birthday": "Đ”Đ°Đ´Đ°Ņ†ŅŒ дСĐĩĐŊҌ ĐŊĐ°Ņ€Đ°Đ´ĐļŅĐŊĐŊŅ",
"add_endpoint": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ĐēŅ€ĐžĐŋĐē҃ Đ´ĐžŅŅ‚ŅƒĐŋ҃",
"add_exclusion_pattern": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ŅˆĐ°ĐąĐģĐžĐŊ Đ˛Ņ‹ĐēĐģŅŽŅ‡ŅĐŊĐŊŅ",
"add_import_path": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ҈ĐģŅŅ… Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Ņƒ",
@@ -27,6 +28,8 @@
"add_to_album": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ҃ аĐģŅŒĐąĐžĐŧ",
"add_to_album_bottom_sheet_added": "ДададзĐĩĐŊа да {album}",
"add_to_album_bottom_sheet_already_exists": "ĐŖĐļĐž СĐŊĐ°Ņ…ĐžĐ´ĐˇŅ–Ņ†Ņ†Đ° Ņž {album}",
"add_to_albums": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ҃ аĐģŅŒĐąĐžĐŧŅ‹",
"add_to_albums_count": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ҃ аĐģŅŒĐąĐžĐŧŅ‹ ({count})",
"add_to_shared_album": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ҃ Đ°ĐŗŅƒĐģҌĐŊŅ‹ аĐģŅŒĐąĐžĐŧ",
"add_url": "Đ”Đ°Đ´Đ°Ņ†ŅŒ URL",
"added_to_archive": "ДададзĐĩĐŊа Ņž Đ°Ņ€Ņ…Ņ–Ņž",
@@ -44,6 +47,10 @@
"backup_database": "ĐĄŅ‚Đ˛Đ°Ņ€Ņ‹Ņ†ŅŒ Ņ€ŅĐˇĐĩŅ€Đ˛ĐžĐ˛ŅƒŅŽ ĐēĐžĐŋŅ–ŅŽ ĐąĐ°ĐˇŅ‹ даĐŊҋ҅",
"backup_database_enable_description": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ Ņ€ŅĐˇĐĩŅ€Đ˛Đ°Đ˛Đ°ĐŊĐŊĐĩ ĐąĐ°ĐˇŅ‹ даĐŊҋ҅",
"backup_keep_last_amount": "КоĐģҌĐēĐ°ŅŅ†ŅŒ ĐŋаĐŋŅŅ€ŅĐ´ĐŊŅ–Ņ… Ņ€ŅĐˇĐĩŅ€Đ˛ĐžĐ˛Ņ‹Ņ… ĐēĐžĐŋŅ–Đš Đ´ĐģŅ ĐˇĐ°Ņ…Đ°Đ˛Đ°ĐŊĐŊŅ",
"backup_onboarding_1_description": "СĐŊŅŅˆĐŊŅŅ ĐēĐžĐŋŅ–Ņ Ņž вОйĐģаĐē҃ айО Ņž Ņ–ĐŊŅˆŅ‹Đŧ Ņ„Ņ–ĐˇŅ–Ņ‡ĐŊŅ‹Đŧ ĐŧĐĩҁ҆ҋ.",
"backup_onboarding_2_description": "ĐģаĐēаĐģҌĐŊŅ‹Ņ ĐēĐžĐŋŅ–Ņ– ĐŊа Ņ–ĐŊŅˆŅ‹Ņ… ĐŋҀҋĐģĐ°Đ´Đ°Ņ…. Đ“ŅŅ‚Đ° ŅžĐēĐģŅŽŅ‡Đ°Đĩ Ņž ŅŅĐąĐĩ Đ°ŅĐŊĐžŅžĐŊŅ‹Ņ Ņ„Đ°ĐšĐģŅ‹ Ņ– ĐģаĐēаĐģҌĐŊŅƒŅŽ Ņ€ŅĐˇĐĩŅ€Đ˛ĐžĐ˛ŅƒŅŽ ĐēĐžĐŋŅ–ŅŽ ĐŗŅŅ‚Ņ‹Ņ… Ņ„Đ°ĐšĐģĐ°Ņž.",
"backup_onboarding_parts_title": "Đ ŅĐˇĐĩŅ€Đ˛ĐžĐ˛Đ°Ņ ĐēĐžĐŋŅ–Ņ ÂĢ3-2-1Âģ ҃ĐēĐģŅŽŅ‡Đ°Đĩ Ņž ŅŅĐąĐĩ:",
"backup_onboarding_title": "Đ ŅĐˇĐĩŅ€Đ˛ĐžĐ˛Ņ‹Ņ ĐēĐžĐŋŅ–Ņ–",
"backup_settings": "НаĐģĐ°Đ´Ņ‹ Ņ€ŅĐˇĐĩŅ€Đ˛ĐžĐ˛Đ°ĐŗĐ° ĐēаĐŋŅ–ŅĐ˛Đ°ĐŊĐŊŅ",
"backup_settings_description": "ĐšŅ–Ņ€Đ°Đ˛Đ°ĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ– Ņ€ŅĐˇĐĩŅ€Đ˛Đ°Đ˛Đ°ĐŊĐŊŅ ĐąĐ°ĐˇŅ‹ даĐŊҋ҅.",
"cleared_jobs": "ĐŅ‡Ņ‹ŅˆŅ‡Đ°ĐŊŅ‹ СадаĐŊĐŊŅ– Đ´ĐģŅ: {job}",
@@ -56,14 +63,14 @@
"confirm_user_pin_code_reset": "Đ’Ņ‹ ŅžĐŋŅŅžĐŊĐĩĐŊŅ‹ Ņž ҂ҋĐŧ, ŅˆŅ‚Đž ĐļадаĐĩ҆Đĩ ҁĐēŅ–ĐŊŅƒŅ†ŅŒ PIN-ĐēОд {user}?",
"create_job": "ĐĄŅ‚Đ˛Đ°Ņ€Ņ‹Ņ†ŅŒ СадаĐŊĐŊĐĩ",
"cron_expression": "Đ’Ņ‹Ņ€Đ°Đˇ Cron",
"cron_expression_description": "ĐŖŅŅ‚Đ°ĐģŅŽĐšŅ†Đĩ Ņ–ĐŊŅ‚ŅŅ€Đ˛Đ°Đģ ҁĐēаĐŊаваĐŊĐŊŅ, Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ŅŽŅ‡Ņ‹ Ņ„Đ°Ņ€ĐŧĐ°Ņ‚ cron. ДĐģŅ Đ°Ņ‚Ņ€Ņ‹ĐŧаĐŊĐŊŅ Đ´Đ°Đ´Đ°Ņ‚ĐēОваК Ņ–ĐŊŅ„Đ°Ņ€ĐŧĐ°Ņ†Ņ‹Ņ–, ĐēаĐģŅ– ĐģĐ°ŅĐēа, ĐˇĐ˛ŅŅ€ĐŊҖ҆ĐĩŅŅ, ĐŊаĐŋҀҋĐēĐģад, да <link>Crontab Guru</link>",
"cron_expression_description": "Đ—Đ°Đ´Đ°ĐšŅ†Đĩ Ņ–ĐŊŅ‚ŅŅ€Đ˛Đ°Đģ ҁĐēаĐŊаваĐŊĐŊŅ, Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ŅŽŅ‡Ņ‹ Ņ„Đ°Ņ€ĐŧĐ°Ņ‚ cron. ДĐģŅ Đ°Ņ‚Ņ€Ņ‹ĐŧаĐŊĐŊŅ Đ´Đ°Đ´Đ°Ņ‚ĐēОваК Ņ–ĐŊŅ„Đ°Ņ€ĐŧĐ°Ņ†Ņ‹Ņ–, ĐˇĐ˛ŅŅ€ĐŊҖ҆ĐĩŅŅ, ĐŊаĐŋҀҋĐēĐģад, да <link>Crontab Guru</link>",
"cron_expression_presets": "ĐŸŅ€Đ°Đ´ŅƒŅŅ‚Đ°ĐŊĐžŅžĐēŅ– Đ˛Ņ‹Ņ€Đ°ĐˇĐ°Ņž Cron",
"disable_login": "АдĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ŅƒĐ˛Đ°Ņ…ĐžĐ´",
"duplicate_detection_job_description": "ЗаĐŋŅƒŅŅ†Ņ–Ņ†ŅŒ ĐŧĐ°ŅˆŅ‹ĐŊĐŊаĐĩ ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊĐĩ ĐŊа аĐēŅ‚Ņ‹Đ˛Đ°Ņ… Đ´ĐģŅ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ ĐŋадОйĐŊҋ҅ Đ˛Ņ‹ŅŅž. ЗаĐģĐĩĐļŅ‹Ņ†ŅŒ ад Smart Search",
"exclusion_pattern_description": "ШайĐģĐžĐŊŅ‹ Đ˛Ņ‹ĐēĐģŅŽŅ‡ŅĐŊĐŊŅ даСваĐģŅŅŽŅ†ŅŒ Ņ–ĐŗĐŊĐ°Ņ€Đ°Đ˛Đ°Ņ†ŅŒ Ņ„Đ°ĐšĐģŅ‹ Ņ– ĐŋаĐŋĐēŅ– ĐŋҀҋ ҁĐēаĐŊаваĐŊĐŊŅ– Đ˛Đ°ŅˆĐ°Đš ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēŅ–. Đ“ŅŅ‚Đ° ĐēĐ°Ņ€Ņ‹ŅĐŊа, ĐēаĐģŅ– Ņž Đ˛Đ°Ņ Ņ‘ŅŅ†ŅŒ ĐŋаĐŋĐēŅ–, ŅĐēŅ–Ņ СĐŧŅŅˆŅ‡Đ°ŅŽŅ†ŅŒ Ņ„Đ°ĐšĐģŅ‹, ŅĐēŅ–Ņ Đ˛Ņ‹ ĐŊĐĩ Ņ…ĐžŅ‡Đ°Ņ†Đĩ Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°Ņ†ŅŒ, ĐŊаĐŋҀҋĐēĐģад, Ņ„Đ°ĐšĐģŅ‹ RAW.",
"external_library_management": "ĐšŅ–Ņ€Đ°Đ˛Đ°ĐŊĐŊĐĩ СĐŊĐĩ҈ĐŊŅĐš ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēаК",
"face_detection": "Đ’Ņ‹ŅŅžĐģĐĩĐŊĐŊĐĩ Ņ‚Đ˛Đ°Ņ€Đ°Ņž",
"face_detection_description": "Đ’Ņ‹ŅŅžĐģŅŅ†ŅŒ Ņ‚Đ˛Đ°Ņ€Ņ‹ ĐŊа Ņ„ĐžŅ‚Đ°ĐˇĐ´Ņ‹ĐŧĐēĐ°Ņ… Ņ– Đ˛Ņ–Đ´ŅĐ° С даĐŋаĐŧĐžĐŗĐ°Đš ĐŧĐ°ŅˆŅ‹ĐŊĐŊĐ°ĐŗĐ° ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊŅ. ДĐģŅ Đ˛Ņ–Đ´ŅĐ° ŅžĐģŅ–Ņ‡Đ˛Đ°ĐĩŅ†Ņ†Đ° Ņ‚ĐžĐģҌĐēŅ– ĐŧŅ–ĐŊŅ–ŅŅ†ŅŽŅ€Đ°. \"АйĐŊĐ°Đ˛Ņ–Ņ†ŅŒ\" (ĐŋĐĩŅ€Đ°)аĐŋŅ€Đ°Ņ†ĐžŅžĐ˛Đ°Đĩ ŅžŅĐĩ ĐŧĐĩĐ´Ņ‹Ņ. \"ĐĄĐēŅ–ĐŊŅƒŅ†ŅŒ\" Đ´Đ°Đ´Đ°Ņ‚ĐēОва Đ°Ņ‡Ņ‹ŅˆŅ‡Đ°Đĩ ŅžŅĐĩ ĐąŅĐŗŅƒŅ‡Ņ‹Ņ дадСĐĩĐŊŅ‹Ņ ĐŋŅ€Đ° Ņ‚Đ˛Đ°Ņ€Ņ‹. \"ĐĐ´ŅŅƒŅ‚ĐŊŅ–Ņ‡Đ°Đĩ\" ŅŅ‚Đ°Đ˛Ņ–Ņ†ŅŒ ҃ Ņ‡Đ°Ņ€ĐŗŅƒ ĐŧĐĩĐ´Ņ‹Ņ, ŅĐēŅ–Ņ ŅŅˆŅ‡Ņ ĐŊĐĩ ĐąŅ‹ĐģŅ– аĐŋŅ€Đ°Ņ†Đ°Đ˛Đ°ĐŊŅ‹Ņ. Đ’Ņ‹ŅŅžĐģĐĩĐŊŅ‹Ņ Ņ‚Đ˛Đ°Ņ€Ņ‹ ĐąŅƒĐ´ŅƒŅ†ŅŒ ĐŋĐ°ŅŅ‚Đ°ŅžĐģĐĩĐŊŅ‹ Ņž Ņ‡Đ°Ņ€ĐŗŅƒ Đ´ĐģŅ Ņ€Đ°ŅĐŋаСĐŊаваĐŊĐŊŅ Đ°ŅĐžĐą ĐŋĐ°ŅĐģŅ ĐˇĐ°Đ˛ŅŅ€ŅˆŅĐŊĐŊŅ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ Ņ‚Đ˛Đ°Ņ€Đ°Ņž, С ĐŗŅ€ŅƒĐŋаваĐŊĐŊĐĩĐŧ Ņ–Ņ… Đŋа ҖҁĐŊŅƒŅŽŅ‡Ņ‹Ņ… айО ĐŊĐžĐ˛Ņ‹Ņ… ĐģŅŽĐ´ĐˇŅŅ….",
"face_detection_description": "Đ’Ņ‹ŅŅžĐģŅŅ†ŅŒ Ņ‚Đ˛Đ°Ņ€Ņ‹ ĐŊа Ņ„ĐžŅ‚Đ°ĐˇĐ´Ņ‹ĐŧĐēĐ°Ņ… Ņ– Đ˛Ņ–Đ´ŅĐ° С даĐŋаĐŧĐžĐŗĐ°Đš ĐŧĐ°ŅˆŅ‹ĐŊĐŊĐ°ĐŗĐ° ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊŅ. ДĐģŅ Đ˛Ņ–Đ´ŅĐ° ŅžĐģŅ–Ņ‡Đ˛Đ°ĐĩŅ†Ņ†Đ° Ņ‚ĐžĐģҌĐēŅ– ĐŧŅ–ĐŊŅ–ŅŅ†ŅŽŅ€Đ°. \"АйĐŊĐ°Đ˛Ņ–Ņ†ŅŒ\" (ĐŋĐĩŅ€Đ°)аĐŋŅ€Đ°Ņ†ĐžŅžĐ˛Đ°Đĩ ŅžŅĐĩ ĐŧĐĩĐ´Ņ‹Ņ. \"ĐĄĐēŅ–ĐŊŅƒŅ†ŅŒ\" Đ´Đ°Đ´Đ°Ņ‚ĐēОва Đ°Ņ‡Ņ‹ŅˆŅ‡Đ°Đĩ ŅžŅĐĩ ĐąŅĐŗŅƒŅ‡Ņ‹Ņ даĐŊŅ‹Ņ ĐŋŅ€Đ° Ņ‚Đ˛Đ°Ņ€Ņ‹. \"ĐĐ´ŅŅƒŅ‚ĐŊŅ–Ņ‡Đ°Đĩ\" ŅŅ‚Đ°Đ˛Ņ–Ņ†ŅŒ ҃ Ņ‡Đ°Ņ€ĐŗŅƒ ĐŧĐĩĐ´Ņ‹Ņ, ŅĐēŅ–Ņ ŅŅˆŅ‡Ņ ĐŊĐĩ ĐąŅ‹ĐģŅ– аĐŋŅ€Đ°Ņ†Đ°Đ˛Đ°ĐŊŅ‹Ņ. Đ’Ņ‹ŅŅžĐģĐĩĐŊŅ‹Ņ Ņ‚Đ˛Đ°Ņ€Ņ‹ ĐąŅƒĐ´ŅƒŅ†ŅŒ ĐŋĐ°ŅŅ‚Đ°ŅžĐģĐĩĐŊŅ‹ Ņž Ņ‡Đ°Ņ€ĐŗŅƒ Đ´ĐģŅ Ņ€Đ°ŅĐŋаСĐŊаваĐŊĐŊŅ Đ°ŅĐžĐą ĐŋĐ°ŅĐģŅ ĐˇĐ°Đ˛ŅŅ€ŅˆŅĐŊĐŊŅ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ Ņ‚Đ˛Đ°Ņ€Đ°Ņž, С ĐŗŅ€ŅƒĐŋаваĐŊĐŊĐĩĐŧ Ņ–Ņ… Đŋа ҖҁĐŊŅƒŅŽŅ‡Ņ‹Ņ… айО ĐŊĐžĐ˛Ņ‹Ņ… ĐģŅŽĐ´ĐˇŅŅ….",
"facial_recognition_job_description": "Đ“Ņ€ŅƒĐŋĐ°Đ˛Đ°Ņ†ŅŒ Đ˛Ņ‹ŅŅžĐģĐĩĐŊŅ‹Ņ Ņ‚Đ˛Đ°Ņ€Ņ‹ Đŋа Đ°ŅĐžĐąĐ°Ņ…. Đ“ŅŅ‚Ņ‹ ŅŅ‚Đ°Đŋ Đ˛Ņ‹ĐēĐžĐŊваĐĩŅ†Ņ†Đ° ĐŋĐ°ŅĐģŅ ĐˇĐ°Đ˛ŅŅ€ŅˆŅĐŊĐŊŅ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ Ņ‚Đ˛Đ°Ņ€Đ°Ņž. \"ĐĄĐēŅ–ĐŊŅƒŅ†ŅŒ\" (ĐŋĐ°ŅžŅ‚ĐžŅ€ĐŊа) ĐŋĐĩŅ€Đ°ĐŗŅ€ŅƒĐŋĐžŅžĐ˛Đ°Đĩ ŅžŅĐĩ Ņ‚Đ˛Đ°Ņ€Ņ‹. \"ĐĐ´ŅŅƒŅ‚ĐŊŅ–Ņ‡Đ°Đĩ\" ŅŅ‚Đ°Đ˛Ņ–Ņ†ŅŒ ҃ Ņ‡Đ°Ņ€ĐŗŅƒ Ņ‚Đ˛Đ°Ņ€Ņ‹, ŅĐēŅ–Ņ ŅŅˆŅ‡Ņ ĐŊĐĩ ĐŋҀҋĐŋŅ–ŅĐ°ĐŊŅ‹Ņ да ŅĐēОК-ĐŊĐĩĐąŅƒĐ´ĐˇŅŒ Đ°ŅĐžĐąŅ‹.",
"failed_job_command": "КаĐŧаĐŊда {command} ĐŊĐĩ Đ˛Ņ‹ĐēаĐŊаĐģĐ°ŅŅ Đ´ĐģŅ СадаĐŊĐŊŅ: {job}",
"force_delete_user_warning": "ĐŸĐĐŸĐ¯Đ Đ­Đ”Đ–ĐĐĐĐ•: Đ“ŅŅ‚Đ° дСĐĩŅĐŊĐŊĐĩ ĐŊĐĩадĐēĐģадĐŊа Đ˛Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đēа Ņ– ŅžŅĐĩ ай'ĐĩĐē҂ҋ. Đ“ŅŅ‚Đ° дСĐĩŅĐŊĐŊĐĩ ĐŊĐĩ ĐŧĐžĐļа ĐąŅ‹Ņ†ŅŒ Đ°Đ´Ņ€ĐžĐąĐģĐĩĐŊа Ņ– Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩĐŧĐ°ĐŗŅ‡Ņ‹Đŧа ĐąŅƒĐ´ĐˇĐĩ адĐŊĐ°Đ˛Ņ–Ņ†ŅŒ.",
@@ -75,17 +82,39 @@
"image_fullsize_quality_description": "Đ¯ĐēĐ°ŅŅ†ŅŒ Đ˛Ņ‹ŅĐ˛Ņ‹ Ņž ĐŋĐžŅžĐŊŅ‹Đŧ ĐŋаĐŧĐĩҀҋ ад 1 да 100. БоĐģҌ҈ Đ˛Ņ‹ŅĐžĐēаĐĩ СĐŊĐ°Ņ‡ŅĐŊĐŊĐĩ ĐģĐĩĐŋŅˆĐ°Đĩ, аĐģĐĩ ĐŋŅ€Ņ‹Đ˛ĐžĐ´ĐˇŅ–Ņ†ŅŒ да ĐŋавĐĩĐģŅ–Ņ‡ŅĐŊĐŊŅ ĐŋаĐŧĐĩŅ€Ņƒ Ņ„Đ°ĐšĐģа.",
"image_fullsize_title": "НаĐģĐ°Đ´Ņ‹ Đ˛Ņ‹ŅĐ˛Ņ‹ Ņž ĐŋĐžŅžĐŊŅ‹Đŧ ĐŋаĐŧĐĩҀҋ",
"image_prefer_embedded_preview": "ĐĐ´Đ´Đ°Đ˛Đ°Ņ†ŅŒ ĐŋĐĩŅ€Đ°Đ˛Đ°ĐŗŅƒ ŅžĐąŅƒĐ´Đ°Đ˛Đ°ĐŊаК ĐŋŅ€Đ°ŅĐ˛Đĩ",
"image_prefer_embedded_preview_setting_description": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ ŅƒĐąŅƒĐ´Đ°Đ˛Đ°ĐŊŅ‹Ņ ĐŋŅ€Đ°ŅĐ˛Ņ‹ Ņž RAW-Ņ„ĐžŅ‚Đ°ĐˇĐ´Ņ‹ĐŧĐēĐ°Ņ… Ņž ŅĐēĐ°ŅŅ†Ņ– ŅžĐ˛Đ°Ņ…ĐžĐ´ĐŊҋ҅ дадСĐĩĐŊҋ҅ Đ´ĐģŅ аĐŋŅ€Đ°Ņ†ĐžŅžĐēŅ– ĐŧаĐģŅŽĐŊĐēĐ°Ņž, ĐēаĐģŅ– ĐŧĐ°ĐŗŅ‡Ņ‹Đŧа. Đ“ŅŅ‚Đ° даСваĐģŅĐĩ Đ°Ņ‚Ņ€Ņ‹ĐŧĐ°Ņ†ŅŒ йОĐģҌ҈ даĐēĐģадĐŊŅ‹Ņ ĐēĐžĐģĐĩҀҋ Đ´ĐģŅ ĐŊĐĩĐēĐ°Ņ‚ĐžŅ€Ņ‹Ņ… Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅĐ°Ņž, аĐģĐĩ Đļ ŅĐēĐ°ŅŅ†ŅŒ ĐŋŅ€Đ°ŅŅž СаĐģĐĩĐļŅ‹Ņ†ŅŒ ад ĐēаĐŧĐĩҀҋ, Ņ– ĐŊа Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅĐĩ ĐŧĐžĐļа ĐąŅ‹Ņ†ŅŒ йОĐģҌ҈ Đ°Ņ€Ņ‚ŅŅ„Đ°ĐēŅ‚Đ°Ņž ҁ҆ҖҁĐē҃.",
"image_prefer_embedded_preview_setting_description": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ ŅƒĐąŅƒĐ´Đ°Đ˛Đ°ĐŊŅ‹Ņ ĐŋŅ€Đ°ŅĐ˛Ņ‹ Ņž RAW-Ņ„ĐžŅ‚Đ°ĐˇĐ´Ņ‹ĐŧĐēĐ°Ņ… Ņž ŅĐēĐ°ŅŅ†Ņ– ŅžĐ˛Đ°Ņ…ĐžĐ´ĐŊҋ҅ даĐŊҋ҅ Đ´ĐģŅ аĐŋŅ€Đ°Ņ†ĐžŅžĐēŅ– ĐŧаĐģŅŽĐŊĐēĐ°Ņž, ĐēаĐģŅ– ĐŧĐ°ĐŗŅ‡Ņ‹Đŧа. Đ“ŅŅ‚Đ° даСваĐģŅĐĩ Đ°Ņ‚Ņ€Ņ‹ĐŧĐ°Ņ†ŅŒ йОĐģҌ҈ даĐēĐģадĐŊŅ‹Ņ ĐēĐžĐģĐĩҀҋ Đ´ĐģŅ ĐŊĐĩĐēĐ°Ņ‚ĐžŅ€Ņ‹Ņ… Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅĐ°Ņž, аĐģĐĩ Đļ ŅĐēĐ°ŅŅ†ŅŒ ĐŋŅ€Đ°ŅŅž СаĐģĐĩĐļŅ‹Ņ†ŅŒ ад ĐēаĐŧĐĩҀҋ, Ņ– ĐŊа Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅĐĩ ĐŧĐžĐļа ĐąŅ‹Ņ†ŅŒ йОĐģҌ҈ Đ°Ņ€Ņ‚ŅŅ„Đ°ĐēŅ‚Đ°Ņž ҁ҆ҖҁĐē҃.",
"image_prefer_wide_gamut": "ĐĐ´Đ´Đ°Ņ†ŅŒ ĐŋĐĩŅ€Đ°Đ˛Đ°ĐŗŅƒ ŅˆŅ‹Ņ€ĐžĐēаК ĐŗĐ°ĐŧĐĩ",
"image_preview_description": "Đ’Ņ–Đ´Đ°Ņ€Ņ‹Ņ ŅŅŅ€ŅĐ´ĐŊŅĐŗĐ° ĐŋаĐŧĐĩŅ€Ņƒ С Đ˛Ņ‹Đ´Đ°ĐģĐĩĐŊŅ‹ĐŧŅ– ĐŧĐĩŅ‚Đ°Đ´Đ°Đ´ĐˇĐĩĐŊŅ‹ĐŧŅ–, Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐĩŅ†Ņ†Đ° ĐŋҀҋ ĐŋŅ€Đ°ĐŗĐģŅĐ´ĐˇĐĩ Đ°ŅĐžĐąĐŊĐ°ĐŗĐ° Ņ€ŅŅŅƒŅ€ŅŅƒ Ņ– Đ´ĐģŅ ĐŧĐ°ŅˆŅ‹ĐŊĐŊĐ°ĐŗĐ° ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊŅ",
"image_preview_description": "Đ’Ņ–Đ´Đ°Ņ€Ņ‹Ņ ŅŅŅ€ŅĐ´ĐŊŅĐŗĐ° ĐŋаĐŧĐĩŅ€Ņƒ С Đ˛Ņ‹Đ´Đ°ĐģĐĩĐŊŅ‹ĐŧŅ– ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ‹ĐŧŅ–, Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐĩŅ†Ņ†Đ° ĐŋҀҋ ĐŋŅ€Đ°ĐŗĐģŅĐ´ĐˇĐĩ Đ°ŅĐžĐąĐŊĐ°ĐŗĐ° Ņ€ŅŅŅƒŅ€ŅŅƒ Ņ– Đ´ĐģŅ ĐŧĐ°ŅˆŅ‹ĐŊĐŊĐ°ĐŗĐ° ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊŅ",
"image_preview_quality_description": "Đ¯ĐēĐ°ŅŅ†ŅŒ ĐŋŅ€Đ°ŅĐ˛Ņ‹ ад 1 да 100. Đ§Ņ‹Đŧ Đ˛Ņ‹ŅˆŅĐš, ҂ҋĐŧ ĐģĐĩĐŋ҈, аĐģĐĩ ĐŋҀҋ ĐŗŅŅ‚Ņ‹Đŧ ŅŅ‚Đ˛Đ°Ņ€Đ°ŅŽŅ†Ņ†Đ° Ņ„Đ°ĐšĐģŅ‹ йОĐģŅŒŅˆĐ°ĐŗĐ° ĐŋаĐŧĐĩŅ€Ņƒ Ņ– ĐŧĐžĐļа СĐŊŅ–ĐˇŅ–Ņ†Ņ†Đ° Ņ…ŅƒŅ‚ĐēĐ°ŅŅ†ŅŒ Đ˛ĐžĐ´ĐŗŅƒĐē҃ ĐŋҀҋĐēĐģадаĐŊĐŊŅ. ĐŽŅŅ‚Đ°ĐŊĐžŅžĐēа ĐŊŅ–ĐˇĐēĐ°ĐŗĐ° СĐŊĐ°Ņ‡ŅĐŊĐŊŅ ĐŧĐžĐļа ĐŋĐ°ŅžĐŋĐģŅ‹Đ˛Đ°Ņ†ŅŒ ĐŊа ŅĐēĐ°ŅŅ†ŅŒ ĐŧĐ°ŅˆŅ‹ĐŊĐŊĐ°ĐŗĐ° ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊŅ.",
"image_preview_title": "НаĐģĐ°Đ´Ņ‹ ĐŋаĐŋŅŅ€ŅĐ´ĐŊŅĐŗĐ° ĐŋŅ€Đ°ĐŗĐģŅĐ´Ņƒ",
"image_quality": "Đ¯ĐēĐ°ŅŅ†ŅŒ",
"image_resolution": "Đ Đ°ĐˇĐ´ĐˇŅĐģŅĐģҌĐŊĐ°ŅŅ†ŅŒ",
"image_settings": "НаĐģĐ°Đ´Ņ‹ Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅĐ°",
"image_settings_description": "ĐšŅ–Ņ€ŅƒĐšŅ†Đĩ ŅĐēĐ°ŅŅ†ŅŽ Ņ– Ņ€Đ°ĐˇĐ´ĐˇŅĐģŅĐģҌĐŊĐ°ŅŅ†ŅŽ ŅĐŗĐĩĐŊĐĩŅ€Ņ‹Ņ€Đ°Đ˛Đ°ĐŊҋ҅ Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅĐ°Ņž",
"image_thumbnail_title": "НаĐģĐ°Đ´Ņ‹ ĐŧŅ–ĐŊŅ–ŅŅ†ŅŽŅ€",
"job_concurrency": "{job} ĐēаĐŊĐēŅƒŅ€ŅĐŊŅ‚ĐŊĐ°ŅŅ†ŅŒ",
"job_created": "ЗадаĐŊĐŊĐĩ ŅŅ‚Đ˛ĐžŅ€Đ°ĐŊа",
"job_not_concurrency_safe": "Đ“ŅŅ‚Đ° СадаĐŊĐŊĐĩ ĐŊĐĩĐąŅŅĐŋĐĩ҇ĐŊаĐĩ Đ´ĐģŅ ĐēаĐŊĐēŅƒŅ€ŅĐŊŅ‚ĐŊĐ°ĐŗĐ°(адĐŊĐ°Ņ‡Đ°ŅĐžĐ˛Đ°ĐŗĐ°, ĐŋĐ°Ņ€Đ°ĐģĐĩĐģҌĐŊĐ°ĐŗĐ°) Đ˛Ņ‹ĐēаĐŊаĐŊĐŊŅ.",
"job_settings": "НаĐģĐ°Đ´Ņ‹ СадаĐŊĐŊŅŅž",
"job_settings_description": "ĐšŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ ĐŊаĐģадаĐŧŅ– адĐŊĐ°Ņ‡Đ°ŅĐžĐ˛Đ°ĐŗĐ° (ĐŋĐ°Ņ€Đ°ĐģĐĩĐģҌĐŊĐ°ĐŗĐ°) Đ˛Ņ‹ĐēаĐŊаĐŊĐŊŅ СадаĐŊĐŊŅ",
"job_status": "ĐĄŅ‚Đ°ĐŊĐžĐ˛Ņ–ŅˆŅ‡Đ° СадаĐŊĐŊŅ",
"library_created": "ĐĄŅ‚Đ˛ĐžŅ€Đ°ĐŊа ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēа: {library}",
"library_deleted": "Đ‘Ņ–ĐąĐģŅ–ŅŅ‚ŅĐēа Đ˛Ņ‹Đ´Đ°ĐģĐĩĐŊа",
"library_scanning": "ĐĄĐēаĐŊаваĐŊĐŊĐĩ Đŋа Ņ€Đ°ŅĐēĐģадСĐĩ",
"library_scanning_description": "НаĐģĐ°Đ´ĐˇŅŒŅ†Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ ҁĐēаĐŊаваĐŊĐŊŅ Đ˛Đ°ŅˆĐ°Đš ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēŅ–",
"library_scanning_enable_description": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ҁĐēаĐŊаваĐŊĐŊĐĩ ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēŅ– Đŋа Ņ€Đ°ŅĐēĐģадСĐĩ",
"library_settings": "ЗĐŊĐĩ҈ĐŊŅŅ ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēа",
"library_settings_description": "НаĐģĐ°Đ´ĐˇŅŒŅ†Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ СĐŊĐĩ҈ĐŊŅĐš ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēŅ–",
"library_tasks_description": "ĐĄĐēаĐŊĐ°Đ˛Đ°Ņ†ŅŒ СĐŊĐĩ҈ĐŊŅ–Ņ ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēŅ– ĐŊа ĐŊĐ°ŅŅžĐŊĐ°ŅŅ†ŅŒ ĐŊĐžĐ˛Ņ‹Ņ… Ņ–/айО СĐŧĐĩĐŊĐĩĐŊҋ҅ Ņ€ŅŅŅƒŅ€ŅĐ°Ņž",
"library_watching_enable_description": "ĐĐ°ĐˇŅ–Ņ€Đ°Ņ†ŅŒ Са СĐŧĐĩĐŊаĐŧŅ– Ņ„Đ°ĐšĐģĐ°Ņž ҃ СĐŊĐĩ҈ĐŊŅ–Ņ… ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēĐ°Ņ…",
"library_watching_settings": "ĐĄĐ°Ņ‡Ņ‹Ņ†ŅŒ Са ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēаК (ŅĐēҁĐŋĐĩҀҋĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊŅ‹)",
"library_watching_settings_description": "ĐŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊа ŅĐ°Ņ‡Ņ‹Ņ†ŅŒ Са СĐŧĐĩĐŊаĐŧŅ– Ņž Ņ„Đ°ĐšĐģĐ°Ņ…",
"logging_enable_description": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ Đ˛ŅĐ´ĐˇĐĩĐŊĐŊĐĩ ĐļŅƒŅ€ĐŊаĐģа",
"logging_level_description": "КаĐģŅ– ҃ĐēĐģŅŽŅ‡Đ°ĐŊа, ŅĐēŅ– ŅžĐˇŅ€ĐžĐ˛ĐĩĐŊҌ ĐļŅƒŅ€ĐŊаĐģŅĐ˛Đ°ĐŊĐŊŅ Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ.",
"logging_settings": "Đ’ŅĐ´ĐˇĐĩĐŊĐŊĐĩ ĐļŅƒŅ€ĐŊаĐģа",
"machine_learning_clip_model": "CLIP ĐŧĐ°Đ´ŅĐģҌ",
"machine_learning_clip_model_description": "Назва CLIP ĐŧĐ°Đ´ŅĐģŅ– ĐŋаĐēаСаĐŊа <link>Ņ‚ŅƒŅ‚</link>. Đ—Đ˛ŅŅ€ĐŊҖ҆Đĩ ŅžĐ˛Đ°ĐŗŅƒ, ŅˆŅ‚Đž ĐŋҀҋ СĐŧĐĩĐŊĐĩ ĐŧĐ°Đ´ŅĐģŅ– ĐŊĐĩĐ°ĐąŅ…ĐžĐ´ĐŊа ĐŋĐ°ŅžŅ‚ĐžŅ€ĐŊа СаĐŋŅƒŅŅ†Ņ–Ņ†ŅŒ СадаĐŊĐŊĐĩ \"Smart Search\" Đ´ĐģŅ ŅžŅŅ–Ņ… Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅĐ°Ņž.",
"machine_learning_duplicate_detection": "Đ’Ņ‹ŅŅžĐģĐĩĐŊĐŊĐĩ ĐŋадОйĐŊҋ҅",
"map_dark_style": "ĐĻŅ‘ĐŧĐŊŅ‹ ҁ҂ҋĐģҌ",
"map_enable_description": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ Ņ„ŅƒĐŊĐē҆ҋҖ ĐēĐ°Ņ€Ņ‚Ņ‹",
"map_gps_settings": "НаĐģĐ°Đ´Ņ‹ ĐēĐ°Ņ€Ņ‚Ņ‹ Ņ– GPS",
@@ -133,7 +162,7 @@
"user_settings_description": "ĐšŅ–Ņ€Đ°Đ˛Đ°ĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ– ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đēа",
"user_successfully_removed": "ĐšĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đē {email} ĐąŅ‹Ņž ĐŋĐ°ŅĐŋŅŅ…ĐžĐ˛Đ° Đ˛Ņ‹Đ´Đ°ĐģĐĩĐŊŅ‹.",
"version_check_enabled_description": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ĐŋŅ€Đ°Đ˛ĐĩŅ€Đē҃ вĐĩҀҁҖҖ",
"version_check_implications": "Đ¤ŅƒĐŊĐē҆ҋҖ ĐŋŅ€Đ°Đ˛ĐĩŅ€ĐēŅ– вĐĩҀҁҖҖ ĐŋĐĩŅ€Ņ‹ŅĐ´Ņ‹Ņ‡ĐŊа ĐˇĐ˛ŅŅ€Ņ‚Đ°ĐĩŅ†Ņ†Đ° да github.com",
"version_check_implications": "Đ¤ŅƒĐŊĐēŅ†Ņ‹Ņ ĐŋŅ€Đ°Đ˛ĐĩŅ€ĐēŅ– вĐĩҀҁҖҖ ĐŋĐĩŅ€Ņ‹ŅĐ´Ņ‹Ņ‡ĐŊа ĐˇĐ˛ŅŅ€Ņ‚Đ°ĐĩŅ†Ņ†Đ° да github.com",
"version_check_settings": "ĐŸŅ€Đ°Đ˛ĐĩŅ€Đēа вĐĩҀҁҖҖ",
"version_check_settings_description": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ/адĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ аĐŋĐ°Đ˛ŅŅˆŅ‡ŅĐŊĐŊŅ– ай ĐŊОваК вĐĩҀҁҖҖ"
},
@@ -206,7 +235,10 @@
"asset_skipped_in_trash": "ĐŖ ҁĐŧĐĩŅ‚ĐŊҖ҆ҋ",
"asset_uploaded": "ЗаĐŋаĐŧĐŋаваĐŊа",
"asset_uploading": "ЗаĐŋаĐŧĐŋĐžŅžĐ˛Đ°ĐŊĐŊĐĩâ€Ļ",
"assets_were_part_of_albums_count": "{count, plural, one {АĐēŅ‚Ņ‹Ņž ҃ĐļĐž ĐąŅ‹Ņž} other {АĐēŅ‚Ņ‹Đ˛Ņ‹ ҃ĐļĐž ĐąŅ‹ĐģŅ–}} Ņ‡Đ°ŅŅ‚ĐēаК аĐģŅŒĐąĐžĐŧ҃",
"authorized_devices": "ĐŅžŅ‚Đ°Ņ€Ņ‹ĐˇĐ°Đ˛Đ°ĐŊŅ‹Ņ ĐŋҀҋĐģĐ°Đ´Ņ‹",
"automatic_endpoint_switching_subtitle": "ПадĐēĐģŅŽŅ‡Đ°Ņ†Ņ†Đ° ĐģаĐēаĐģҌĐŊа Đŋа Đ˛Ņ‹ĐģŅƒŅ‡Đ°ĐŊŅ‹Đŧ Wi-Fi, ĐēаĐģŅ– ĐŗŅŅ‚Đ° ĐŧĐ°ĐŗŅ‡Ņ‹Đŧа, Ņ– Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ аĐģŅŒŅ‚ŅŅ€ĐŊĐ°Ņ‚Ņ‹ŅžĐŊŅ‹Ņ ĐŋадĐēĐģŅŽŅ‡ŅĐŊĐŊŅ Ņž Ņ–ĐŊŅˆŅ‹Ņ… ĐŧĐĩŅŅ†Đ°Ņ…",
"automatic_endpoint_switching_title": "ĐŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊаĐĩ ĐŋĐĩŅ€Đ°ĐēĐģŅŽŅ‡ŅĐŊĐŊĐĩ URL",
"back": "Назад",
"backup_album_selection_page_albums_device": "АĐģŅŒĐąĐžĐŧŅ‹ ĐŊа ĐŋҀҋĐģадСĐĩ ({count})",
"backup_all": "ĐŖŅĐĩ",
@@ -369,6 +401,15 @@
"purchase_button_buy": "ĐšŅƒĐŋŅ–Ņ†ŅŒ",
"purchase_button_buy_immich": "ĐšŅƒĐŋŅ–Ņ†ŅŒ Immich",
"purchase_button_select": "Đ’Ņ‹ĐąŅ€Đ°Ņ†ŅŒ",
"readonly_mode_disabled": "Đ’Ņ‹ĐēĐģŅŽŅ‡Đ°ĐŊŅ‹ Ņ€ŅĐļŅ‹Đŧ Ņ‚ĐžĐģҌĐēŅ– Đ´ĐģŅ Ņ‡Ņ‹Ņ‚Đ°ĐŊĐŊŅ",
"readonly_mode_enabled": "ĐŖĐēĐģŅŽŅ‡Đ°ĐŊŅ‹ Ņ€ŅĐļŅ‹Đŧ Ņ‚ĐžĐģҌĐēŅ– Đ´ĐģŅ Ņ‡Ņ‹Ņ‚Đ°ĐŊĐŊŅ",
"reassign": "ПĐĩŅ€Đ°ĐŋŅ€Ņ‹ĐˇĐŊĐ°Ņ‡Ņ‹Ņ†ŅŒ",
"reassing_hint": "ĐŸŅ€Ņ‹ĐŋŅ–ŅĐ°Ņ†ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊŅ‹Ņ аĐēŅ‚Ņ‹Đ˛Ņ‹ ҖҁĐŊŅƒŅŽŅ‡Đ°Đš Đ°ŅĐžĐąĐĩ",
"recent": "ĐŅĐ´Đ°ŅžĐŊŅ–",
"recent-albums": "ĐŅĐ´Đ°ŅžĐŊŅ–Ņ аĐģŅŒĐąĐžĐŧŅ‹",
"recent_searches": "ĐŅĐ´Đ°ŅžĐŊŅ–Ņ ĐŋĐžŅˆŅƒĐēŅ–",
"recently_added": "ĐŅĐ´Đ°ŅžĐŊа дададСĐĩĐŊа",
"refresh_faces": "АйĐŊĐ°Đ˛Ņ–Ņ†ŅŒ Ņ‚Đ˛Đ°Ņ€Ņ‹",
"remove": "Đ’Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ",
"remove_from_album": "Đ’Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ С аĐģŅŒĐąĐžĐŧа",
"remove_from_favorites": "Đ’Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ С Đ°ĐąŅ€Đ°ĐŊҋ҅",
@@ -457,7 +498,7 @@
"view_all_users": "ĐŸŅ€Đ°ĐŗĐģŅĐ´ĐˇĐĩŅ†ŅŒ ҃ҁĐĩŅ… ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–ĐēĐ°Ņž",
"view_in_timeline": "ĐŸĐ°ĐŗĐģŅĐ´ĐˇĐĩŅ†ŅŒ Ņ…Ņ€ĐžĐŊŅ–Đē҃",
"view_links": "ĐŸŅ€Đ°ĐŗĐģŅĐ´ĐˇĐĩŅ†ŅŒ ҁĐŋĐ°ŅŅ‹ĐģĐēŅ–",
"view_name": "ĐŸŅ€Đ°ĐŗĐģĐĩдСĐĩŅ†ŅŒ",
"view_name": "ĐŸŅ€Đ°ĐŗĐģŅĐ´",
"view_next_asset": "ПаĐēĐ°ĐˇĐ°Ņ†ŅŒ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ‹ ай'ĐĩĐēŅ‚",
"view_previous_asset": "ĐŸŅ€Đ°ĐŗĐģŅĐ´ĐˇĐĩŅ†ŅŒ ĐŋаĐŋŅŅ€ŅĐ´ĐŊŅ– ай'ĐĩĐēŅ‚",
"view_stack": "ĐŸŅ€Đ°ĐŗĐģŅĐ´ ŅŅ‚ŅĐēа",

View File

@@ -13,20 +13,24 @@
"add_a_description": "Добави ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ",
"add_a_location": "Добави ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
"add_a_name": "Добави иĐŧĐĩ",
"add_a_title": "ДобавĐĩŅ‚Đĩ ĐˇĐ°ĐŗĐģавиĐĩ",
"add_a_title": "Добaви ĐˇĐ°ĐŗĐģавиĐĩ",
"add_birthday": "Добави Đ´Đ°Ņ‚Đ° ĐŊа Ņ€Đ°ĐļдаĐŊĐĩ",
"add_endpoint": "Добави ĐēŅ€Đ°ĐšĐŊа Ņ‚ĐžŅ‡Đēа",
"add_exclusion_pattern": "Добави ĐŧОдĐĩĐģ Са иСĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ",
"add_import_path": "Добави ĐŋŅŠŅ‚ Са иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ",
"add_location": "ДобавĐĩŅ‚Đĩ ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
"add_more_users": "ДобавĐĩŅ‚Đĩ ĐžŅ‰Đĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи",
"add_partner": "ДобавĐĩŅ‚Đĩ ĐŋĐ°Ņ€Ņ‚ĐŊŅŒĐžŅ€",
"add_location": "Дoйави ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
"add_more_users": "Добави ĐžŅ‰Đĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи",
"add_partner": "Добави ĐŋĐ°Ņ€Ņ‚ĐŊŅŒĐžŅ€",
"add_path": "Добави ĐŋŅŠŅ‚",
"add_photos": "ДобавĐĩŅ‚Đĩ ҁĐŊиĐŧĐēи",
"add_photos": "Добави ҁĐŊиĐŧĐēи",
"add_tag": "Добави ĐŧĐ°Ņ€ĐēĐĩŅ€",
"add_to": "Добави ĐēҊĐŧâ€Ļ",
"add_to_album": "Добави ĐēҊĐŧ аĐģĐąŅƒĐŧ",
"add_to_album_bottom_sheet_added": "ДобавĐĩĐŊĐž в {album}",
"add_to_album_bottom_sheet_already_exists": "ВĐĩ҇Đĩ Đĩ в {album}",
"add_to_album_toggle": "ĐĄĐŧĐĩĐŊĐĩŅ‚Đĩ Đ¸ĐˇĐąĐžŅ€Đ° Са {album}",
"add_to_albums": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ в аĐģĐąŅƒĐŧи",
"add_to_albums_count": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ в аĐģĐąŅƒĐŧи ({count})",
"add_to_shared_album": "Добави ĐēҊĐŧ ҁĐŋОдĐĩĐģĐĩĐŊ аĐģĐąŅƒĐŧ",
"add_url": "Добави URL",
"added_to_archive": "ДобавĐĩĐŊĐž ĐēҊĐŧ Đ°Ņ€Ņ…Đ¸Đ˛Đ°",
@@ -44,6 +48,13 @@
"backup_database": "ĐĄŅŠĐˇĐ´Đ°Đš Ņ€ĐĩСĐĩŅ€Đ˛ĐŊа йаСа даĐŊĐŊи",
"backup_database_enable_description": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊи ĐēĐžĐŋĐ¸Ņ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи",
"backup_keep_last_amount": "Đ‘Ņ€ĐžĐš СаĐŋаСĐĩĐŊи Ņ€ĐĩСĐĩŅ€Đ˛ĐŊи ĐēĐžĐŋĐ¸Ņ",
"backup_onboarding_1_description": "ĐēĐžĐŋиĐĩ ĐŊа ОйĐģаĐēа иĐģи Đ´Ņ€ŅƒĐŗĐž Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēĐž ĐŧŅŅŅ‚Đž.",
"backup_onboarding_2_description": "ĐģĐžĐēаĐģĐŊи ĐēĐžĐŋĐ¸Ņ ĐŊа Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°. ĐĸОва вĐēĐģŅŽŅ‡Đ˛Đ° ĐžŅĐŊОвĐŊĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģОвĐĩ и ĐģĐžĐēаĐģĐŊи Đ°Ņ€Ņ…Đ¸Đ˛Đ¸ ĐŊа Ņ‚ĐĩСи Ņ„Đ°ĐšĐģОвĐĩ.",
"backup_onboarding_3_description": "ĐžĐąŅ‰Đž ĐēĐžĐŋĐ¸Ņ ĐŊа Đ˛Đ°ŅˆĐ¸Ņ‚Đĩ даĐŊĐŊи, вĐēĐģŅŽŅ‡Đ¸Ņ‚ĐĩĐŊĐž ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģĐŊĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģОвĐĩ. ĐĸОва вĐēĐģŅŽŅ‡Đ˛Đ° 1 ĐēĐžĐŋиĐĩ Đ¸ĐˇĐ˛ŅŠĐŊ ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ° и 2 ĐģĐžĐēаĐģĐŊи ĐēĐžĐŋĐ¸Ņ.",
"backup_onboarding_description": "За ĐŊадĐĩĐļĐ´ĐŊа ĐˇĐ°Ņ‰Đ¸Ņ‚Đ° ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ˛Đ°ĐŧĐĩ ŅŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸ŅŅ‚Đ° <backblaze-link>3-2-1</backblaze-link>. ĐŸŅ€Đ°Đ˛ĐĩŅ‚Đĩ Đ°Ņ€Ņ…Đ¸Đ˛ĐŊи ĐēĐžĐŋĐ¸Ņ ĐēаĐēŅ‚Đž ĐŊа ĐēĐ°Ņ‡ĐĩĐŊĐ¸Ņ‚Đĩ ҁĐŊиĐŧĐēи/видĐĩа, Ņ‚Đ°Đēа и ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи ĐŊа Immich.",
"backup_onboarding_footer": "За ĐŋĐžĐ´Ņ€ĐžĐąĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ĐžŅ‚ĐŊĐžŅĐŊĐž Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž в Immich, ĐŧĐžĐģŅ виĐļŅ‚Đĩ в <link>Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸ŅŅ‚Đ°</link>.",
"backup_onboarding_parts_title": "ĐĄŅ‚Ņ€Đ°Ņ‚ĐĩĐŗĐ¸ŅŅ‚Đ° 3-2-1 вĐēĐģŅŽŅ‡Đ˛Đ°:",
"backup_onboarding_title": "Đ ĐĩСĐĩŅ€Đ˛ĐŊи ĐēĐžĐŋĐ¸Ņ",
"backup_settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐŊа Ņ€ĐĩСĐĩŅ€Đ˛ĐŊи ĐēĐžĐŋĐ¸Ņ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи",
"backup_settings_description": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ Са Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐž ĐēĐžĐŋиĐĩ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи.",
"cleared_jobs": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚ĐĩĐŊи ĐˇĐ°Đ´Đ°Ņ‡Đ¸ ĐžŅ‚ Ņ‚Đ¸Đŋ: {job}",
@@ -347,6 +358,9 @@
"trash_number_of_days_description": "Đ‘Ņ€ĐžĐš Đ´ĐŊи, в ĐēĐžĐ¸Ņ‚Đž Ņ„Đ°ĐšĐģОвĐĩŅ‚Đĩ да ҁĐĩ ŅŅŠŅ…Ņ€Đ°ĐŊŅĐ˛Đ°Ņ‚ ĐŊа йОĐēĐģ҃Đēа, ĐŋŅ€Đĩди да ĐąŅŠĐ´Đ°Ņ‚ ĐžĐēĐžĐŊŅ‡Đ°Ņ‚ĐĩĐģĐŊĐž ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚Đ¸",
"trash_settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа ĐēĐžŅˆŅ‡ĐĩŅ‚Đž",
"trash_settings_description": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐēĐžŅˆŅ‡ĐĩŅ‚Đž",
"unlink_all_oauth_accounts": "ĐŸŅ€ĐĩĐēŅ€Đ°Ņ‚Đ¸ вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ˛ŅĐ¸Ņ‡Đēи OAuth ĐŋŅ€ĐžŅ„Đ¸Đģи",
"unlink_all_oauth_accounts_description": "НĐĩ ĐˇĐ°ĐąŅ€Đ°Đ˛ŅĐšŅ‚Đĩ да ĐŋŅ€ĐĩĐēŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ˛ŅĐ¸Ņ‡Đēи OAuth ĐŋŅ€ĐžŅ„Đ¸Đģи ĐŋŅ€Đĩди да ĐŧĐ¸ĐŗŅ€Đ¸Ņ€Đ°Ņ‚Đĩ ĐēҊĐŧ ĐŊОв Đ´ĐžŅŅ‚Đ°Đ˛Ņ‡Đ¸Đē.",
"unlink_all_oauth_accounts_prompt": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐžŅ‚ĐŋĐ¸ŅˆĐĩŅ‚Đĩ Đ˛ŅĐ¸Ņ‡Đēи OAuth ĐŋŅ€ĐžŅ„Đ¸Đģи? ĐĸОва ҉Đĩ ĐŊ҃ĐģĐ¸Ņ€Đ° OAuth ID Са Đ˛ŅĐĩĐēи ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ и ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊĐž.",
"user_cleanup_job": "ĐŸĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи",
"user_delete_delay": "<b>{user}</b> aĐēĐ°ŅƒĐŊŅ‚ŅŠŅ‚ и Ņ„Đ°ĐšĐģОвĐĩŅ‚Đĩ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģŅ ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ ĐŋĐģаĐŊĐ¸Ņ€Đ°ĐŊи Са ĐŋĐžŅŅ‚ĐžŅĐŊĐŊĐž Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ҁĐģĐĩĐ´ {delay, plural, one {# Đ´ĐĩĐŊ} other {# Đ´ĐŊи}}.",
"user_delete_delay_settings": "Đ—Đ°ĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ",
@@ -373,8 +387,6 @@
"admin_password": "АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ŅĐēа ĐŋĐ°Ņ€ĐžĐģа",
"administration": "АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ",
"advanced": "Đ Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊĐž",
"advanced_settings_beta_timeline_subtitle": "ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐŊĐžĐ˛Đ¸Ņ‚Đĩ Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž",
"advanced_settings_beta_timeline_title": "БĐĩŅ‚Đ° вĐĩŅ€ŅĐ¸Ņ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩĐ˛Đ°Ņ‚Đ° ĐģиĐŊĐ¸Ņ",
"advanced_settings_enable_alternate_media_filter_subtitle": "ĐŸŅ€Đ¸ ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ, иСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ Ņ‚Đ°ĐˇĐ¸ ĐžĐŋŅ†Đ¸Ņ ĐēĐ°Ņ‚Đž Ņ„Đ¸ĐģŅ‚ŅŠŅ€, ĐžŅĐŊОваĐŊ ĐŊа ĐŋŅ€ĐžĐŧŅĐŊа ĐŊа дадĐĩĐŊ ĐēŅ€Đ¸Ņ‚ĐĩŅ€Đ¸Đ¸. ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ŅĐ°ĐŧĐž в ҁĐģŅƒŅ‡Đ°Đš, ҇Đĩ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž иĐŧа ĐŋŅ€ĐžĐąĐģĐĩĐŧ ҁ ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Đ˛ŅĐ¸Ņ‡Đēи аĐģĐąŅƒĐŧи.",
"advanced_settings_enable_alternate_media_filter_title": "[ЕКСПЕРИМЕНĐĸАЛНО] ИСĐŋĐžĐģСваК Ņ„Đ¸ĐģŅ‚ŅŠŅ€Đ° ĐŊа аĐģŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐŊĐžŅ‚Đž ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž Са ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ ĐŊа аĐģĐąŅƒĐŧи",
"advanced_settings_log_level_title": "Ниво ĐŊа СаĐŋĐ¸Ņ в Đ´ĐŊĐĩвĐŊиĐēа: {level}",
@@ -382,13 +394,15 @@
"advanced_settings_prefer_remote_title": "ĐŸŅ€ĐĩĐ´ĐŋĐžŅ‡Đ¸Ņ‚Đ°Đš Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸ŅŅ‚Đ° ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"advanced_settings_proxy_headers_subtitle": "ДĐĩŅ„Đ¸ĐŊĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐēŅĐ¸ Ņ…ĐĩĐ´ŅŠŅ€Đ¸, ĐēĐžĐ¸Ņ‚Đž Immich Ņ‚Ņ€ŅĐąĐ˛Đ° да иСĐŋŅ€Đ°Ņ‰Đ° ҁ Đ˛ŅŅĐēа ĐŧŅ€ĐĩĐļОва ĐˇĐ°ŅĐ˛Đēа",
"advanced_settings_proxy_headers_title": "ĐŸŅ€ĐžĐēŅĐ¸ Ņ…ĐĩĐ´ŅŠŅ€Đ¸",
"advanced_settings_readonly_mode_subtitle": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ° Ņ€ĐĩĐļиĐŧа \"ŅĐ°ĐŧĐž Са ҇ĐĩŅ‚ĐĩĐŊĐĩ\", ĐŋŅ€Đ¸ ĐēĐžĐšŅ‚Đž ҁĐŊиĐŧĐēĐ¸Ņ‚Đĩ ĐŧĐžĐŗĐ°Ņ‚ да ĐąŅŠĐ´Đ°Ņ‚ Ņ€Đ°ĐˇĐŗĐģĐĩĐļдаĐŊи, ĐŊĐž ĐŊĐĩŅ‰Đ° ĐēĐ°Ņ‚Đž Đ¸ĐˇĐąĐžŅ€ ĐŊа ĐŊŅĐēĐžĐģĐēĐž Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ, ҁĐŋОдĐĩĐģŅĐŊĐĩ, Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ŅĐ° ĐˇĐ°ĐąŅ€Đ°ĐŊĐĩĐŊи. АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ/Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐļиĐŧа ŅĐ°ĐŧĐž Са ҇ĐĩŅ‚ĐĩĐŊĐĩ ŅŅ‚Đ°Đ˛Đ° ĐžŅ‚ ĐēĐ°Ņ€Ņ‚Đ¸ĐŊĐēĐ°Ņ‚Đ°-Đ°Đ˛Đ°Ņ‚Đ°Ņ€ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģŅ ĐžŅ‚ ĐžŅĐŊОвĐŊĐ¸Ņ ĐĩĐēŅ€Đ°ĐŊ",
"advanced_settings_readonly_mode_title": "Đ ĐĩĐļиĐŧ ŅĐ°ĐŧĐž Са ҇ĐĩŅ‚ĐĩĐŊĐĩ",
"advanced_settings_self_signed_ssl_subtitle": "ĐŸŅ€ĐžĐŋ҃ҁĐēа ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐ°Ņ‚Đ° ĐŊа SSL-ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ° ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°. Đ˜ĐˇĐ¸ŅĐēва ҁĐĩ ĐŋŅ€Đ¸ ŅĐ°ĐŧĐžĐŋОдĐŋĐ¸ŅĐ°ĐŊи ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ¸.",
"advanced_settings_self_signed_ssl_title": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸ ŅĐ°ĐŧĐžĐŋОдĐŋĐ¸ŅĐ°ĐŊи SSL ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ¸",
"advanced_settings_sync_remote_deletions_subtitle": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ¸ĐˇŅ‚Ņ€Đ¸Đ¸ иĐģи Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊОви ОйĐĩĐēŅ‚ ĐŊа Ņ‚ĐžĐ˛Đ° ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž, ĐēĐžĐŗĐ°Ņ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸ĐĩŅ‚Đž Đĩ Đ¸ĐˇĐ˛ŅŠŅ€ŅˆĐĩĐŊĐž ĐŋŅ€ĐĩС ҃ĐĩĐą-иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐ°",
"advanced_settings_sync_remote_deletions_title": "ХиĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ ĐŊа Đ´Đ¸ŅŅ‚Đ°ĐŊŅ†Đ¸ĐžĐŊĐŊи Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐ¸Ņ [ЕКСПЕРИМЕНĐĸАЛНО]",
"advanced_settings_tile_subtitle": "Đ Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊи ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēи ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи",
"advanced_settings_troubleshooting_subtitle": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸ Đ´ĐžĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊи Đ˛ŅŠĐˇĐŧĐžĐļĐŊĐžŅŅ‚Đ¸ Са ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐąĐģĐĩĐŧи",
"advanced_settings_troubleshooting_title": "ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐąĐģĐĩĐŧи",
"advanced_settings_troubleshooting_title": "ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊe ĐŊа ĐŋŅ€ĐžĐąĐģĐĩĐŧи",
"age_months": "Đ’ŅŠĐˇŅ€Đ°ŅŅ‚ {months, plural, one {# ĐŧĐĩҁĐĩ҆} other {# ĐŧĐĩҁĐĩŅ†Đ¸}}",
"age_year_months": "Đ’ŅŠĐˇŅ€Đ°ŅŅ‚ 1 ĐŗĐžĐ´Đ¸ĐŊа, {months, plural, one {# ĐŧĐĩҁĐĩ҆} other {# ĐŧĐĩҁĐĩŅ†Đ¸}}",
"age_years": "{years, plural, other {ГодиĐŊа #}}",
@@ -397,6 +411,7 @@
"album_cover_updated": "ОбĐģĐžĐļĐēĐ°Ņ‚Đ° ĐŊа аĐģĐąŅƒĐŧа Đĩ аĐēŅ‚ŅƒĐ°ĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊа",
"album_delete_confirmation": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да Đ¸ĐˇŅ‚Ņ€Đ¸ĐĩŅ‚Đĩ аĐģĐąŅƒĐŧа {album}?",
"album_delete_confirmation_description": "АĐēĐž Ņ‚ĐžĐˇĐ¸ аĐģĐąŅƒĐŧ Đĩ ҁĐŋОдĐĩĐģĐĩĐŊ, Đ´Ņ€ŅƒĐŗĐ¸ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи вĐĩ҇Đĩ ĐŊŅĐŧа да иĐŧĐ°Ņ‚ Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ĐŊĐĩĐŗĐž.",
"album_deleted": "АĐģĐąŅƒĐŧа Đĩ Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚",
"album_info_card_backup_album_excluded": "ИЗКЛЮЧЕН",
"album_info_card_backup_album_included": "ВКЛЮЧЕН",
"album_info_updated": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŅ‚Đ° Са аĐģĐąŅƒĐŧа Đĩ аĐēŅ‚ŅƒĐ°ĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊа",
@@ -406,7 +421,9 @@
"album_options": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа аĐģĐąŅƒĐŧа",
"album_remove_user": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ?",
"album_remove_user_confirmation": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ {user}?",
"album_search_not_found": "ĐŅĐŧа ĐŊаĐŧĐĩŅ€ĐĩĐŊи аĐģĐąŅƒĐŧи, ĐžŅ‚ĐŗĐžĐ˛Đ°Ņ€ŅŅ‰Đ¸ ĐŊа Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩŅ‚Đž ви",
"album_share_no_users": "Đ˜ĐˇĐŗĐģĐĩĐļда, ҇Đĩ ҁ҂Đĩ ҁĐŋОдĐĩĐģиĐģи Ņ‚ĐžĐˇĐ¸ аĐģĐąŅƒĐŧ ҁ Đ˛ŅĐ¸Ņ‡Đēи ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи иĐģи ĐŊŅĐŧĐ°Ņ‚Đĩ Đ´Ņ€ŅƒĐŗ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ, ҁ ĐēĐžĐŗĐžŅ‚Đž да ĐŗĐž ҁĐŋОдĐĩĐģĐ¸Ņ‚Đĩ.",
"album_summary": "ĐžĐąĐžĐąŅ‰ĐĩĐŊиĐĩ ĐŊа аĐģĐąŅƒĐŧа",
"album_updated": "АĐģĐąŅƒĐŧŅŠŅ‚ Đĩ аĐēŅ‚ŅƒĐ°ĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ",
"album_updated_setting_description": "ПоĐģŅƒŅ‡Đ°Đ˛Đ°ĐšŅ‚Đĩ иСвĐĩŅŅ‚Đ¸Đĩ ĐŋĐž иĐŧĐĩĐšĐģ, ĐēĐžĐŗĐ°Ņ‚Đž ҁĐŋОдĐĩĐģĐĩĐŊ аĐģĐąŅƒĐŧ иĐŧа ĐŊОви Ņ„Đ°ĐšĐģОвĐĩ",
"album_user_left": "НаĐŋ҃ҁĐŊа {album}",
@@ -425,6 +442,7 @@
"albums_default_sort_order": "Đ ĐĩĐ´ ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ Са ŅĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа аĐģĐąŅƒĐŧи",
"albums_default_sort_order_description": "ĐŸŅŠŅ€Đ˛ĐžĐŊĐ°Ņ‡Đ°ĐģĐĩĐŊ Ņ€ĐĩĐ´ ĐŊа ŅĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŋŅ€Đ¸ ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐŊОв аĐģĐąŅƒĐŧ.",
"albums_feature_description": "КоĐģĐĩĐēŅ†Đ¸Đ¸ ĐžŅ‚ ОйĐĩĐēŅ‚Đ¸, ĐēĐžĐ¸Ņ‚Đž ĐŧĐžĐŗĐ°Ņ‚ да ĐąŅŠĐ´Đ°Ņ‚ ҁĐŋОдĐĩĐģŅĐŊи ҁ Đ´Ņ€ŅƒĐŗĐ¸ ĐŋĐžŅ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи.",
"albums_on_device_count": "АĐģĐąŅƒĐŧи ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž ({count})",
"all": "Đ’ŅĐ¸Ņ‡Đēи",
"all_albums": "Đ’ŅĐ¸Ņ‡Đēи аĐģĐąŅƒĐŧи",
"all_people": "Đ’ŅĐ¸Ņ‡Đēи Ņ…ĐžŅ€Đ°",
@@ -444,6 +462,7 @@
"app_bar_signout_dialog_title": "ИСĐģĐĩС ĐžŅ‚ ĐŋŅ€ĐžŅ„Đ¸Đģа",
"app_settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи Đŧа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž",
"appears_in": "ИСĐģиСа в",
"apply_count": "ĐŸŅ€Đ¸ĐģĐžĐļи ({count, number})",
"archive": "ĐŅ€Ņ…Đ¸Đ˛",
"archive_action_prompt": "{count} ŅĐ° дОйавĐĩĐŊи в ĐŅ€Ņ…Đ¸Đ˛Đ°",
"archive_or_unarchive_photo": "ĐŅ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ иĐģи Đ´ĐĩĐ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ҁĐŊиĐŧĐēа",
@@ -476,6 +495,8 @@
"asset_restored_successfully": "ĐŖŅĐŋĐĩ҈ĐŊĐž Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊОвĐĩĐŊ ОйĐĩĐēŅ‚",
"asset_skipped": "ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đž",
"asset_skipped_in_trash": "В ĐēĐžŅˆŅ‡ĐĩŅ‚Đž",
"asset_trashed": "ОбĐĩĐēŅ‚ŅŠŅ‚ Đĩ Đ¸ĐˇŅ…Đ˛ŅŠŅ€ĐģĐĩĐŊ",
"asset_troubleshoot": "ПоĐŋŅ€Đ°Đ˛Đēа ĐŊа ĐŗŅ€Đĩ҈Đēи ҁ ОйĐĩĐēŅ‚Đ°",
"asset_uploaded": "ĐšĐ°Ņ‡ĐĩĐŊĐž",
"asset_uploading": "ĐšĐ°Ņ‡Đ˛Đ°ĐŊĐĩâ€Ļ",
"asset_viewer_settings_subtitle": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ Са Đ¸ĐˇĐŗĐģĐĩĐ´",
@@ -483,7 +504,9 @@
"assets": "ЕĐģĐĩĐŧĐĩĐŊŅ‚Đ¸",
"assets_added_count": "ДобавĐĩĐŊĐž {count, plural, one {# asset} other {# assets}}",
"assets_added_to_album_count": "ДобавĐĩĐŊ(и) ŅĐ° {count, plural, one {# аĐēŅ‚Đ¸Đ˛} other {# аĐēŅ‚Đ¸Đ˛Đ°}} в аĐģĐąŅƒĐŧа",
"assets_added_to_albums_count": "{assetTotal, plural, one {# ОйĐĩĐēŅ‚ Đĩ дОйавĐĩĐŊ} other {# ОйĐĩĐēŅ‚Đ° ŅĐ° дОйавĐĩĐŊи}} в {albumTotal, plural, one {# аĐģĐąŅƒĐŧ} other {# аĐģĐąŅƒĐŧа}}",
"assets_cannot_be_added_to_album_count": "{count, plural, one {ОбĐĩĐēŅ‚Đ° ĐŊĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ дОйави} other {ОбĐĩĐēŅ‚Đ¸Ņ‚Đĩ ĐŊĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ Đ´ĐžĐąĐ°Đ˛ŅŅ‚}} в аĐģĐąŅƒĐŧа",
"assets_cannot_be_added_to_albums": "{count, plural, one {ОйĐĩĐēŅ‚ ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ дОйавĐĩĐŊ} other {ОйĐĩĐēŅ‚Đ° ĐŊĐĩ ĐŧĐžĐŗĐ°Ņ‚ да ĐąŅŠĐ´Đ°Ņ‚ дОйавĐĩĐŊи}} в ĐŊиĐēОК ĐžŅ‚ аĐģĐąŅƒĐŧĐ¸Ņ‚Đĩ",
"assets_count": "{count, plural, one {# аĐēŅ‚Đ¸Đ˛} other {# аĐēŅ‚Đ¸Đ˛Đ°}}",
"assets_deleted_permanently": "{count} ОйĐĩĐēŅ‚Đ° ŅĐ° Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đ¸ СавиĐŊĐ°ĐŗĐ¸",
"assets_deleted_permanently_from_server": "{count} ОйĐĩĐēŅ‚Đ° ŅĐ° Đ¸ĐˇŅ‚Đ¸Ņ‚Đ¸ ĐžŅ‚ Immich ŅŅŠŅ€Đ˛ŅŠŅ€Đ° СавиĐŊĐ°ĐŗĐ¸",
@@ -500,14 +523,17 @@
"assets_trashed_count": "Đ’ŅŠĐˇŅŅ‚Đ°ĐŊОвĐĩĐŊ(и) ŅĐ° {count, plural, one {# Ņ„Đ°ĐšĐģ} other {# Ņ„Đ°ĐšĐģа}}",
"assets_trashed_from_server": "{count} ОйĐĩĐēŅ‚Đ° ŅĐ° ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊи в ĐēĐžŅˆĐ° ĐŊа Immich ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"assets_were_part_of_album_count": "{count, plural, one {ФаКĐģŅŠŅ‚ Đĩ} other {ФаКĐģОвĐĩŅ‚Đĩ ŅĐ°}} вĐĩ҇Đĩ Ņ‡Đ°ŅŅ‚ ĐžŅ‚ аĐģĐąŅƒĐŧа",
"assets_were_part_of_albums_count": "{count, plural, one {ОйĐĩĐēŅ‚ вĐĩ҇Đĩ Đĩ} other {ОйĐĩĐēŅ‚Đ° вĐĩ҇Đĩ ŅĐ°}} Ņ‡Đ°ŅŅ‚ ĐžŅ‚ аĐģĐąŅƒĐŧĐ¸Ņ‚Đĩ",
"authorized_devices": "ĐŖĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ĐĩĐŊи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°",
"automatic_endpoint_switching_subtitle": "ĐšĐžĐŗĐ°Ņ‚Đž Đĩ Đ´ĐžŅŅ‚ŅŠĐŋĐŊа, иСĐŋĐžĐģСваК ĐŋĐžŅĐžŅ‡ĐĩĐŊĐ°Ņ‚Đ° Wi-Fi ĐŧŅ€ĐĩĐļа, иĐŊĐ°Ņ‡Đĩ иСĐŋĐžĐģСваК аĐģŅ‚ĐĩŅ€ĐŊĐ°Ņ‚Đ¸Đ˛ĐŊи Đ˛Ņ€ŅŠĐˇĐēи",
"automatic_endpoint_switching_title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа URL",
"autoplay_slideshow": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊа ҁĐŧŅĐŊа ĐŊа ҁĐģаКдОвĐĩŅ‚Đĩ",
"back": "Назад",
"back_close_deselect": "Назад, ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ иĐģи ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐąĐžŅ€Đ°",
"background_backup_running_error": "ĐĄŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐŊĐž Đĩ Ņ„ĐžĐŊОвО Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ, ĐŊĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ Đŋ҃ҁĐŊĐĩ Ņ€ŅŠŅ‡ĐŊĐž Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ",
"background_location_permission": "Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ Са Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž Đ˛ŅŠĐ˛ Ņ„ĐžĐŊОв Ņ€ĐĩĐļиĐŧ",
"background_location_permission_content": "За да ĐŧĐžĐļĐĩ да ҇ĐĩŅ‚Đĩ иĐŧĐĩĐŊĐ°Ņ‚Đ° ĐŊа Wi-Fi ĐŧŅ€ĐĩĐļĐ¸Ņ‚Đĩ и да ĐŗĐ¸ ĐŋŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ° ĐŋŅ€Đ¸ Ņ€Đ°ĐąĐžŅ‚Đ° Đ˛ŅŠĐ˛ Ņ„ĐžĐŊОв Ņ€ĐĩĐļиĐŧ, Immich Ņ‚Ņ€ŅĐąĐ˛Đ° *виĐŊĐ°ĐŗĐ¸* да иĐŧа Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž Ņ‚ĐžŅ‡ĐŊĐžŅ‚Đž ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
"background_options": "ОĐŋŅ†Đ¸Đ¸ Са Ņ„ĐžĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐˇĐ°Đ´Đ°Ņ‡Đ¸",
"backup": "ĐŅ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ",
"backup_album_selection_page_albums_device": "АĐģĐąŅƒĐŧи ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž ({count})",
"backup_album_selection_page_albums_tap": "ĐĐ°Ņ‚Đ¸ŅĐŊи Са да вĐēĐģŅŽŅ‡Đ¸Ņˆ, двОКĐŊĐž Са да иСĐēĐģŅŽŅ‡Đ¸Ņˆ",
@@ -515,6 +541,7 @@
"backup_album_selection_page_select_albums": "Đ˜ĐˇĐąĐžŅ€ ĐŊа аĐģĐąŅƒĐŧи",
"backup_album_selection_page_selection_info": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Са Đ¸ĐˇĐąŅ€Đ°ĐŊĐžŅ‚Đž",
"backup_album_selection_page_total_assets": "ĐŖĐŊиĐēаĐģĐŊи ОйĐĩĐēŅ‚Đ¸ ĐžĐąŅ‰Đž",
"backup_albums_sync": "ХиĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ‚Đĩ",
"backup_all": "Đ’ŅĐ¸Ņ‡ĐēĐž",
"backup_background_service_backup_failed_message": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ. Нов ĐžĐŋĐ¸Ņ‚â€Ļ",
"backup_background_service_connection_failed_message": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐ˛ŅŠŅ€ĐˇĐ˛Đ°ĐŊĐĩ ĐēҊĐŧ ŅŅŠŅ€Đ˛ŅŠŅ€Đ°. Нов ĐžĐŋĐ¸Ņ‚â€Ļ",
@@ -564,13 +591,15 @@
"backup_controller_page_turn_on": "ВĐēĐģŅŽŅ‡Đ¸ Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ в аĐēŅ‚Đ¸Đ˛ĐĩĐŊ Ņ€ĐĩĐļиĐŧ",
"backup_controller_page_uploading_file_info": "ИĐŊŅ„Đž Са Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐ¸Ņ Ņ„Đ°ĐšĐģ",
"backup_err_only_album": "НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩ ĐĩдиĐŊŅŅ‚Đ˛ĐĩĐŊĐ¸Ņ аĐģĐąŅƒĐŧ",
"backup_info_card_assets": "ОйĐĩĐēŅ‚Đ¸",
"backup_info_card_assets": "ОйĐĩĐēŅ‚Đ°",
"backup_manual_cancelled": "ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊĐž",
"backup_manual_in_progress": "Đ’ŅŠŅ€Đ˛Đ¸ Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ. ОĐŋĐ¸Ņ‚Đ°Đš ҁĐģĐĩĐ´ ĐŧаĐģĐēĐž",
"backup_manual_success": "ĐŖŅĐŋĐĩ҈ĐŊĐž",
"backup_manual_title": "ĐĄŅŠŅŅ‚ĐžŅĐŊиĐĩ ĐŊа Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž",
"backup_options": "ОĐŋŅ†Đ¸Đ¸ Са Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ",
"backup_options_page_title": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи Са Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ",
"backup_setting_subtitle": "ĐŖĐŋŅ€Đ°Đ˛ĐģŅĐ˛Đ°Đš ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ Са Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ в аĐēŅ‚Đ¸Đ˛ĐĩĐŊ и Ņ„ĐžĐŊОв Ņ€ĐĩĐļиĐŧ",
"backup_settings_subtitle": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ Са ĐēĐ°Ņ‡Đ˛Đ°ĐŊĐĩ",
"backward": "Назад",
"biometric_auth_enabled": "ВĐēĐģŅŽŅ‡ĐĩĐŊа йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊĐž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ",
"biometric_locked_out": "ĐŅĐŧа Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊĐž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ",
@@ -589,7 +618,7 @@
"cache_settings_clear_cache_button": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ¸ ĐēĐĩŅˆĐ°",
"cache_settings_clear_cache_button_title": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ˛Đ° ĐēĐĩŅˆĐ° ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž. ĐĸОва ҉Đĩ ĐŋОвĐģĐ¸ŅĐĩ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ĐĩĐģĐŊĐžŅŅ‚Ņ‚Đ° ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž Đ´ĐžĐēĐ°Ņ‚Đž ĐēĐĩŅˆĐ° ĐŊĐĩ ĐąŅŠĐ´Đĩ ŅŅŠĐˇĐ´Đ°Đ´ĐĩĐŊ ĐžŅ‚ĐŊОвО.",
"cache_settings_duplicated_assets_clear_button": "ИЗЧИСĐĸИ",
"cache_settings_duplicated_assets_subtitle": "ĐĄĐŊиĐŧĐēи и видĐĩа, ĐēĐžĐ¸Ņ‚Đž ŅĐ° в ЧĐĩŅ€ĐŊĐ¸Ņ ҁĐŋĐ¸ŅŅŠĐē ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž",
"cache_settings_duplicated_assets_subtitle": "ĐĄĐŊиĐŧĐēи и видĐĩа, ĐēĐžĐ¸Ņ‚Đž ŅĐ° в ĐĄĐŋĐ¸ŅŅŠĐēа Са Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€Đ°ĐŊĐĩ ĐžŅ‚ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž",
"cache_settings_duplicated_assets_title": "Đ”ŅƒĐąĐģĐ¸Ņ€Đ°ĐŊи ОйĐĩĐēŅ‚Đ¸ ({count})",
"cache_settings_statistics_album": "БибĐģĐ¸ĐžŅ‚ĐĩĐēа ҁ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸",
"cache_settings_statistics_full": "ĐŸŅŠĐģĐŊи Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ",
@@ -606,6 +635,7 @@
"cancel": "ĐžŅ‚ĐēаĐļи",
"cancel_search": "ĐžŅ‚ĐŧĐĩĐŊи Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩŅ‚Đž",
"canceled": "ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊĐž",
"canceling": "АĐŊ҃ĐģĐ¸Ņ€Đ°ĐŊĐĩ",
"cannot_merge_people": "НĐĩ ĐŧĐžĐļĐĩ да ОйĐĩдиĐŊŅĐ˛Đ° Ņ…ĐžŅ€Đ°",
"cannot_undo_this_action": "НĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ да ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚Đĩ Ņ‚ĐžĐ˛Đ° Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ!",
"cannot_update_the_description": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩŅ‚Đž ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ аĐēŅ‚ŅƒĐ°ĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐž",
@@ -628,6 +658,8 @@
"change_pin_code": "ĐĄĐŧĐĩĐŊи PIN ĐēОда",
"change_your_password": "ĐŸŅ€ĐžĐŧĐĩĐŊĐĩŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ŅĐ¸",
"changed_visibility_successfully": "ВидиĐŧĐžŅŅ‚Ņ‚Đ° Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊа ҃ҁĐŋĐĩ҈ĐŊĐž",
"charging": "ĐŸŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ",
"charging_requirement_mobile_backup": "ФОĐŊОвО Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ŅĐ°ĐŧĐž ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž",
"check_corrupt_asset_backup": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸ Са ĐŋĐžĐ˛Ņ€ĐĩĐ´ĐĩĐŊи Đ°Ņ€Ņ…Đ¸Đ˛ĐŊи ĐēĐžĐŋĐ¸Ņ",
"check_corrupt_asset_backup_button": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸",
"check_corrupt_asset_backup_description": "ИСĐŋҊĐģĐŊи Ņ‚Đ°ĐˇĐ¸ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēа ŅĐ°ĐŧĐž ĐŋŅ€Đ¸ Wi-Fi и ҁĐģĐĩĐ´ Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛ŅĐ¸Ņ‡Đēи ОйĐĩĐēŅ‚Đ¸. ĐŸŅ€ĐžŅ†ĐĩĐ´ŅƒŅ€Đ°Ņ‚Đ° ĐŧĐžĐļĐĩ да ĐŋŅ€ĐžĐ´ŅŠĐģĐļи ĐŊŅĐēĐžĐģĐēĐž ĐŧиĐŊŅƒŅ‚Đ¸.",
@@ -637,6 +669,7 @@
"clear": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ¸",
"clear_all": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ¸ Đ˛ŅĐ¸Ņ‡ĐēĐž",
"clear_all_recent_searches": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚ĐĩŅ‚Đĩ Đ˛ŅĐ¸Ņ‡Đēи ҁĐēĐžŅ€ĐžŅˆĐŊи Ņ‚ŅŠŅ€ŅĐĩĐŊĐ¸Ņ",
"clear_file_cache": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ˛Đ°ĐŊĐĩ ĐŊа ĐēĐĩŅˆĐ° ĐŊа Ņ„Đ°ĐšĐģОвĐĩŅ‚Đĩ",
"clear_message": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ¸ ŅŅŠĐžĐąŅ‰ĐĩĐŊиĐĩŅ‚Đž",
"clear_value": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ¸ ŅŅ‚ĐžĐšĐŊĐžŅŅ‚Ņ‚Đ°",
"client_cert_dialog_msg_confirm": "ОК",
@@ -707,11 +740,13 @@
"create_new_user": "ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐŊОв ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ",
"create_shared_album_page_share_add_assets": "ДОБАВИ ОБЕКĐĸИ",
"create_shared_album_page_share_select_photos": "ИСйĐĩŅ€Đ¸ ҁĐŊиĐŧĐēи",
"create_shared_link": "ĐĄŅŠĐˇĐ´Đ°Đš ĐģиĐŊĐē Са ҁĐŋОдĐĩĐģŅĐŊĐĩ",
"create_tag": "ĐĄŅŠĐˇĐ´Đ°Đš Ņ‚Đ°Đŗ",
"create_tag_description": "ĐĄŅŠĐˇĐ´Đ°ĐšŅ‚Đĩ ĐŊОв Ņ‚Đ°Đŗ. За вĐģĐžĐļĐĩĐŊи Ņ‚Đ°ĐŗĐžĐ˛Đĩ, ĐŧĐžĐģŅ, Đ˛ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐŋҊĐģĐŊĐ¸Ņ ĐŋŅŠŅ‚ ĐŊа Ņ‚Đ°ĐŗĐ°, вĐēĐģŅŽŅ‡Đ¸Ņ‚ĐĩĐģĐŊĐž ĐŊаĐēĐģĐžĐŊĐĩĐŊĐ¸Ņ‚Đĩ ҇ĐĩŅ€Ņ‚Đ¸.",
"create_user": "ĐĄŅŠĐˇĐ´Đ°Đš ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ",
"created": "ĐĄŅŠĐˇĐ´Đ°Đ´ĐĩĐŊĐž",
"created_at": "ĐĄŅŠĐˇĐ´Đ°Đ´ĐĩĐŊ",
"creating_linked_albums": "ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ŅĐ˛ŅŠŅ€ĐˇĐ°ĐŊи аĐģĐąŅƒĐŧи...",
"crop": "Đ˜ĐˇŅ€ĐĩĐļи",
"curated_object_page_title": "НĐĩŅ‰Đ°",
"current_device": "ĐĸĐĩĐēŅƒŅ‰Đž ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž",
@@ -719,6 +754,7 @@
"current_server_address": "ĐĐ°ŅŅ‚ĐžŅŅ‰ Đ°Đ´Ņ€Đĩҁ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"custom_locale": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ ĐģĐžĐēаĐģ",
"custom_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ´Đ°Ņ‚Đ¸ и Ņ‡Đ¸ŅĐģа в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚ ĐžŅ‚ ĐĩСиĐēа и Ņ€ĐĩĐŗĐ¸ĐžĐŊа",
"custom_url": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ URL Đ°Đ´Ņ€Đĩҁ",
"daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM yyyy",
"dark": "ĐĸҊĐŧĐĩĐŊ",
@@ -730,6 +766,7 @@
"date_of_birth_saved": "Đ”Đ°Ņ‚Đ° ĐŊа Ņ€Đ°ĐļдаĐŊĐĩ Đĩ СаĐŋĐ¸ŅĐ°ĐŊа ҃ҁĐŋĐĩ҈ĐŊĐž",
"date_range": "ПĐĩŅ€Đ¸ĐžĐ´ ĐžŅ‚ Đ˛Ņ€ĐĩĐŧĐĩ",
"day": "ДĐĩĐŊ",
"days": "ДĐŊи",
"deduplicate_all": "ДĐĩĐ´ŅƒĐŋĐģиĐēĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛ŅĐ¸Ņ‡Đēи",
"deduplication_criteria_1": "РаСĐŧĐĩŅ€ ĐŊа ҁĐŊиĐŧĐēĐ°Ņ‚Đ° в ĐąĐ°ĐšŅ‚ĐžĐ˛Đĩ",
"deduplication_criteria_2": "Đ‘Ņ€ĐžĐš EXIF даĐŊĐŊи",
@@ -738,7 +775,8 @@
"default_locale": "ЛоĐēаĐģĐ¸ĐˇĐ°Ņ†Đ¸Ņ ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ",
"default_locale_description": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ´Đ°Ņ‚Đ¸ и Ņ‡Đ¸ŅĐģа в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚ ĐžŅ‚ ĐĩСиĐēĐžĐ˛Đ°Ņ‚Đ° ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°",
"delete": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš",
"delete_action_prompt": "{count} ŅĐ° Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đ¸ СавиĐŊĐ°ĐŗĐ¸",
"delete_action_confirmation_message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да Đ¸ĐˇŅ‚Ņ€Đ¸ĐĩŅ‚Đĩ Ņ‚ĐžĐˇĐ¸ ОйĐĩĐēŅ‚? ĐĄĐģĐĩдва ĐŋŅ€ĐĩĐŧĐĩŅŅ‚Đ˛Đ°ĐŊĐĩ ĐŊа ОйĐĩĐēŅ‚Đ° в ĐēĐžŅˆĐ° Са ĐžŅ‚ĐŋĐ°Đ´ŅŠŅ†Đ¸ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ° и ҉Đĩ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚Đĩ ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊиĐĩ ОйĐĩĐēŅ‚Đ° да ĐąŅŠĐ´Đĩ Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚ ĐģĐžĐēаĐģĐŊĐž",
"delete_action_prompt": "{count} ŅĐ° Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đ¸",
"delete_album": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš аĐģĐąŅƒĐŧ",
"delete_api_key_prompt": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да Đ¸ĐˇŅ‚Ņ€Đ¸ĐĩŅ‚Đĩ Ņ‚ĐžĐˇĐ¸ API ĐēĐģŅŽŅ‡?",
"delete_dialog_alert": "ĐĸĐĩСи ОйĐĩĐēŅ‚Đ¸ ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đ¸ СавиĐŊĐ°ĐŗĐ¸ и ĐžŅ‚ Immich ŅŅŠŅ€Đ˛ŅŠŅ€Đ° и ĐžŅ‚ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž",
@@ -756,6 +794,8 @@
"delete_local_dialog_ok_backed_up_only": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš ĐģĐžĐēаĐģĐŊĐž ŅĐ°ĐŧĐž Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐ¸Ņ‚Đĩ",
"delete_local_dialog_ok_force": "Đ’ŅŠĐŋŅ€ĐĩĐēи Ņ‚ĐžĐ˛Đ° Đ¸ĐˇŅ‚Ņ€Đ¸Đš",
"delete_others": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš ĐžŅŅ‚Đ°ĐŊаĐģĐ¸Ņ‚Đĩ",
"delete_permanently": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš Са ĐŋĐžŅŅ‚ĐžŅĐŊĐŊĐž",
"delete_permanently_action_prompt": "{count} Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đ¸ Са ĐŋĐžŅŅ‚ĐžŅĐŊĐŊĐž",
"delete_shared_link": "Đ˜ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐŋОдĐĩĐģĐĩĐŊ ĐģиĐŊĐē",
"delete_shared_link_dialog_title": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš ҁĐŋОдĐĩĐģĐĩĐŊĐ°Ņ‚Đ° Đ˛Ņ€ŅŠĐˇĐēа",
"delete_tag": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš Ņ‚Đ°Đŗ",
@@ -766,6 +806,7 @@
"description": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ",
"description_input_hint_text": "Добави ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ...",
"description_input_submit_error": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩŅ‚Đž. За ĐŋĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸ виĐļŅ‚Đĩ в Đ´ĐŊĐĩвĐŊиĐēа",
"deselect_all": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊи Đ¸ĐˇĐąĐžŅ€Đ° ĐžŅ‚ Đ˛ŅĐ¸Ņ‡Đēи",
"details": "ДĐĩŅ‚Đ°ĐšĐģи",
"direction": "ĐŸĐžŅĐžĐēа",
"disabled": "ИСĐēĐģŅŽŅ‡ĐĩĐŊĐž",
@@ -810,8 +851,12 @@
"edit": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ",
"edit_album": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа аĐģĐąŅƒĐŧ",
"edit_avatar": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ°Đ˛Đ°Ņ‚Đ°Ņ€",
"edit_birthday": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ€ĐžĐļĐ´ĐĩĐŊ Đ´ĐĩĐŊ",
"edit_date": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ´Đ°Ņ‚Đ°",
"edit_date_and_time": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ´Đ°Ņ‚Đ° и Ņ‡Đ°Ņ",
"edit_date_and_time_action_prompt": "{count} Đ´Đ°Ņ‚Đ° и Đ˛Ņ€ĐĩĐŧĐĩ ŅĐ° Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊи",
"edit_date_and_time_by_offset": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа Đ´Đ°Ņ‚Đ°Ņ‚Đ° ҇ҀĐĩС ĐžŅ‚ĐŧĐĩŅŅ‚Đ˛Đ°ĐŊĐĩ",
"edit_date_and_time_by_offset_interval": "Нов ĐŋĐĩŅ€Đ¸ĐžĐ´ ĐžŅ‚ Đ˛Ņ€ĐĩĐŧĐĩ: {from} - {to}",
"edit_description": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°Đš ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ",
"edit_description_prompt": "МоĐģŅ, иСйĐĩŅ€Đ¸ ĐŊОвО ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ:",
"edit_exclusion_pattern": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ŅˆĐ°ĐąĐģĐžĐŊ Са иСĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ",
@@ -840,6 +885,7 @@
"empty_trash": "ИСĐŋŅ€Đ°ĐˇĐ˛Đ°ĐŊĐĩ ĐŊа ĐēĐžŅˆ",
"empty_trash_confirmation": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да иСĐŋŅ€Đ°ĐˇĐŊĐ¸Ņ‚Đĩ ĐēĐžŅˆŅ‡ĐĩŅ‚Đž? ĐĸОва ҉Đĩ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩ Đ˛ŅĐ¸Ņ‡ĐēĐž в ĐēĐžŅˆŅ‡ĐĩŅ‚Đž Са ĐŋĐžŅŅ‚ĐžŅĐŊĐŊĐž ĐžŅ‚ Immich.\nНĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ да ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚Đĩ Ņ‚ĐžĐ˛Đ° Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ!",
"enable": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ",
"enable_backup": "ВĐēĐģŅŽŅ‡Đ¸ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžŅ‚Đž ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊĐĩ",
"enable_biometric_auth_description": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ Đ˛Đ°ŅˆĐ¸Ņ PIN ĐēОд, Са да Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚Đĩ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊĐž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ",
"enabled": "ВĐēĐģŅŽŅ‡ĐĩĐŊĐž",
"end_date": "ĐšŅ€Đ°ĐšĐŊа Đ´Đ°Ņ‚Đ°",
@@ -850,7 +896,9 @@
"error": "Đ“Ņ€Đĩ҈Đēа",
"error_change_sort_album": "НĐĩ҃ҁĐŋĐĩ҈ĐŊа ĐŋŅ€ĐžĐŧŅĐŊа ĐŊа Ņ€Đĩда ĐŊа ŅĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа аĐģĐąŅƒĐŧ",
"error_delete_face": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐģĐ¸Ņ†Đĩ ĐžŅ‚ аĐēŅ‚Đ¸Đ˛Đ°",
"error_getting_places": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ŅŅŠĐąĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŧĐĩŅŅ‚Đ°Ņ‚Đ°",
"error_loading_image": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž",
"error_loading_partners": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ĐŋĐ°Ņ€Ņ‚ĐŊŅŒĐžŅ€Đ¸: {error}",
"error_saving_image": "Đ“Ņ€Đĩ҈Đēа: {error}",
"error_tag_face_bounding_box": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ĐžŅ‚ĐąĐĩĐģŅĐˇĐ˛Đ°ĐŊĐĩ ĐŊа ĐģĐ¸Ņ†Đĩ - ĐŊĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋĐžĐģŅƒŅ‡Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐēĐžĐžŅ€Đ´Đ¸ĐŊĐ°Ņ‚Đ¸ ĐŊа Ņ€Đ°ĐŧĐēĐ°Ņ‚Đ°",
"error_title": "Đ“Ņ€Đĩ҈Đēа - ĐŊĐĩŅ‰Đž ҁĐĩ ĐžĐąŅŠŅ€Đēа",
@@ -874,7 +922,7 @@
"error_selecting_all_assets": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ Đ¸ĐˇĐąĐžŅ€Đ° ĐŊа Đ˛ŅĐ¸Ņ‡Đēи Ņ„Đ°ĐšĐģОвĐĩ",
"exclusion_pattern_already_exists": "ĐĸОСи ĐŧОдĐĩĐģ Са иСĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ вĐĩ҇Đĩ ŅŅŠŅ‰ĐĩŅŅ‚Đ˛ŅƒĐ˛Đ°.",
"failed_to_create_album": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа аĐģĐąŅƒĐŧ",
"failed_to_create_shared_link": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐŋОдĐĩĐģĐĩĐŊа Đ˛Ņ€ŅŠĐˇĐēа",
"failed_to_create_shared_link": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐŋoĐ´ĐĩĐģĐĩĐŊа Đ˛Ņ€ŅŠĐˇĐēа",
"failed_to_edit_shared_link": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ҁĐŋОдĐĩĐģĐĩĐŊа Đ˛Ņ€ŅŠĐˇĐēа",
"failed_to_get_people": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа Ņ…ĐžŅ€Đ°",
"failed_to_keep_this_delete_others": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž СаĐŋаСваĐŊĐĩ ĐŊа Ņ‚ĐžĐˇĐ¸ ОйĐĩĐēŅ‚ и Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐžŅŅ‚Đ°ĐŊаĐģĐ¸Ņ‚Đĩ ОйĐĩĐēŅ‚Đ¸",
@@ -883,6 +931,7 @@
"failed_to_load_notifications": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа иСвĐĩŅŅ‚Đ¸Ņ",
"failed_to_load_people": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа Ņ…ĐžŅ€Đ°",
"failed_to_remove_product_key": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚ĐžĐ˛Đ¸Ņ ĐēĐģŅŽŅ‡",
"failed_to_reset_pin_code": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ĐŊ҃ĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ПИН ĐēОда",
"failed_to_stack_assets": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋĐžĐ´Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ОйĐĩĐēŅ‚Đ¸",
"failed_to_unstack_assets": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐžĐ´Ņ€ĐĩĐ´ĐąĐ°Ņ‚Đ° ĐŊа ОйĐĩĐēŅ‚Đ¸",
"failed_to_update_notification_status": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа ŅŅŠŅŅ‚ĐžŅĐŊиĐĩŅ‚Đž ĐŊа иСвĐĩŅŅ‚Đ¸ŅŅ‚Đ°",
@@ -891,6 +940,7 @@
"paths_validation_failed": "{paths, plural, one {# ĐŋŅŠŅ‚} other {# ĐŋŅŠŅ‚Đ¸Ņ‰Đ°}} ĐŊĐĩ ĐŋŅ€ĐĩĐŧиĐŊĐ°Ņ…Đ° ваĐģĐ¸Đ´Đ°Ņ†Đ¸Ņ",
"profile_picture_transparent_pixels": "ĐŸŅ€ĐžŅ„Đ¸ĐģĐŊĐ¸Ņ‚Đĩ ҁĐŊиĐŧĐēи ĐŊĐĩ ĐŧĐžĐŗĐ°Ņ‚ да иĐŧĐ°Ņ‚ ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊи ĐŋиĐēҁĐĩĐģи. МоĐģŅ, ŅƒĐ˛ĐĩĐģĐ¸Ņ‡ĐĩŅ‚Đĩ и/иĐģи ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩŅ‚Đĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž.",
"quota_higher_than_disk_size": "ЗададĐĩĐŊа Đĩ ĐēĐ˛ĐžŅ‚Đ°, ĐŋĐž-ĐŗĐžĐģŅĐŧа ĐžŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐŊа Đ´Đ¸ŅĐēа",
"something_went_wrong": "НĐĩŅ‰Đž ҁĐĩ ĐžĐąŅŠŅ€Đēа",
"unable_to_add_album_users": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž Đ´ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи в аĐģĐąŅƒĐŧ",
"unable_to_add_assets_to_shared_link": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž Đ´ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ОйĐĩĐēŅ‚Đ¸ в ҁĐŋОдĐĩĐģĐĩĐŊ ĐģиĐŊĐē",
"unable_to_add_comment": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž Đ´ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€",
@@ -976,13 +1026,11 @@
},
"exif": "Exif",
"exif_bottom_sheet_description": "Добави ОĐŋĐ¸ŅĐ°ĐŊиĐĩ...",
"exif_bottom_sheet_description_error": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ",
"exif_bottom_sheet_details": "ПОДРОБНОСĐĸИ",
"exif_bottom_sheet_location": "ĐœĐ¯ĐĄĐĸО",
"exif_bottom_sheet_people": "ĐĨОРА",
"exif_bottom_sheet_person_add_person": "Добави иĐŧĐĩ",
"exif_bottom_sheet_person_age_months": "Đ’ŅŠĐˇŅ€Đ°ŅŅ‚ {months} ĐŧĐĩҁĐĩŅ†Đ°",
"exif_bottom_sheet_person_age_year_months": "Đ’ŅŠĐˇŅ€Đ°ŅŅ‚ 1 ĐŗĐžĐ´Đ¸ĐŊа и {months} ĐŧĐĩҁĐĩŅ†Đ°",
"exif_bottom_sheet_person_age_years": "Đ’ŅŠĐˇŅ€Đ°ŅŅ‚ {years}",
"exit_slideshow": "Đ˜ĐˇŅ…ĐžĐ´ ĐžŅ‚ ҁĐģĐ°ĐšĐ´ŅˆĐžŅƒŅ‚Đž",
"expand_all": "Đ Đ°ĐˇŅˆĐ¸Ņ€Đ¸ Đ˛ŅĐ¸Ņ‡Đēи",
"experimental_settings_new_asset_list_subtitle": "В Ņ€Đ°ĐˇĐ˛Đ¸Ņ‚Đ¸Đĩ",
@@ -996,6 +1044,8 @@
"explorer": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´",
"export": "ЕĐēҁĐŋĐžŅ€Ņ‚",
"export_as_json": "ЕĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐēĐ°Ņ‚Đž JSON",
"export_database": "ЕĐēҁĐŋĐžŅ€Ņ‚ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи",
"export_database_description": "ЕĐēҁĐŋĐžŅ€Ņ‚ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи SQLite",
"extension": "Đ Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊиĐĩ",
"external": "Đ’ŅŠĐŊ҈ĐŊĐž",
"external_libraries": "Đ’ŅŠĐŊ҈ĐŊи йийĐģĐ¸ĐžŅ‚ĐĩĐēи",
@@ -1013,6 +1063,7 @@
"favorites_page_no_favorites": "НĐĩ ŅĐ° ĐŊаĐŧĐĩŅ€ĐĩĐŊи ĐģŅŽĐąĐ¸Đŧи ОйĐĩĐēŅ‚Đ¸",
"feature_photo_updated": "ĐŸŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛Đ¸Ņ‚ĐĩĐģĐŊĐ°Ņ‚Đ° ҁĐŊиĐŧĐēа Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊа",
"features": "Đ¤ŅƒĐŊĐēŅ†Đ¸Đ¸",
"features_in_development": "Đ¤ŅƒĐŊĐēŅ†Đ¸Đ¸ в ĐŋŅ€ĐžŅ†Đĩҁ ĐŊа Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Đēа",
"features_setting_description": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸Ņ‚Đĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž",
"file_name": "ИĐŧĐĩ ĐŊа Ņ„Đ°ĐšĐģа",
"file_name_or_extension": "ИĐŧĐĩ ĐŊа Ņ„Đ°ĐšĐģ иĐģи Ņ€Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊиĐĩ",
@@ -1022,21 +1073,26 @@
"filter_people": "ФиĐģŅ‚Ņ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ…ĐžŅ€Đ°",
"filter_places": "ФиĐģŅ‚ŅŠŅ€ ĐŋĐž ĐŧŅŅŅ‚Đž",
"find_them_fast": "НаĐŧĐĩŅ€ĐĩŅ‚Đĩ ĐŗĐ¸ ĐąŅŠŅ€ĐˇĐž ĐŋĐž иĐŧĐĩ ҁ Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ",
"first": "ĐŸŅŠŅ€Đ˛Đ¸",
"fix_incorrect_match": "ПоĐŋŅ€Đ°Đ˛ŅĐŊĐĩ ĐŊа ĐŊĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐŊĐž ŅŅŠĐ˛ĐŋадĐĩĐŊиĐĩ",
"folder": "ПаĐŋĐēа",
"folder_not_found": "ПаĐŋĐēĐ°Ņ‚Đ° ĐŊĐĩ Đĩ ĐŊаĐŧĐĩŅ€ĐĩĐŊа",
"folders": "ПаĐŋĐēи",
"folders_feature_description": "ĐŸŅ€ĐĩĐŗĐģĐĩĐļдаĐŊĐĩ ĐŊа ĐŋаĐŋĐēĐ°Ņ‚Đ° Са ҁĐŊиĐŧĐēĐ¸Ņ‚Đĩ и видĐĩĐžĐēĐģиĐŋОвĐĩŅ‚Đĩ в Ņ„Đ°ĐšĐģĐžĐ˛Đ°Ņ‚Đ° ŅĐ¸ŅŅ‚ĐĩĐŧа",
"forgot_pin_code_question": "Đ—Đ°ĐąŅ€Đ°Đ˛Đ¸Đģи ҁ҂Đĩ ŅĐ˛ĐžŅ ПИН ĐēОд?",
"forward": "НаĐŋŅ€ĐĩĐ´",
"gcast_enabled": "Google Cast",
"gcast_enabled_description": "За да Ņ€Đ°ĐąĐžŅ‚Đ¸ Ņ‚Đ°ĐˇĐ¸ Ņ„ŅƒĐŊĐēŅ†Đ¸Ņ ĐˇĐ°Ņ€ĐĩĐļда Đ˛ŅŠĐŊ҈ĐŊи Ņ€ĐĩŅŅƒŅ€ŅĐ¸ ĐžŅ‚ Google.",
"general": "ĐžĐąŅ‰Đ¸",
"geolocation_instruction_location": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ОйĐĩĐēŅ‚ ҁ GPS ĐēĐžĐžŅ€Đ´Đ¸ĐŊĐ°Ņ‚Đ¸ Са да иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ Ņ‚ŅŅ… иĐģи иСйĐĩŅ€ĐĩŅ‚Đĩ ĐŧŅŅŅ‚Đž Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐŊĐž ĐžŅ‚ ĐēĐ°Ņ€Ņ‚Đ°Ņ‚Đ°",
"get_help": "ПоĐŧĐžŅ‰",
"get_wifiname_error": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋĐžĐģŅƒŅ‡Đ°Đ˛Đ°ĐŊĐĩ иĐŧĐĩŅ‚Đž ĐŊа Wi-Fi ĐŧŅ€ĐĩĐļĐ°Ņ‚Đ°. МоĐģŅ, ŅƒĐąĐĩĐ´ĐĩŅ‚Đĩ ҁĐĩ, ҇Đĩ ŅĐ° ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐĩĐŊи ĐŊ҃ĐļĐŊĐ¸Ņ‚Đĩ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐ¸Ņ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž и иĐŧа Đ˛Ņ€ŅŠĐˇĐēа ҁ Wi-Fi",
"getting_started": "КаĐē да СаĐŋĐžŅ‡ĐŊĐĩĐŧ",
"go_back": "Đ’Ņ€ŅŠŅ‰Đ°ĐŊĐĩ ĐŊаСад",
"go_to_folder": "ĐžŅ‚Đ¸Đ´Đ¸ в ĐŋаĐŋĐēĐ°Ņ‚Đ°",
"go_to_search": "ĐŸŅ€ĐĩĐŧиĐŊаваĐŊĐĩ ĐēҊĐŧ Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ",
"gps": "GPS ĐēĐžĐžŅ€Đ´Đ¸ĐŊĐ°Ņ‚Đ¸",
"gps_missing": "ĐŅĐŧа GPS ĐēĐžĐžŅ€Đ´Đ¸ĐŊĐ°Ņ‚Đ¸",
"grant_permission": "Дай Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ",
"group_albums_by": "Đ“Ņ€ŅƒĐŋĐ¸Ņ€Đ°Đš аĐģĐąŅƒĐŧ ĐŋĐž...",
"group_country": "Đ“Ņ€ŅƒĐŋĐ¸Ņ€Đ°Đš ĐŋĐž Đ´ŅŠŅ€Đļава",
@@ -1047,6 +1103,9 @@
"haptic_feedback_switch": "ВĐēĐģŅŽŅ‡Đ¸ Ņ‚Đ°ĐēŅ‚Đ¸ĐģĐŊа ĐžĐąŅ€Đ°Ņ‚ĐŊа Đ˛Ņ€ŅŠĐˇĐēа",
"haptic_feedback_title": "ĐĸаĐēŅ‚Đ¸ĐģĐŊа ĐžĐąŅ€Đ°Ņ‚ĐŊа Đ˛Ņ€ŅŠĐˇĐēа",
"has_quota": "ЛиĐŧĐ¸Ņ‚",
"hash_asset": "ОбĐĩĐēŅ‚ ҁ Ņ…Đĩ҈",
"hashed_assets": "ĐĨĐĩŅˆĐ¸Ņ€Đ°ĐŊи ОйĐĩĐēŅ‚Đ¸",
"hashing": "ĐĨĐĩŅˆĐ¸Ņ€Đ°ĐŊĐĩ",
"header_settings_add_header_tip": "Добави ĐˇĐ°ĐŗĐģавиĐĩ",
"header_settings_field_validator_msg": "НĐĩĐ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧĐž Đĩ да ĐŊŅĐŧа ŅŅ‚ĐžĐšĐŊĐžŅŅ‚",
"header_settings_header_name_input": "ИĐŧĐĩ ĐŊа ĐˇĐ°ĐŗĐģавиĐĩŅ‚Đž",
@@ -1078,7 +1137,9 @@
"home_page_upload_err_limit": "МоĐļĐĩ да ĐēĐ°Ņ‡Đ˛Đ°Ņ‚Đĩ ĐŧаĐēŅĐ¸Đŧ҃Đŧ 30 ОйĐĩĐēŅ‚Đ° ĐĩĐ´ĐŊĐžĐ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž, ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ",
"host": "ĐĨĐžŅŅ‚",
"hour": "Đ§Đ°Ņ",
"hours": "Đ§Đ°ŅĐ°",
"id": "ID",
"idle": "БĐĩСдĐĩĐšŅŅ‚Đ˛Đ¸Đĩ",
"ignore_icloud_photos": "ĐŸŅ€ĐžĐŋ҃ҁĐŊи ҁĐŊиĐŧĐēи ĐžŅ‚ iCloud",
"ignore_icloud_photos_description": "ĐĄĐŊиĐŧĐēи, ĐēĐžĐ¸Ņ‚Đž ŅĐ° СаĐŋаСĐĩĐŊи в iCloud ĐŊŅĐŧа да ҁĐĩ ĐēĐ°Ņ‡Đ˛Đ°Ņ‚ в Immich ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"image": "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ",
@@ -1136,10 +1197,13 @@
"language_no_results_title": "НĐĩ ŅĐ° ĐŊаĐŧĐĩŅ€ĐĩĐŊи ĐĩĐˇĐ¸Ņ†Đ¸",
"language_search_hint": "ĐĸŅŠŅ€ŅĐĩĐŊĐĩ ĐŊа ĐĩĐˇĐ¸Ņ†Đ¸...",
"language_setting_description": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐŋŅ€ĐĩĐ´ĐŋĐžŅ‡Đ¸Ņ‚Đ°ĐŊ ĐĩСиĐē",
"large_files": "ГоĐģĐĩĐŧи Ņ„Đ°ĐšĐģОвĐĩ",
"last": "ĐŸĐžŅĐģĐĩĐ´ĐĩĐŊ",
"last_seen": "ĐŸĐžŅĐģĐĩĐ´ĐŊĐž Đ˛Đ¸Đ´ŅĐŊĐž",
"latest_version": "ĐŸĐžŅĐģĐĩĐ´ĐŊа вĐĩŅ€ŅĐ¸Ņ",
"latitude": "Đ¨Đ¸Ņ€Đ¸ĐŊа",
"leave": "ИСĐģĐĩС",
"leave_album": "НаĐŋ҃ҁĐēаĐŊĐĩ ĐŊа аĐģĐąŅƒĐŧа",
"lens_model": "МодĐĩĐģ ĐģĐĩŅ‰Đ°",
"let_others_respond": "ПозвоĐģĐĩŅ‚Đĩ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸Ņ‚Đĩ да ĐžŅ‚ĐŗĐžĐ˛ĐžŅ€ŅŅ‚",
"level": "Ниво",
@@ -1153,6 +1217,7 @@
"library_page_sort_title": "Đ—Đ°ĐŗĐģавиĐĩ ĐŊа аĐģĐąŅƒĐŧа",
"licenses": "Đ›Đ¸Ņ†ĐĩĐŊСи",
"light": "ХвĐĩŅ‚ĐģĐž",
"like": "ĐĨĐ°Ņ€ĐĩŅĐ°ĐšŅ‚Đĩ",
"like_deleted": "ĐšĐ°Ņ‚Đž Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚",
"link_motion_video": "ЛиĐŊĐē ĐēҊĐŧ видĐĩĐž",
"link_to_oauth": "ЛиĐŊĐē ĐēҊĐŧ OAuth",
@@ -1160,7 +1225,10 @@
"list": "Đ›Đ¸ŅŅ‚",
"loading": "Đ—Đ°Ņ€ĐĩĐļдаĐŊĐĩ",
"loading_search_results_failed": "Đ—Đ°Ņ€ĐĩĐļдаĐŊĐĩŅ‚Đž ĐŊа Ņ€ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸Ņ‚Đĩ ĐžŅ‚ Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩŅ‚Đž Đĩ ĐŊĐĩ҃ҁĐŋĐĩ҈ĐŊĐž",
"local": "ЛоĐēаĐģĐŊĐž",
"local_asset_cast_failed": "НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ĐŋŅ€Đĩдава ОйĐĩĐēŅ‚, ĐēĐžĐšŅ‚Đž ĐžŅ‰Đĩ ĐŊĐĩ Đĩ ĐēĐ°Ņ‡ĐĩĐŊ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"local_assets": "ЛоĐēаĐģĐŊи ОйĐĩĐēŅ‚Đ¸",
"local_media_summary": "ĐžĐąĐžĐąŅ‰ĐĩĐŊиĐĩ ĐŊа ĐģĐžĐēаĐģĐŊĐ¸Ņ‚Đĩ ĐŧĐĩдиКĐŊи Ņ„Đ°ĐšĐģОвĐĩ",
"local_network": "ЛоĐēаĐģĐŊа ĐŧŅ€ĐĩĐļа",
"local_network_sheet_info": "ĐŸŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž ҉Đĩ ҁĐĩ ŅĐ˛ŅŠŅ€ĐļĐĩ ҁҊҁ ŅŅŠŅ€Đ˛ŅŠŅ€Đ° ĐŊа Ņ‚ĐžĐˇĐ¸ URL, ĐēĐžĐŗĐ°Ņ‚Đž ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž Đĩ ŅĐ˛ŅŠŅ€ĐˇĐ°ĐŊĐž ĐēҊĐŧ СададĐĩĐŊĐ°Ņ‚Đ° Wi-Fi ĐŧŅ€ĐĩĐļа",
"location_permission": "Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ Са ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
@@ -1172,6 +1240,7 @@
"location_picker_longitude_hint": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐŗĐĩĐžĐŗŅ€Đ°Ņ„ŅĐēа Đ´ŅŠĐģĐļиĐŊа Ņ‚ŅƒĐē",
"lock": "ЗаĐēĐģŅŽŅ‡Đ¸",
"locked_folder": "ЗаĐēĐģŅŽŅ‡ĐĩĐŊа ĐŋаĐŋĐēа",
"log_detail_title": "ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸ ĐžŅ‚ Đ´ĐŊĐĩвĐŊиĐēа",
"log_out": "ИСĐģиСаĐŊĐĩ",
"log_out_all_devices": "ИСĐģиСаĐŊĐĩ ҁ Đ˛ŅĐ¸Ņ‡Đēи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°",
"logged_in_as": "ВĐŋĐ¸ŅĐ°ĐŊ ĐēĐ°Ņ‚Đž {user}",
@@ -1202,6 +1271,7 @@
"login_password_changed_success": "ĐŖŅĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐĩĐŊа ĐŋĐ°Ņ€ĐžĐģа",
"logout_all_device_confirmation": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да иСĐģĐĩСĐĩŅ‚Đĩ ĐžŅ‚ Đ˛ŅĐ¸Ņ‡Đēи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°?",
"logout_this_device_confirmation": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да иСĐģĐĩСĐĩŅ‚Đĩ ĐžŅ‚ Ņ‚ĐžĐ˛Đ° ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž?",
"logs": "ДĐŊĐĩвĐŊиĐē",
"longitude": "Đ”ŅŠĐģĐļиĐŊа",
"look": "Đ˜ĐˇĐŗĐģĐĩĐ´",
"loop_videos": "ĐŸĐžĐ˛Ņ‚Đ°Ņ€ŅĐŊĐĩ ĐŊа видĐĩĐ°Ņ‚Đ°",
@@ -1209,6 +1279,7 @@
"main_branch_warning": "ИСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ вĐĩŅ€ŅĐ¸Ņ Са Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Ņ‡Đ¸Ņ†Đ¸, ŅĐ¸ĐģĐŊĐž ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ˛Đ°ĐŧĐĩ да иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ ĐžŅ„Đ¸Ņ†Đ¸Đ°ĐģĐŊа вĐĩŅ€ŅĐ¸Ņ!",
"main_menu": "ГĐģавĐŊĐž ĐŧĐĩĐŊŅŽ",
"make": "ĐœĐ°Ņ€Đēа",
"manage_geolocation": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊĐ¸ŅŅ‚Đ°",
"manage_shared_links": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ҁĐŋОдĐĩĐģĐĩĐŊи Đ˛Ņ€ŅŠĐˇĐēи",
"manage_sharing_with_partners": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ҁĐŋОдĐĩĐģŅĐŊĐĩŅ‚Đž ҁ ĐŋĐ°Ņ€Ņ‚ĐŊŅŒĐžŅ€Đ¸",
"manage_the_app_settings": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž",
@@ -1217,7 +1288,7 @@
"manage_your_devices": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа вĐģĐĩСĐģĐ¸Ņ‚Đĩ в ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ° ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°",
"manage_your_oauth_connection": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа OAuth Đ˛Ņ€ŅŠĐˇĐēĐ°Ņ‚Đ°",
"map": "ĐšĐ°Ņ€Ņ‚Đ°",
"map_assets_in_bounds": "{count} ҁĐŊиĐŧĐēи",
"map_assets_in_bounds": "{count, plural, =0 {ĐŅĐŧа ҁĐŊиĐŧĐēи} one {# ҁĐŊиĐŧĐēа} other {# ҁĐŊиĐŧĐēи}}",
"map_cannot_get_user_location": "НĐĩ ĐŧĐžĐļĐ°Ņ… да ĐŋĐžĐģŅƒŅ‡Đ° ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž",
"map_location_dialog_yes": "Да",
"map_location_picker_page_use_location": "ИСĐŋĐžĐģСваК Ņ‚ĐžĐ˛Đ° ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
@@ -1225,7 +1296,6 @@
"map_location_service_disabled_title": "ĐŖŅĐģŅƒĐŗĐ°Ņ‚Đ° Са ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ Đĩ иСĐēĐģŅŽŅ‡ĐĩĐŊа",
"map_marker_for_images": "ĐœĐ°Ņ€ĐēĐĩŅ€Đ¸ ĐŊа ĐēĐ°Ņ€Ņ‚Đ°Ņ‚Đ° Са ҁĐŊиĐŧĐēи ĐŊаĐŋŅ€Đ°Đ˛ĐĩĐŊи в {city}, {country}",
"map_marker_with_image": "ĐœĐ°Ņ€ĐēĐĩŅ€ ĐŊа ĐēĐ°Ņ€Ņ‚Đ°Ņ‚Đ° ҁ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ",
"map_no_assets_in_bounds": "ĐŅĐŧа ҁĐŊиĐŧĐēи ĐžŅ‚ Ņ‚ĐžĐˇĐ¸ Ņ€Đ°ĐšĐžĐŊ",
"map_no_location_permission_content": "За да ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ ОйĐĩĐēŅ‚Đ¸Ņ‚Đĩ ĐžŅ‚ Ņ‚ĐĩĐēŅƒŅ‰ĐžŅ‚Đž ĐŧŅŅŅ‚Đž, Ņ‚Ņ€ŅĐąĐ˛Đ° Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ Са ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅĐŊĐĩ ĐŊа ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž. Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ ҁĐĩĐŗĐ°?",
"map_no_location_permission_title": "ĐžŅ‚ĐēаСаĐŊ Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ",
"map_settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа ĐēĐ°Ņ€Ņ‚Đ°Ņ‚Đ°",
@@ -1244,6 +1314,7 @@
"mark_as_read": "ĐœĐ°Ņ€ĐēĐ¸Ņ€Đ°Đš ĐēĐ°Ņ‚Đž ҇ĐĩŅ‚ĐĩĐŊĐž",
"marked_all_as_read": "Đ’ŅĐ¸Ņ‡Đēи ĐŧĐ°Ņ€ĐēĐ¸Ņ€Đ°ĐŊи ĐēĐ°Ņ‚Đž ĐŋŅ€ĐžŅ‡ĐĩŅ‚ĐĩĐŊи",
"matches": "ĐĄŅŠĐ˛ĐŋадĐĩĐŊĐ¸Ņ",
"matching_assets": "ĐĄŅŠĐ˛ĐŋĐ°Đ´Đ°Ņ‰Đ¸ ОйĐĩĐēŅ‚Đ¸",
"media_type": "Вид ĐŧĐĩĐ´Đ¸Ņ",
"memories": "ĐĄĐŋĐžĐŧĐĩĐŊи",
"memories_all_caught_up": "ĐĸОва Đĩ Đ˛ŅĐ¸Ņ‡ĐēĐž Са Đ´ĐŊĐĩҁ",
@@ -1262,6 +1333,7 @@
"merged_people_count": "ĐĄĐģŅŅ‚ {count, plural, one {# Ņ‡ĐžĐ˛ĐĩĐē} other {# Ņ‡ĐžĐ˛ĐĩĐēа}}",
"minimize": "МиĐŊиĐŧĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ",
"minute": "МиĐŊŅƒŅ‚Đ°",
"minutes": "МиĐŊŅƒŅ‚Đ¸",
"missing": "ЛиĐŋŅĐ˛Đ°Ņ‰Đ¸",
"model": "МодĐĩĐģ",
"month": "МĐĩҁĐĩ҆",
@@ -1281,6 +1353,10 @@
"my_albums": "Мои аĐģĐąŅƒĐŧи",
"name": "ИĐŧĐĩ",
"name_or_nickname": "ИĐŧĐĩ иĐģи ĐŋŅ€ŅĐēĐžŅ€",
"network_requirement_photos_upload": "ИСĐŋĐžĐģСваК ĐŧОйиĐģĐŊи даĐŊĐŊи Са Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ҁĐŊиĐŧĐēи",
"network_requirement_videos_upload": "ИСĐŋĐžĐģСваК ĐŧОйиĐģĐŊи даĐŊĐŊи Са Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа видĐĩĐž",
"network_requirements": "Đ˜ĐˇĐ¸ŅĐēваĐŊĐ¸Ņ ĐēҊĐŧ ĐŧŅ€ĐĩĐļĐ°Ņ‚Đ°",
"network_requirements_updated": "ĐœŅ€ĐĩĐļĐžĐ˛Đ¸Ņ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи ŅĐ° ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊи, ĐŊ҃ĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐžĐŋĐ°ŅˆĐēĐ°Ņ‚Đ° Са Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ",
"networking_settings": "ĐœŅ€ĐĩĐļа",
"networking_subtitle": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ Са Đ˛Ņ€ŅŠĐˇĐēа ҁҊҁ ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"never": "НиĐēĐžĐŗĐ°",
@@ -1290,6 +1366,7 @@
"new_person": "Нов Ņ‡ĐžĐ˛ĐĩĐē",
"new_pin_code": "Нов PIN ĐēОд",
"new_pin_code_subtitle": "ĐĸОва Đĩ ĐŋŅŠŅ€Đ˛Đ¸ Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž СаĐēĐģŅŽŅ‡ĐĩĐŊа ĐŋаĐŋĐēа. ĐĄŅŠĐˇĐ´Đ°ĐšŅ‚Đĩ PIN ĐēОд Са ĐˇĐ°Ņ‰Đ¸Ņ‚ĐĩĐŊ Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž Ņ‚Đ°ĐˇĐ¸ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°",
"new_timeline": "Нова Đ˛Ņ€ĐĩĐŧĐĩва ĐģиĐŊĐ¸Ņ",
"new_user_created": "ĐĄŅŠĐˇĐ´Đ°Đ´ĐĩĐŊ ĐŊОв ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ",
"new_version_available": "НАЛИЧНА НОВА Đ’Đ•Đ ĐĄĐ˜Đ¯",
"newest_first": "Най-ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐŋŅŠŅ€Đ˛Đ¸",
@@ -1303,19 +1380,25 @@
"no_assets_message": "КЛИКНЕĐĸЕ, ЗА ДА КАЧИĐĸЕ ПĐĒРВАĐĸА ХИ СНИМКА",
"no_assets_to_show": "ĐŅĐŧа ОйĐĩĐēŅ‚Đ¸ Са ĐŋĐžĐēаСваĐŊĐĩ",
"no_cast_devices_found": "ĐŅĐŧа ĐŊаĐŧĐĩŅ€ĐĩĐŊи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° Са ĐŋŅ€ĐĩдаваĐŊĐĩ",
"no_checksum_local": "ЛиĐŋŅĐ˛Đ°Ņ‚ ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐŊи ҁ҃Đŧи - ĐŊĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ ĐģĐžĐēаĐģĐŊи ОйĐĩĐēŅ‚Đ¸",
"no_checksum_remote": "ЛиĐŋŅĐ˛Đ°Ņ‚ ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐŊи ҁ҃Đŧи - ĐŊĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ ОйĐĩĐēŅ‚Đ¸ ĐžŅ‚ ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"no_duplicates_found": "НĐĩ ĐąŅŅ…Đ° ĐžŅ‚ĐēŅ€Đ¸Ņ‚Đ¸ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Đ¸.",
"no_exif_info_available": "ĐŅĐŧа exif иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ",
"no_explore_results_message": "ĐšĐ°Ņ‡ĐĩŅ‚Đĩ ĐžŅ‰Đĩ ҁĐŊиĐŧĐēи, Са да Ņ€Đ°ĐˇĐŗĐģĐĩĐ´Đ°Ņ‚Đĩ ĐēĐžĐģĐĩĐēŅ†Đ¸ŅŅ‚Đ° ŅĐ¸.",
"no_favorites_message": "ДобавĐĩŅ‚Đĩ в ĐģŅŽĐąĐ¸Đŧи, Са да ĐŊаĐŧĐ¸Ņ€Đ°Ņ‚Đĩ ĐąŅŠŅ€ĐˇĐž ĐŊаК-Đ´ĐžĐąŅ€Đ¸Ņ‚Đĩ ŅĐ¸ ҁĐŊиĐŧĐēи и видĐĩĐžĐēĐģиĐŋОвĐĩ",
"no_libraries_message": "ĐĄŅŠĐˇĐ´Đ°ĐšŅ‚Đĩ Đ˛ŅŠĐŊ҈ĐŊа йийĐģĐ¸ĐžŅ‚ĐĩĐēа Са да Ņ€Đ°ĐˇĐŗĐģĐĩĐļĐ´Đ°Ņ‚Đĩ ҁĐŊиĐŧĐēи и видĐĩĐžĐēĐģиĐŋОвĐĩ",
"no_local_assets_found": "НĐĩ Đĩ ĐŊаĐŧĐĩŅ€ĐĩĐŊ ĐģĐžĐēаĐģĐĩĐŊ ОйĐĩĐēŅ‚ ҁ Ņ‚Đ°Đēава ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐŊа ҁ҃Đŧа",
"no_locked_photos_message": "ĐĄĐŊиĐŧĐēĐ¸Ņ‚Đĩ и видĐĩĐ°Ņ‚Đ° в СаĐēĐģŅŽŅ‡ĐĩĐŊĐ°Ņ‚Đ° ĐŋаĐŋĐēа ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸ и ĐŊĐĩ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ ĐŋŅ€Đ¸ Ņ€Đ°ĐˇĐŗĐģĐĩĐļдаĐŊĐĩ ĐŊа йийĐģĐ¸ĐžŅ‚ĐĩĐēĐ°Ņ‚Đ°.",
"no_name": "БĐĩС иĐŧĐĩ",
"no_notifications": "ĐŅĐŧа иСвĐĩŅŅ‚Đ¸Ņ",
"no_people_found": "НĐĩ ŅĐ° ĐŊаĐŧĐĩŅ€ĐĩĐŊи ŅŅŠĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ°Ņ‰Đ¸ Ņ…ĐžŅ€Đ°",
"no_places": "ĐŅĐŧа ĐŧĐĩŅŅ‚Đ°",
"no_remote_assets_found": "НĐĩ Đĩ ĐŊаĐŧĐĩŅ€ĐĩĐŊ ОйĐĩĐēŅ‚ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ° ҁ Ņ‚Đ°Đēава ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐŊа ҁ҃Đŧа",
"no_results": "ĐŅĐŧа Ņ€ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸",
"no_results_description": "ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ҁҊҁ ŅĐ¸ĐŊĐžĐŊиĐŧ иĐģи ĐŋĐž-ĐžĐąŅ‰Đ° ĐēĐģŅŽŅ‡ĐžĐ˛Đ° Đ´ŅƒĐŧа",
"no_shared_albums_message": "ĐĄŅŠĐˇĐ´Đ°ĐšŅ‚Đĩ аĐģĐąŅƒĐŧ, Са да ҁĐŋОдĐĩĐģŅŅ‚Đĩ ҁĐŊиĐŧĐēи и видĐĩĐžĐēĐģиĐŋОвĐĩ ҁ Ņ…ĐžŅ€Đ°Ņ‚Đ° в ĐŧŅ€ĐĩĐļĐ°Ņ‚Đ° ŅĐ¸",
"no_uploads_in_progress": "ĐŅĐŧа ĐēĐ°Ņ‡Đ˛Đ°ĐŊĐĩ в ĐŧĐžĐŧĐĩĐŊŅ‚Đ°",
"not_available": "НĐĩĐŊаĐģĐ¸Ņ‡ĐŊĐž",
"not_in_any_album": "НĐĩ Đĩ в ĐŊиĐēОК аĐģĐąŅƒĐŧ",
"not_selected": "НĐĩ Đĩ Đ¸ĐˇĐąŅ€Đ°ĐŊĐž",
"note_apply_storage_label_to_previously_uploaded assets": "ЗабĐĩĐģĐĩĐļĐēа: За да ĐŋŅ€Đ¸ĐģĐžĐļĐ¸Ņ‚Đĩ ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ° Са ŅŅŠŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ ĐēҊĐŧ ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģĐŊĐž ĐēĐ°Ņ‡ĐĩĐŊи аĐēŅ‚Đ¸Đ˛Đ¸, ŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐšŅ‚Đĩ",
@@ -1331,6 +1414,7 @@
"oauth": "OAuth",
"official_immich_resources": "ĐžŅ„Đ¸Ņ†Đ¸Đ°ĐģĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Са Immich",
"offline": "ĐžŅ„ĐģаКĐŊ",
"offset": "ĐžŅ‚ĐŧĐĩŅŅ‚Đ˛Đ°ĐŊĐĩ",
"ok": "Đ”ĐžĐąŅ€Đĩ",
"oldest_first": "Най-ŅŅ‚Đ°Ņ€Đ¸Ņ‚Đĩ ĐŋŅŠŅ€Đ˛Đ¸",
"on_this_device": "На Ņ‚ĐžĐ˛Đ° ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž",
@@ -1349,10 +1433,13 @@
"open_the_search_filters": "ĐžŅ‚Đ˛Đ°Ņ€Đ¸ Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ‚Đĩ Са Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ",
"options": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи",
"or": "иĐģи",
"organize_into_albums": "Organitzar per àlbums",
"organize_into_albums_description": "Posar les fotos existents dins dels àlbums fent servir la configuraciÃŗ de sincronitzaciÃŗ",
"organize_your_library": "ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛Đ°ŅˆĐ°Ņ‚Đ° йийĐģĐ¸ĐžŅ‚ĐĩĐēа",
"original": "ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģ",
"other": "Đ”Ņ€ŅƒĐŗĐ¸",
"other_devices": "Đ”Ņ€ŅƒĐŗĐ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°",
"other_entities": "Đ”Ņ€ŅƒĐŗĐ¸ ОйĐĩĐēŅ‚Đ¸",
"other_variables": "Đ”Ņ€ŅƒĐŗĐ¸ ĐŋŅ€ĐžĐŧĐĩĐŊĐģиви",
"owned": "ĐœĐžĐ¸Ņ‚Đĩ",
"owner": "ĐĄĐžĐąŅŅ‚Đ˛ĐĩĐŊиĐē",
@@ -1407,6 +1494,9 @@
"permission_onboarding_permission_limited": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊ Đ´ĐžŅŅ‚ŅŠĐŋ. За да ĐŧĐžĐļĐĩ Immich да Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ° и ҃ĐŋŅ€Đ°Đ˛ĐģŅĐ˛Đ° ĐŗĐ°ĐģĐĩŅ€Đ¸ŅŅ‚Đ°, ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐĩŅ‚Đĩ Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ҁĐŊиĐŧĐēи и видĐĩĐž в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ.",
"permission_onboarding_request": "Immich ҁĐĩ ĐŊ҃ĐļдаĐĩ ĐžŅ‚ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ Са ĐŋŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа ҁĐŊиĐŧĐēи и видĐĩĐž.",
"person": "ЧОвĐĩĐē",
"person_age_months": "{months, plural, one {# ĐŧĐĩҁĐĩ҆} other {# ĐŧĐĩҁĐĩŅ†Đ°}}",
"person_age_year_months": "1 ĐŗĐžĐ´Đ¸ĐŊа и {months, plural, one {# ĐŧĐĩҁĐĩ҆} other {# ĐŧĐĩҁĐĩŅ†Đ°}}",
"person_age_years": "{years, plural, other {# ĐŗĐžĐ´Đ¸ĐŊи}}",
"person_birthdate": "Đ”Đ°Ņ‚Đ° ĐŊа Ņ€Đ°ĐļдаĐŊĐĩ {date}",
"person_hidden": "{name}{hidden, select, true { (ҁĐēŅ€Đ¸Ņ‚)} other {}}",
"photo_shared_all_users": "Đ˜ĐˇĐŗĐģĐĩĐļда, ҇Đĩ ҁ҂Đĩ ҁĐŋОдĐĩĐģиĐģи ҁĐŊиĐŧĐēĐ¸Ņ‚Đĩ ŅĐ¸ ҁ Đ˛ŅĐ¸Ņ‡Đēи ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи иĐģи ĐŊŅĐŧĐ°Ņ‚Đĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи, ҁ ĐēĐžĐ¸Ņ‚Đž да ҁĐŋОдĐĩĐģŅŅ‚Đĩ.",
@@ -1446,6 +1536,7 @@
"profile_drawer_client_out_of_date_minor": "МобиĐģĐŊĐžŅ‚Đž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Đĩ ĐžŅŅ‚Đ°Ņ€ŅĐģĐž. МоĐģŅ, аĐēŅ‚ŅƒĐ°ĐģĐ¸ĐˇĐ¸Ņ€Đ°Đš Đ´Đž ĐŊаК-ĐŊĐžĐ˛Đ°Ņ‚Đ° вĐĩŅ€ŅĐ¸Ņ.",
"profile_drawer_client_server_up_to_date": "КĐģиĐĩĐŊŅ‚Đ° и ŅŅŠŅ€Đ˛ŅŠŅ€Đ° ŅĐ° ОйĐŊОвĐĩĐŊи",
"profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Đ ĐĩĐļиĐŧа ŅĐ°ĐŧĐž Са ҇ĐĩŅ‚ĐĩĐŊĐĩ Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ. ĐĄ Đ´ŅŠĐģĐŗĐž ĐŊĐ°Ņ‚Đ¸ŅĐēаĐŊĐĩ Đ˛ŅŠŅ€Ņ…Ņƒ ĐēĐ°Ņ€Ņ‚Đ¸ĐēĐ°Ņ‚Đ°-Đ°Đ˛Đ°Ņ‚Đ°Ņ€ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģŅ ҉Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Ņ‚Đĩ ŅĐ°ĐŧĐž Са ҇ĐĩŅ‚ĐĩĐŊĐĩ.",
"profile_drawer_server_out_of_date_major": "ВĐĩŅ€ŅĐ¸ŅŅ‚Đ° ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ° Đĩ ĐžŅŅ‚Đ°Ņ€ŅĐģа. МоĐģŅ, аĐēŅ‚ŅƒĐ°ĐģĐ¸ĐˇĐ¸Ņ€Đ°Đš ĐŋĐžĐŊĐĩ Đ´Đž ĐŋĐžŅĐģĐĩĐ´ĐŊĐ°Ņ‚Đ° ĐŗĐģавĐŊа вĐĩŅ€ŅĐ¸Ņ.",
"profile_drawer_server_out_of_date_minor": "ВĐĩŅ€ŅĐ¸ŅŅ‚Đ° ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ° Đĩ ĐžŅŅ‚Đ°Ņ€ŅĐģа. МоĐģŅ, аĐēŅ‚ŅƒĐ°ĐģĐ¸ĐˇĐ¸Ņ€Đ°Đš Đ´Đž ĐŋĐžŅĐģĐĩĐ´ĐŊĐ°Ņ‚Đ° вĐĩŅ€ŅĐ¸Ņ.",
"profile_image_of_user": "ĐŸŅ€ĐžŅ„Đ¸ĐģĐŊа ҁĐŊиĐŧĐēа ĐŊа {user}",
@@ -1484,12 +1575,16 @@
"purchase_server_description_2": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ ĐŊа ĐŋĐžĐ´Đ´Ņ€ŅŠĐļĐŊиĐē",
"purchase_server_title": "ĐĄŅŠŅ€Đ˛ŅŠŅ€",
"purchase_settings_server_activated": "ĐŸŅ€ĐžĐ´ŅƒĐēŅ‚ĐžĐ˛Đ¸ŅŅ‚ ĐēĐģŅŽŅ‡ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ° ҁĐĩ ҃ĐŋŅ€Đ°Đ˛ĐģŅĐ˛Đ° ĐžŅ‚ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ°",
"query_asset_id": "Buscar item per ID",
"queue_status": "В ĐžĐŋĐ°ŅˆĐēа {count} ĐžŅ‚ {total}",
"rating": "ĐžŅ†ĐĩĐŊĐēа ҁҊҁ СвĐĩСди",
"rating_clear": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ¸ ĐžŅ†ĐĩĐŊĐēĐ°Ņ‚Đ°",
"rating_count": "{count, plural, one {# СвĐĩСда} other {# СвĐĩСди}}",
"rating_description": "ПоĐēаĐļи EXIF ĐžŅ†ĐĩĐŊĐēĐ°Ņ‚Đ° в ĐŋаĐŊĐĩĐģа ҁ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ",
"reaction_options": "Đ˜ĐˇĐąĐžŅ€ ĐŊа Ņ€ĐĩаĐēŅ†Đ¸Ņ",
"read_changelog": "ĐŸŅ€ĐžŅ‡ĐĩŅ‚Đ¸ ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ",
"readonly_mode_disabled": "Đ ĐĩĐļиĐŧа ŅĐ°ĐŧĐž Са ҇ĐĩŅ‚ĐĩĐŊĐĩ Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ",
"readonly_mode_enabled": "Đ ĐĩĐļиĐŧа ŅĐ°ĐŧĐž Са ҇ĐĩŅ‚ĐĩĐŊĐĩ Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ",
"reassign": "ĐŸŅ€ĐĩĐŊаСĐŊĐ°Ņ‡Đ°Đ˛Đ°ĐŊĐĩ",
"reassigned_assets_to_existing_person": "ĐŸŅ€ĐĩĐŊаСĐŊĐ°Ņ‡ĐĩĐŊи {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°}} ĐŊа {name, select, null {ŅŅŠŅ‰ĐĩŅŅ‚Đ˛ŅƒĐ˛Đ°Ņ‰ Ņ‡ĐžĐ˛ĐĩĐē} other {{name}}}",
"reassigned_assets_to_new_person": "ĐŸŅ€ĐĩĐŊаСĐŊĐ°Ņ‡ĐĩĐŊи {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°}} ĐŊа ĐŊОв Ņ‡ĐžĐ˛ĐĩĐē",
@@ -1512,6 +1607,9 @@
"refreshing_faces": "ОĐŋŅ€ĐĩҁĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐģĐ¸Ņ†Đ°Ņ‚Đ°",
"refreshing_metadata": "ОĐŋŅ€ĐĩҁĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊĐ¸Ņ‚Đĩ",
"regenerating_thumbnails": "ĐŸŅ€ĐĩŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸Ņ‚Đĩ",
"remote": "На ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"remote_assets": "ОбĐĩĐēŅ‚Đ¸ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"remote_media_summary": "ĐžĐąĐžĐąŅ‰ĐĩĐŊиĐĩ ĐŊа ĐŧĐĩдиКĐŊĐ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģОвĐĩ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"remove": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊи",
"remove_assets_album_confirmation": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°}} ĐžŅ‚ аĐģĐąŅƒĐŧа?",
"remove_assets_shared_link_confirmation": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°}} ĐžŅ‚ Ņ‚ĐžĐˇĐ¸ ҁĐŋĐžĐĩĐ´ĐĩĐģĐĩĐŊ ĐģиĐŊĐē?",
@@ -1549,19 +1647,29 @@
"reset_password": "ĐŅƒĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°",
"reset_people_visibility": "ĐŅƒĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа видиĐŧĐžŅŅ‚Ņ‚Đ° ĐŊа Ņ…ĐžŅ€Đ°Ņ‚Đ°",
"reset_pin_code": "ĐŅƒĐģĐ¸Ņ€Đ°Đš PIN ĐēОда",
"reset_pin_code_description": "АĐēĐž ҁ҂Đĩ ŅĐ¸ ĐˇĐ°ĐąŅ€Đ°Đ˛Đ¸Đģи ПИН ĐēОда, ĐŧĐžĐļĐĩ да ҁĐĩ ĐžĐąŅŠŅ€ĐŊĐĩŅ‚Đĩ ĐēҊĐŧ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ° ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ° Са да ĐŗĐž ĐŊ҃ĐģĐ¸Ņ€Đ°",
"reset_pin_code_success": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐŊ҃ĐģĐ¸Ņ€Đ°ĐŊ ПИН ĐēОд",
"reset_pin_code_with_password": "ĐĄ Đ˛Đ°ŅˆĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа ĐŧĐžĐļĐĩŅ‚Đĩ виĐŊĐ°ĐŗĐ¸ да ĐŊ҃ĐģĐ¸Ņ€Đ°Ņ‚Đĩ ŅĐ˛ĐžŅ ПИН ĐēОд",
"reset_sqlite": "ĐŅƒĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи SQLite",
"reset_sqlite_confirmation": "ĐĐ°Đ¸ŅŅ‚Đ¸ĐŊа Đģи Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐŊ҃ĐģĐ¸Ņ€Đ°Ņ‚Đĩ ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи SQLite? ĐŠĐĩ Ņ‚Ņ€ŅĐąĐ˛Đ° да иСĐģĐĩСĐĩŅ‚Đĩ ĐžŅ‚ ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ° и да ҁĐĩ вĐŋĐ¸ŅˆĐĩŅ‚Đĩ ĐžŅ‚ĐŊОвО Са ĐŊОва ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ",
"reset_sqlite_success": "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐŊ҃ĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° даĐŊĐŊи SQLite",
"reset_to_default": "Đ’Ņ€ŅŠŅ‰Đ°ĐŊĐĩ ĐŊа Ņ„Đ°ĐąŅ€Đ¸Ņ‡ĐŊи ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи",
"resolve_duplicates": "Đ ĐĩŅˆĐ¸ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Đ¸Ņ‚Đĩ",
"resolved_all_duplicates": "Đ’ŅĐ¸Ņ‡Đēи Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Đ¸ ŅĐ° Ņ€Đĩ҈ĐĩĐŊи",
"restore": "Đ’ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ",
"restore_all": "Đ’ŅŠĐˇŅŅ‚Đ°ĐŊОви Đ˛ŅĐ¸Ņ‡Đēи",
"restore_trash_action_prompt": "{count} Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊОвĐĩĐŊи ĐžŅ‚ ĐēĐžŅˆĐ°",
"restore_user": "Đ’ŅŠĐˇŅŅ‚Đ°ĐŊОви ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ",
"restored_asset": "Đ’ŅŠĐˇŅŅ‚Đ°ĐŊОвĐĩĐŊ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚",
"resume": "ĐŸŅ€ĐžĐ´ŅŠĐģĐļаваĐŊĐĩ",
"resume_paused_jobs": "ĐŸŅ€ĐžĐ´ŅŠĐģĐļи иСĐŋҊĐģĐŊĐĩĐŊиĐĩŅ‚Đž ĐŊа {count, plural, one {# ĐˇĐ°Đ´Đ°Ņ‡Đ°} other {# ĐˇĐ°Đ´Đ°Ņ‡Đ¸}}",
"retry_upload": "ОĐŋĐ¸Ņ‚Đ°Đš ĐēĐ°Ņ‡Đ˛Đ°ĐŊĐĩŅ‚Đž ĐžŅ‚ĐŊОвО",
"review_duplicates": "Đ Đ°ĐˇĐŗĐģĐĩдаК Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Đ¸Ņ‚Đĩ",
"review_large_files": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа ĐŗĐžĐģĐĩĐŧи Ņ„Đ°ĐšĐģОвĐĩ",
"role": "Đ ĐžĐģŅ",
"role_editor": "Đ ĐĩдаĐēŅ‚ĐžŅ€",
"role_viewer": "Đ—Ņ€Đ¸Ņ‚ĐĩĐģ",
"running": "ИСĐŋҊĐģĐŊŅĐ˛Đ°ĐŊĐĩ",
"save": "ЗаĐŋаСи",
"save_to_gallery": "ЗаĐŋаСи в ĐŗĐ°ĐģĐĩŅ€Đ¸ŅŅ‚Đ°",
"saved_api_key": "ЗаĐŋаСĐĩĐŊ API Key",
@@ -1648,6 +1756,7 @@
"select_user_for_sharing_page_err_album": "ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа аĐģĐąŅƒĐŧ ĐŊĐĩ ĐąĐĩ ҃ҁĐŋĐĩ҈ĐŊĐž",
"selected": "Đ˜ĐˇĐąŅ€Đ°ĐŊĐž",
"selected_count": "{count, plural, other {# Đ¸ĐˇĐąŅ€Đ°ĐŊи}}",
"selected_gps_coordinates": "Đ˜ĐˇĐąŅ€Đ°ĐŊи GPS ĐēĐžĐžŅ€Đ´Đ¸ĐŊĐ°Ņ‚Đ¸",
"send_message": "ИСĐŋŅ€Đ°Ņ‚ĐĩŅ‚Đĩ ŅŅŠĐžĐąŅ‰ĐĩĐŊиĐĩ",
"send_welcome_email": "ИСĐŋŅ€Đ°Ņ‚ĐĩŅ‚Đĩ иĐŧĐĩĐšĐģ Са Đ´ĐžĐąŅ€Đĩ Đ´ĐžŅˆĐģи",
"server_endpoint": "ĐĐ´Ņ€Đĩҁ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
@@ -1715,6 +1824,7 @@
"shared_link_clipboard_copied_massage": "КоĐŋĐ¸Ņ€Đ°ĐŊĐž в ĐēĐģиĐŋĐąĐžŅ€Đ´Đ°",
"shared_link_clipboard_text": "Đ’Ņ€ŅŠĐˇĐēа: {link}\nĐŸĐ°Ņ€ĐžĐģа: {password}",
"shared_link_create_error": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐŋОдĐĩĐģĐĩĐŊа Đ˛Ņ€ŅŠĐˇĐēа",
"shared_link_custom_url_description": "Đ”ĐžŅŅ‚ŅŠĐŋĐĩŅ‚Đĩ ҁĐŋОдĐĩĐģĐĩĐŊĐ¸Ņ ĐģиĐŊĐē ҁ ĐŋĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ URL Đ°Đ´Ņ€Đĩҁ",
"shared_link_edit_description_hint": "Đ’ŅŠĐ˛Đĩди ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ ĐŊа ҁĐŋОдĐĩĐģĐĩĐŊĐžŅ‚Đž",
"shared_link_edit_expire_after_option_day": "1 Đ´ĐĩĐŊ",
"shared_link_edit_expire_after_option_days": "{count} Đ´ĐŊи",
@@ -1740,6 +1850,7 @@
"shared_link_info_chip_metadata": "EXIF",
"shared_link_manage_links": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ҁĐŋОдĐĩĐģĐĩĐŊĐ¸Ņ‚Đĩ Đ˛Ņ€ŅŠĐˇĐēи",
"shared_link_options": "ОĐŋŅ†Đ¸Đ¸ Са ҁĐŋОдĐĩĐģĐĩĐŊа Đ˛Ņ€ŅŠĐˇĐēа",
"shared_link_password_description": "Đ˜ĐˇĐ¸ŅĐēваĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа Са Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ҁĐŋОдĐĩĐģĐĩĐŊĐ¸Ņ ĐģиĐŊĐē",
"shared_links": "ĐĄĐŋОдĐĩĐģĐĩĐŊи Đ˛Ņ€ŅŠĐˇĐēи",
"shared_links_description": "ĐĄĐŋОдĐĩĐģи ҁĐŊиĐŧĐēи и видĐĩа ҁ ĐģиĐŊĐē",
"shared_photos_and_videos_count": "{assetCount, plural, other {# ҁĐŋОдĐĩĐģĐĩĐŊи ҁĐŊиĐŧĐēи и видĐĩа.}}",
@@ -1774,6 +1885,7 @@
"show_slideshow_transition": "ПоĐēаĐļи ĐŋŅ€ĐĩŅ…ĐžĐ´Đ° ĐŊа ҁĐģĐ°ĐšĐ´ŅˆĐžŅƒŅ‚Đž",
"show_supporter_badge": "ЗĐŊĐ°Ņ‡Đēа ĐŋĐžĐ´Đ´Ņ€ŅŠĐļĐŊиĐē",
"show_supporter_badge_description": "ПоĐēаĐļи СĐŊĐ°Ņ‡Đēа ĐŋĐžĐ´Đ´Ņ€ŅŠĐļĐŊиĐē",
"show_text_search_menu": "ПоĐēаĐļи ĐŧĐĩĐŊŅŽŅ‚Đž Са Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ ĐŊа Ņ‚ĐĩĐēҁ҂",
"shuffle": "Đ Đ°ĐˇĐąŅŠŅ€ĐēваĐŊĐĩ",
"sidebar": "ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ‡ĐŊа ĐģĐĩĐŊŅ‚Đ°",
"sidebar_display_description": "ПоĐēаСваĐŊĐĩ ĐŊа Đ˛Ņ€ŅŠĐˇĐēа ĐēҊĐŧ Đ¸ĐˇĐŗĐģĐĩда в ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ‡ĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ°",
@@ -1789,6 +1901,7 @@
"sort_created": "Đ”Đ°Ņ‚Đ° ĐŊа ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ",
"sort_items": "Đ‘Ņ€ĐžĐš ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸",
"sort_modified": "Đ”Đ°Ņ‚Đ° ĐŊа ĐŋŅ€ĐžĐŧŅĐŊа",
"sort_newest": "Най-ĐŊОви ҁĐŊиĐŧĐēи",
"sort_oldest": "Най-ŅŅ‚Đ°Ņ€Đ°Ņ‚Đ° ҁĐŊиĐŧĐēа",
"sort_people_by_similarity": "ĐĄĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ…ĐžŅ€Đ° ĐŋĐž ĐŋŅ€Đ¸ĐģиĐēа",
"sort_recent": "Най-ĐŊĐžĐ˛Đ°Ņ‚Đ° ҁĐŊиĐŧĐēа",
@@ -1815,6 +1928,7 @@
"storage_quota": "ĐšĐ˛ĐžŅ‚Đ° ĐŊа Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰ĐĩŅ‚Đž",
"storage_usage": "ИСĐŋĐžĐģСваĐŊи {used} ĐžŅ‚ {available}",
"submit": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ",
"success": "ĐŖŅĐŋĐĩ҈ĐŊĐž",
"suggestions": "ĐŸŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ",
"sunrise_on_the_beach": "Đ˜ĐˇĐŗŅ€Đĩв ĐŊа ĐŋĐģаĐļа",
"support": "ĐŸĐžĐ´Đ´Ņ€ŅŠĐļĐēа",
@@ -1824,6 +1938,10 @@
"sync": "ХиĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ",
"sync_albums": "ХиĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа аĐģĐąŅƒĐŧи",
"sync_albums_manual_subtitle": "ХиĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ¸Ņ€Đ°Đš Đ˛ŅĐ¸Ņ‡Đēи ĐˇĐ°Ņ€ĐĩĐ´ĐĩĐŊи видĐĩа и ҁĐŊиĐŧĐēи в Đ¸ĐˇĐąŅ€Đ°ĐŊĐ¸Ņ‚Đĩ Đ°Ņ€Ņ…Đ¸Đ˛ĐŊи аĐģĐąŅƒĐŧи",
"sync_local": "ЛоĐēаĐģĐŊа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ",
"sync_remote": "ХиĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ ҁҊҁ ŅŅŠŅ€Đ˛ŅŠŅ€Đ°",
"sync_status": "ĐĄŅŠŅŅ‚ĐžŅĐŊиĐĩ ĐŊа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ°",
"sync_status_subtitle": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ и ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ° Са ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ",
"sync_upload_album_setting_subtitle": "ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐšŅ‚Đĩ и ĐˇĐ°Ņ€ĐĩĐļĐ´Đ°ĐšŅ‚Đĩ ҁĐŊиĐŧĐēи и видĐĩа в Đ¸ĐˇĐąŅ€Đ°ĐŊи аĐģĐąŅƒĐŧи в Immich",
"tag": "ĐĸĐ°Đŗ",
"tag_assets": "ĐĸĐ°ĐŗĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸",
@@ -1834,6 +1952,7 @@
"tag_updated": "АĐēŅ‚ŅƒĐ°ĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ ĐĩŅ‚Đ¸ĐēĐĩŅ‚: {tag}",
"tagged_assets": "ĐĸĐ°ĐŗĐŊĐ°Ņ‚Đ¸ {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸}}",
"tags": "Đ•Ņ‚Đ¸ĐēĐĩŅ‚",
"tap_to_run_job": "ДоĐēĐžŅĐŊĐĩŅ‚Đĩ, Са да ŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°Ņ‚Đĩ ĐˇĐ°Đ´Đ°Ņ‡Đ°Ņ‚Đ°",
"template": "ШайĐģĐžĐŊ",
"theme": "ĐĸĐĩĐŧа",
"theme_selection": "Đ˜ĐˇĐąĐžŅ€ ĐŊа Ņ‚ĐĩĐŧа",
@@ -1860,7 +1979,9 @@
"to_change_password": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°",
"to_favorite": "Đ›ŅŽĐąĐ¸Đŧ",
"to_login": "ВĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ",
"to_multi_select": "Са Đ¸ĐˇĐąĐžŅ€ ĐŊа ĐŊŅĐēĐžĐģĐēĐž",
"to_parent": "ĐžŅ‚Đ¸Đ´Đ¸ ĐēҊĐŧ Ņ€ĐžĐ´Đ¸Ņ‚ĐĩĐģҁĐēĐ¸Ņ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚",
"to_select": "Са Đ¸ĐˇĐąĐžŅ€",
"to_trash": "ĐšĐžŅˆŅ‡Đĩ",
"toggle_settings": "ĐŸŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ",
"total": "ĐžĐąŅ‰Đž",
@@ -1880,6 +2001,7 @@
"trash_page_select_assets_btn": "ИСйĐĩŅ€Đ¸ ОйĐĩĐēŅ‚Đ¸",
"trash_page_title": "В ĐēĐžŅˆĐ° ({count})",
"trashed_items_will_be_permanently_deleted_after": "Đ˜ĐˇŅ…Đ˛ŅŠŅ€ĐģĐĩĐŊĐ¸Ņ‚Đĩ в ĐēĐžŅˆŅ‡ĐĩŅ‚Đž ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đ¸ Са ĐŋĐžŅŅ‚ĐžŅĐŊĐŊĐž ҁĐģĐĩĐ´ {days, plural, one {# Đ´ĐĩĐŊ} other {# Đ´ĐŊи}}.",
"troubleshoot": "ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐąĐģĐĩĐŧи",
"type": "ĐĸиĐŋ",
"unable_to_change_pin_code": "НĐĩĐ˛ŅŠĐˇĐŧĐžĐļĐŊа ĐŋŅ€ĐžĐŧŅĐŊа ĐŊа PIN ĐēОда",
"unable_to_setup_pin_code": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž СадаваĐŊĐĩ ĐŊа PIN ĐēОда",
@@ -1910,13 +2032,17 @@
"unstacked_assets_count": "РаСĐēĐ°Ņ‡ĐĩĐŊи {count, plural, one {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚} other {# ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸}}",
"untagged": "НĐĩĐŧĐ°Ņ€ĐēĐ¸Ņ€Đ°ĐŊи",
"up_next": "ĐĄĐģĐĩĐ´Đ˛Đ°Ņ‰",
"update_location_action_prompt": "ОбĐŊОви ĐēĐžĐžŅ€Đ´Đ¸ĐŊĐ°Ņ‚Đ¸Ņ‚Đĩ ĐŊа {count} Đ¸ĐˇĐąŅ€Đ°ĐŊи ОйĐĩĐēŅ‚Đ° ҁ:",
"updated_at": "ОбĐŊОвĐĩĐŊĐž",
"updated_password": "ĐŸĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° Đĩ аĐēŅ‚ŅƒĐ°ĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊа",
"upload": "ĐšĐ°Ņ‡Đ˛Đ°ĐŊĐĩ",
"upload_action_prompt": "{count} ĐŊа ĐžĐŋĐ°ŅˆĐēа Са ĐēĐ°Ņ‡Đ˛Đ°ĐŊĐĩ",
"upload_concurrency": "ĐŖŅĐŋĐžŅ€ĐĩĐ´ĐŊи ĐēĐ°Ņ‡Đ˛Đ°ĐŊĐ¸Ņ",
"upload_details": "ДĐĩŅ‚Đ°ĐšĐģи Са ĐēĐ°Ņ‡Đ˛Đ°ĐŊĐĩŅ‚Đž",
"upload_dialog_info": "Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да Đ°Ņ€Ņ…Đ¸Đ˛Đ¸Ņ€Đ°Ņ‚Đĩ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ° Đ¸ĐˇĐąŅ€Đ°ĐŊĐ¸Ņ‚Đĩ ОйĐĩĐēŅ‚Đ¸?",
"upload_dialog_title": "ĐšĐ°Ņ‡Đ¸ ОйĐĩĐēŅ‚",
"upload_errors": "ĐšĐ°Ņ‡Đ˛Đ°ĐŊĐĩŅ‚Đž Đĩ ĐˇĐ°Đ˛ŅŠŅˆĐĩĐŊĐž ҁ {count, plural, one {# ĐŗŅ€Đĩ҈Đēа} other {# ĐŗŅ€Đĩ҈Đēи}}, ОйĐŊОвĐĩŅ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° Са да Đ˛Đ¸Đ´Đ¸Ņ‚Đĩ ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸.",
"upload_finished": "ĐšĐ°Ņ‡Đ˛Đ°ĐŊĐĩŅ‚Đž ĐˇĐ°Đ˛ŅŠŅ€ŅˆĐ¸",
"upload_progress": "ĐžŅŅ‚Đ°Đ˛Đ°Ņ‚ {remaining, number} - ĐžĐąŅ€Đ°ĐąĐžŅ‚ĐĩĐŊи {processed, number}/{total, number}",
"upload_skipped_duplicates": "ĐŸŅ€ĐĩҁĐēĐžŅ‡ĐĩĐŊи {count, plural, one {# Đ´ŅƒĐąĐģĐ¸Ņ€Đ°ĐŊ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚} other {# Đ´ŅƒĐąĐģĐ¸Ņ€Đ°ĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸}}",
"upload_status_duplicates": "Đ”ŅƒĐąĐģиĐēĐ°Ņ‚Đ¸",
@@ -1925,6 +2051,7 @@
"upload_success": "ĐšĐ°Ņ‡Đ˛Đ°ĐŊĐĩŅ‚Đž Đĩ ҃ҁĐŋĐĩ҈ĐŊĐž, ĐžĐŋŅ€ĐĩҁĐŊĐĩŅ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°, Са да Đ˛Đ¸Đ´Đ¸Ņ‚Đĩ ĐŊĐžĐ˛Đ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģОвĐĩ.",
"upload_to_immich": "КазваĐŊĐĩ в Immich ({count})",
"uploading": "ĐšĐ°Ņ‡Đ˛Đ°ĐŧĐĩ",
"uploading_media": "ĐšĐ°Ņ‡Đ˛Đ°ĐŊĐĩ ĐŊа ĐŧĐĩдиКĐŊи Ņ„Đ°ĐšĐģОвĐĩ",
"url": "URL",
"usage": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐģĐĩĐŊиĐĩ",
"use_biometric": "ИСĐŋĐžĐģСваК йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ",
@@ -1945,6 +2072,7 @@
"user_usage_stats_description": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸ĐēĐ°Ņ‚Đ° Са иСĐŋĐžĐģСваĐŊĐĩŅ‚Đž ĐŊа аĐēĐ°ŅƒĐŊŅ‚Đ°",
"username": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐž иĐŧĐĩ",
"users": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи",
"users_added_to_album_count": "{count, plural, one {ДобавĐĩĐŊ Đĩ # ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ} other {ДобавĐĩĐŊи ŅĐ° # ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģŅ}} ĐŊа аĐģĐąŅƒĐŧа",
"utilities": "ИĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ¸",
"validate": "ВаĐģĐ¸Đ´Đ¸Ņ€Đ°ĐŊĐĩ",
"validate_endpoint_error": "МоĐģŅ, Đ˛ŅŠĐ˛Đĩди ĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ URL",
@@ -1963,6 +2091,7 @@
"view_album": "Đ Đ°ĐˇĐŗĐģĐĩдаК аĐģĐąŅƒĐŧа",
"view_all": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа Đ˛ŅĐ¸Ņ‡Đēи",
"view_all_users": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа Đ˛ŅĐ¸Ņ‡Đēи ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи",
"view_details": "ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸ Са Đ¸ĐˇĐŗĐģĐĩда",
"view_in_timeline": "ПоĐēаĐļи Đ˛ŅŠĐ˛ Đ˛Ņ€ĐĩĐŧĐĩва ĐģиĐŊĐ¸Ņ",
"view_link": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа Đ˛Ņ€ŅŠĐˇĐēĐ°Ņ‚Đ°",
"view_links": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа Đ˛Ņ€ŅŠĐˇĐēĐ¸Ņ‚Đĩ",
@@ -1970,6 +2099,7 @@
"view_next_asset": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа ҁĐģĐĩĐ´Đ˛Đ°Ņ‰Đ¸Ņ Ņ„Đ°ĐšĐģ",
"view_previous_asset": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа ĐŋŅ€ĐĩĐ´Đ¸ŅˆĐŊĐ¸Ņ Ņ„Đ°ĐšĐģ",
"view_qr_code": "ВиĐļ QR ĐēОда",
"view_similar_photos": "ВиĐļ ĐŋОдОйĐŊи ҁĐŊиĐŧĐēи",
"view_stack": "ПоĐēаĐļи в ҁ҂ĐĩĐē",
"view_user": "ВиĐļ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģŅ",
"viewer_remove_from_stack": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐžŅ‚ ĐžĐŋĐ°ŅˆĐēĐ°Ņ‚Đ°",
@@ -1988,5 +2118,6 @@
"yes": "Да",
"you_dont_have_any_shared_links": "ĐŅĐŧĐ°Ņ‚Đĩ ҁĐŋОдĐĩĐģĐĩĐŊи Đ˛Ņ€ŅŠĐˇĐēи",
"your_wifi_name": "Đ’Đ°ŅˆĐ°Ņ‚Đ° Wi-Fi ĐŧŅ€ĐĩĐļа",
"zoom_image": "ĐŖĐ˛ĐĩĐģĐ¸Ņ‡Đ°Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž"
"zoom_image": "ĐŖĐ˛ĐĩĐģĐ¸Ņ‡Đ°Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž",
"zoom_to_bounds": "ĐŸŅ€Đ¸ĐąĐģиĐļи Đ´Đž ŅŅŠĐąĐ¸Ņ€Đ°ĐŊĐĩ в ĐŗŅ€Đ°ĐŊĐ¸Ņ†Đ¸Ņ‚Đĩ"
}

View File

@@ -14,5 +14,10 @@
"add_exclusion_pattern": "Putem wan paten wae hemi karem aot",
"add_import_path": "Putem wan pat blo import",
"add_location": "Putem wan place blo hem",
"add_more_users": "Putem mor man"
"add_more_users": "Putem mor man",
"readonly_mode_enabled": "Mod blo yu no save janjem i on",
"reassigned_assets_to_new_person": "Janjem{count, plural, one {# asset} other {# assets}} blo nu man",
"reassing_hint": "janjem ol sumtin yu bin joos i go blo wan man",
"recent-albums": "album i no old tu mas",
"recent_searches": "lukabout wea i no old tu mas"
}

View File

@@ -14,6 +14,7 @@
"add_a_location": "āĻāĻ•āϟāĻŋ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āϝ⧋āĻ— āĻ•āϰ⧁āύ",
"add_a_name": "āĻāĻ•āϟāĻŋ āύāĻžāĻŽ āϝ⧋āĻ— āĻ•āϰ⧁āύ",
"add_a_title": "āĻāĻ•āϟāĻŋ āĻļāĻŋāϰ⧋āύāĻžāĻŽ āϝ⧋āĻ— āĻ•āϰ⧁āύ",
"add_birthday": "āĻāĻ•āϟāĻŋ āϜāĻ¨ā§āĻŽāĻĻāĻŋāύ āϝ⧋āĻ— āĻ•āϰ⧁āύ",
"add_endpoint": "āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϝ⧋āĻ— āĻ•āϰ⧁āύ",
"add_exclusion_pattern": "āĻŦāĻšāĻŋāĻ°ā§āĻ­ā§‚āϤāĻ•āϰāĻŖ āύāĻŽā§āύāĻž",
"add_import_path": "āχāĻŽāĻĒā§‹āĻ°ā§āϟ āĻ•āϰāĻžāϰ āĻĒāĻžāĻĨ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ",
@@ -27,6 +28,9 @@
"add_to_album": "āĻāϞāĻŦāĻžāĻŽ āĻ āϝ⧋āĻ— āĻ•āϰ⧁āύ",
"add_to_album_bottom_sheet_added": "{album} āĻ āϝ⧋āĻ— āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇",
"add_to_album_bottom_sheet_already_exists": "{album} āĻ āφāϗ⧇ āĻĨ⧇āϕ⧇āχ āφāϛ⧇",
"add_to_album_toggle": "{album} - āĻāϰ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧁āύ",
"add_to_albums": "āĻ…ā§āϝāĻžāϞāĻŦāĻžāĻŽā§‡ āϝ⧋āĻ— āĻ•āϰ⧁āύ",
"add_to_albums_count": "āĻ…ā§āϝāĻžāϞāĻŦāĻžāĻŽā§‡ āϝ⧋āĻ— āĻ•āϰ⧁āύ ({count})",
"add_to_shared_album": "āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰāĻž āĻ…ā§āϝāĻžāϞāĻŦāĻžāĻŽā§‡ āϝ⧋āĻ— āĻ•āϰ⧁āύ",
"add_url": "āϞāĻŋāĻ™ā§āĻ• āϝ⧋āĻ— āĻ•āϰ⧁āύ",
"added_to_archive": "āφāĻ°ā§āĻ•āĻžāχāĻ­ āĻ āϝ⧋āĻ— āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇",
@@ -44,6 +48,13 @@
"backup_database": "āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĄāĻžāĻŽā§āĻĒ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ",
"backup_database_enable_description": "āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĄāĻžāĻŽā§āĻĒ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ",
"backup_keep_last_amount": "āφāϗ⧇āϰ āĻĄāĻžāĻŽā§āĻĒ⧇āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āϰāĻžāĻ–āĻž āĻšāĻŦ⧇",
"backup_onboarding_1_description": "āĻ…āĻĢāϏāĻžāχāϟ āĻ•āĻĒāĻŋ āĻ•ā§āϞāĻžāωāĻĄā§‡ āĻ…āĻĨāĻŦāĻž āĻ…āĻ¨ā§āϝ āϕ⧋āύāĻ“ āϭ⧌āϤ āĻ¸ā§āĻĨāĻžāύ⧇āĨ¤",
"backup_onboarding_2_description": "āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻ•āĻĒāĻŋāĨ¤ āĻāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ āĻĒā§āϰāϧāĻžāύ āĻĢāĻžāχāϞ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧāĻ­āĻžāĻŦ⧇ āϏ⧇āχ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϰ āĻŦā§āϝāĻžāĻ•āφāĻĒāĨ¤",
"backup_onboarding_3_description": "āĻŽā§‚āϞ āĻĢāĻžāχāϞ āϏāĻš āφāĻĒāύāĻžāϰ āĻĄā§‡āϟāĻžāϰ āĻŽā§‹āϟ āĻ•āĻĒāĻŋāĨ¤ āĻāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ ā§§āϟāĻŋ āĻ…āĻĢāϏāĻžāχāϟ āĻ•āĻĒāĻŋ āĻāĻŦāĻ‚ ⧍āϟāĻŋ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻ•āĻĒāĻŋāĨ¤",
"backup_onboarding_description": "āφāĻĒāύāĻžāϰ āĻĄā§‡āϟāĻž āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āϰāĻžāĻ–āĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ <backblaze-link>3-2-1 āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻ•ā§ŒāĻļāϞ</backblaze-link> āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻŦā§āϝāĻžāĻ•āφāĻĒ āϏāĻŽāĻžāϧāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϰ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻĢāĻŸā§‹/āĻ­āĻŋāĻĄāĻŋāĻ“āϗ⧁āϞāĻŋāϰ āĻ•āĻĒāĻŋ āĻāĻŦāĻ‚ Immich āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āϰāĻžāĻ–āĻž āωāϚāĻŋāϤāĨ¤",
"backup_onboarding_footer": "Immich āĻāϰ āĻŦā§āϝāĻžāĻ•āφāĻĒ āύ⧇āĻ“ā§ŸāĻžāϰ āĻŦāĻŋāĻˇā§Ÿā§‡ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ, āĻ…āύ⧁āĻ—ā§āϰāĻš āĻ•āϰ⧇ <link>āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ</link> āĻĻ⧇āϖ⧁āύāĨ¤",
"backup_onboarding_parts_title": "ā§Š-⧍-ā§§ āĻŦā§āϝāĻžāĻ•āφāĻĒ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇:",
"backup_onboarding_title": "āĻŦā§āϝāĻžāĻ•āφāĻĒ",
"backup_settings": "āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĄāĻžāĻŽā§āĻĒ āϏ⧇āϟāĻŋāĻ‚āϏ",
"backup_settings_description": "āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĄāĻžāĻŽā§āĻĒ āϏ⧇āϟāĻŋāĻ‚āϏ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύāĨ¤",
"cleared_jobs": "{job} āĻāϰ āϜāĻ¨ā§āϝ jobs āĻ–āĻžāϞāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇",
@@ -64,7 +75,7 @@
"external_library_management": "āĻŦāĻšāĻŋāϰāĻžāĻ—āϤ āĻ—ā§āϰāĻ¨ā§āĻĨāĻžāĻ—āĻžāϰ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž",
"face_detection": "āĻŽā§āĻ– āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ",
"face_detection_description": "āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…ā§āϝāĻžāϏ⧇āĻŸā§‡ āĻĨāĻžāĻ•āĻž āĻŽā§āĻ–/āĻšā§‡āĻšāĻžāϰāĻž āϗ⧁āϞāĻŋ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰ⧁āύāĨ¤ āĻ­āĻŋāĻĄāĻŋāĻ“ āϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ \"āϰāĻŋāĻĢā§āϰ⧇āĻļ\" (āĻĒ⧁āύāϰāĻžāϝāĻŧ) āϏāĻŽāĻ¸ā§āϤ āĻ…ā§āϝāĻžāϏ⧇āϟ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰ⧇āĨ¤ \"āϰāĻŋāϏ⧇āϟ\" āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤāĻ­āĻžāĻŦ⧇ āϏāĻŽāĻ¸ā§āϤ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŽā§āϖ⧇āϰ āĻĄā§‡āϟāĻž āϏāĻžāĻĢ āĻ•āϰ⧇āĨ¤ \"āĻ…āύ⧁āĻĒāĻ¸ā§āĻĨāĻŋāϤ\" āĻ…ā§āϝāĻžāϏ⧇āϟāϗ⧁āϞāĻŋāϕ⧇ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻ•āϰ⧇ āϝāĻž āĻāĻ–āύāĻ“ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āĻŽā§āĻ–āϗ⧁āϞāĻŋāϕ⧇ āĻĢ⧇āϏāĻŋāϝāĻŧāĻžāϞ āϰāĻŋāĻ•āĻ—āύāĻŋāĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻ•āϰāĻž āĻšāĻŦ⧇, āĻĢ⧇āϏāĻŋāϝāĻŧāĻžāϞ āĻĄāĻŋāĻŸā§‡āĻ•āĻļāύ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇, āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦāĻž āύāϤ⧁āύ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻĻ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻ—ā§‹āĻˇā§āĻ ā§€āĻŦāĻĻā§āϧ āĻ•āϰ⧇āĨ¤",
"facial_recognition_job_description": "āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āĻŽā§āĻ–āϗ⧁āϞāĻŋāϕ⧇ āĻŽāĻžāύ⧁āώ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻ—ā§‹āĻˇā§āĻ ā§€āϭ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύāĨ¤ āĻŽā§āĻ– āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇ āĻāχ āϧāĻžāĻĒāϟāĻŋ āϚāϞ⧇āĨ¤ \"āϰāĻŋāϏ⧇āϟ\" (āĻĒ⧁āύāϰāĻžāϝāĻŧ) āϏāĻŽāĻ¸ā§āϤ āĻŽā§āĻ–āϕ⧇ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻ•āϰ⧇āĨ¤ \"āĻ…āύ⧁āĻĒāĻ¸ā§āĻĨāĻŋāϤ\" āĻŽā§āĻ–āϗ⧁āϞāĻŋāϕ⧇ āϏāĻžāϰāĻŋāϤ⧇ āϰāĻžāϖ⧇ āϝ⧇āĻ–āĻžāύ⧇ āϕ⧋āύāĻ“ āĻŦā§āϝāĻ•ā§āϤāĻŋāϕ⧇ āĻŦāϰāĻžāĻĻā§āĻĻ āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤",
"facial_recognition_job_description": "āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āĻŽā§āĻ–āϗ⧁āϞāĻŋāϕ⧇ āĻŽāĻžāύ⧁āώ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻ—ā§‹āĻˇā§āĻ ā§€āϭ⧁āĻ•ā§āϤ/āĻ—ā§āϰ⧁āĻĒ āĻ•āϰ⧁āύāĨ¤ āĻŽā§āĻ– āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇ āĻāχ āϧāĻžāĻĒāϟāĻŋ āϚāϞ⧇āĨ¤ \"āϰāĻŋāϏ⧇āϟ\" (āĻĒ⧁āύāϰāĻžāϝāĻŧ) āϏāĻŽāĻ¸ā§āϤ āĻŽā§āĻ–āϕ⧇ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻ•āϰ⧇āĨ¤ \"āĻ…āύ⧁āĻĒāĻ¸ā§āĻĨāĻŋāϤ/āĻŽāĻŋāϏāĻŋāĻ‚\" āĻŽā§āĻ–āϗ⧁āϞāĻŋāϕ⧇ āϏāĻžāϰāĻŋāϤ⧇ āϰāĻžāϖ⧇ āϝ⧇āϗ⧁āϞ⧋ āϕ⧋āύāĻ“ āĻŦā§āϝāĻ•ā§āϤāĻŋāϕ⧇ āĻāϏāĻžāχāύ/āĻŦāϰāĻžāĻĻā§āĻĻ āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤",
"failed_job_command": "āĻ•āĻŽāĻžāĻ¨ā§āĻĄ {command} āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ⧇āϛ⧇: {job}",
"force_delete_user_warning": "āϏāϤāĻ°ā§āĻ•āϤāĻž: āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻāĻŦāĻ‚ āϏāĻŽāĻ¸ā§āϤ āϏāĻŽā§āĻĒāĻĻ āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āϏāϰāĻŋāϝāĻŧ⧇ āĻĢ⧇āϞāĻŦ⧇āĨ¤ āĻāϟāĻŋ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĢ⧇āϰāĻžāύ⧋ āϝāĻžāĻŦ⧇ āύāĻž āĻāĻŦāĻ‚ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻž āϝāĻžāĻŦ⧇ āύāĻžāĨ¤",
"image_format": "āĻĢāϰāĻŽā§āϝāĻžāϟ",
@@ -75,9 +86,9 @@
"image_fullsize_quality_description": "āĻĒā§‚āĻ°ā§āĻŖ-āφāĻ•āĻžāϰ⧇āϰ āĻ›āĻŦāĻŋāϰ āĻŽāĻžāύ ā§§-ā§§ā§Ļā§ĻāĨ¤ āωāĻšā§āϚāϤāϰ āĻšāϞ⧇ āĻ­āĻžāϞ⧋, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāϰāĻ“ āĻŦāĻĄāĻŧ āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻšāϝāĻŧāĨ¤",
"image_fullsize_title": "āĻĒā§‚āĻ°ā§āĻŖ-āφāĻ•āĻžāϰ⧇āϰ āϚāĻŋāĻ¤ā§āϰ āϏ⧇āϟāĻŋāĻ‚āϏ",
"image_prefer_embedded_preview": "āĻāĻŽā§āĻŦ⧇āĻĄ āĻ•āϰāĻž āĻĒā§āϰāĻŋāĻ­āĻŋāω āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧁āύ",
"image_prefer_embedded_preview_setting_description": "āĻ›āĻŦāĻŋ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻŦāĻ‚ āϝāĻ–āύāχ āωāĻĒāϞāĻŦā§āϧ āĻĨāĻžāĻ•āĻŦ⧇ āϤāĻ–āύ RAW āĻĢāĻŸā§‹āϤ⧇ āĻāĻŽāĻŦ⧇āĻĄā§‡āĻĄ āĻĒā§āϰāĻŋāĻ­āĻŋāω āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻāϟāĻŋ āĻ•āĻŋāϛ⧁ āĻ›āĻŦāĻŋāϰ āϜāĻ¨ā§āϝ āφāϰāĻ“ āϏāĻ āĻŋāĻ• āϰāĻ™ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻŦ⧇ āĻĒā§āϰāĻŋāĻ­āĻŋāωāϝāĻŧ⧇āϰ āĻŽāĻžāύ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž-āύāĻŋāĻ°ā§āĻ­āϰ āĻāĻŦāĻ‚ āĻ›āĻŦāĻŋāϤ⧇ āφāϰāĻ“ āĻ•āĻŽā§āĻĒā§āϰ⧇āĻļāύ āφāĻ°ā§āϟāĻŋāĻĢā§āϝāĻžāĻ•ā§āϟ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤",
"image_prefer_embedded_preview_setting_description": "āϝāĻĻāĻŋ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§Ÿ, RAW āĻ›āĻŦāĻŋāϰ āϭ⧇āϤāϰ⧇ āĻĨāĻžāĻ•āĻž āĻĒā§āϰāĻŋāĻ­āĻŋāω āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻāϤ⧇ āĻ•āĻŋāϛ⧁ āĻ›āĻŦāĻŋāϰ āϰāĻ™ āφāϰāĻ“ āϏāĻ āĻŋāĻ• āĻĻ⧇āĻ–āĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻŦ⧇ āĻŽāĻžāύ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻžāϰ āĻ“āĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻ›āĻŦāĻŋāϤ⧇ āĻŦāĻžā§œāϤāĻŋ āĻ•āĻŽāĻĒā§āϰ⧇āĻļāύ āφāĻ°ā§āϟāĻŋāĻĢā§āϝāĻžāĻ•ā§āϟ āĻĻ⧇āĻ–āĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤",
"image_prefer_wide_gamut": "āĻĒā§āϰāĻļāĻ¸ā§āϤ āĻĒāϰāĻŋāϏāϰ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧁āύ",
"image_prefer_wide_gamut_setting_description": "āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻĄāĻŋāϏāĻĒā§āϞ⧇ P3 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻāϟāĻŋ āĻĒā§āϰāĻļāĻ¸ā§āϤ āϰāϙ⧇āϰ āĻ¸ā§āĻĨāĻžāύ āϏāĻš āĻ›āĻŦāĻŋāϰ āĻĒā§āϰāĻžāĻŖāĻŦāĻ¨ā§āϤāϤāĻž āφāϰāĻ“ āĻ­āĻžāϞāĻ­āĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇, āϤāĻŦ⧇ āĻĒ⧁āϰāĻžāύ⧋ āĻŦā§āϰāĻžāωāϜāĻžāϰ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ āϏāĻš āĻĒ⧁āϰāĻžāύ⧋ āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋāϤ⧇ āĻ›āĻŦāĻŋāϗ⧁āϞāĻŋ āĻ­āĻŋāĻ¨ā§āύāĻ­āĻžāĻŦ⧇ āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϰāϙ⧇āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻāĻĄāĻŧāĻžāϤ⧇ sRGB āĻ›āĻŦāĻŋāϗ⧁āϞāĻŋāϕ⧇ sRGB āĻšāĻŋāϏāĻžāĻŦ⧇ āϰāĻžāĻ–āĻž āĻšāϝāĻŧāĨ¤",
"image_prefer_wide_gamut_setting_description": "āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ⧇āϰ āϜāĻ¨ā§āϝ Display P3 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻāϟāĻŋ āĻ“ā§ŸāĻžāχāĻĄ āĻ•āĻžāϞāĻžāϰāĻ¸ā§āĻĒ⧇āϏ āĻ›āĻŦāĻŋāϰ āωāĻœā§āĻœā§āĻŦāϞāϤāĻž āĻ“ āĻĒā§āϰāĻžāĻŖāĻŦāĻ¨ā§āϤ āϰāĻ™ āĻ­āĻžāϞ⧋āĻ­āĻžāĻŦ⧇ āϧāϰ⧇ āϰāĻžāϖ⧇, āϤāĻŦ⧇ āĻĒ⧁āϰāύ⧋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻŦāĻž āĻŦā§āϰāĻžāωāϜāĻžāϰ⧇ āĻ›āĻŦāĻŋāϗ⧁āϞ⧋ āĻ­āĻŋāĻ¨ā§āύāĻ­āĻžāĻŦ⧇ āĻĻ⧇āĻ–āĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ sRGB āĻ›āĻŦāĻŋāϗ⧁āϞ⧋ āϰāϙ⧇āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻā§œāĻžāϤ⧇ sRGB āĻšāĻŋāϏ⧇āĻŦ⧇āχ āϰāĻžāĻ–āĻž āĻšāĻŦ⧇āĨ¤",
"image_preview_description": "āĻ¸ā§āĻŸā§āϰāĻŋāĻĒāĻĄ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž āϏāĻš āĻŽāĻžāĻāĻžāϰāĻŋ āφāĻ•āĻžāϰ⧇āϰ āĻ›āĻŦāĻŋ, āĻāĻ•āϟāĻŋ āĻāĻ•āĻ• āϏāĻŽā§āĻĒāĻĻ āĻĻ⧇āĻ–āĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŦāĻ‚ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ",
"image_preview_quality_description": "ā§§-ā§§ā§Ļā§Ļ āĻāϰ āĻŽāĻ§ā§āϝ⧇ āĻĒā§āϰāĻŋāĻ­āĻŋāω āϕ⧋āϝāĻŧāĻžāϞāĻŋāϟāĻŋāĨ¤ āĻŦ⧇āĻļāĻŋ āĻšāϞ⧇ āĻ­āĻžāϞ⧋, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŦāĻĄāĻŧ āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻļā§€āϞāϤāĻž āĻ•āĻŽāĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻ•āĻŽ āĻŽāĻžāύ āϏ⧇āϟ āĻ•āϰāϞ⧇ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϕ⧋āϝāĻŧāĻžāϞāĻŋāϟāĻŋāϰ āωāĻĒāϰ āĻĒā§āϰāĻ­āĻžāĻŦ āĻĒāĻĄāĻŧāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤",
"image_preview_title": "āĻĒā§āϰāĻŋāĻ­āĻŋāω āϏ⧇āϟāĻŋāĻ‚āϏ",
@@ -91,9 +102,30 @@
"image_thumbnail_title": "āĻĨāĻžāĻŽā§āĻŦāύ⧇āϞ āϏ⧇āϟāĻŋāĻ‚āϏ",
"job_concurrency": "{job} āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ",
"job_created": "Job āϤ⧈āϰāĻŋ āĻšāϝāĻŧ⧇āϛ⧇",
"job_not_concurrency_safe": "āĻāχ āĻ•āĻžāϜāϟāĻŋ āϏāĻŽāĻ•āĻžāϞ⧀āύ-āύāĻŋāϰāĻžāĻĒāĻĻ āύāϝāĻŧāĨ¤",
"job_not_concurrency_safe": "āĻāχ āĻ•āĻžāϜāϟāĻŋ āϏāĻŽāĻžāĻ¨ā§āϤāϰāĻžāϞāĻ­āĻžāĻŦ⧇ āϚāĻžāϞāĻžāύ⧋ āύāĻŋāϰāĻžāĻĒāĻĻ āύ⧟",
"job_settings": "āĻ•āĻžāĻœā§‡āϰ āϏ⧇āϟāĻŋāĻ‚āϏ",
"job_settings_description": "āĻ•āĻžāĻœā§‡āϰ āϏāĻŽāĻžāĻ¨ā§āϤāϰāĻžāϞāϤāĻž āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ",
"job_status": "āϚāĻžāĻ•āϰāĻŋāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻž"
"job_status": "āϚāĻžāĻ•āϰāĻŋāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻž",
"jobs_delayed": "{jobCount, plural, other {# āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ}}",
"jobs_failed": "{jobCount, plural, other {# āĻŦā§āϝāĻ°ā§āĻĨ}}",
"library_created": "āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āσ {library}",
"library_deleted": "āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāϝāĻŧ⧇āϛ⧇",
"library_import_path_description": "āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ/āϝ⧋āĻ— āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧁āύāĨ¤ āϏāĻžāĻŦāĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āϏāĻš āĻāχ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰāϟāĻŋ āĻ›āĻŦāĻŋ āĻāĻŦāĻ‚ āĻ­āĻŋāĻĄāĻŋāĻ“āϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻ•ā§āϝāĻžāύ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤",
"library_scanning": "āĻĒāĻ°ā§āϝāĻžāϝāĻŧāĻ•ā§āϰāĻŽāĻŋāĻ• āĻ¸ā§āĻ•ā§āϝāĻžāύāĻŋāĻ‚",
"library_scanning_description": "āĻĒāĻ°ā§āϝāĻžāϝāĻŧāĻ•ā§āϰāĻŽāĻŋāĻ• āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻ¸ā§āĻ•ā§āϝāĻžāύāĻŋāĻ‚ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ",
"library_scanning_enable_description": "āĻĒāĻ°ā§āϝāĻžāϝāĻŧāĻ•ā§āϰāĻŽāĻŋāĻ• āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻ¸ā§āĻ•ā§āϝāĻžāύāĻŋāĻ‚ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ",
"library_settings": "āĻŦāĻšāĻŋāϰāĻžāĻ—āϤ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ",
"library_settings_description": "āĻŦāĻšāĻŋāϰāĻžāĻ—āϤ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āϏ⧇āϟāĻŋāĻ‚āϏ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ",
"library_tasks_description": "āύāϤ⧁āύ āĻāĻŦāĻ‚/āĻ…āĻĨāĻŦāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āϏāĻŽā§āĻĒāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻŦāĻšāĻŋāϰāĻžāĻ—āϤ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻ¸ā§āĻ•ā§āϝāĻžāύ āĻ•āϰ⧁āύ",
"library_watching_enable_description": "āĻĢāĻžāχāϞ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āϜāĻ¨ā§āϝ āĻŦāĻšāĻŋāϰāĻžāĻ—āϤ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϗ⧁āϞāĻŋ āĻĻ⧇āϖ⧁āύ",
"library_watching_settings": "āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻĻ⧇āĻ–āĻž (āĻĒāϰ⧀āĻ•ā§āώāĻžāĻŽā§‚āϞāĻ•)",
"library_watching_settings_description": "āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āύāϜāϰ āϰāĻžāϖ⧁āύ",
"logging_enable_description": "āϞāĻ—āĻŋāĻ‚ āĻāύāĻžāĻŦāϞ/āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ",
"logging_level_description": "āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻĨāĻžāĻ•āĻžāĻ•āĻžāϞ⧀āύ, āϕ⧋āύ āϞāĻ— āĻ¸ā§āϤāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤",
"logging_settings": "āϞāĻ—āĻŋāĻ‚",
"machine_learning_clip_model": "CLIP āĻŽāĻĄā§‡āϞ",
"machine_learning_clip_model_description": "<link>āĻāĻ–āĻžāύ⧇</link> āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤ āĻāĻ•āϟāĻŋ CLIP āĻŽāĻĄā§‡āϞ⧇āϰ āύāĻžāĻŽāĨ¤ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ, āĻŽāĻĄā§‡āϞ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āĻĒāϰ āϏāĻŦ āĻ›āĻŦāĻŋāϰ āϜāĻ¨ā§āϝ āĻ…āĻŦāĻļā§āϝāχ ‘Smart Search’ āĻ•āĻžāϜāϟāĻŋ āφāĻŦāĻžāϰ āϚāĻžāϞāĻžāϤ⧇ āĻšāĻŦ⧇āĨ¤",
"machine_learning_duplicate_detection": "āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ",
"machine_learning_duplicate_detection_enabled": "āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ"
}
}

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