Compare commits

..

160 Commits

Author SHA1 Message Date
mertalev
930961825e queue assets without detected faces 2025-05-14 20:36:32 -04:00
mertalev
fdc8f91b18 revert image size change 2025-05-13 23:45:59 -04:00
mertalev
016a760dda use original image for ml 2025-05-13 23:41:57 -04:00
mertalev
c15507baad remove nesting 2025-05-13 13:20:41 -04:00
mertalev
1691706666 avoid always printing "vector reindexing complete" 2025-05-13 12:56:03 -04:00
mertalev
a96026c821 tighten range 2025-05-13 12:48:38 -04:00
Mert
5740928843 Update docs/docs/administration/postgres-standalone.md
Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
2025-05-13 12:26:56 -04:00
mertalev
6126ac77b5 update docker compose files 2025-05-12 20:57:09 -04:00
mertalev
8c166b9381 outdated message 2025-05-12 20:57:09 -04:00
mertalev
d656cc2198 redundant switch 2025-05-12 20:57:09 -04:00
mertalev
32f25580ec revert refreshfaces sql change 2025-05-12 20:57:09 -04:00
mertalev
34f72a8251 maybe fix sql generation 2025-05-12 20:57:09 -04:00
mertalev
e851884f88 handle different db name 2025-05-12 20:57:09 -04:00
mertalev
db2493d003 preexisiting pg docs 2025-05-12 20:57:09 -04:00
mertalev
595f4c6d2e simplify dummy 2025-05-12 20:57:09 -04:00
mertalev
36481d037f accurate dummy vector 2025-05-12 20:57:09 -04:00
mertalev
217f6fe4fa fix new instance 2025-05-12 20:57:09 -04:00
mertalev
e90f28985a cascade 2025-05-12 20:57:09 -04:00
mertalev
0c9890b70f update image for sql checker
update images for gha
2025-05-12 20:57:09 -04:00
mertalev
b750440f90 set probes 2025-05-12 20:57:09 -04:00
mertalev
c80b16d24e wip
auto-detect available extensions

auto-recovery, fix reindexing check

use original image for ml
2025-05-12 20:57:08 -04:00
Jason Rasmussen
81d959a27e refactor: remove unused props (#18240) 2025-05-12 22:31:37 +00:00
Jason Rasmussen
bb775110ef refactor: password reset success modal (#18239) 2025-05-12 18:18:13 -04:00
Jason Rasmussen
7280331b76 refactor: confirm modal (#18238) 2025-05-12 22:02:49 +00:00
Jason Rasmussen
93ee6ee0a5 refactor: dialog controller (#18235) 2025-05-12 17:48:05 -04:00
Daniel Dietzler
7544a678ec refactor: remove unnecessary bg-color attributes and move to ui lib vars (#18234) 2025-05-12 17:17:01 -04:00
Jason Rasmussen
3066c8198c feat(web): user detail page (#18230)
feat: user detail page
2025-05-12 16:50:26 -04:00
Jason Rasmussen
eb8dfa283e fix(web): no rounded map on /map page (#18232) 2025-05-12 14:15:15 -04:00
Daniel Dietzler
41a127e2ab refactor: avatar selector modal (#18228) 2025-05-12 10:56:36 -04:00
Daniel Dietzler
feb475561e fix: missing translation in pin settings (#18203) 2025-05-10 15:27:42 -04:00
Alex
4c4c67f0d2 chore(web): color tuning (#18193) 2025-05-10 20:55:06 +02:00
Daimolean
381b66bf70 fix(web): IconButton size in user restore (#18194) 2025-05-10 07:28:37 -05:00
renovate[bot]
a89f3ad97c fix(deps): update typescript-projects (#18133)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-10 13:07:20 +02:00
Jason Rasmussen
c473511133 feat(web): stat card tweaks (#18189)
feat: stat card tweaks
2025-05-09 17:56:41 -05:00
Ben McCann
0d66a6b51f chore(web): upgrade enhanced-img (#18186) 2025-05-09 16:05:07 -05:00
Jason Rasmussen
66400b2e8e fix(web): user restore (#18188) 2025-05-09 21:05:01 +00:00
Alex
87cdf0ebd9 chore: use correct font on buy button (#18187) 2025-05-09 17:04:03 -04:00
Alex
3f719bd8d7 feat: user pin-code (#18138)
* feat: user pincode

* pr feedback

* chore: cleanup

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-05-09 17:00:58 -04:00
Daniel Dietzler
55af925ab3 refactor: shared link url (#18185) 2025-05-09 15:23:00 -05:00
Alex
ff63b0fa8f docs: face lift, botox x3 (#18184)
* chore: docs face lift

* logo and fonts

* docs: face lift, botox x3

* docs: face lift, botox x3
2025-05-09 13:27:21 -05:00
Daniel Dietzler
f21fe8716c refactor: shortcuts modal (#18175) 2025-05-09 13:24:36 -04:00
Daniel Dietzler
6a69dafd31 refactor: share modals (#18183) 2025-05-09 16:59:29 +00:00
Daniel Dietzler
47b1938f17 fix: search filter modal close (#18180) 2025-05-09 10:10:10 -05:00
Martin Schmidt
2ffcfe06f3 fix: properly work with languages with multiple scripts (#18167)
Co-authored-by: Ewe Zu Lin <zlewe1997@gmail.com>
2025-05-09 10:09:24 -05:00
Daniel Dietzler
89551edee5 fix: z-index war in the asset viewer (#18091) 2025-05-09 10:17:26 -04:00
Zack Pollard
cb6c541ae1 fix: constraint migration to handle any existing pkey name (#18178) 2025-05-09 13:45:44 +00:00
luzpaz
b1e1362246 fix: various typos (grouped in to separate commits) (#18177) 2025-05-09 13:10:34 +00:00
Alex
ccc2b191dd fix: notification text's color (#18170) 2025-05-08 19:07:12 -04:00
Alex
bb7010b2bb chore: rounded map corner when needed (#18163) 2025-05-09 00:49:16 +02:00
Daniel Dietzler
8db666bc38 refactor: search filter modal (#18159) 2025-05-08 15:36:05 -05:00
Daimolean
eace0f716d fix(web): add photos to album (#18166) 2025-05-08 20:24:51 +00:00
bo0tzz
96743b6c33 fix: properly set cache key suffix in image build (#18169) 2025-05-08 15:24:29 -05:00
bo0tzz
ff181cf346 fix: always set cache-key-base during image build (#18168) 2025-05-08 15:14:33 -05:00
Daimolean
0cd5960007 fix(web): ui (#18160)
* fix(web): ui

* fix(web): ui

* lint

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-05-08 19:32:45 +00:00
Dan Pizappi
698592c1b0 chore: update truenas install guide (#18142)
* Update truenas.md

* Update truenas.md

fix link

* Update truenas.md

* Update docs/docs/install/truenas.md

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-05-08 13:51:04 +00:00
Robert Vollmer
f75d853e9a fix(mobile): Remote video playback and asset download on Android with mTLS (#16403)
* Add class to apply SSL options

* Apply client certificate for native Android code

* Refactor self-signed check

* Allow self-signed certificates

* Fix Dart analysis

* Add HostnameVerifier

Android explicitly does NOT check the Common Name of a certificate,
only the Subject Alt Names. Chances are that someone who self-signs a
certificate doesn't go through the extra steps to add a SAN, and in
that case the connection would be prevented by the HostnameVerifier
even thought the TrustManager was fine with the certificate itself.

* Rename parameter like in Dart

* Fix NPE

* Catch all native errors in HttpSSLOptionsPlugin

* Workaround for too early onChanged() callback

* Fix formatting

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-05-08 13:45:11 +00:00
Alex
3a1e3e82e7 fix: notification text's color (#18151) 2025-05-08 12:15:11 +02:00
bo0tzz
0beb3ac4c1 feat: extract multi-arch image building to shared logic (#17877) 2025-05-08 12:00:05 +02:00
Daniel Dietzler
894545aeed refactor: modal manager types (#18150) 2025-05-07 22:08:19 +00:00
Daniel Dietzler
5250269fa4 refactor: user page modals (#18147) 2025-05-07 17:58:46 -04:00
Daniel Dietzler
a169fb6a79 refactor: map (#18143) 2025-05-07 17:39:50 -04:00
Daniel Dietzler
09ced9a171 refactor: help modal (#18145) 2025-05-07 17:31:38 -04:00
Jason Rasmussen
a6e5e4f625 fix: schema ci checks (#18146) 2025-05-07 21:14:20 +00:00
Daniel Dietzler
bbd8de177b refactor: side bar modals (#18134) 2025-05-07 09:01:51 -05:00
bo0tzz
867f6e64f9 chore: run all e2e tests on github runners (#17987)
* chore: run all e2e tests on github runners

* fix: use it.each for multi-case test
2025-05-07 01:42:48 -04:00
SGT
ec6379b0b2 chore: remove usage of deprecated Kysely method (#18127)
* minor update. fix usage of deprecated method'

* restore original formatting
2025-05-06 17:01:02 -04:00
Mert
2a80251dc3 fix(server): more robust person thumbnail generation (#17974)
* more robust person thumbnail generation

* clamp bounding boxes

* update sql

* no need to process invalid images after decoding

* cursed knowledge

* new line
2025-05-06 14:18:22 -04:00
Alex
d33ce13561 feat(server): visibility column (#17939)
* feat: private view

* pr feedback

* sql generation

* feat: visibility column

* fix: set visibility value as the same as the still part after unlinked live photos

* fix: test

* pr feedback
2025-05-06 12:12:48 -05:00
Nicholas Flamy
016d7a6ceb fix(docs): remove old patch versions from version switcher (#18130) 2025-05-06 17:53:17 +01:00
renovate[bot]
8ff25a4f7a fix(deps): update dependency @react-email/components to ^0.0.37 (#18126)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-06 18:23:45 +02:00
renovate[bot]
61a3eba1bd fix(deps): update machine-learning (#18118) 2025-05-06 15:27:34 +00:00
David Cruz
7072e48cbe feat: Add DB_SSL_MODE environment variable for Postgres sslmode (#18025)
* feat: Add DB_SSL_MODE environment variable for Postgres sslmode

* chore: clean up

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-05-06 09:25:37 -04:00
shenlong
ece977d9ca fix(mobile): empty translation placeholders (#18063)
* fix: empty placeholders

* fix: use namedArgs

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-05-06 09:21:05 -04:00
Jason Rasmussen
2af8095880 fix(web): e2e download tests (#18125) 2025-05-06 15:07:04 +02:00
renovate[bot]
30822fcd10 fix(deps): update typescript-projects (#18124)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-06 14:50:22 +02:00
Alex
c578273e7a chore: modal shenanigan (#18116) 2025-05-06 08:47:58 -04:00
Jovan Gerodetti
118a3fc9db fix: update assets when duplicateId is provided as null (#18071)
Update assets when duplicateId is provided as null
2025-05-06 08:47:19 -04:00
Daniel Dietzler
1138f6dcce refactor: job create modal (#18106)
* refactor: job create modal

* chore: better modal manager types (#18107)
2025-05-06 08:44:44 -04:00
renovate[bot]
33f3751b72 chore(deps): update github-actions (#18114)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-06 08:39:14 -04:00
renovate[bot]
b8509e6411 chore(deps): update docker.io/valkey/valkey:8-bookworm docker digest to 4a9f847 (#18113)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-06 08:35:24 -04:00
renovate[bot]
bd43edbcd7 chore(deps): update prom/prometheus docker digest to e2b8aa6 (#18117)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-06 08:35:01 -04:00
Matthew Momjian
c8b4a7e1f1 fix(docs): update nginx reverse proxy (#18104)
update nginx reverse proxy
2025-05-05 21:09:42 -05:00
Jason Rasmussen
f34f83e164 refactor: controller tests (#18100) 2025-05-05 18:57:32 -04:00
Alex
df2cf5d106 refactor: use UI library variable for table (#18105) 2025-05-05 22:39:52 +00:00
Daniel Dietzler
52975eadb3 refactor: all user admin page modals (#18097) 2025-05-05 23:54:42 +02:00
Sergey Katsubo
12610e4a9f fix(server): handle orientation of imported face regions (#18021)
* Transform imported face RegionInfo according to Exif Orientation

* Add unit tests for re-orienting metadata face regions

* Make code DRY using ImmichTagsWithFaces instead of NonNullable

* Add e2e test for importing metadata face regions when orientation is RotateCW90

* Disable new e2e test until its asset is added to the test-assets project

* Simplify unit tests by using the same face tag definition

* Combine similar e2e tests

* Disable new e2e test until portrait-orientation-6.jpg is added to test-assets

* Fix lint error: Expected property shorthand

* Update test-assets ref to latest

* Enable new e2e test after updating test-assets
2025-05-05 11:11:21 -04:00
renovate[bot]
2b3efa02d8 chore(deps): update dependency vite to v6.3.4 [security] (#18003)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-05 07:26:32 -07:00
Peter Denham
a21a997f21 fix: documentation - synology install docker link (#18084)
* fix docker link

* fix docker link

---------

Co-authored-by: Peter Denham <peter@denham>
2025-05-05 08:08:11 -05:00
David
7d61ed7ce4 feat(web): Map in albums & shared albums (#17906)
* add btn, map and marker

* Fix bug in navigation assetviewer

* Correct bug on main Viewer

* Add to user album the map of his pictures

* change icon to outline

* lint & format

* with manager instead of variable

* remove duplicate

* chore: minor styling change

* formatting

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-05-05 02:58:44 +00:00
Daniel Dietzler
8f7baf8336 chore: add language requests from weblate (#18050) 2025-05-04 21:04:53 +02:00
Weblate (bot)
44923acfd6 chore(web): update translations (#17817)
Co-authored-by: Ali Afzal <ali.afzalt20@gmail.com>
Co-authored-by: Andreas Johansen <andreas@josern.com>
Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: Bonov <bonov@mail.ru>
Co-authored-by: CanbiZ <mickey.leskowitz@gmail.com>
Co-authored-by: Conrad <conrad@grosser.group>
Co-authored-by: Daniel A <aquino.daniel1994@ikmail.com>
Co-authored-by: Denis Pacquier <denis.pacquier@gmail.com>
Co-authored-by: Diomed <diomed@tuta.io>
Co-authored-by: Dragonslayer <chybzik@gmail.com>
Co-authored-by: Felipe Garcia <garcia.o.felipe@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: HanYuan <lion70332@gmail.com>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Javier Villanueva García <jvg2203@gmail.com>
Co-authored-by: Jesús Jiménez <jesjimenez@gmail.com>
Co-authored-by: John Kapelakos <johnkapelakos5@gmail.com>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: Leo Bottaro <github@leobottaro.com>
Co-authored-by: Linerly <linerly@proton.me>
Co-authored-by: Luna <me@devkit.dk>
Co-authored-by: Malhelo <weblate@malhelo.de>
Co-authored-by: Marco Vockner <marco.vockner@outlook.com>
Co-authored-by: Matjaž T <matjaz@moj-svet.si>
Co-authored-by: Matthew Momjian <mmomjian@gmail.com>
Co-authored-by: Micash <micash_545@protonmail.com>
Co-authored-by: Mārtiņš Bruņenieks <martinsb@gmail.com>
Co-authored-by: NoopyD <antish85@gmail.com>
Co-authored-by: Olaf Nielsen <solluh@mail.de>
Co-authored-by: PixelAxolotl <catmeowmeow009@gmail.com>
Co-authored-by: Raul <raul.plesa@gmail.com>
Co-authored-by: Shawn <xiaxinx@gmail.com>
Co-authored-by: Stan P <g97d6liib@mozmail.com>
Co-authored-by: Stanislav <stanislavnastasiu0@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: Taiki M <vexingly-many-mace@duck.com>
Co-authored-by: Tobias Calcetin <arbelos@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: User 123456789 <w0g-1es-5qq@cld3.com>
Co-authored-by: Vinyas N S <vinyasns@gmail.com>
Co-authored-by: Väino Daum <vainodaum@gmail.com>
Co-authored-by: Zack Pollard <zack@futo.org>
Co-authored-by: Zvonimir <zzrakic@protonmail.com>
Co-authored-by: chamdim <chamdim@protonmail.com>
Co-authored-by: dvbthien <dvbthien@users.noreply.hosted.weblate.org>
Co-authored-by: eav5jhl0 <eav5jhl0@users.noreply.hosted.weblate.org>
Co-authored-by: fmis13 <76878393+fmis13@users.noreply.github.com>
Co-authored-by: fmis136696a34093be41a0 <miskovicfrano2@gmail.com>
Co-authored-by: godzinilla <godzinilla@gmail.com>
Co-authored-by: jojo <e80f8c6f-ccb0-423e-9526-614163e44d51@anonaddy.me>
Co-authored-by: jonas-bonas <frage.zeichen@posteo.at>
Co-authored-by: labolstad <lasse.bolstad@gmail.com>
Co-authored-by: lsy223622 <lsy223622@outlook.com>
Co-authored-by: millallo <millallo@tiscali.it>
Co-authored-by: stephane Carrié <spcc70@gmail.com>
Co-authored-by: tct123 <tct1234@protonmail.com>
Co-authored-by: vzvl <lojewski.vitus@gmail.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: Вячеслав Лукьяненко <madeinchuguev@gmail.com>
2025-05-04 20:47:46 +02:00
Matthew Momjian
ab95881ebb fix(mobile): Share page URL (#17834)
* Update share_intent.page.dart

* Update share_intent.page.dart

* unused stores

* remove unused duplicate function
2025-05-04 08:58:45 -05:00
Alex
8801ae5821 fix(web): text dim in darkmode (#18072) 2025-05-04 08:30:21 -04:00
Jason Rasmussen
ea9f11bf39 refactor: controller tests (#18035)
* feat: controller unit tests

* refactor: controller tests
2025-05-03 09:39:44 -04:00
Daniel Dietzler
62fc5b3c7d refactor: introduce modal manager (#18039) 2025-05-02 18:41:42 -04:00
Daniel Dietzler
15d431ba6a refactor: dialog callbacks (#18034) 2025-05-02 13:34:53 -04:00
Jason Rasmussen
5d21ba3166 chore: logging clean up (#18031) 2025-05-02 12:34:35 -05:00
Thomas
da7a81b752 chore(server): split album update notifications into multiple jobs (#17879)
We would like to move away from the concept of finding and removing pending
jobs. The only place this is used is for album update notifications, and this
is done so that users who initially uploaded assets to an album will also
receive a notification if someone else then adds assets to the same album. This
can also be achieved with a job for each recipient. Multiple jobs also has the
advantage that it will scale better for albums with many users, it's possible
to send notifications concurrently, retries are possible without sending
duplicate notifications, and it's clear what recipient a job failed for.
2025-04-30 17:45:35 -04:00
Jason Rasmussen
becdc3dcf5 refactor: job on-done (#18004) 2025-04-30 17:02:53 -04:00
Eli Gao
84b51e3cbb fix(server): double rotation on HEIF files (#18002)
* fix(server): double rotation on HEIF/HEIC files

* Update server/src/services/media.service.ts

* formatting

---------

Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
2025-04-30 20:33:18 +00:00
Jason Rasmussen
b845184c80 chore: remove old memory lane implementation (#18000) 2025-04-30 14:23:32 -04:00
Jason Rasmussen
1fde02ee1e chore: remove unused types and code (#17999) 2025-04-30 13:41:23 -04:00
Jason Rasmussen
526c02297c refactor: stream queue migration (#17997) 2025-04-30 16:23:13 +00:00
Alex
732b06eec8 refactor: stream for sidecar (#17995)
* refactor: stream for sidecar

* chore: make sql

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-04-30 10:53:51 -05:00
Daniel Dietzler
436cff72b5 refactor: activity manager (#17943) 2025-04-30 15:50:38 +00:00
Jason Rasmussen
be5cc2cdf5 refactor: stream detect faces (#17996) 2025-04-30 11:25:30 -04:00
Jason Rasmussen
094a41ac9a chore: remove audit file report (#17994) 2025-04-30 11:17:23 -04:00
Daniel Dietzler
ebad6a008f fix: add missing translations to face editor (#17993) 2025-04-30 10:07:21 -05:00
Jason Rasmussen
0c261ffbe2 fix: queue in batches (#17989) 2025-04-30 10:52:51 -04:00
Jason Rasmussen
6df6103c67 chore: better immich-web logging (#17992) 2025-04-30 09:48:24 -05:00
Jason Rasmussen
8c5116bc1d refactor: stream search duplicates (#17991) 2025-04-30 10:40:32 -04:00
bo0tzz
e3812a0e36 chore: also run e2e tests on arm64 (#17822)
Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-30 14:22:10 +02:00
Min Idzelis
4b1ced439b feat: improve/refactor focus handling (#17796)
* feat: improve focus

* test

* lint

* use modulus in loop
2025-04-30 00:19:38 -04:00
Jason Rasmussen
2e8a286540 refactor: smart search queue (#17977) 2025-04-29 17:44:28 -04:00
Jason Rasmussen
038a82c4f1 refactor: theme manager (#17976) 2025-04-29 17:44:09 -04:00
renovate[bot]
2c2dd01bf0 fix(deps): update machine-learning (#17951) 2025-04-29 20:02:58 +00:00
Ben
ac73e163df chore(mobile): translate toast messages (#17964) 2025-04-29 14:26:41 -05:00
Jason Rasmussen
d89e88bb3f feat: configure token endpoint auth method (#17968) 2025-04-29 15:17:48 -04:00
Thomas
3ce353393a chore(server): don't insert embeddings if the model has changed (#17885)
* chore(server): don't insert embeddings if the model has changed

We're moving away from the heuristic of waiting for queues to complete. The job
which inserts embeddings can simply check if the model has changed before
inserting, rather than attempting to lock the queue.

* more robust dim size update

* use check constraint

* index command cleanup

* add create statement

* update medium test, create appropriate extension

* new line

* set dimension size when running on all assets

* why does it want braces smh

* take 2

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-04-29 14:23:01 -04:00
Min Idzelis
0e4cf9ac57 feat(web): responsive date group header height (#17944)
* feat: responsive date group header height

* update tests

* feat(web): improve perf when changing mobile orientation (#17945)

fix: improve perf when changing mobile orientation
2025-04-29 13:59:06 -04:00
Min Idzelis
07290580a6 feat: improve semantic nav/main tags (#17800)
feat: nav/main elements

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-04-29 13:51:39 -04:00
AverageHelper
d9ce74b896 chore: add security.txt (#17952)
* feat: Create .well-known/security.txt

* feat: Add another security.txt for the main website

* fix: deploy hidden files

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2025-04-29 13:48:06 -04:00
Jason Rasmussen
4c0f79b162 fix: use lint:p in checkall script (#17969) 2025-04-29 17:34:36 +00:00
renovate[bot]
9851d24628 chore(deps): update docker.io/valkey/valkey:8-bookworm docker digest to c855f98 (#17948)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-29 12:08:50 +01:00
renovate[bot]
fe6cbd93b1 chore(deps): pin dependencies (#17947)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-29 12:08:40 +01:00
renovate[bot]
df20788088 chore(deps): update grafana/grafana docker tag to v11.6.1 (#17955)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-29 12:08:08 +01:00
renovate[bot]
3d042cc7f1 fix(deps): update typescript-projects (#17961)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-29 13:00:37 +02:00
renovate[bot]
85446c5862 chore(deps): update redis:6.2-alpine docker digest to 3211c33 (#17950)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-29 10:09:25 +00:00
renovate[bot]
fb52ac0f5b chore(deps): update node.js to v22.15.0 (#17956)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-29 12:08:32 +02:00
Eli Gao
48bcbee6ed feat(server): JXL previews from DNG 1.7+ (#17861)
* feat(server): JXL previews from RAW

* refactor(server): use var name assumedExtractedFormat for clarity

* test(server): fix existing media.extract() returning JPEG

* chore(openapi): regen

* style(server): lint

* fix(server): ignore undefined decode orientation

* fix(server): correct orientation assignment in media decode options

* test(server): unit tests of JXL-encoded DNG

* refactor(server): return buffer and format from mediaRepository.extract()

* chore(open-api): regen

* refactor

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2025-04-28 18:18:46 -04:00
Daniel Dietzler
f621f8ef2c refactor: more job queries (#17745) 2025-04-29 00:03:20 +02:00
Jason Rasmussen
7f69abbf0d refactor: app init event (#17937) 2025-04-28 14:48:33 -04:00
Jason Rasmussen
895b2bf5cd refactor: download manager (#17935) 2025-04-28 14:21:24 -04:00
Jason Rasmussen
f64e6f5dc3 refactor: auth login event (#17934) 2025-04-28 14:13:14 -04:00
Luke Towers
64e738f79d feat(web): move duplicates controls above preview of duplicate images (#17837)
Move duplicates controls above preview of duplicate images
2025-04-28 16:10:40 +00:00
Daniel Dietzler
a17390a422 refactor: move managers to new folder (#17929) 2025-04-28 16:56:04 +02:00
Jason Rasmussen
1b5fc9c665 feat: notifications (#17701)
* feat: notifications

* UI works

* chore: pr feedback

* initial fetch and clear notification upon logging out

* fix: merge

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-04-28 10:36:14 -04:00
Yaros
23717ce981 feat(mobile): save grid size on gesture resize (#17891) 2025-04-28 09:23:33 -05:00
Min Idzelis
2fd05e8447 feat: preload and cancel images with a service worker (#16893)
* feat: Service Worker to preload/cancel images and other resources

* Remove caddy configuration, localhost is secure if port-forwarded

* fix e2e tests

* Cache/return the app.html for all web entry points

* Only handle preload/cancel

* fix e2e

* fix e2e

* e2e-2

* that'll do it

* format

* fix test

* lint

* refactor common code to conditionals

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-04-28 14:23:05 +00:00
Min Idzelis
c664d99a34 refactor: vscode - format/organize on save (#17928) 2025-04-28 10:11:19 -04:00
Andreas Tollkötter
21c7d70336 feat(mobile): Capitalize month names in asset grid (#17898)
* capitalize month titles

* capitalize day titles as well
2025-04-28 13:56:36 +00:00
Jason Rasmussen
ad272333db refactor: user avatar color (#17753) 2025-04-28 08:54:51 -05:00
Zack Pollard
460d594791 feat: api response compression (#17878) 2025-04-28 08:54:11 -05:00
Jason Rasmussen
e6c575c33e feat: rtl (#17860) 2025-04-28 08:53:53 -05:00
Andreas Tollkötter
85ac0512a6 fix(web): Make date-time formatting follow locale (#17899)
* fixed missing $locale parameter to .toLocaleString

* Remove unused types and functions in timeline-util

* remove unused export

* re-enable export because it is needed for tests

* format
2025-04-28 08:53:26 -05:00
Alex
205260d31c chore: post release tasks (#17895) 2025-04-27 23:02:03 -05:00
Alex
3858973be5 chore(mobile): translation (#17920) 2025-04-27 23:00:40 -05:00
github-actions
02994883fe chore: version v1.132.3 2025-04-25 19:44:05 +00:00
Alex
a1f8150c30 fix: Authelia OAuth code verifier value contains invalid characters (#17886)
* fix(mobile): Authelia OAuth code verifier value contains invalid characters

* Refactor

* Refactoring with Jason

* Refactoring with Jason
2025-04-25 19:39:14 +00:00
Yaros
d85ef19bfc fix(mobile): revert get location on app start (#17882) 2025-04-25 10:38:30 -05:00
Jason Rasmussen
d0014bdf94 refactor: event manager (#17862)
* refactor: event manager

* refactor: event manager
2025-04-25 08:36:31 -04:00
Martin Mikita
e822e3eca9 docs: update MapTiler name (#17863) 2025-04-25 08:57:44 +00:00
Alex
644defa4a1 chore: post release tasks (#17867) 2025-04-25 04:14:40 +00:00
Matthew Momjian
1fe3c7b9b3 fix(docs): priorities (Capitalization) (#17866)
priorities
2025-04-25 04:07:42 +00:00
github-actions
0d60be3d87 chore: version v1.132.2 2025-04-25 03:07:06 +00:00
Alex
765da7b182 fix(mobile): mobile migration logic (#17865)
* fix(mobile): mobile migration logic

* add exception

* remove unused comment

* finalize
2025-04-25 00:16:54 +00:00
shenlong
b037158028 fix(mobile): auto trash using MANAGE_MEDIA (#17828)
fix: auto trash using MANAGE_MEDIA

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2025-04-24 19:09:50 -05:00
Daimolean
a03902f174 fix(docs): incorrect date sorting (#17858) 2025-04-24 19:40:52 -04:00
Jason Rasmussen
1d610ad9cb refactor: database connection parsing (#17852) 2025-04-24 12:58:29 -04:00
Min Idzelis
dab4870fed fix: flappy e2e test (#17832)
* fix: flappy e2e test

* lint
2025-04-23 23:30:13 -04:00
666 changed files with 23047 additions and 14562 deletions

118
.github/actions/image-build/action.yml vendored Normal file
View File

@@ -0,0 +1,118 @@
name: 'Single arch image build'
description: 'Build single-arch image on platform appropriate runner'
inputs:
image:
description: 'Name of the image to build'
required: true
ghcr-token:
description: 'GitHub Container Registry token'
required: true
platform:
description: 'Platform to build for'
required: true
artifact-key-base:
description: 'Base key for artifact name'
required: true
context:
description: 'Path to build context'
required: true
dockerfile:
description: 'Path to Dockerfile'
required: true
build-args:
description: 'Docker build arguments'
required: false
runs:
using: 'composite'
steps:
- name: Prepare
id: prepare
shell: bash
env:
PLATFORM: ${{ inputs.platform }}
run: |
echo "platform-pair=${PLATFORM//\//-}" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
- name: Login to GitHub Container Registry
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
if: ${{ !github.event.pull_request.head.repo.fork }}
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ inputs.ghcr-token }}
- name: Generate cache key suffix
id: cache-key-suffix
shell: bash
env:
REF: ${{ github.ref_name }}
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
echo "cache-key-suffix=pr-${{ github.event.number }}" >> $GITHUB_OUTPUT
else
SUFFIX=$(echo "${REF}" | sed 's/[^a-zA-Z0-9]/-/g')
echo "suffix=${SUFFIX}" >> $GITHUB_OUTPUT
fi
- name: Generate cache target
id: cache-target
shell: bash
env:
BUILD_ARGS: ${{ inputs.build-args }}
IMAGE: ${{ inputs.image }}
SUFFIX: ${{ steps.cache-key-suffix.outputs.suffix }}
PLATFORM_PAIR: ${{ steps.prepare.outputs.platform-pair }}
run: |
HASH=$(sha256sum <<< "${BUILD_ARGS}" | cut -d' ' -f1)
CACHE_KEY="${PLATFORM_PAIR}-${HASH}"
echo "cache-key-base=${CACHE_KEY}" >> $GITHUB_OUTPUT
if [[ "${{ github.event.pull_request.head.repo.fork }}" == "true" ]]; then
# Essentially just ignore the cache output (forks can't write to registry cache)
echo "cache-to=type=local,dest=/tmp/discard,ignore-error=true" >> $GITHUB_OUTPUT
else
echo "cache-to=type=registry,ref=${IMAGE}-build-cache:${CACHE_KEY}-${SUFFIX},mode=max,compression=zstd" >> $GITHUB_OUTPUT
fi
- name: Generate docker image tags
id: meta
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
env:
DOCKER_METADATA_PR_HEAD_SHA: 'true'
- name: Build and push image
id: build
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
with:
context: ${{ inputs.context }}
file: ${{ inputs.dockerfile }}
platforms: ${{ inputs.platform }}
labels: ${{ steps.meta.outputs.labels }}
cache-to: ${{ steps.cache-target.outputs.cache-to }}
cache-from: |
type=registry,ref=${{ inputs.image }}-build-cache:${{ steps.cache-target.outputs.cache-key-base }}-${{ steps.cache-key-suffix.outputs.suffix }}
type=registry,ref=${{ inputs.image }}-build-cache:${{ steps.cache-target.outputs.cache-key-base }}-main
outputs: type=image,"name=${{ inputs.image }}",push-by-digest=true,name-canonical=true,push=${{ !github.event.pull_request.head.repo.fork }}
build-args: |
BUILD_ID=${{ github.run_id }}
BUILD_IMAGE=${{ github.event_name == 'release' && github.ref_name || steps.meta.outputs.tags }}
BUILD_SOURCE_REF=${{ github.ref_name }}
BUILD_SOURCE_COMMIT=${{ github.sha }}
${{ inputs.build-args }}
- name: Export digest
shell: bash
run: | # zizmor: ignore[template-injection]
mkdir -p ${{ runner.temp }}/digests
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: ${{ inputs.artifact-key-base }}-${{ steps.cache-target.outputs.cache-key-base }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1

View File

@@ -96,7 +96,7 @@ jobs:
type=raw,value=latest,enable=${{ github.event_name == 'release' }}
- name: Build and push image
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0
with:
file: cli/Dockerfile
platforms: linux/amd64,linux/arm64

View File

@@ -50,7 +50,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@45775bd8235c68ba998cffa5171334d58593da47 # v3
uses: github/codeql-action/init@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3
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@45775bd8235c68ba998cffa5171334d58593da47 # v3
uses: github/codeql-action/autobuild@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -76,6 +76,6 @@ jobs:
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@45775bd8235c68ba998cffa5171334d58593da47 # v3
uses: github/codeql-action/analyze@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3
with:
category: '/language:${{matrix.language}}'

View File

@@ -40,6 +40,8 @@ jobs:
- '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
@@ -103,429 +105,74 @@ jobs:
docker buildx imagetools create -t "${REGISTRY_NAME}/${REPOSITORY}:${TAG_PR}" "${REGISTRY_NAME}/${REPOSITORY}:${TAG_OLD}"
docker buildx imagetools create -t "${REGISTRY_NAME}/${REPOSITORY}:${TAG_COMMIT}" "${REGISTRY_NAME}/${REPOSITORY}:${TAG_OLD}"
build_and_push_ml:
machine-learning:
name: Build and Push ML
needs: pre-job
permissions:
contents: read
packages: write
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }}
runs-on: ${{ matrix.runner }}
env:
image: immich-machine-learning
context: machine-learning
file: machine-learning/Dockerfile
GHCR_REPO: ghcr.io/${{ github.repository_owner }}/immich-machine-learning
strategy:
# Prevent a failure in one image from stopping the other builds
fail-fast: false
matrix:
include:
- platform: linux/amd64
runner: ubuntu-latest
device: cpu
- platform: linux/arm64
runner: ubuntu-24.04-arm
device: cpu
- platform: linux/amd64
runner: ubuntu-latest
device: cuda
suffix: -cuda
- platform: linux/amd64
runner: mich
device: rocm
suffix: -rocm
- platform: linux/amd64
runner: ubuntu-latest
device: openvino
suffix: -openvino
- platform: linux/arm64
runner: ubuntu-24.04-arm
device: armnn
suffix: -armnn
- platform: linux/arm64
runner: ubuntu-24.04-arm
device: rknn
suffix: -rknn
steps:
- name: Prepare
run: |
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
persist-credentials: false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
- name: Login to GitHub Container Registry
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
if: ${{ !github.event.pull_request.head.repo.fork }}
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Generate cache key suffix
env:
REF: ${{ github.ref_name }}
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
echo "CACHE_KEY_SUFFIX=pr-${{ github.event.number }}" >> $GITHUB_ENV
else
SUFFIX=$(echo "${REF}" | sed 's/[^a-zA-Z0-9]/-/g')
echo "CACHE_KEY_SUFFIX=${SUFFIX}" >> $GITHUB_ENV
fi
- name: Generate cache target
id: cache-target
run: |
if [[ "${{ github.event.pull_request.head.repo.fork }}" == "true" ]]; then
# Essentially just ignore the cache output (forks can't write to registry cache)
echo "cache-to=type=local,dest=/tmp/discard,ignore-error=true" >> $GITHUB_OUTPUT
else
echo "cache-to=type=registry,ref=${GHCR_REPO}-build-cache:${PLATFORM_PAIR}-${{ matrix.device }}-${CACHE_KEY_SUFFIX},mode=max,compression=zstd" >> $GITHUB_OUTPUT
fi
- name: Generate docker image tags
id: meta
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
env:
DOCKER_METADATA_PR_HEAD_SHA: 'true'
- name: Build and push image
id: build
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
with:
context: ${{ env.context }}
file: ${{ env.file }}
platforms: ${{ matrix.platforms }}
labels: ${{ steps.meta.outputs.labels }}
cache-to: ${{ steps.cache-target.outputs.cache-to }}
cache-from: |
type=registry,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-${{ matrix.device }}-${{ env.CACHE_KEY_SUFFIX }}
type=registry,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-${{ matrix.device }}-main
outputs: type=image,"name=${{ env.GHCR_REPO }}",push-by-digest=true,name-canonical=true,push=${{ !github.event.pull_request.head.repo.fork }}
build-args: |
DEVICE=${{ matrix.device }}
BUILD_ID=${{ github.run_id }}
BUILD_IMAGE=${{ github.event_name == 'release' && github.ref_name || steps.metadata.outputs.tags }}
BUILD_SOURCE_REF=${{ github.ref_name }}
BUILD_SOURCE_COMMIT=${{ github.sha }}
- name: Export digest
run: | # zizmor: ignore[template-injection]
mkdir -p ${{ runner.temp }}/digests
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: ml-digests-${{ matrix.device }}-${{ env.PLATFORM_PAIR }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1
merge_ml:
name: Merge & Push ML
runs-on: ubuntu-latest
permissions:
contents: read
actions: read
packages: write
if: ${{ needs.pre-job.outputs.should_run_ml == 'true' && !github.event.pull_request.head.repo.fork }}
env:
GHCR_REPO: ghcr.io/${{ github.repository_owner }}/immich-machine-learning
DOCKER_REPO: altran1502/immich-machine-learning
strategy:
matrix:
include:
- device: cpu
tag-suffix: ''
- device: cuda
suffix: -cuda
- device: rocm
suffix: -rocm
tag-suffix: '-cuda'
platforms: linux/amd64
- device: openvino
suffix: -openvino
tag-suffix: '-openvino'
platforms: linux/amd64
- device: armnn
suffix: -armnn
tag-suffix: '-armnn'
platforms: linux/arm64
- device: rknn
suffix: -rknn
needs:
- build_and_push_ml
steps:
- name: Download digests
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
path: ${{ runner.temp }}/digests
pattern: ml-digests-${{ matrix.device }}-*
merge-multiple: true
- name: Login to Docker Hub
if: ${{ github.event_name == 'release' }}
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GHCR
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
- name: Generate docker image tags
id: meta
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
env:
DOCKER_METADATA_PR_HEAD_SHA: 'true'
with:
flavor: |
# Disable latest tag
latest=false
suffix=${{ matrix.suffix }}
images: |
name=${{ env.GHCR_REPO }}
name=${{ env.DOCKER_REPO }},enable=${{ github.event_name == 'release' }}
tags: |
# Tag with branch name
type=ref,event=branch
# Tag with pr-number
type=ref,event=pr
# Tag with long commit sha hash
type=sha,format=long,prefix=commit-
# Tag with git tag on release
type=ref,event=tag
type=raw,value=release,enable=${{ github.event_name == 'release' }}
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
run: |
# Process annotations
declare -a ANNOTATIONS=()
if [[ -n "$DOCKER_METADATA_OUTPUT_JSON" ]]; then
while IFS= read -r annotation; do
# Extract key and value by removing the manifest: prefix
if [[ "$annotation" =~ ^manifest:(.+)=(.+)$ ]]; then
key="${BASH_REMATCH[1]}"
value="${BASH_REMATCH[2]}"
# Use array to properly handle arguments with spaces
ANNOTATIONS+=(--annotation "index:$key=$value")
fi
done < <(jq -r '.annotations[]' <<< "$DOCKER_METADATA_OUTPUT_JSON")
fi
TAGS=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
SOURCE_ARGS=$(printf "${GHCR_REPO}@sha256:%s " *)
docker buildx imagetools create $TAGS "${ANNOTATIONS[@]}" $SOURCE_ARGS
build_and_push_server:
name: Build and Push Server
runs-on: ${{ matrix.runner }}
permissions:
contents: read
packages: write
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
env:
image: immich-server
context: .
file: server/Dockerfile
GHCR_REPO: ghcr.io/${{ github.repository_owner }}/immich-server
strategy:
fail-fast: false
matrix:
include:
- platform: linux/amd64
runner: ubuntu-latest
- platform: linux/arm64
runner: ubuntu-24.04-arm
steps:
- name: Prepare
run: |
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
persist-credentials: false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
- name: Login to GitHub Container Registry
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
if: ${{ !github.event.pull_request.head.repo.fork }}
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Generate cache key suffix
env:
REF: ${{ github.ref_name }}
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
echo "CACHE_KEY_SUFFIX=pr-${{ github.event.number }}" >> $GITHUB_ENV
else
SUFFIX=$(echo "${REF}" | sed 's/[^a-zA-Z0-9]/-/g')
echo "CACHE_KEY_SUFFIX=${SUFFIX}" >> $GITHUB_ENV
fi
- name: Generate cache target
id: cache-target
run: |
if [[ "${{ github.event.pull_request.head.repo.fork }}" == "true" ]]; then
# Essentially just ignore the cache output (forks can't write to registry cache)
echo "cache-to=type=local,dest=/tmp/discard,ignore-error=true" >> $GITHUB_OUTPUT
else
echo "cache-to=type=registry,ref=${GHCR_REPO}-build-cache:${PLATFORM_PAIR}-${CACHE_KEY_SUFFIX},mode=max,compression=zstd" >> $GITHUB_OUTPUT
fi
- name: Generate docker image tags
id: meta
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
env:
DOCKER_METADATA_PR_HEAD_SHA: 'true'
- name: Build and push image
id: build
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
with:
context: ${{ env.context }}
file: ${{ env.file }}
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
cache-to: ${{ steps.cache-target.outputs.cache-to }}
cache-from: |
type=registry,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-${{ env.CACHE_KEY_SUFFIX }}
type=registry,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-main
outputs: type=image,"name=${{ env.GHCR_REPO }}",push-by-digest=true,name-canonical=true,push=${{ !github.event.pull_request.head.repo.fork }}
build-args: |
DEVICE=cpu
BUILD_ID=${{ github.run_id }}
BUILD_IMAGE=${{ github.event_name == 'release' && github.ref_name || steps.metadata.outputs.tags }}
BUILD_SOURCE_REF=${{ github.ref_name }}
BUILD_SOURCE_COMMIT=${{ github.sha }}
- name: Export digest
run: | # zizmor: ignore[template-injection]
mkdir -p ${{ runner.temp }}/digests
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: server-digests-${{ env.PLATFORM_PAIR }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1
merge_server:
name: Merge & Push Server
runs-on: ubuntu-latest
tag-suffix: '-rknn'
platforms: linux/arm64
- device: rocm
tag-suffix: '-rocm'
platforms: linux/amd64
runner-mapping: '{"linux/amd64": "mich"}'
uses: ./.github/workflows/multi-runner-build.yml
permissions:
contents: read
actions: read
packages: write
if: ${{ needs.pre-job.outputs.should_run_server == 'true' && !github.event.pull_request.head.repo.fork }}
env:
GHCR_REPO: ghcr.io/${{ github.repository_owner }}/immich-server
DOCKER_REPO: altran1502/immich-server
needs:
- build_and_push_server
steps:
- name: Download digests
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
path: ${{ runner.temp }}/digests
pattern: server-digests-*
merge-multiple: true
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
with:
image: immich-machine-learning
context: machine-learning
dockerfile: machine-learning/Dockerfile
platforms: ${{ matrix.platforms }}
runner-mapping: ${{ matrix.runner-mapping }}
tag-suffix: ${{ matrix.tag-suffix }}
dockerhub-push: ${{ github.event_name == 'release' }}
build-args: |
DEVICE=${{ matrix.device }}
- name: Login to Docker Hub
if: ${{ github.event_name == 'release' }}
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GHCR
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
- name: Generate docker image tags
id: meta
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
env:
DOCKER_METADATA_PR_HEAD_SHA: 'true'
with:
flavor: |
# Disable latest tag
latest=false
suffix=${{ matrix.suffix }}
images: |
name=${{ env.GHCR_REPO }}
name=${{ env.DOCKER_REPO }},enable=${{ github.event_name == 'release' }}
tags: |
# Tag with branch name
type=ref,event=branch
# Tag with pr-number
type=ref,event=pr
# Tag with long commit sha hash
type=sha,format=long,prefix=commit-
# Tag with git tag on release
type=ref,event=tag
type=raw,value=release,enable=${{ github.event_name == 'release' }}
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
run: |
# Process annotations
declare -a ANNOTATIONS=()
if [[ -n "$DOCKER_METADATA_OUTPUT_JSON" ]]; then
while IFS= read -r annotation; do
# Extract key and value by removing the manifest: prefix
if [[ "$annotation" =~ ^manifest:(.+)=(.+)$ ]]; then
key="${BASH_REMATCH[1]}"
value="${BASH_REMATCH[2]}"
# Use array to properly handle arguments with spaces
ANNOTATIONS+=(--annotation "index:$key=$value")
fi
done < <(jq -r '.annotations[]' <<< "$DOCKER_METADATA_OUTPUT_JSON")
fi
TAGS=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
SOURCE_ARGS=$(printf "${GHCR_REPO}@sha256:%s " *)
docker buildx imagetools create $TAGS "${ANNOTATIONS[@]}" $SOURCE_ARGS
server:
name: Build and Push Server
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_server == 'true' }}
uses: ./.github/workflows/multi-runner-build.yml
permissions:
contents: read
actions: read
packages: write
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
with:
image: immich-server
context: .
dockerfile: server/Dockerfile
dockerhub-push: ${{ github.event_name == 'release' }}
build-args: |
DEVICE=cpu
success-check-server:
name: Docker Build & Push Server Success
needs: [merge_server, retag_server]
needs: [server, retag_server]
permissions: {}
runs-on: ubuntu-latest
if: always()
@@ -540,7 +187,7 @@ jobs:
success-check-ml:
name: Docker Build & Push ML Success
needs: [merge_ml, retag_ml]
needs: [machine-learning, retag_ml]
permissions: {}
runs-on: ubuntu-latest
if: always()

View File

@@ -72,4 +72,5 @@ jobs:
with:
name: docs-build-output
path: docs/build/
include-hidden-files: true
retention-days: 1

View File

@@ -16,7 +16,7 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}

185
.github/workflows/multi-runner-build.yml vendored Normal file
View File

@@ -0,0 +1,185 @@
name: 'Multi-runner container image build'
on:
workflow_call:
inputs:
image:
description: 'Name of the image'
type: string
required: true
context:
description: 'Path to build context'
type: string
required: true
dockerfile:
description: 'Path to Dockerfile'
type: string
required: true
tag-suffix:
description: 'Suffix to append to the image tag'
type: string
default: ''
dockerhub-push:
description: 'Push to Docker Hub'
type: boolean
default: false
build-args:
description: 'Docker build arguments'
type: string
required: false
platforms:
description: 'Platforms to build for'
type: string
runner-mapping:
description: 'Mapping from platforms to runners'
type: string
secrets:
DOCKERHUB_USERNAME:
required: false
DOCKERHUB_TOKEN:
required: false
env:
GHCR_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ inputs.image }}
DOCKERHUB_IMAGE: altran1502/${{ inputs.image }}
jobs:
matrix:
name: 'Generate matrix'
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.matrix.outputs.matrix }}
key: ${{ steps.artifact-key.outputs.base }}
steps:
- name: Generate build matrix
id: matrix
shell: bash
env:
PLATFORMS: ${{ inputs.platforms || 'linux/amd64,linux/arm64' }}
RUNNER_MAPPING: ${{ inputs.runner-mapping || '{"linux/amd64":"ubuntu-latest","linux/arm64":"ubuntu-24.04-arm"}' }}
run: |
matrix=$(jq -R -c \
--argjson runner_mapping "${RUNNER_MAPPING}" \
'split(",") | map({platform: ., runner: $runner_mapping[.]})' \
<<< "${PLATFORMS}")
echo "${matrix}"
echo "matrix=${matrix}" >> $GITHUB_OUTPUT
- name: Determine artifact key
id: artifact-key
shell: bash
env:
IMAGE: ${{ inputs.image }}
SUFFIX: ${{ inputs.tag-suffix }}
run: |
if [[ -n "${SUFFIX}" ]]; then
base="${IMAGE}${SUFFIX}-digests"
else
base="${IMAGE}-digests"
fi
echo "${base}"
echo "base=${base}" >> $GITHUB_OUTPUT
build:
needs: matrix
runs-on: ${{ matrix.runner }}
permissions:
contents: read
packages: write
strategy:
fail-fast: false
matrix:
include: ${{ fromJson(needs.matrix.outputs.matrix) }}
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
persist-credentials: false
- uses: ./.github/actions/image-build
with:
context: ${{ inputs.context }}
dockerfile: ${{ inputs.dockerfile }}
image: ${{ env.GHCR_IMAGE }}
ghcr-token: ${{ secrets.GITHUB_TOKEN }}
platform: ${{ matrix.platform }}
artifact-key-base: ${{ needs.matrix.outputs.key }}
build-args: ${{ inputs.build-args }}
merge:
needs: [matrix, build]
runs-on: ubuntu-latest
if: ${{ !github.event.pull_request.head.repo.fork }}
permissions:
contents: read
actions: read
packages: write
steps:
- name: Download digests
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
path: ${{ runner.temp }}/digests
pattern: ${{ needs.matrix.outputs.key }}-*
merge-multiple: true
- name: Login to Docker Hub
if: ${{ inputs.dockerhub-push }}
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GHCR
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
- name: Generate docker image tags
id: meta
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
env:
DOCKER_METADATA_PR_HEAD_SHA: 'true'
with:
flavor: |
# Disable latest tag
latest=false
suffix=${{ inputs.tag-suffix }}
images: |
name=${{ env.GHCR_IMAGE }}
name=${{ env.DOCKERHUB_IMAGE }},enable=${{ inputs.dockerhub-push }}
tags: |
# Tag with branch name
type=ref,event=branch
# Tag with pr-number
type=ref,event=pr
# Tag with long commit sha hash
type=sha,format=long,prefix=commit-
# Tag with git tag on release
type=ref,event=tag
type=raw,value=release,enable=${{ github.event_name == 'release' }}
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
run: |
# Process annotations
declare -a ANNOTATIONS=()
if [[ -n "$DOCKER_METADATA_OUTPUT_JSON" ]]; then
while IFS= read -r annotation; do
# Extract key and value by removing the manifest: prefix
if [[ "$annotation" =~ ^manifest:(.+)=(.+)$ ]]; then
key="${BASH_REMATCH[1]}"
value="${BASH_REMATCH[2]}"
# Use array to properly handle arguments with spaces
ANNOTATIONS+=(--annotation "index:$key=$value")
fi
done < <(jq -r '.annotations[]' <<< "$DOCKER_METADATA_OUTPUT_JSON")
fi
TAGS=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
SOURCE_ARGS=$(printf "${GHCR_IMAGE}@sha256:%s " *)
docker buildx imagetools create $TAGS "${ANNOTATIONS[@]}" $SOURCE_ARGS

View File

@@ -32,7 +32,7 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
@@ -83,7 +83,7 @@ jobs:
steps:
- name: Generate a token
id: generate-token
uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2
uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2
with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
@@ -95,7 +95,7 @@ jobs:
persist-credentials: false
- name: Download APK
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: release-apk-signed

View File

@@ -105,12 +105,12 @@ jobs:
actions: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
persist-credentials: false
- name: Install the latest version of uv
uses: astral-sh/setup-uv@v5
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
- name: Run zizmor 🌈
run: uvx zizmor --format=sarif . > results.sarif
@@ -118,7 +118,7 @@ jobs:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload SARIF file
uses: github/codeql-action/upload-sarif@v3
uses: github/codeql-action/upload-sarif@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3
with:
sarif_file: results.sarif
category: zizmor

View File

@@ -338,12 +338,15 @@ jobs:
name: End-to-End Tests (Server & CLI)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e_server_cli == 'true' }}
runs-on: mich
runs-on: ${{ matrix.runner }}
permissions:
contents: read
defaults:
run:
working-directory: ./e2e
strategy:
matrix:
runner: [ubuntu-latest, ubuntu-24.04-arm]
steps:
- name: Checkout code
@@ -383,12 +386,15 @@ jobs:
name: End-to-End Tests (Web)
needs: pre-job
if: ${{ needs.pre-job.outputs.should_run_e2e_web == 'true' }}
runs-on: mich
runs-on: ${{ matrix.runner }}
permissions:
contents: read
defaults:
run:
working-directory: ./e2e
strategy:
matrix:
runner: [ubuntu-latest, ubuntu-24.04-arm]
steps:
- name: Checkout code
@@ -423,6 +429,21 @@ jobs:
run: npx playwright test
if: ${{ !cancelled() }}
success-check-e2e:
name: End-to-End Tests Success
needs: [e2e-tests-server-cli, e2e-tests-web]
permissions: {}
runs-on: ubuntu-latest
if: always()
steps:
- name: Any jobs failed?
if: ${{ contains(needs.*.result, 'failure') }}
run: exit 1
- name: All jobs passed or skipped
if: ${{ !(contains(needs.*.result, 'failure')) }}
# zizmor: ignore[template-injection]
run: echo "All jobs passed or skipped" && echo "${{ toJSON(needs.*.result) }}"
mobile-unit-tests:
name: Unit Test Mobile
needs: pre-job
@@ -461,7 +482,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # v5
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
# TODO: add caching when supported (https://github.com/actions/setup-python/pull/818)
# with:
# python-version: 3.11
@@ -572,14 +593,14 @@ jobs:
echo "Changed files: ${CHANGED_FILES}"
exit 1
generated-typeorm-migrations-up-to-date:
name: TypeORM Checks
sql-schema-up-to-date:
name: SQL Schema Checks
runs-on: ubuntu-latest
permissions:
contents: read
services:
postgres:
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
image: tensorchord/vchord-postgres:pg14-v0.3.0
env:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
@@ -620,7 +641,7 @@ jobs:
- name: Generate new migrations
continue-on-error: true
run: npm run migrations:generate TestMigration
run: npm run migrations:generate src/TestMigration
- name: Find file changes
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20

80
.vscode/settings.json vendored
View File

@@ -1,45 +1,63 @@
{
"editor.formatOnSave": true,
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.tabSize": 2,
"editor.formatOnSave": true
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.tabSize": 2,
"editor.formatOnSave": true
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.tabSize": 2,
"editor.formatOnSave": true
},
"[svelte]": {
"editor.defaultFormatter": "svelte.svelte-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"svelte.enable-ts-plugin": true,
"eslint.validate": [
"javascript",
"svelte"
],
"typescript.preferences.importModuleSpecifier": "non-relative",
"[dart]": {
"editor.defaultFormatter": "Dart-Code.dart-code",
"editor.formatOnSave": true,
"editor.selectionHighlight": false,
"editor.suggest.snippetsPreventQuickSuggestions": false,
"editor.suggestSelection": "first",
"editor.tabCompletion": "onlySnippets",
"editor.wordBasedSuggestions": "off",
"editor.defaultFormatter": "Dart-Code.dart-code"
"editor.wordBasedSuggestions": "off"
},
"cSpell.words": [
"immich"
],
"[javascript]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[svelte]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "svelte.svelte-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[typescript]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"cSpell.words": ["immich"],
"editor.formatOnSave": true,
"eslint.validate": ["javascript", "svelte"],
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"*.ts": "${capture}.spec.ts,${capture}.mock.ts",
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart"
}
}
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
"*.ts": "${capture}.spec.ts,${capture}.mock.ts"
},
"svelte.enable-ts-plugin": true,
"typescript.preferences.importModuleSpecifier": "non-relative"
}

View File

@@ -17,6 +17,9 @@ e2e:
prod:
docker compose -f ./docker/docker-compose.prod.yml up --build -V --remove-orphans
prod-down:
docker compose -f ./docker/docker-compose.prod.yml down --remove-orphans
prod-scale:
docker compose -f ./docker/docker-compose.prod.yml up --build -V --scale immich-server=3 --scale immich-microservices=3 --remove-orphans

View File

@@ -1,4 +1,4 @@
FROM node:22.14.0-alpine3.20@sha256:40be979442621049f40b1d51a26b55e281246b5de4e5f51a18da7beb6e17e3f9 AS core
FROM node:22.15.0-alpine3.20@sha256:686b8892b69879ef5bfd6047589666933508f9a5451c67320df3070ba0e9807b AS core
WORKDIR /usr/src/open-api/typescript-sdk
COPY open-api/typescript-sdk/package*.json open-api/typescript-sdk/tsconfig*.json ./

1226
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.63",
"version": "2.2.65",
"description": "Command Line Interface (CLI) for Immich",
"type": "module",
"exports": "./dist/index.js",

View File

@@ -116,13 +116,13 @@ services:
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:8-bookworm@sha256:42cba146593a5ea9a622002c1b7cba5da7be248650cbb64ecb9c6c33d29794b1
image: docker.io/valkey/valkey:8-bookworm@sha256:4a9f847af90037d59b34cd4d4ad14c6e055f46540cf4ff757aaafb266060fa28
healthcheck:
test: redis-cli ping || exit 1
database:
container_name: immich_postgres
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0
env_file:
- .env
environment:
@@ -134,24 +134,6 @@ services:
- ${UPLOAD_LOCATION}/postgres:/var/lib/postgresql/data
ports:
- 5432:5432
healthcheck:
test: >-
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align
--command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
echo "checksum failure count is $$Chksum";
[ "$$Chksum" = '0' ] || exit 1
interval: 5m
start_interval: 30s
start_period: 5m
command: >-
postgres
-c shared_preload_libraries=vectors.so
-c 'search_path="$$user", public, vectors'
-c logging_collector=on
-c max_wal_size=2GB
-c shared_buffers=512MB
-c wal_compression=on
# set IMMICH_TELEMETRY_INCLUDE=all in .env to enable metrics
# immich-prometheus:

View File

@@ -56,14 +56,14 @@ services:
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:8-bookworm@sha256:42cba146593a5ea9a622002c1b7cba5da7be248650cbb64ecb9c6c33d29794b1
image: docker.io/valkey/valkey:8-bookworm@sha256:4a9f847af90037d59b34cd4d4ad14c6e055f46540cf4ff757aaafb266060fa28
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0
env_file:
- .env
environment:
@@ -75,14 +75,6 @@ services:
- ${UPLOAD_LOCATION}/postgres:/var/lib/postgresql/data
ports:
- 5432:5432
healthcheck:
test: >-
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1; Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
interval: 5m
start_interval: 30s
start_period: 5m
command: >-
postgres -c shared_preload_libraries=vectors.so -c 'search_path="$$user", public, vectors' -c logging_collector=on -c max_wal_size=2GB -c shared_buffers=512MB -c wal_compression=on
restart: always
# set IMMICH_TELEMETRY_INCLUDE=all in .env to enable metrics
@@ -90,7 +82,7 @@ services:
container_name: immich_prometheus
ports:
- 9090:9090
image: prom/prometheus@sha256:339ce86a59413be18d0e445472891d022725b4803fab609069110205e79fb2f1
image: prom/prometheus@sha256:e2b8aa62b64855956e3ec1e18b4f9387fb6203174a4471936f4662f437f04405
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
@@ -102,7 +94,7 @@ services:
command: [ './run.sh', '-disable-reporting' ]
ports:
- 3000:3000
image: grafana/grafana:11.6.0-ubuntu@sha256:fd8fa48213c624e1a95122f1d93abbf1cf1cbe85fc73212c1e599dbd76c63ff8
image: grafana/grafana:11.6.1-ubuntu@sha256:6fc273288470ef499dd3c6b36aeade093170d4f608f864c5dd3a7fabeae77b50
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:42cba146593a5ea9a622002c1b7cba5da7be248650cbb64ecb9c6c33d29794b1
image: docker.io/valkey/valkey:8-bookworm@sha256:4a9f847af90037d59b34cd4d4ad14c6e055f46540cf4ff757aaafb266060fa28
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
@@ -65,14 +65,8 @@ services:
volumes:
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
healthcheck:
test: >-
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1; Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
interval: 5m
start_interval: 30s
start_period: 5m
command: >-
postgres -c shared_preload_libraries=vectors.so -c 'search_path="$$user", public, vectors' -c logging_collector=on -c max_wal_size=2GB -c shared_buffers=512MB -c wal_compression=on
# change ssd below to hdd if you are using a hard disk drive or other slow storage
command: postgres -c config_file=/etc/postgresql/postgresql.ssd.conf
restart: always
volumes:

View File

@@ -10,12 +10,12 @@ Running with a pre-existing Postgres server can unlock powerful administrative f
## Prerequisites
You must install pgvecto.rs into your instance of Postgres using their [instructions][vectors-install]. After installation, add `shared_preload_libraries = 'vectors.so'` to your `postgresql.conf`. If you already have some `shared_preload_libraries` set, you can separate each extension with a comma. For example, `shared_preload_libraries = 'pg_stat_statements, vectors.so'`.
You must install VectorChord into your instance of Postgres using their [instructions][vchord-install]. After installation, add `shared_preload_libraries = 'vchord.so'` to your `postgresql.conf`. If you already have some `shared_preload_libraries` set, you can separate each extension with a comma. For example, `shared_preload_libraries = 'pg_stat_statements, vchord.so'`.
:::note
Immich is known to work with Postgres versions 14, 15, and 16. Earlier versions are unsupported. Postgres 17 is nominally compatible, but pgvecto.rs does not have prebuilt images or packages for it as of writing.
Immich is known to work with Postgres versions 14, 15, 16 and 17. Earlier versions are unsupported.
Make sure the installed version of pgvecto.rs is compatible with your version of Immich. The current accepted range for pgvecto.rs is `>= 0.2.0, < 0.4.0`.
Make sure the installed version of VectorChord is compatible with your version of Immich. The current accepted range for VectorChord is `>= 0.3.0, < 0.4.0`.
:::
## Specifying the connection URL
@@ -53,16 +53,75 @@ CREATE DATABASE <immichdatabasename>;
\c <immichdatabasename>
BEGIN;
ALTER DATABASE <immichdatabasename> OWNER TO <immichdbusername>;
CREATE EXTENSION vectors;
CREATE EXTENSION vchord CASCADE;
CREATE EXTENSION earthdistance CASCADE;
ALTER DATABASE <immichdatabasename> SET search_path TO "$user", public, vectors;
ALTER SCHEMA vectors OWNER TO <immichdbusername>;
COMMIT;
```
### Updating pgvecto.rs
### Updating VectorChord
When installing a new version of pgvecto.rs, you will need to manually update the extension by connecting to the Immich database and running `ALTER EXTENSION vectors UPDATE;`.
When installing a new version of VectorChord, you will need to manually update the extension by connecting to the Immich database and running `ALTER EXTENSION vchord UPDATE;`.
## Migrating to VectorChord
VectorChord is the successor extension to pgvecto.rs, allowing for higher performance, lower memory usage and higher quality results for smart search and facial recognition.
### Migrating from pgvecto.rs
Support for pgvecto.rs will be dropped in a later release, hence we recommend all users currently using pgvecto.rs to migrate to VectorChord at their convenience. There are two primary approaches to do so.
The easiest option is to have both extensions installed during the migration:
1. Ensure you still have pgvecto.rs installed
2. [Install VectorChord][vchord-install]
3. Add `shared_preload_libraries= 'vchord.so, vectors.so'` to your `postgresql.conf`, making sure to include _both_ `vchord.so` and `vectors.so`. You may include other libraries here as well if needed
4. If Immich does not have superuser permissions, run the SQL command `CREATE EXTENSION vchord CASCADE;` using psql or your choice of database client
5. Start Immich and wait for the logs `Reindexed face_index` and `Reindexed clip_index` to be output
6. Remove the `vectors.so` entry from the `shared_preload_libraries` setting
7. Uninstall pgvecto.rs (e.g. `apt-get purge vectors-pg14` on Debian-based environments, replacing `pg14` as appropriate)
If it is not possible to have both VectorChord and pgvector.s installed at the same time, you can perform the migration with more manual steps:
1. While pgvecto.rs is still installed, run the following SQL command using psql or your choice of database client. Take note of the number outputted by this command as you will need it later
```sql
SELECT atttypmod as dimsize
FROM pg_attribute f
JOIN pg_class c ON c.oid = f.attrelid
WHERE c.relkind = 'r'::char
AND f.attnum > 0
AND c.relname = 'smart_search'::text
AND f.attname = 'embedding'::text;
```
2. Remove references to pgvecto.rs using the below SQL commands
```sql
DROP INDEX IF EXISTS clip_index;
DROP INDEX IF EXISTS face_index;
ALTER TABLE smart_search ALTER COLUMN embedding SET DATA TYPE real[];
ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE real[];
```
3. [Install VectorChord][vchord-install]
4. Change the columns back to the appropriate vector types, replacing `<number>` with the number from step 1
```sql
CREATE EXTENSION IF NOT EXISTS vchord CASCADE;
ALTER TABLE smart_search ALTER COLUMN embedding SET DATA TYPE vector(<number>);
ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE vector(512);
```
5. Start Immich and let it create new indices using VectorChord
### Migrating from pgvector
1. Ensure you have at least 0.7.0 of pgvector installed. If it is below that, please upgrade it and run the SQL command `ALTER EXTENSION vector UPDATE;` using psql or your choice of database client
2. Follow the Prerequisites to install VectorChord
3. If Immich does not have superuser permissions, run the SQL command `CREATE EXTENSION vchord CASCADE;`
4. Start Immich and let it create new indices using VectorChord
Note that VectorChord itself uses pgvector types, so you should not uninstall pgvector after following these steps.
### Common errors
@@ -70,4 +129,4 @@ When installing a new version of pgvecto.rs, you will need to manually update th
If you get the error `driverError: error: permission denied for view pg_vector_index_stat`, you can fix this by connecting to the Immich database and running `GRANT SELECT ON TABLE pg_vector_index_stat TO <immichdbusername>;`.
[vectors-install]: https://docs.vectorchord.ai/getting-started/installation.html
[vchord-install]: https://docs.vectorchord.ai/vectorchord/getting-started/installation.html

View File

@@ -22,7 +22,7 @@ server {
client_max_body_size 50000M;
# Set headers
proxy_set_header Host $http_host;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

View File

@@ -72,7 +72,7 @@ In rare cases, the library watcher can hang, preventing Immich from starting up.
### Nightly job
There is an automatic scan job that is scheduled to run once a day. This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library managment page.
There is an automatic scan job that is scheduled to run once a day. This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library management page.
## Usage

View File

@@ -5,7 +5,7 @@ import TabItem from '@theme/TabItem';
Immich uses Postgres as its search database for both metadata and contextual CLIP search.
Contextual CLIP search is powered by the [pgvecto.rs](https://github.com/tensorchord/pgvecto.rs) extension, utilizing machine learning models like [CLIP](https://openai.com/research/clip) to provide relevant search results. This allows for freeform searches without requiring specific keywords in the image or video metadata.
Contextual CLIP search is powered by the [VectorChord](https://github.com/tensorchord/VectorChord) extension, utilizing machine learning models like [CLIP](https://openai.com/research/clip) to provide relevant search results. This allows for freeform searches without requiring specific keywords in the image or video metadata.
## Advanced Search Filters
@@ -92,7 +92,7 @@ Memory and execution time estimates were obtained without acceleration on a 7800
**Execution Time (ms)**: After warming up the model with one pass, the mean execution time of 100 passes with the same input.
**Memory (MiB)**: The peak RSS usage of the process afer performing the above timing benchmark. Does not include image decoding, concurrent processing, the web server, etc., which are relatively constant factors.
**Memory (MiB)**: The peak RSS usage of the process after performing the above timing benchmark. Does not include image decoding, concurrent processing, the web server, etc., which are relatively constant factors.
**Recall (%)**: Evaluated on Crossmodal-3600, the average of the recall@1, recall@5 and recall@10 results for zeroshot image retrieval. Chinese (Simplified), English, French, German, Italian, Japanese, Korean, Polish, Russian, Spanish and Turkish are additionally tested on XTD-10. Chinese (Simplified) and English are additionally tested on Flickr30k. The recall metrics are the average across all tested datasets.

View File

@@ -14,14 +14,14 @@ online generators you can use.
2. Paste the link to your JSON style in either the **Light Style** or **Dark Style**. (You can add different styles which will help make the map style more appropriate depending on whether you set **Immich** to Light or Dark mode.)
3. Save your selections. Reload the map, and enjoy your custom map style!
## Use Maptiler to build a custom style
## Use MapTiler to build a custom style
Customizing the map style can be done easily using Maptiler, if you do not want to write an entire JSON document by hand.
Customizing the map style can be done easily using MapTiler, if you do not want to write an entire JSON document by hand.
1. Create a free account at https://cloud.maptiler.com
2. Once logged in, you can either create a brand new map by clicking on **New Map**, selecting a starter map, and then clicking **Customize**, OR by selecting a **Standard Map** and customizing it from there.
3. The **editor** interface is self-explanatory. You can change colors, remove visible layers, or add optional layers (e.g., administrative, topo, hydro, etc.) in the composer.
4. Once you have your map composed, click on **Save** at the top right. Give it a unique name to save it to your account.
5. Next, **Publish** your style using the **Publish** button at the top right. This will deploy it to production, which means it is able to be exposed over the Internet. Maptiler will present an interactive side-by-side map with the original and your changes prior to publication.<br/>![Maptiler Publication Settings](img/immich_map_styles_publish.webp)
6. Maptiler will warn you that changing the map will change it across all apps using the map. Since no apps are using the map yet, this is okay.
7. Clicking on the name of your new map at the top left will bring you to the item's **details** page. From here, copy the link to the JSON style under **Use vector style**. This link will automatically contain your personal API key to Maptiler.
5. Next, **Publish** your style using the **Publish** button at the top right. This will deploy it to production, which means it is able to be exposed over the Internet. MapTiler will present an interactive side-by-side map with the original and your changes prior to publication.<br/>![MapTiler Publication Settings](img/immich_map_styles_publish.webp)
6. MapTiler will warn you that changing the map will change it across all apps using the map. Since no apps are using the map yet, this is okay.
7. Clicking on the name of your new map at the top left will bring you to the item's **details** page. From here, copy the link to the JSON style under **Use vector style**. This link will automatically contain your personal API key to MapTiler.

View File

@@ -1,7 +1,7 @@
# Database Queries
:::danger
Keep in mind that mucking around in the database might set the moon on fire. Avoid modifying the database directly when possible, and always have current backups.
Keep in mind that mucking around in the database might set the Moon on fire. Avoid modifying the database directly when possible, and always have current backups.
:::
:::tip

View File

@@ -2,53 +2,13 @@
sidebar_position: 30
---
import CodeBlock from '@theme/CodeBlock';
import ExampleEnv from '!!raw-loader!../../../docker/example.env';
# Docker Compose [Recommended]
Docker Compose is the recommended method to run Immich in production. Below are the steps to deploy Immich with Docker Compose.
## Step 1 - Download the required files
import DockerComposeSteps from '/docs/partials/_docker-compose-install-steps.mdx';
Create a directory of your choice (e.g. `./immich-app`) to hold the `docker-compose.yml` and `.env` files.
```bash title="Move to the directory you created"
mkdir ./immich-app
cd ./immich-app
```
Download [`docker-compose.yml`][compose-file] and [`example.env`][env-file] by running the following commands:
```bash title="Get docker-compose.yml file"
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
```
```bash title="Get .env file"
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
```
You can alternatively download these two files from your browser and move them to the directory that you created, in which case ensure that you rename `example.env` to `.env`.
## Step 2 - Populate the .env file with custom values
<CodeBlock language="bash" title="Default environmental variable content">
{ExampleEnv}
</CodeBlock>
- Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets. It should be a new directory on the server with enough free space.
- Consider changing `DB_PASSWORD` to a custom value. Postgres is not publicly exposed, so this password is only used for local authentication.
To avoid issues with Docker parsing this value, it is best to use only the characters `A-Za-z0-9`. `pwgen` is a handy utility for this.
- Set your timezone by uncommenting the `TZ=` line.
- Populate custom database information if necessary.
## Step 3 - Start the containers
From the directory you created in Step 1 (which should now contain your customized `docker-compose.yml` and `.env` files), run the following command to start Immich as a background service:
```bash title="Start the containers"
docker compose up -d
```
<DockerComposeSteps />
:::info Docker version
If you get an error such as `unknown shorthand flag: 'd' in -d` or `open <location of your .env file>: permission denied`, you are probably running the wrong Docker version. (This happens, for example, with the docker.io package in Ubuntu 22.04.3 LTS.) You can correct the problem by following the complete [Docker Engine install](https://docs.docker.com/engine/install/) procedure for your distribution, crucially the "Uninstall old versions" and "Install using the apt/rpm repository" sections. These replace the distro's Docker packages with Docker's official ones.
@@ -70,6 +30,3 @@ If you get an error `can't set healthcheck.start_interval as feature require Doc
## Next Steps
Read the [Post Installation](/docs/install/post-install.mdx) steps and [upgrade instructions](/docs/install/upgrading.md).
[compose-file]: https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
[env-file]: https://github.com/immich-app/immich/releases/latest/download/example.env

View File

@@ -72,20 +72,21 @@ Information on the current workers can be found [here](/docs/administration/jobs
## Database
| Variable | Description | Default | Containers |
| :---------------------------------- | :----------------------------------------------------------------------- | :----------: | :----------------------------- |
| `DB_URL` | Database URL | | server |
| `DB_HOSTNAME` | Database host | `database` | server |
| `DB_PORT` | Database port | `5432` | server |
| `DB_USERNAME` | Database user | `postgres` | server, database<sup>\*1</sup> |
| `DB_PASSWORD` | Database password | `postgres` | server, database<sup>\*1</sup> |
| `DB_DATABASE_NAME` | Database name | `immich` | server, database<sup>\*1</sup> |
| `DB_VECTOR_EXTENSION`<sup>\*2</sup> | Database vector extension (one of [`pgvector`, `pgvecto.rs`]) | `pgvecto.rs` | server |
| `DB_SKIP_MIGRATIONS` | Whether to skip running migrations on startup (one of [`true`, `false`]) | `false` | server |
| Variable | Description | Default | Containers |
| :---------------------------------- | :--------------------------------------------------------------------------- | :--------: | :----------------------------- |
| `DB_URL` | Database URL | | server |
| `DB_HOSTNAME` | Database host | `database` | server |
| `DB_PORT` | Database port | `5432` | server |
| `DB_USERNAME` | Database user | `postgres` | server, database<sup>\*1</sup> |
| `DB_PASSWORD` | Database password | `postgres` | server, database<sup>\*1</sup> |
| `DB_DATABASE_NAME` | Database name | `immich` | server, database<sup>\*1</sup> |
| `DB_SSL_MODE` | Database SSL mode | | server |
| `DB_VECTOR_EXTENSION`<sup>\*2</sup> | Database vector extension (one of [`vectorchord`, `pgvector`, `pgvecto.rs`]) | | server |
| `DB_SKIP_MIGRATIONS` | Whether to skip running migrations on startup (one of [`true`, `false`]) | `false` | server |
\*1: The values of `DB_USERNAME`, `DB_PASSWORD`, and `DB_DATABASE_NAME` are passed to the Postgres container as the variables `POSTGRES_USER`, `POSTGRES_PASSWORD`, and `POSTGRES_DB` in `docker-compose.yml`.
\*2: This setting cannot be changed after the server has successfully started up.
\*2: If not provided, the appropriate extension to use is auto-detected at startup by introspecting the database. When multiple extensions are installed, the order of preference is VectorChord, pgvecto.rs, pgvector.
:::info

View File

@@ -29,7 +29,7 @@ Download [`docker-compose.yml`](https://github.com/immich-app/immich/releases/la
## Step 2 - Populate the .env file with custom values
Follow [Step 2 in Docker Compose](./docker-compose#step-2---populate-the-env-file-with-custom-values) for instructions on customizing the `.env` file, and then return back to this guide to continue.
Follow [Step 2 in Docker Compose](/docs/install/docker-compose#step-2---populate-the-env-file-with-custom-values) for instructions on customizing the `.env` file, and then return back to this guide to continue.
## Step 3 - Create a new project in Container Manager

View File

@@ -2,7 +2,7 @@
sidebar_position: 80
---
# TrueNAS SCALE [Community]
# TrueNAS [Community]
:::note
This is a community contribution and not officially supported by the Immich team, but included here for convenience.
@@ -12,17 +12,17 @@ Community support can be found in the dedicated channel on the [Discord Server](
**Please report app issues to the corresponding [Github Repository](https://github.com/truenas/charts/tree/master/community/immich).**
:::
Immich can easily be installed on TrueNAS SCALE via the **Community** train application.
Consider reviewing the TrueNAS [Apps tutorial](https://www.truenas.com/docs/scale/scaletutorials/apps/) if you have not previously configured applications on your system.
Immich can easily be installed on TrueNAS Community Edition via the **Community** train application.
Consider reviewing the TrueNAS [Apps resources](https://apps.truenas.com/getting-started/) if you have not previously configured applications on your system.
TrueNAS SCALE makes installing and updating Immich easy, but you must use the Immich web portal and mobile app to configure accounts and access libraries.
TrueNAS Community Edition makes installing and updating Immich easy, but you must use the Immich web portal and mobile app to configure accounts and access libraries.
## First Steps
The Immich app in TrueNAS SCALE installs, completes the initial configuration, then starts the Immich web portal.
When updates become available, SCALE alerts and provides easy updates.
The Immich app in TrueNAS Community Edition installs, completes the initial configuration, then starts the Immich web portal.
When updates become available, TrueNAS alerts and provides easy updates.
Before installing the Immich app in SCALE, review the [Environment Variables](#environment-variables) documentation to see if you want to configure any during installation.
Before installing the Immich app in TrueNAS, review the [Environment Variables](#environment-variables) documentation to see if you want to configure any during installation.
You may also configure environment variables at any time after deploying the application.
### Setting up Storage Datasets
@@ -126,9 +126,9 @@ className="border rounded-xl"
Accept the default port `30041` in **WebUI Port** or enter a custom port number.
:::info Allowed Port Numbers
Only numbers within the range 9000-65535 may be used on SCALE versions below TrueNAS Scale 24.10 Electric Eel.
Only numbers within the range 9000-65535 may be used on TrueNAS versions below TrueNAS Community Edition 24.10 Electric Eel.
Regardless of version, to avoid port conflicts, don't use [ports on this list](https://www.truenas.com/docs/references/defaultports/).
Regardless of version, to avoid port conflicts, don't use [ports on this list](https://www.truenas.com/docs/solutions/optimizations/security/#truenas-default-ports).
:::
### Storage Configuration
@@ -173,7 +173,7 @@ className="border rounded-xl"
You may configure [External Libraries](/docs/features/libraries) by mounting them using **Additional Storage**.
The **Mount Path** is the location you will need to copy and paste into the External Library settings within Immich.
The **Host Path** is the location on the TrueNAS SCALE server where your external library is located.
The **Host Path** is the location on the TrueNAS Community Edition server where your external library is located.
<!-- A section for Labels would go here but I don't know what they do. -->
@@ -188,17 +188,17 @@ className="border rounded-xl"
Accept the default **CPU** limit of `2` threads or specify the number of threads (CPUs with Multi-/Hyper-threading have 2 threads per core).
Accept the default **Memory** limit of `4096` MB or specify the number of MB of RAM. If you're using Machine Learning you should probably set this above 8000 MB.
Specify the **Memory** limit in MB of RAM. Immich recommends at least 6000 MB (6GB). If you selected **Enable Machine Learning** in **Immich Configuration**, you should probably set this above 8000 MB.
:::info Older SCALE Versions
Before TrueNAS SCALE version 24.10 Electric Eel:
:::info Older TrueNAS Versions
Before TrueNAS Community Edition version 24.10 Electric Eel:
The **CPU** value was specified in a different format with a default of `4000m` which is 4 threads.
The **Memory** value was specified in a different format with a default of `8Gi` which is 8 GiB of RAM. The value was specified in bytes or a number with a measurement suffix. Examples: `129M`, `123Mi`, `1000000000`
:::
Enable **GPU Configuration** options if you have a GPU that you will use for [Hardware Transcoding](/docs/features/hardware-transcoding) and/or [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md). More info: [GPU Passthrough Docs for TrueNAS Apps](https://www.truenas.com/docs/truenasapps/#gpu-passthrough)
Enable **GPU Configuration** options if you have a GPU that you will use for [Hardware Transcoding](/docs/features/hardware-transcoding) and/or [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md). More info: [GPU Passthrough Docs for TrueNAS Apps](https://apps.truenas.com/managing-apps/installing-apps/#gpu-passthrough)
### Install
@@ -240,7 +240,7 @@ className="border rounded-xl"
/>
:::info
Some Environment Variables are not available for the TrueNAS SCALE app. This is mainly because they can be configured through GUI options in the [Edit Immich screen](#edit-app-settings).
Some Environment Variables are not available for the TrueNAS Community Edition app. This is mainly because they can be configured through GUI options in the [Edit Immich screen](#edit-app-settings).
Some examples are: `IMMICH_VERSION`, `UPLOAD_LOCATION`, `DB_DATA_LOCATION`, `TZ`, `IMMICH_LOG_LEVEL`, `DB_PASSWORD`, `REDIS_PASSWORD`.
:::
@@ -251,7 +251,7 @@ Some examples are: `IMMICH_VERSION`, `UPLOAD_LOCATION`, `DB_DATA_LOCATION`, `TZ`
Make sure to read the general [upgrade instructions](/docs/install/upgrading.md).
:::
When updates become available, SCALE alerts and provides easy updates.
When updates become available, TrueNAS alerts and provides easy updates.
To update the app to the latest version:
- Go to the **Installed Applications** screen and select Immich from the list of installed applications.

View File

@@ -1,5 +1,5 @@
---
sidebar_position: 2
sidebar_position: 3
---
# Comparison

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

View File

@@ -1,5 +1,5 @@
---
sidebar_position: 3
sidebar_position: 2
---
# Quick start
@@ -10,11 +10,20 @@ to install and use it.
## Requirements
Check the [requirements page](/docs/install/requirements) to get started.
- A system with at least 4GB of RAM and 2 CPU cores.
- [Docker](https://docs.docker.com/engine/install/)
> For a more detailed list of requirements, see the [requirements page](/docs/install/requirements).
---
## Set up the server
Follow the [Docker Compose (Recommended)](/docs/install/docker-compose) instructions to install the server.
import DockerComposeSteps from '/docs/partials/_docker-compose-install-steps.mdx';
<DockerComposeSteps />
---
## Try the web app
@@ -26,6 +35,8 @@ Try uploading a picture from your browser.
<img src={require('./img/upload-button.webp').default} title="Upload button" />
---
## Try the mobile app
### Download the Mobile App
@@ -56,6 +67,8 @@ You can select the **Jobs** tab to see Immich processing your photos.
<img src={require('/docs/guides/img/jobs-tab.webp').default} title="Jobs tab" width={300} />
---
## Review the database backup and restore process
Immich has built-in database backups. You can refer to the
@@ -65,6 +78,8 @@ Immich has built-in database backups. You can refer to the
The database only contains metadata and user information. You must setup manual backups of the images and videos stored in `UPLOAD_LOCATION`.
:::
---
## Where to go from here?
You may decide you'd like to install the server a different way; the Install category on the left menu provides many options.

View File

@@ -2,9 +2,13 @@
sidebar_position: 1
---
# Introduction
# Welcome to Immich
<img src={require('./img/feature-panel.webp').default} alt="Immich - Self-hosted photos and videos backup tool" />
<img
src={require('./img/social-preview-light.webp').default}
alt="Immich - Self-hosted photos and videos backup tool"
data-theme="light"
/>
## Welcome!

View File

@@ -0,0 +1,43 @@
import CodeBlock from '@theme/CodeBlock';
import ExampleEnv from '!!raw-loader!../../../docker/example.env';
### Step 1 - Download the required files
Create a directory of your choice (e.g. `./immich-app`) to hold the `docker-compose.yml` and `.env` files.
```bash title="Move to the directory you created"
mkdir ./immich-app
cd ./immich-app
```
Download [`docker-compose.yml`](https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml) and [`example.env`](https://github.com/immich-app/immich/releases/latest/download/example.env) by running the following commands:
```bash title="Get docker-compose.yml file"
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
```
```bash title="Get .env file"
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
```
You can alternatively download these two files from your browser and move them to the directory that you created, in which case ensure that you rename `example.env` to `.env`.
### Step 2 - Populate the .env file with custom values
<CodeBlock language="bash" title="Default environmental variable content">
{ExampleEnv}
</CodeBlock>
- Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets. It should be a new directory on the server with enough free space.
- Consider changing `DB_PASSWORD` to a custom value. Postgres is not publicly exposed, so this password is only used for local authentication.
To avoid issues with Docker parsing this value, it is best to use only the characters `A-Za-z0-9`. `pwgen` is a handy utility for this.
- Set your timezone by uncommenting the `TZ=` line.
- Populate custom database information if necessary.
### Step 3 - Start the containers
From the directory you created in Step 1 (which should now contain your customized `docker-compose.yml` and `.env` files), run the following command to start Immich as a background service:
```bash title="Start the containers"
docker compose up -d
```

View File

@@ -95,7 +95,7 @@ const config = {
position: 'right',
},
{
to: '/docs/overview/introduction',
to: '/docs/overview/welcome',
position: 'right',
label: 'Docs',
},
@@ -124,6 +124,12 @@ const config = {
label: 'Discord',
position: 'right',
},
{
type: 'html',
position: 'right',
value:
'<a href="https://buy.immich.app" target="_blank" class="no-underline hover:no-underline"><button class="buy-button bg-immich-primary dark:bg-immich-dark-primary text-white dark:text-black rounded-xl">Buy Immich</button></a>',
},
],
},
footer: {
@@ -134,7 +140,7 @@ const config = {
items: [
{
label: 'Welcome',
to: '/docs/overview/introduction',
to: '/docs/overview/welcome',
},
{
label: 'Installation',

View File

@@ -7,14 +7,22 @@
@tailwind components;
@tailwind utilities;
@import url('https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
body {
font-family: 'Be Vietnam Pro', serif;
font-optical-sizing: auto;
/* font-size: 1.125rem;
@font-face {
font-family: 'Overpass';
src: url('/fonts/overpass/Overpass.ttf') format('truetype-variations');
font-weight: 1 999;
font-style: normal;
ascent-override: 106.25%;
size-adjust: 106.25%; */
size-adjust: 106.25%;
}
@font-face {
font-family: 'Overpass Mono';
src: url('/fonts/overpass/OverpassMono.ttf') format('truetype-variations');
font-weight: 1 999;
font-style: normal;
ascent-override: 106.25%;
size-adjust: 106.25%;
}
.breadcrumbs__link {
@@ -29,6 +37,7 @@ img {
/* You can override the default Infima variables here. */
:root {
font-family: 'Overpass', sans-serif;
--ifm-color-primary: #4250af;
--ifm-color-primary-dark: #4250af;
--ifm-color-primary-darker: #4250af;
@@ -59,14 +68,12 @@ div[class^='announcementBar_'] {
}
.menu__link {
padding: 10px;
padding-left: 16px;
padding: 10px 10px 10px 16px;
border-radius: 24px;
margin-right: 16px;
}
.menu__list-item-collapsible {
border-radius: 10px;
margin-right: 16px;
border-radius: 24px;
}
@@ -83,3 +90,12 @@ div[class*='navbar__items'] > li:has(a[class*='version-switcher-34ab39']) {
code {
font-weight: 600;
}
.buy-button {
padding: 8px 14px;
border: 1px solid transparent;
font-family: 'Overpass', sans-serif;
font-weight: 500;
cursor: pointer;
box-shadow: 0 0 5px 2px rgba(181, 206, 254, 0.4);
}

View File

@@ -2,6 +2,7 @@ import {
mdiBug,
mdiCalendarToday,
mdiCrosshairsOff,
mdiCrop,
mdiDatabase,
mdiLeadPencil,
mdiLockOff,
@@ -22,6 +23,18 @@ const withLanguage = (date: Date) => (language: string) => date.toLocaleDateStri
type Item = Omit<TimelineItem, 'done' | 'getDateLabel'> & { date: Date };
const items: Item[] = [
{
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, 5, 5),
},
{
icon: mdiMicrosoftWindows,
iconColor: '#357EC7',

View File

@@ -4,7 +4,7 @@ import Layout from '@theme/Layout';
import { discordPath, discordViewBox } from '@site/src/components/svg-paths';
import ThemedImage from '@theme/ThemedImage';
import Icon from '@mdi/react';
import { mdiAndroid } from '@mdi/js';
function HomepageHeader() {
return (
<header>
@@ -13,11 +13,14 @@ function HomepageHeader() {
<div className="w-full h-[120vh] absolute left-0 top-0 backdrop-blur-3xl bg-immich-bg/40 dark:bg-transparent"></div>
</div>
<section className="text-center pt-12 sm:pt-24 bg-immich-bg/50 dark:bg-immich-dark-bg/80">
<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"
/>
<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{' '}
@@ -28,7 +31,7 @@ function HomepageHeader() {
solution<span className="block"></span>
</p>
<p className="max-w-1/4 m-auto mt-4 px-4">
<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.
@@ -36,27 +39,21 @@ function HomepageHeader() {
</div>
<div className="flex flex-col sm:flex-row place-items-center place-content-center mt-9 gap-4 ">
<Link
className="flex place-items-center place-content-center py-3 px-8 border bg-immich-primary dark:bg-immich-dark-primary rounded-xl no-underline hover:no-underline text-white hover:text-gray-50 dark:text-immich-dark-bg font-bold uppercase"
to="docs/overview/introduction"
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
Get Started
</Link>
<Link
className="flex place-items-center place-content-center py-3 px-8 border bg-immich-primary/10 dark:bg-gray-300 rounded-xl hover:no-underline text-immich-primary dark:text-immich-dark-bg font-bold uppercase"
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/"
>
Demo
</Link>
<Link
className="flex place-items-center place-content-center py-3 px-8 border bg-immich-primary/10 dark:bg-gray-300 rounded-xl hover:no-underline text-immich-primary dark:text-immich-dark-bg font-bold uppercase"
to="https://immich.store"
>
Buy Merch
Open Demo
</Link>
</div>
<div className="my-12 flex gap-1 font-medium place-items-center place-content-center text-immich-primary dark:text-immich-dark-primary">
<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. */
@@ -119,7 +116,7 @@ export default function Home(): JSX.Element {
<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-xs">Privacy should not be a luxury</p>
<p className="text-sm">Privacy should not be a luxury</p>
</div>
</Layout>
);

View File

@@ -1,5 +1,4 @@
import React from 'react';
import Link from '@docusaurus/Link';
import Layout from '@theme/Layout';
function HomepageHeader() {
return (

View File

@@ -252,6 +252,13 @@ const milestones: Item[] = [
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',
@@ -260,13 +267,6 @@ const milestones: Item[] = [
'Manually tag or remove faces in photos and videos, even when automatic detection misses or misidentifies them.',
release: 'v1.127.0',
}),
{
icon: mdiStar,
iconColor: 'gold',
title: '60,000 Stars',
description: 'Reached 60K Stars on GitHub!',
getDateLabel: withLanguage(new Date(2025, 2, 4)),
},
withRelease({
icon: mdiLinkEdit,
iconColor: 'crimson',

5
docs/static/.well-known/security.txt vendored Normal file
View File

@@ -0,0 +1,5 @@
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

@@ -30,3 +30,4 @@
/docs/guides/api-album-sync /docs/community-projects 307
/docs/guides/remove-offline-files /docs/community-projects 307
/milestones /roadmap 307
/docs/overview/introduction /docs/overview/welcome 307

View File

@@ -1,44 +1,16 @@
[
{
"label": "v1.132.1",
"url": "https://v1.132.1.archive.immich.app"
},
{
"label": "v1.132.0",
"url": "https://v1.132.0.archive.immich.app"
"label": "v1.132.3",
"url": "https://v1.132.3.archive.immich.app"
},
{
"label": "v1.131.3",
"url": "https://v1.131.3.archive.immich.app"
},
{
"label": "v1.131.2",
"url": "https://v1.131.2.archive.immich.app"
},
{
"label": "v1.131.1",
"url": "https://v1.131.1.archive.immich.app"
},
{
"label": "v1.131.0",
"url": "https://v1.131.0.archive.immich.app"
},
{
"label": "v1.130.3",
"url": "https://v1.130.3.archive.immich.app"
},
{
"label": "v1.130.2",
"url": "https://v1.130.2.archive.immich.app"
},
{
"label": "v1.130.1",
"url": "https://v1.130.1.archive.immich.app"
},
{
"label": "v1.130.0",
"url": "https://v1.130.0.archive.immich.app"
},
{
"label": "v1.129.0",
"url": "https://v1.129.0.archive.immich.app"
@@ -55,46 +27,14 @@
"label": "v1.126.1",
"url": "https://v1.126.1.archive.immich.app"
},
{
"label": "v1.126.0",
"url": "https://v1.126.0.archive.immich.app"
},
{
"label": "v1.125.7",
"url": "https://v1.125.7.archive.immich.app"
},
{
"label": "v1.125.6",
"url": "https://v1.125.6.archive.immich.app"
},
{
"label": "v1.125.5",
"url": "https://v1.125.5.archive.immich.app"
},
{
"label": "v1.125.3",
"url": "https://v1.125.3.archive.immich.app"
},
{
"label": "v1.125.2",
"url": "https://v1.125.2.archive.immich.app"
},
{
"label": "v1.125.1",
"url": "https://v1.125.1.archive.immich.app"
},
{
"label": "v1.124.2",
"url": "https://v1.124.2.archive.immich.app"
},
{
"label": "v1.124.1",
"url": "https://v1.124.1.archive.immich.app"
},
{
"label": "v1.124.0",
"url": "https://v1.124.0.archive.immich.app"
},
{
"label": "v1.123.0",
"url": "https://v1.123.0.archive.immich.app"
@@ -103,18 +43,6 @@
"label": "v1.122.3",
"url": "https://v1.122.3.archive.immich.app"
},
{
"label": "v1.122.2",
"url": "https://v1.122.2.archive.immich.app"
},
{
"label": "v1.122.1",
"url": "https://v1.122.1.archive.immich.app"
},
{
"label": "v1.122.0",
"url": "https://v1.122.0.archive.immich.app"
},
{
"label": "v1.121.0",
"url": "https://v1.121.0.archive.immich.app"
@@ -123,34 +51,14 @@
"label": "v1.120.2",
"url": "https://v1.120.2.archive.immich.app"
},
{
"label": "v1.120.1",
"url": "https://v1.120.1.archive.immich.app"
},
{
"label": "v1.120.0",
"url": "https://v1.120.0.archive.immich.app"
},
{
"label": "v1.119.1",
"url": "https://v1.119.1.archive.immich.app"
},
{
"label": "v1.119.0",
"url": "https://v1.119.0.archive.immich.app"
},
{
"label": "v1.118.2",
"url": "https://v1.118.2.archive.immich.app"
},
{
"label": "v1.118.1",
"url": "https://v1.118.1.archive.immich.app"
},
{
"label": "v1.118.0",
"url": "https://v1.118.0.archive.immich.app"
},
{
"label": "v1.117.0",
"url": "https://v1.117.0.archive.immich.app"
@@ -159,14 +67,6 @@
"label": "v1.116.2",
"url": "https://v1.116.2.archive.immich.app"
},
{
"label": "v1.116.1",
"url": "https://v1.116.1.archive.immich.app"
},
{
"label": "v1.116.0",
"url": "https://v1.116.0.archive.immich.app"
},
{
"label": "v1.115.0",
"url": "https://v1.115.0.archive.immich.app"
@@ -179,18 +79,10 @@
"label": "v1.113.1",
"url": "https://v1.113.1.archive.immich.app"
},
{
"label": "v1.113.0",
"url": "https://v1.113.0.archive.immich.app"
},
{
"label": "v1.112.1",
"url": "https://v1.112.1.archive.immich.app"
},
{
"label": "v1.112.0",
"url": "https://v1.112.0.archive.immich.app"
},
{
"label": "v1.111.0",
"url": "https://v1.111.0.archive.immich.app"
@@ -203,14 +95,6 @@
"label": "v1.109.2",
"url": "https://v1.109.2.archive.immich.app"
},
{
"label": "v1.109.1",
"url": "https://v1.109.1.archive.immich.app"
},
{
"label": "v1.109.0",
"url": "https://v1.109.0.archive.immich.app"
},
{
"label": "v1.108.0",
"url": "https://v1.108.0.archive.immich.app"
@@ -219,38 +103,14 @@
"label": "v1.107.2",
"url": "https://v1.107.2.archive.immich.app"
},
{
"label": "v1.107.1",
"url": "https://v1.107.1.archive.immich.app"
},
{
"label": "v1.107.0",
"url": "https://v1.107.0.archive.immich.app"
},
{
"label": "v1.106.4",
"url": "https://v1.106.4.archive.immich.app"
},
{
"label": "v1.106.3",
"url": "https://v1.106.3.archive.immich.app"
},
{
"label": "v1.106.2",
"url": "https://v1.106.2.archive.immich.app"
},
{
"label": "v1.106.1",
"url": "https://v1.106.1.archive.immich.app"
},
{
"label": "v1.105.1",
"url": "https://v1.105.1.archive.immich.app"
},
{
"label": "v1.105.0",
"url": "https://v1.105.0.archive.immich.app"
},
{
"label": "v1.104.0",
"url": "https://v1.104.0.archive.immich.app"
@@ -259,26 +119,10 @@
"label": "v1.103.1",
"url": "https://v1.103.1.archive.immich.app"
},
{
"label": "v1.103.0",
"url": "https://v1.103.0.archive.immich.app"
},
{
"label": "v1.102.3",
"url": "https://v1.102.3.archive.immich.app"
},
{
"label": "v1.102.2",
"url": "https://v1.102.2.archive.immich.app"
},
{
"label": "v1.102.1",
"url": "https://v1.102.1.archive.immich.app"
},
{
"label": "v1.102.0",
"url": "https://v1.102.0.archive.immich.app"
},
{
"label": "v1.101.0",
"url": "https://v1.101.0.archive.immich.app"

Binary file not shown.

BIN
docs/static/fonts/overpass/Overpass.ttf vendored Normal file

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 75 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 75 KiB

View File

@@ -34,11 +34,11 @@ services:
- 2285:2285
redis:
image: redis:6.2-alpine@sha256:148bb5411c184abd288d9aaed139c98123eeb8824c5d3fce03cf721db58066d8
image: redis:6.2-alpine@sha256:3211c33a618c457e5d241922c975dbc4f446d0bdb2dc75694f5573ef8e2d01fa
database:
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52
command: -c fsync=off -c shared_preload_libraries=vectors.so
image: tensorchord/vchord-postgres:pg14-v0.3.0
command: -c fsync=off -c shared_preload_libraries=vchord.so
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres

1325
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.132.1",
"version": "1.132.3",
"description": "",
"main": "index.js",
"type": "module",

View File

@@ -46,38 +46,6 @@ describe('/activities', () => {
});
describe('GET /activities', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/activities');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require an albumId', async () => {
const { status, body } = await request(app)
.get('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(400);
expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['albumId must be a UUID'])));
});
it('should reject an invalid albumId', async () => {
const { status, body } = await request(app)
.get('/activities')
.query({ albumId: uuidDto.invalid })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(400);
expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['albumId must be a UUID'])));
});
it('should reject an invalid assetId', async () => {
const { status, body } = await request(app)
.get('/activities')
.query({ albumId: uuidDto.notFound, assetId: uuidDto.invalid })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(400);
expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['assetId must be a UUID'])));
});
it('should start off empty', async () => {
const { status, body } = await request(app)
.get('/activities')
@@ -192,30 +160,6 @@ describe('/activities', () => {
});
describe('POST /activities', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/activities');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require an albumId', async () => {
const { status, body } = await request(app)
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ albumId: uuidDto.invalid });
expect(status).toEqual(400);
expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['albumId must be a UUID'])));
});
it('should require a comment when type is comment', async () => {
const { status, body } = await request(app)
.post('/activities')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ albumId: uuidDto.notFound, type: 'comment', comment: null });
expect(status).toEqual(400);
expect(body).toEqual(errorDto.badRequest(['comment must be a string', 'comment should not be empty']));
});
it('should add a comment to an album', async () => {
const { status, body } = await request(app)
.post('/activities')
@@ -330,20 +274,6 @@ describe('/activities', () => {
});
describe('DELETE /activities/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).delete(`/activities/${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require a valid uuid', async () => {
const { status, body } = await request(app)
.delete(`/activities/${uuidDto.invalid}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
});
it('should remove a comment from an album', async () => {
const reaction = await createActivity({
albumId: album.id,

View File

@@ -9,7 +9,7 @@ import {
LoginResponseDto,
SharedLinkType,
} from '@immich/sdk';
import { createUserDto, uuidDto } from 'src/fixtures';
import { createUserDto } from 'src/fixtures';
import { errorDto } from 'src/responses';
import { app, asBearerAuth, utils } from 'src/utils';
import request from 'supertest';
@@ -128,28 +128,6 @@ describe('/albums', () => {
});
describe('GET /albums', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/albums');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should reject an invalid shared param', async () => {
const { status, body } = await request(app)
.get('/albums?shared=invalid')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toEqual(400);
expect(body).toEqual(errorDto.badRequest(['shared must be a boolean value']));
});
it('should reject an invalid assetId param', async () => {
const { status, body } = await request(app)
.get('/albums?assetId=invalid')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toEqual(400);
expect(body).toEqual(errorDto.badRequest(['assetId must be a UUID']));
});
it("should not show other users' favorites", async () => {
const { status, body } = await request(app)
.get(`/albums/${user1Albums[0].id}?withoutAssets=false`)
@@ -323,12 +301,6 @@ describe('/albums', () => {
});
describe('GET /albums/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/albums/${user1Albums[0].id}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should return album info for own album', async () => {
const { status, body } = await request(app)
.get(`/albums/${user1Albums[0].id}?withoutAssets=false`)
@@ -421,12 +393,6 @@ describe('/albums', () => {
});
describe('GET /albums/statistics', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/albums/statistics');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should return total count of albums the user has access to', async () => {
const { status, body } = await request(app)
.get('/albums/statistics')
@@ -438,12 +404,6 @@ describe('/albums', () => {
});
describe('POST /albums', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/albums').send({ albumName: 'New album' });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should create an album', async () => {
const { status, body } = await request(app)
.post('/albums')
@@ -471,12 +431,6 @@ describe('/albums', () => {
});
describe('PUT /albums/:id/assets', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/albums/${user1Albums[0].id}/assets`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should be able to add own asset to own album', async () => {
const asset = await utils.createAsset(user1.accessToken);
const { status, body } = await request(app)
@@ -526,14 +480,6 @@ describe('/albums', () => {
});
describe('PATCH /albums/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.patch(`/albums/${uuidDto.notFound}`)
.send({ albumName: 'New album name' });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should update an album', async () => {
const album = await utils.createAlbum(user1.accessToken, {
albumName: 'New album',
@@ -576,15 +522,6 @@ describe('/albums', () => {
});
describe('DELETE /albums/:id/assets', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.delete(`/albums/${user1Albums[0].id}/assets`)
.send({ ids: [user1Asset1.id] });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization', async () => {
const { status, body } = await request(app)
.delete(`/albums/${user1Albums[1].id}/assets`)
@@ -679,13 +616,6 @@ describe('/albums', () => {
});
});
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/albums/${user1Albums[0].id}/users`).send({ sharedUserIds: [] });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should be able to add user to own album', async () => {
const { status, body } = await request(app)
.put(`/albums/${album.id}/users`)

View File

@@ -1,5 +1,5 @@
import { LoginResponseDto, Permission, createApiKey } from '@immich/sdk';
import { createUserDto, uuidDto } from 'src/fixtures';
import { createUserDto } from 'src/fixtures';
import { errorDto } from 'src/responses';
import { app, asBearerAuth, utils } from 'src/utils';
import request from 'supertest';
@@ -24,12 +24,6 @@ describe('/api-keys', () => {
});
describe('POST /api-keys', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/api-keys').send({ name: 'API Key' });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should not work without permission', async () => {
const { secret } = await create(user.accessToken, [Permission.ApiKeyRead]);
const { status, body } = await request(app).post('/api-keys').set('x-api-key', secret).send({ name: 'API Key' });
@@ -99,12 +93,6 @@ describe('/api-keys', () => {
});
describe('GET /api-keys', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/api-keys');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should start off empty', async () => {
const { status, body } = await request(app).get('/api-keys').set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual([]);
@@ -125,12 +113,6 @@ describe('/api-keys', () => {
});
describe('GET /api-keys/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/api-keys/${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization', async () => {
const { apiKey } = await create(user.accessToken, [Permission.All]);
const { status, body } = await request(app)
@@ -140,14 +122,6 @@ describe('/api-keys', () => {
expect(body).toEqual(errorDto.badRequest('API Key not found'));
});
it('should require a valid uuid', async () => {
const { status, body } = await request(app)
.get(`/api-keys/${uuidDto.invalid}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
});
it('should get api key details', async () => {
const { apiKey } = await create(user.accessToken, [Permission.All]);
const { status, body } = await request(app)
@@ -165,12 +139,6 @@ describe('/api-keys', () => {
});
describe('PUT /api-keys/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/api-keys/${uuidDto.notFound}`).send({ name: 'new name' });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization', async () => {
const { apiKey } = await create(user.accessToken, [Permission.All]);
const { status, body } = await request(app)
@@ -181,15 +149,6 @@ describe('/api-keys', () => {
expect(body).toEqual(errorDto.badRequest('API Key not found'));
});
it('should require a valid uuid', async () => {
const { status, body } = await request(app)
.put(`/api-keys/${uuidDto.invalid}`)
.send({ name: 'new name' })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
});
it('should update api key details', async () => {
const { apiKey } = await create(user.accessToken, [Permission.All]);
const { status, body } = await request(app)
@@ -208,12 +167,6 @@ describe('/api-keys', () => {
});
describe('DELETE /api-keys/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).delete(`/api-keys/${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require authorization', async () => {
const { apiKey } = await create(user.accessToken, [Permission.All]);
const { status, body } = await request(app)
@@ -223,14 +176,6 @@ describe('/api-keys', () => {
expect(body).toEqual(errorDto.badRequest('API Key not found'));
});
it('should require a valid uuid', async () => {
const { status, body } = await request(app)
.delete(`/api-keys/${uuidDto.invalid}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
});
it('should delete an api key', async () => {
const { apiKey } = await create(user.accessToken, [Permission.All]);
const { status } = await request(app)

View File

@@ -3,6 +3,7 @@ import {
AssetMediaStatus,
AssetResponseDto,
AssetTypeEnum,
AssetVisibility,
getAssetInfo,
getMyUser,
LoginResponseDto,
@@ -22,27 +23,9 @@ import { app, asBearerAuth, tempDir, TEN_TIMES, testAssetDir, utils } from 'src/
import request from 'supertest';
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
const makeUploadDto = (options?: { omit: string }): Record<string, any> => {
const dto: Record<string, any> = {
deviceAssetId: 'example-image',
deviceId: 'TEST',
fileCreatedAt: new Date().toISOString(),
fileModifiedAt: new Date().toISOString(),
isFavorite: 'testing',
duration: '0:00:00.000000',
};
const omit = options?.omit;
if (omit) {
delete dto[omit];
}
return dto;
};
const locationAssetFilepath = `${testAssetDir}/metadata/gps-position/thompson-springs.jpg`;
const ratingAssetFilepath = `${testAssetDir}/metadata/rating/mongolels.jpg`;
const facesAssetFilepath = `${testAssetDir}/metadata/faces/portrait.jpg`;
const facesAssetDir = `${testAssetDir}/metadata/faces`;
const readTags = async (bytes: Buffer, filename: string) => {
const filepath = join(tempDir, filename);
@@ -137,9 +120,9 @@ describe('/asset', () => {
// stats
utils.createAsset(statsUser.accessToken),
utils.createAsset(statsUser.accessToken, { isFavorite: true }),
utils.createAsset(statsUser.accessToken, { isArchived: true }),
utils.createAsset(statsUser.accessToken, { visibility: AssetVisibility.Archive }),
utils.createAsset(statsUser.accessToken, {
isArchived: true,
visibility: AssetVisibility.Archive,
isFavorite: true,
assetData: { filename: 'example.mp4' },
}),
@@ -160,13 +143,6 @@ describe('/asset', () => {
});
describe('GET /assets/:id/original', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/assets/${uuidDto.notFound}/original`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should download the file', async () => {
const response = await request(app)
.get(`/assets/${user1Assets[0].id}/original`)
@@ -178,20 +154,6 @@ describe('/asset', () => {
});
describe('GET /assets/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/assets/${uuidDto.notFound}`);
expect(body).toEqual(errorDto.unauthorized);
expect(status).toBe(401);
});
it('should require a valid id', async () => {
const { status, body } = await request(app)
.get(`/assets/${uuidDto.invalid}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
});
it('should require access', async () => {
const { status, body } = await request(app)
.get(`/assets/${user2Assets[0].id}`)
@@ -224,27 +186,19 @@ describe('/asset', () => {
});
});
it('should get the asset faces', async () => {
const config = await utils.getSystemConfig(admin.accessToken);
config.metadata.faces.import = true;
await updateConfig({ systemConfigDto: config }, { headers: asBearerAuth(admin.accessToken) });
// asset faces
const facesAsset = await utils.createAsset(admin.accessToken, {
assetData: {
describe('faces', () => {
const metadataFaceTests = [
{
description: 'without orientation',
filename: 'portrait.jpg',
bytes: await readFile(facesAssetFilepath),
},
});
await utils.waitForWebsocketEvent({ event: 'assetUpload', id: facesAsset.id });
const { status, body } = await request(app)
.get(`/assets/${facesAsset.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body.id).toEqual(facesAsset.id);
expect(body.people).toMatchObject([
{
description: 'adjusting face regions to orientation',
filename: 'portrait-orientation-6.jpg',
},
];
// should produce same resulting face region coordinates for any orientation
const expectedFaces = [
{
name: 'Marie Curie',
birthDate: null,
@@ -279,7 +233,30 @@ describe('/asset', () => {
},
],
},
]);
];
it.each(metadataFaceTests)('should get the asset faces from $filename $description', async ({ filename }) => {
const config = await utils.getSystemConfig(admin.accessToken);
config.metadata.faces.import = true;
await updateConfig({ systemConfigDto: config }, { headers: asBearerAuth(admin.accessToken) });
const facesAsset = await utils.createAsset(admin.accessToken, {
assetData: {
filename,
bytes: await readFile(`${facesAssetDir}/${filename}`),
},
});
await utils.waitForWebsocketEvent({ event: 'assetUpload', id: facesAsset.id });
const { status, body } = await request(app)
.get(`/assets/${facesAsset.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body.id).toEqual(facesAsset.id);
expect(body.people).toMatchObject(expectedFaces);
});
});
it('should work with a shared link', async () => {
@@ -333,7 +310,7 @@ describe('/asset', () => {
});
it('disallows viewing archived assets', async () => {
const asset = await utils.createAsset(user1.accessToken, { isArchived: true });
const asset = await utils.createAsset(user1.accessToken, { visibility: AssetVisibility.Archive });
const { status } = await request(app)
.get(`/assets/${asset.id}`)
@@ -354,13 +331,6 @@ describe('/asset', () => {
});
describe('GET /assets/statistics', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/assets/statistics');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should return stats of all assets', async () => {
const { status, body } = await request(app)
.get('/assets/statistics')
@@ -384,7 +354,7 @@ describe('/asset', () => {
const { status, body } = await request(app)
.get('/assets/statistics')
.set('Authorization', `Bearer ${statsUser.accessToken}`)
.query({ isArchived: true });
.query({ visibility: AssetVisibility.Archive });
expect(status).toBe(200);
expect(body).toEqual({ images: 1, videos: 1, total: 2 });
@@ -394,7 +364,7 @@ describe('/asset', () => {
const { status, body } = await request(app)
.get('/assets/statistics')
.set('Authorization', `Bearer ${statsUser.accessToken}`)
.query({ isFavorite: true, isArchived: true });
.query({ isFavorite: true, visibility: AssetVisibility.Archive });
expect(status).toBe(200);
expect(body).toEqual({ images: 0, videos: 1, total: 1 });
@@ -404,7 +374,7 @@ describe('/asset', () => {
const { status, body } = await request(app)
.get('/assets/statistics')
.set('Authorization', `Bearer ${statsUser.accessToken}`)
.query({ isFavorite: false, isArchived: false });
.query({ isFavorite: false, visibility: AssetVisibility.Timeline });
expect(status).toBe(200);
expect(body).toEqual({ images: 1, videos: 0, total: 1 });
@@ -425,13 +395,6 @@ describe('/asset', () => {
await utils.waitForQueueFinish(admin.accessToken, 'thumbnailGeneration');
});
it('should require authentication', async () => {
const { status, body } = await request(app).get('/assets/random');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it.each(TEN_TIMES)('should return 1 random assets', async () => {
const { status, body } = await request(app)
.get('/assets/random')
@@ -467,31 +430,9 @@ describe('/asset', () => {
expect(status).toBe(200);
expect(body).toEqual([expect.objectContaining({ id: user2Assets[0].id })]);
});
it('should return error', async () => {
const { status } = await request(app)
.get('/assets/random?count=ABC')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(400);
});
});
describe('PUT /assets/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/assets/:${uuidDto.notFound}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require a valid id', async () => {
const { status, body } = await request(app)
.put(`/assets/${uuidDto.invalid}`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID']));
});
it('should require access', async () => {
const { status, body } = await request(app)
.put(`/assets/${user2Assets[0].id}`)
@@ -519,7 +460,7 @@ describe('/asset', () => {
const { status, body } = await request(app)
.put(`/assets/${user1Assets[0].id}`)
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ isArchived: true });
.send({ visibility: AssetVisibility.Archive });
expect(body).toMatchObject({ id: user1Assets[0].id, isArchived: true });
expect(status).toEqual(200);
});
@@ -619,28 +560,6 @@ describe('/asset', () => {
expect(status).toEqual(200);
});
it('should reject invalid gps coordinates', async () => {
for (const test of [
{ latitude: 12 },
{ longitude: 12 },
{ latitude: 12, longitude: 'abc' },
{ latitude: 'abc', longitude: 12 },
{ latitude: null, longitude: 12 },
{ latitude: 12, longitude: null },
{ latitude: 91, longitude: 12 },
{ latitude: -91, longitude: 12 },
{ latitude: 12, longitude: -181 },
{ latitude: 12, longitude: 181 },
]) {
const { status, body } = await request(app)
.put(`/assets/${user1Assets[0].id}`)
.send(test)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest());
}
});
it('should update gps data', async () => {
const { status, body } = await request(app)
.put(`/assets/${user1Assets[0].id}`)
@@ -712,17 +631,6 @@ describe('/asset', () => {
expect(status).toEqual(200);
});
it('should reject invalid rating', async () => {
for (const test of [{ rating: 7 }, { rating: 3.5 }, { rating: null }]) {
const { status, body } = await request(app)
.put(`/assets/${user1Assets[0].id}`)
.send(test)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest());
}
});
it('should return tagged people', async () => {
const { status, body } = await request(app)
.put(`/assets/${user1Assets[0].id}`)
@@ -746,25 +654,6 @@ describe('/asset', () => {
});
describe('DELETE /assets', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.delete(`/assets`)
.send({ ids: [uuidDto.notFound] });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require a valid uuid', async () => {
const { status, body } = await request(app)
.delete(`/assets`)
.send({ ids: [uuidDto.invalid] })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['each value in ids must be a UUID']));
});
it('should throw an error when the id is not found', async () => {
const { status, body } = await request(app)
.delete(`/assets`)
@@ -877,13 +766,6 @@ describe('/asset', () => {
});
describe('GET /assets/:id/thumbnail', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/assets/${locationAsset.id}/thumbnail`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should not include gps data for webp thumbnails', async () => {
await utils.waitForWebsocketEvent({
event: 'assetUpload',
@@ -919,13 +801,6 @@ describe('/asset', () => {
});
describe('GET /assets/:id/original', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/assets/${locationAsset.id}/original`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should download the original', async () => {
const { status, body, type } = await request(app)
.get(`/assets/${locationAsset.id}/original`)
@@ -946,43 +821,9 @@ describe('/asset', () => {
});
});
describe('PUT /assets', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put('/assets');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
});
describe('POST /assets', () => {
beforeAll(setupTests, 30_000);
it('should require authentication', async () => {
const { status, body } = await request(app).post(`/assets`);
expect(body).toEqual(errorDto.unauthorized);
expect(status).toBe(401);
});
it.each([
{ should: 'require `deviceAssetId`', dto: { ...makeUploadDto({ omit: 'deviceAssetId' }) } },
{ should: 'require `deviceId`', dto: { ...makeUploadDto({ omit: 'deviceId' }) } },
{ should: 'require `fileCreatedAt`', dto: { ...makeUploadDto({ omit: 'fileCreatedAt' }) } },
{ should: 'require `fileModifiedAt`', dto: { ...makeUploadDto({ omit: 'fileModifiedAt' }) } },
{ should: 'require `duration`', dto: { ...makeUploadDto({ omit: 'duration' }) } },
{ should: 'throw if `isFavorite` is not a boolean', dto: { ...makeUploadDto(), isFavorite: 'not-a-boolean' } },
{ should: 'throw if `isVisible` is not a boolean', dto: { ...makeUploadDto(), isVisible: 'not-a-boolean' } },
{ should: 'throw if `isArchived` is not a boolean', dto: { ...makeUploadDto(), isArchived: 'not-a-boolean' } },
])('should $should', async ({ dto }) => {
const { status, body } = await request(app)
.post('/assets')
.set('Authorization', `Bearer ${user1.accessToken}`)
.attach('assetData', makeRandomImage(), 'example.png')
.field(dto);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest());
});
const tests = [
{
input: 'formats/avif/8bit-sRGB.avif',
@@ -1244,31 +1085,21 @@ describe('/asset', () => {
},
];
it(`should upload and generate a thumbnail for different file types`, async () => {
// upload in parallel
const assets = await Promise.all(
tests.map(async ({ input }) => {
const filepath = join(testAssetDir, input);
return utils.createAsset(admin.accessToken, {
assetData: { bytes: await readFile(filepath), filename: basename(filepath) },
});
}),
);
it.each(tests)(`should upload and generate a thumbnail for different file types`, async ({ input, expected }) => {
const filepath = join(testAssetDir, input);
const response = await utils.createAsset(admin.accessToken, {
assetData: { bytes: await readFile(filepath), filename: basename(filepath) },
});
for (const { id, status } of assets) {
expect(status).toBe(AssetMediaStatus.Created);
// longer timeout as the thumbnail generation from full-size raw files can take a while
await utils.waitForWebsocketEvent({ event: 'assetUpload', id });
}
expect(response.status).toBe(AssetMediaStatus.Created);
const id = response.id;
// longer timeout as the thumbnail generation from full-size raw files can take a while
await utils.waitForWebsocketEvent({ event: 'assetUpload', id });
for (const [i, { id }] of assets.entries()) {
const { expected } = tests[i];
const asset = await utils.getAssetInfo(admin.accessToken, id);
expect(asset.exifInfo).toBeDefined();
expect(asset.exifInfo).toMatchObject(expected.exifInfo);
expect(asset).toMatchObject(expected);
}
const asset = await utils.getAssetInfo(admin.accessToken, id);
expect(asset.exifInfo).toBeDefined();
expect(asset.exifInfo).toMatchObject(expected.exifInfo);
expect(asset).toMatchObject(expected);
});
it('should handle a duplicate', async () => {

View File

@@ -1,43 +0,0 @@
import { deleteAssets, getAuditFiles, updateAsset, type LoginResponseDto } from '@immich/sdk';
import { asBearerAuth, utils } from 'src/utils';
import { beforeAll, describe, expect, it } from 'vitest';
describe('/audits', () => {
let admin: LoginResponseDto;
beforeAll(async () => {
await utils.resetDatabase();
await utils.resetFilesystem();
admin = await utils.adminSetup();
});
// TODO: Enable these tests again once #7436 is resolved as these were flaky
describe.skip('GET :/file-report', () => {
it('excludes assets without issues from report', async () => {
const [trashedAsset, archivedAsset] = await Promise.all([
utils.createAsset(admin.accessToken),
utils.createAsset(admin.accessToken),
utils.createAsset(admin.accessToken),
]);
await Promise.all([
deleteAssets({ assetBulkDeleteDto: { ids: [trashedAsset.id] } }, { headers: asBearerAuth(admin.accessToken) }),
updateAsset(
{
id: archivedAsset.id,
updateAssetDto: { isArchived: true },
},
{ headers: asBearerAuth(admin.accessToken) },
),
]);
const body = await getAuditFiles({
headers: asBearerAuth(admin.accessToken),
});
expect(body.orphans).toHaveLength(0);
expect(body.extras).toHaveLength(0);
});
});
});

View File

@@ -19,17 +19,6 @@ describe(`/auth/admin-sign-up`, () => {
expect(body).toEqual(signupResponseDto.admin);
});
it('should sign up the admin with a local domain', async () => {
const { status, body } = await request(app)
.post('/auth/admin-sign-up')
.send({ ...signupDto.admin, email: 'admin@local' });
expect(status).toEqual(201);
expect(body).toEqual({
...signupResponseDto.admin,
email: 'admin@local',
});
});
it('should not allow a second admin to sign up', async () => {
await signUpAdmin({ signUpDto: signupDto.admin });
@@ -57,22 +46,6 @@ describe('/auth/*', () => {
expect(body).toEqual(errorDto.incorrectLogin);
});
for (const key of Object.keys(loginDto.admin)) {
it(`should not allow null ${key}`, async () => {
const { status, body } = await request(app)
.post('/auth/login')
.send({ ...loginDto.admin, [key]: null });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest());
});
it('should reject an invalid email', async () => {
const { status, body } = await request(app).post('/auth/login').send({ email: [], password });
expect(status).toBe(400);
expect(body).toEqual(errorDto.invalidEmail);
});
}
it('should accept a correct password', async () => {
const { status, body, headers } = await request(app).post('/auth/login').send({ email, password });
expect(status).toBe(201);
@@ -127,14 +100,6 @@ describe('/auth/*', () => {
});
describe('POST /auth/change-password', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.post(`/auth/change-password`)
.send({ password, newPassword: 'Password1234' });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require the current password', async () => {
const { status, body } = await request(app)
.post(`/auth/change-password`)

View File

@@ -1,6 +1,5 @@
import { AssetMediaResponseDto, LoginResponseDto } from '@immich/sdk';
import { readFile, writeFile } from 'node:fs/promises';
import { errorDto } from 'src/responses';
import { app, tempDir, utils } from 'src/utils';
import request from 'supertest';
import { beforeAll, describe, expect, it } from 'vitest';
@@ -17,15 +16,6 @@ describe('/download', () => {
});
describe('POST /download/info', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.post(`/download/info`)
.send({ assetIds: [asset1.id] });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should download info', async () => {
const { status, body } = await request(app)
.post('/download/info')
@@ -42,15 +32,6 @@ describe('/download', () => {
});
describe('POST /download/archive', () => {
it('should require authentication', async () => {
const { status, body } = await request(app)
.post(`/download/archive`)
.send({ assetIds: [asset1.id, asset2.id] });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should download an archive', async () => {
const { status, body } = await request(app)
.post('/download/archive')

View File

@@ -1,4 +1,4 @@
import { LoginResponseDto } from '@immich/sdk';
import { AssetVisibility, LoginResponseDto } from '@immich/sdk';
import { readFile } from 'node:fs/promises';
import { basename, join } from 'node:path';
import { Socket } from 'socket.io-client';
@@ -44,7 +44,7 @@ describe('/map', () => {
it('should get map markers for all non-archived assets', async () => {
const { status, body } = await request(app)
.get('/map/markers')
.query({ isArchived: false })
.query({ visibility: AssetVisibility.Timeline })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);

View File

@@ -142,7 +142,7 @@ describe(`/oauth`, () => {
it(`should throw an error if the state mismatches`, async () => {
const callbackParams = await loginWithOAuth('oauth-auto-register');
const { state } = await loginWithOAuth('oauth-auto-register');
const { status, body } = await request(app)
const { status } = await request(app)
.post('/oauth/callback')
.send({ ...callbackParams, state });
expect(status).toBeGreaterThanOrEqual(400);

View File

@@ -1,9 +1,15 @@
import { AssetMediaResponseDto, AssetResponseDto, deleteAssets, LoginResponseDto, updateAsset } from '@immich/sdk';
import {
AssetMediaResponseDto,
AssetResponseDto,
AssetVisibility,
deleteAssets,
LoginResponseDto,
updateAsset,
} from '@immich/sdk';
import { DateTime } from 'luxon';
import { readFile } from 'node:fs/promises';
import { join } from 'node:path';
import { Socket } from 'socket.io-client';
import { errorDto } from 'src/responses';
import { app, asBearerAuth, TEN_TIMES, testAssetDir, utils } from 'src/utils';
import request from 'supertest';
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
@@ -50,7 +56,7 @@ describe('/search', () => {
{ filename: '/formats/motionphoto/samsung-one-ui-6.heic' },
{ filename: '/formats/motionphoto/samsung-one-ui-5.jpg' },
{ filename: '/metadata/gps-position/thompson-springs.jpg', dto: { isArchived: true } },
{ filename: '/metadata/gps-position/thompson-springs.jpg', dto: { visibility: AssetVisibility.Archive } },
// used for search suggestions
{ filename: '/formats/png/density_plot.png' },
@@ -141,65 +147,6 @@ describe('/search', () => {
});
describe('POST /search/metadata', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/search/metadata');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
const badTests = [
{
should: 'should reject page as a string',
dto: { page: 'abc' },
expected: ['page must not be less than 1', 'page must be an integer number'],
},
{
should: 'should reject page as a decimal',
dto: { page: 1.5 },
expected: ['page must be an integer number'],
},
{
should: 'should reject page as a negative number',
dto: { page: -10 },
expected: ['page must not be less than 1'],
},
{
should: 'should reject page as 0',
dto: { page: 0 },
expected: ['page must not be less than 1'],
},
{
should: 'should reject size as a string',
dto: { size: 'abc' },
expected: [
'size must not be greater than 1000',
'size must not be less than 1',
'size must be an integer number',
],
},
{
should: 'should reject an invalid size',
dto: { size: -1.5 },
expected: ['size must not be less than 1', 'size must be an integer number'],
},
...['isArchived', 'isFavorite', 'isEncoded', 'isOffline', 'isMotion', 'isVisible'].map((value) => ({
should: `should reject ${value} not a boolean`,
dto: { [value]: 'immich' },
expected: [`${value} must be a boolean value`],
})),
];
for (const { should, dto, expected } of badTests) {
it(should, async () => {
const { status, body } = await request(app)
.post('/search/metadata')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send(dto);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(expected));
});
}
const searchTests = [
{
should: 'should get my assets',
@@ -231,12 +178,12 @@ describe('/search', () => {
deferred: () => ({ dto: { size: 1, isFavorite: false }, assets: [assetLast] }),
},
{
should: 'should search by isArchived (true)',
deferred: () => ({ dto: { isArchived: true }, assets: [assetSprings] }),
should: 'should search by visibility (AssetVisibility.Archive)',
deferred: () => ({ dto: { visibility: AssetVisibility.Archive }, assets: [assetSprings] }),
},
{
should: 'should search by isArchived (false)',
deferred: () => ({ dto: { size: 1, isArchived: false }, assets: [assetLast] }),
should: 'should search by visibility (AssetVisibility.Timeline)',
deferred: () => ({ dto: { size: 1, visibility: AssetVisibility.Timeline }, assets: [assetLast] }),
},
{
should: 'should search by type (image)',
@@ -245,7 +192,7 @@ describe('/search', () => {
{
should: 'should search by type (video)',
deferred: () => ({
dto: { type: 'VIDEO' },
dto: { type: 'VIDEO', visibility: AssetVisibility.Hidden },
assets: [
// the three live motion photos
{ id: expect.any(String) },
@@ -289,13 +236,6 @@ describe('/search', () => {
should: 'should search by takenAfter (no results)',
deferred: () => ({ dto: { takenAfter: today.plus({ hour: 1 }).toJSDate() }, assets: [] }),
},
// {
// should: 'should search by originalPath',
// deferred: () => ({
// dto: { originalPath: asset1.originalPath },
// assets: [asset1],
// }),
// },
{
should: 'should search by originalFilename',
deferred: () => ({
@@ -325,7 +265,7 @@ describe('/search', () => {
deferred: () => ({
dto: {
city: '',
isVisible: true,
visibility: AssetVisibility.Timeline,
includeNull: true,
},
assets: [assetLast],
@@ -336,7 +276,7 @@ describe('/search', () => {
deferred: () => ({
dto: {
city: null,
isVisible: true,
visibility: AssetVisibility.Timeline,
includeNull: true,
},
assets: [assetLast],
@@ -357,7 +297,7 @@ describe('/search', () => {
deferred: () => ({
dto: {
state: '',
isVisible: true,
visibility: AssetVisibility.Timeline,
withExif: true,
includeNull: true,
},
@@ -369,7 +309,7 @@ describe('/search', () => {
deferred: () => ({
dto: {
state: null,
isVisible: true,
visibility: AssetVisibility.Timeline,
includeNull: true,
},
assets: [assetLast, assetNotocactus],
@@ -390,7 +330,7 @@ describe('/search', () => {
deferred: () => ({
dto: {
country: '',
isVisible: true,
visibility: AssetVisibility.Timeline,
includeNull: true,
},
assets: [assetLast],
@@ -401,7 +341,7 @@ describe('/search', () => {
deferred: () => ({
dto: {
country: null,
isVisible: true,
visibility: AssetVisibility.Timeline,
includeNull: true,
},
assets: [assetLast],
@@ -454,14 +394,6 @@ describe('/search', () => {
}
});
describe('POST /search/smart', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/search/smart');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
});
describe('POST /search/random', () => {
beforeAll(async () => {
await Promise.all([
@@ -476,13 +408,6 @@ describe('/search', () => {
await utils.waitForQueueFinish(admin.accessToken, 'thumbnailGeneration');
});
it('should require authentication', async () => {
const { status, body } = await request(app).post('/search/random').send({ size: 1 });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it.each(TEN_TIMES)('should return 1 random assets', async () => {
const { status, body } = await request(app)
.post('/search/random')
@@ -512,12 +437,6 @@ describe('/search', () => {
});
describe('GET /search/explore', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/search/explore');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should get explore data', async () => {
const { status, body } = await request(app)
.get('/search/explore')
@@ -528,12 +447,6 @@ describe('/search', () => {
});
describe('GET /search/places', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/search/places');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should get relevant places', async () => {
const name = 'Paris';
@@ -552,12 +465,6 @@ describe('/search', () => {
});
describe('GET /search/cities', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/search/cities');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should get all cities', async () => {
const { status, body } = await request(app)
.get('/search/cities')
@@ -576,12 +483,6 @@ describe('/search', () => {
});
describe('GET /search/suggestions', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/search/suggestions');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should get suggestions for country (including null)', async () => {
const { status, body } = await request(app)
.get('/search/suggestions?type=country&includeNull=true')

View File

@@ -1,4 +1,4 @@
import { AssetMediaResponseDto, LoginResponseDto, SharedLinkType, TimeBucketSize } from '@immich/sdk';
import { AssetMediaResponseDto, AssetVisibility, LoginResponseDto, SharedLinkType, TimeBucketSize } from '@immich/sdk';
import { DateTime } from 'luxon';
import { createUserDto } from 'src/fixtures';
import { errorDto } from 'src/responses';
@@ -104,7 +104,7 @@ describe('/timeline', () => {
const req1 = await request(app)
.get('/timeline/buckets')
.set('Authorization', `Bearer ${timeBucketUser.accessToken}`)
.query({ size: TimeBucketSize.Month, withPartners: true, isArchived: true });
.query({ size: TimeBucketSize.Month, withPartners: true, visibility: AssetVisibility.Archive });
expect(req1.status).toBe(400);
expect(req1.body).toEqual(errorDto.badRequest());
@@ -112,7 +112,7 @@ describe('/timeline', () => {
const req2 = await request(app)
.get('/timeline/buckets')
.set('Authorization', `Bearer ${user.accessToken}`)
.query({ size: TimeBucketSize.Month, withPartners: true, isArchived: undefined });
.query({ size: TimeBucketSize.Month, withPartners: true, visibility: undefined });
expect(req2.status).toBe(400);
expect(req2.body).toEqual(errorDto.badRequest());

View File

@@ -215,6 +215,19 @@ describe('/admin/users', () => {
const user = await getMyUser({ headers: asBearerAuth(token.accessToken) });
expect(user).toMatchObject({ email: nonAdmin.userEmail });
});
it('should update the avatar color', async () => {
const { status, body } = await request(app)
.put(`/admin/users/${admin.userId}`)
.send({ avatarColor: 'orange' })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toMatchObject({ avatarColor: 'orange' });
const after = await getUserAdmin({ id: admin.userId }, { headers: asBearerAuth(admin.accessToken) });
expect(after).toMatchObject({ avatarColor: 'orange' });
});
});
describe('PUT /admin/users/:id/preferences', () => {
@@ -240,19 +253,6 @@ describe('/admin/users', () => {
expect(after).toMatchObject({ memories: { enabled: false } });
});
it('should update the avatar color', async () => {
const { status, body } = await request(app)
.put(`/admin/users/${admin.userId}/preferences`)
.send({ avatar: { color: 'orange' } })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toMatchObject({ avatar: { color: 'orange' } });
const after = await getUserPreferencesAdmin({ id: admin.userId }, { headers: asBearerAuth(admin.accessToken) });
expect(after).toMatchObject({ avatar: { color: 'orange' } });
});
it('should update download archive size', async () => {
const { status, body } = await request(app)
.put(`/admin/users/${admin.userId}/preferences`)

View File

@@ -139,6 +139,19 @@ describe('/users', () => {
profileChangedAt: expect.anything(),
});
});
it('should update avatar color', async () => {
const { status, body } = await request(app)
.put(`/users/me`)
.send({ avatarColor: 'blue' })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toMatchObject({ avatarColor: 'blue' });
const after = await getMyUser({ headers: asBearerAuth(admin.accessToken) });
expect(after).toMatchObject({ avatarColor: 'blue' });
});
});
describe('PUT /users/me/preferences', () => {
@@ -158,19 +171,6 @@ describe('/users', () => {
expect(after).toMatchObject({ memories: { enabled: false } });
});
it('should update avatar color', async () => {
const { status, body } = await request(app)
.put(`/users/me/preferences`)
.send({ avatar: { color: 'blue' } })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toMatchObject({ avatar: { color: 'blue' } });
const after = await getMyPreferences({ headers: asBearerAuth(admin.accessToken) });
expect(after).toMatchObject({ avatar: { color: 'blue' } });
});
it('should require an integer for download archive size', async () => {
const { status, body } = await request(app)
.put(`/users/me/preferences`)

View File

@@ -3,6 +3,7 @@ import {
AssetMediaCreateDto,
AssetMediaResponseDto,
AssetResponseDto,
AssetVisibility,
CheckExistingAssetsDto,
CreateAlbumDto,
CreateLibraryDto,
@@ -429,7 +430,10 @@ export const utils = {
},
archiveAssets: (accessToken: string, ids: string[]) =>
updateAssets({ assetBulkUpdateDto: { ids, isArchived: true } }, { headers: asBearerAuth(accessToken) }),
updateAssets(
{ assetBulkUpdateDto: { ids, visibility: AssetVisibility.Archive } },
{ headers: asBearerAuth(accessToken) },
),
deleteAssets: (accessToken: string, ids: string[]) =>
deleteAssets({ assetBulkDeleteDto: { ids } }, { headers: asBearerAuth(accessToken) }),

View File

@@ -25,7 +25,7 @@ test.describe('Registration', () => {
// login
await expect(page).toHaveTitle(/Login/);
await page.goto('/auth/login');
await page.goto('/auth/login?autoLaunch=0');
await page.getByLabel('Email').fill('admin@immich.app');
await page.getByLabel('Password').fill('password');
await page.getByRole('button', { name: 'Login' }).click();
@@ -59,7 +59,7 @@ test.describe('Registration', () => {
await context.clearCookies();
// login
await page.goto('/auth/login');
await page.goto('/auth/login?autoLaunch=0');
await page.getByLabel('Email').fill('user@immich.cloud');
await page.getByLabel('Password').fill('password');
await page.getByRole('button', { name: 'Login' }).click();
@@ -72,7 +72,7 @@ test.describe('Registration', () => {
await page.getByRole('button', { name: 'Change password' }).click();
// login with new password
await expect(page).toHaveURL('/auth/login');
await expect(page).toHaveURL('/auth/login?autoLaunch=0');
await page.getByLabel('Email').fill('user@immich.cloud');
await page.getByLabel('Password').fill('new-password');
await page.getByRole('button', { name: 'Login' }).click();

View File

@@ -21,23 +21,9 @@ test.describe('Photo Viewer', () => {
test.beforeEach(async ({ context, page }) => {
// before each test, login as user
await utils.setAuthCookies(context, admin.accessToken);
await page.goto('/photos');
await page.waitForLoadState('networkidle');
});
test('initially shows a loading spinner', async ({ page }) => {
await page.route(`/api/assets/${asset.id}/thumbnail**`, async (route) => {
// slow down the request for thumbnail, so spinner has chance to show up
await new Promise((f) => setTimeout(f, 2000));
await route.continue();
});
await page.goto(`/photos/${asset.id}`);
await page.waitForLoadState('load');
// this is the spinner
await page.waitForSelector('svg[role=status]');
await expect(page.getByTestId('loading-spinner')).toBeVisible();
});
test('loads original photo when zoomed', async ({ page }) => {
await page.goto(`/photos/${asset.id}`);
await expect.poll(async () => await imageLocator(page).getAttribute('src')).toContain('thumbnail');

View File

@@ -47,16 +47,13 @@ test.describe('Shared Links', () => {
await page.locator(`[data-asset-id="${asset.id}"]`).hover();
await page.waitForSelector('[data-group] svg');
await page.getByRole('checkbox').click();
await page.getByRole('button', { name: 'Download' }).click();
await page.waitForEvent('download');
await Promise.all([page.waitForEvent('download'), page.getByRole('button', { name: 'Download' }).click()]);
});
test('download all from shared link', async ({ page }) => {
await page.goto(`/share/${sharedLink.key}`);
await page.getByRole('heading', { name: 'Test Album' }).waitFor();
await page.getByRole('button', { name: 'Download' }).click();
await page.getByText('DOWNLOADING', { exact: true }).waitFor();
await page.waitForEvent('download');
await Promise.all([page.waitForEvent('download'), page.getByRole('button', { name: 'Download' }).click()]);
});
test('enter password for a shared link', async ({ page }) => {

View File

@@ -187,20 +187,13 @@
"oauth_auto_register": "التسجيل التلقائي",
"oauth_auto_register_description": "التسجيل التلقائي للمستخدمين الجدد بعد تسجيل الدخول باستخدام OAuth",
"oauth_button_text": "نص الزر",
"oauth_client_id": "معرف العميل",
"oauth_client_secret": "الرمز السري للعميل",
"oauth_enable_description": "تسجيل الدخول باستخدام OAuth",
"oauth_issuer_url": "عنوان URL الخاص بجهة الإصدار",
"oauth_mobile_redirect_uri": "عنوان URI لإعادة التوجيه على الهاتف",
"oauth_mobile_redirect_uri_override": "تجاوز عنوان URI لإعادة التوجيه على الهاتف",
"oauth_mobile_redirect_uri_override_description": "قم بتفعيله عندما لا يسمح موفر OAuth بمعرف URI للجوال، مثل '{callback}'",
"oauth_profile_signing_algorithm": "خوارزمية توقيع الملف الشخصي",
"oauth_profile_signing_algorithm_description": "الخوارزمية المستخدمة للتوقيع على ملف تعريف المستخدم.",
"oauth_scope": "النطاق",
"oauth_settings": "OAuth",
"oauth_settings_description": "إدارة إعدادات تسجيل الدخول OAuth",
"oauth_settings_more_details": "لمزيد من التفاصيل حول هذه الميزة، يرجى الرجوع إلى <link>الوثائق</link>.",
"oauth_signing_algorithm": "خوارزمية التوقيع",
"oauth_storage_label_claim": "المطالبة بتصنيف التخزين",
"oauth_storage_label_claim_description": "قم تلقائيًا بتعيين تصنيف التخزين الخاص بالمستخدم على قيمة هذه المطالبة.",
"oauth_storage_quota_claim": "المطالبة بحصة التخزين",

View File

@@ -14,6 +14,7 @@
"add_a_location": "Дадаць месца",
"add_a_name": "Дадаць імя",
"add_a_title": "Дадаць загаловак",
"add_endpoint": "Дадаць кропку доступу",
"add_exclusion_pattern": "Дадаць шаблон выключэння",
"add_import_path": "Дадаць шлях імпарту",
"add_location": "Дадайце месца",
@@ -42,7 +43,7 @@
"backup_database_enable_description": "Уключыць рэзерваванне базы даных",
"backup_keep_last_amount": "Колькасць папярэдніх рэзервовых копій для захавання",
"backup_settings": "Налады рэзервовага капіявання",
"backup_settings_description": "Кіраванне наладкамі рэзервовага капіявання базы даных",
"backup_settings_description": "Кіраванне наладамі дампа базы дадзеных. Заўвага: гэтыя задачы не кантралююцца, і ў выпадку няўдачы паведамленне адпраўлена не будзе.",
"check_all": "Праверыць усе",
"cleanup": "Ачыстка",
"cleared_jobs": "Ачышчаны заданні для: {job}",
@@ -62,8 +63,18 @@
"external_library_created_at": "Знешняя бібліятэка (створана {date})",
"external_library_management": "Кіраванне знешняй бібліятэкай",
"face_detection": "Выяўленне твараў",
"face_detection_description": "Выяўляць твары на фотаздымках і відэа з дапамогай машыннага навучання. Для відэа ўлічваецца толькі мініяцюра. \"Абнавіць\" (пера)апрацоўвае ўсе медыя. \"Скінуць\" дадаткова ачышчае ўсе бягучыя дадзеныя пра твары. \"Адсутнічае\" ставіць у чаргу медыя, якія яшчэ не былі апрацаваныя. Выяўленыя твары будуць пастаўлены ў чаргу для распазнавання асоб пасля завяршэння выяўлення твараў, з групаваннем іх па існуючых або новых людзях.",
"facial_recognition_job_description": "Групаваць выяўленыя твары па асобах. Гэты этап выконваецца пасля завяршэння выяўлення твараў. \"Скінуць\" (паўторна) перагрупоўвае ўсе твары. \"Адсутнічае\" ставіць у чаргу твары, якія яшчэ не прыпісаныя да якой-небудзь асобы.",
"failed_job_command": "Каманда {command} не выканалася для задання: {job}",
"force_delete_user_warning": "ПАПЯРЭДЖАННЕ: Гэта дзеянне неадкладна выдаліць карыстальніка і ўсе аб'екты. Гэта дзеянне не можа быць адроблена і файлы немагчыма будзе аднавіць.",
"forcing_refresh_library_files": "Прымусовае абнаўленне ўсіх файлаў бібліятэкі",
"image_format": "Фармат",
"image_format_description": "WebP стварае меншыя файлы, чым JPEG, але павольней кадуе.",
"image_fullsize_description": "Выява ў поўным памеры без метаданых, выкарыстоўваецца пры павелічэнні",
"image_fullsize_enabled": "Уключыць стварэнне выявы ў поўным памеры",
"image_fullsize_enabled_description": "Ствараць выяву ў поўным памеры для фарматаў, што не прыдатныя для вэб. Калі ўключана опцыя \"Аддаваць перавагу ўбудаванай праяве\", прагляды выкарыстоўваюцца непасрэдна без канвертацыі. Не ўплывае на вэб-прыдатныя фарматы, такія як JPEG.",
"image_fullsize_quality_description": "Якасць выявы ў поўным памеры ад 1 да 100. Больш высокае значэнне лепшае, але прыводзіць да павелічэння памеру файла.",
"image_fullsize_title": "Налады выявы ў поўным памеры",
"image_preview_title": "Налады папярэдняга прагляду",
"image_quality": "Якасць",
"image_resolution": "Раздзяляльнасць",

View File

@@ -183,20 +183,13 @@
"oauth_auto_register": "Автоматична регистрация",
"oauth_auto_register_description": "Автоматично регистриране на нови потребители след влизане с OAuth",
"oauth_button_text": "Текст на бутона",
"oauth_client_id": "Клиентски ID",
"oauth_client_secret": "Клиентска тайна",
"oauth_enable_description": "Влизане с OAuth",
"oauth_issuer_url": "URL на издателя",
"oauth_mobile_redirect_uri": "URI за мобилно пренасочване",
"oauth_mobile_redirect_uri_override": "URI пренасочване за мобилни устройства",
"oauth_mobile_redirect_uri_override_description": "Разреши когато доставчика за OAuth удостоверяване не позволява за мобилни URI идентификатори, като '{callback}'",
"oauth_profile_signing_algorithm": "Алгоритъм за създаване на профили",
"oauth_profile_signing_algorithm_description": "Алгоритъм използван за вписване на потребителски профил.",
"oauth_scope": "Област/обхват на приложение",
"oauth_settings": "OAuth",
"oauth_settings_description": "Управление на настройките за вход с OAuth",
"oauth_settings_more_details": "За повече информация за функционалността, се потърсете в <link>docs</link>.",
"oauth_signing_algorithm": "Алгоритъм за вписване",
"oauth_storage_label_claim": "Заявка за етикет за съхранение",
"oauth_storage_label_claim_description": "Автоматично задайте етикета за съхранение на потребителя със стойността от тази заявка.",
"oauth_storage_quota_claim": "Заявка за квота за съхранение",

View File

@@ -138,17 +138,12 @@
"oauth_auto_register": "",
"oauth_auto_register_description": "",
"oauth_button_text": "",
"oauth_client_id": "",
"oauth_client_secret": "",
"oauth_enable_description": "",
"oauth_issuer_url": "",
"oauth_mobile_redirect_uri": "",
"oauth_mobile_redirect_uri_override": "",
"oauth_mobile_redirect_uri_override_description": "",
"oauth_scope": "",
"oauth_settings": "",
"oauth_settings_description": "",
"oauth_signing_algorithm": "",
"oauth_storage_label_claim": "",
"oauth_storage_label_claim_description": "",
"oauth_storage_quota_claim": "",

View File

@@ -192,20 +192,13 @@
"oauth_auto_register": "Registre automàtic",
"oauth_auto_register_description": "Registra nous usuaris automàticament després d'iniciar sessió amb OAuth",
"oauth_button_text": "Text del botó",
"oauth_client_id": "ID Client",
"oauth_client_secret": "Secret de Client",
"oauth_enable_description": "Iniciar sessió amb OAuth",
"oauth_issuer_url": "URL de l'emissor",
"oauth_mobile_redirect_uri": "URI de redirecció mòbil",
"oauth_mobile_redirect_uri_override": "Sobreescriu l'URI de redirecció mòbil",
"oauth_mobile_redirect_uri_override_description": "Habilita quan el proveïdor d'OAuth no permet una URI mòbil, com ara '{callback}'",
"oauth_profile_signing_algorithm": "Algoritme de signatura del perfil",
"oauth_profile_signing_algorithm_description": "Algoritme utilitzat per signar el perfil dusuari.",
"oauth_scope": "Abast",
"oauth_settings": "OAuth",
"oauth_settings_description": "Gestiona la configuració de l'inici de sessió OAuth",
"oauth_settings_more_details": "Per a més detalls sobre aquesta funcionalitat, consulteu la <link>documentació</link>.",
"oauth_signing_algorithm": "Algorisme de signatura",
"oauth_storage_label_claim": "Petició d'etiquetatge d'emmagatzematge",
"oauth_storage_label_claim_description": "Estableix automàticament l'etiquetatge d'emmagatzematge de l'usuari a aquest valor.",
"oauth_storage_quota_claim": "Quota d'emmagatzematge reclamada",

View File

@@ -192,26 +192,22 @@
"oauth_auto_register": "Automatická registrace",
"oauth_auto_register_description": "Automaticky registrovat nové uživatele po přihlášení pomocí OAuth",
"oauth_button_text": "Text tlačítka",
"oauth_client_id": "Client ID",
"oauth_client_secret": "Client Secret",
"oauth_client_secret_description": "Vyžaduje se, pokud poskytovatel OAuth nepodporuje PKCE (Proof Key for Code Exchange)",
"oauth_enable_description": "Přihlásit pomocí OAuth",
"oauth_issuer_url": "URL vydavatele",
"oauth_mobile_redirect_uri": "Mobilní přesměrování URI",
"oauth_mobile_redirect_uri_override": "Přepsat mobilní přesměrování URI",
"oauth_mobile_redirect_uri_override_description": "Povolit, pokud poskytovatel OAuth nepovoluje mobilní URI, například '{callback}'",
"oauth_profile_signing_algorithm": "Algoritmus podepisování profilu",
"oauth_profile_signing_algorithm_description": "Algoritmus použitý k podepsání profilu uživatele.",
"oauth_scope": "Rozsah",
"oauth_settings": "OAuth",
"oauth_settings_description": "Správa nastavení OAuth přihlášení",
"oauth_settings_more_details": "Další podrobnosti o této funkci naleznete v <link>dokumentaci</link>.",
"oauth_signing_algorithm": "Algoritmus podepisování",
"oauth_storage_label_claim": "Deklarace štítku úložiště",
"oauth_storage_label_claim_description": "Automaticky nastavit štítek úložiště uživatele na hodnotu této deklarace.",
"oauth_storage_quota_claim": "Deklarace kvóty úložiště",
"oauth_storage_quota_claim_description": "Automaticky nastavit kvótu úložiště uživatele na hodnotu této deklarace.",
"oauth_storage_quota_default": "Výchozí kvóta úložiště (GiB)",
"oauth_storage_quota_default_description": "Kvóta v GiB, která se použije, pokud není poskytnuta žádná deklarace (pro neomezenou kvótu zadejte 0).",
"oauth_timeout": "Časový limit požadavku",
"oauth_timeout_description": "Časový limit pro požadavky v milisekundách",
"offline_paths": "Cesty offline",
"offline_paths_description": "Tyto výsledky mohou být způsobeny ručním odstraněním souborů, které nejsou součástí externí knihovny.",
"password_enable_description": "Přihlášení pomocí e-mailu a hesla",
@@ -818,7 +814,7 @@
"enabled": "Povoleno",
"end_date": "Konečné datum",
"enqueued": "Ve frontě",
"enter_wifi_name": "Zadejte název WiFi",
"enter_wifi_name": "Zadejte název Wi-Fi",
"error": "Chyba",
"error_change_sort_album": "Nepodařilo se změnit pořadí alba",
"error_delete_face": "Chyba při odstraňování obličeje z položky",
@@ -853,10 +849,12 @@
"failed_to_keep_this_delete_others": "Nepodařilo se zachovat tuto položku a odstranit ostatní položky",
"failed_to_load_asset": "Nepodařilo se načíst položku",
"failed_to_load_assets": "Nepodařilo se načíst položky",
"failed_to_load_notifications": "Nepodařilo se načíst oznámení",
"failed_to_load_people": "Chyba načítání osob",
"failed_to_remove_product_key": "Nepodařilo se odebrat klíč produktu",
"failed_to_stack_assets": "Nepodařilo se seskupit položky",
"failed_to_unstack_assets": "Nepodařilo se rozložit položky",
"failed_to_update_notification_status": "Nepodařilo se aktualizovat stav oznámení",
"import_path_already_exists": "Tato cesta importu již existuje.",
"incorrect_email_or_password": "Nesprávný e-mail nebo heslo",
"paths_validation_failed": "{paths, plural, one {# cesta neprošla} few {# cesty neprošly} other {# cest neprošlo}} kontrolou",
@@ -978,7 +976,7 @@
"external": "Externí",
"external_libraries": "Externí knihovny",
"external_network": "Externí síť",
"external_network_sheet_info": "Pokud nejste v preferované síti WiFi, aplikace se připojí k serveru prostřednictvím první z níže uvedených adres URL, které může dosáhnout, počínaje shora dolů",
"external_network_sheet_info": "Pokud nejste v preferované síti Wi-Fi, aplikace se připojí k serveru prostřednictvím první z níže uvedených adres URL, které může dosáhnout, počínaje shora dolů",
"face_unassigned": "Nepřiřazena",
"failed": "Selhalo",
"failed_to_load_assets": "Nepodařilo se načíst položky",
@@ -1125,7 +1123,7 @@
"local_network": "Místní síť",
"local_network_sheet_info": "Aplikace se při použití zadané sítě Wi-Fi připojí k serveru prostřednictvím tohoto URL",
"location_permission": "Oprávnění polohy",
"location_permission_content": "Aby bylo možné používat funkci automatického přepínání, potřebuje Immich oprávnění k přesné poloze, aby mohl přečíst název aktuální WiFi sítě",
"location_permission_content": "Aby bylo možné používat funkci automatického přepínání, potřebuje Immich oprávnění k přesné poloze, aby mohl přečíst název aktuální sítě Wi-Fi",
"location_picker_choose_on_map": "Vyberte na mapě",
"location_picker_latitude_error": "Zadejte platnou zeměpisnou šířku",
"location_picker_latitude_hint": "Zadejte vlastní zeměpisnou šířku",
@@ -1199,6 +1197,9 @@
"map_settings_only_show_favorites": "Zobrazit pouze oblíbené",
"map_settings_theme_settings": "Motiv mapy",
"map_zoom_to_see_photos": "Oddálit pro zobrazení fotografií",
"mark_all_as_read": "Označit vše jako přečtené",
"mark_as_read": "Označit jako přečtené",
"marked_all_as_read": "Vše označeno jako přečtené",
"matches": "Shody",
"media_type": "Typ média",
"memories": "Vzpomínky",
@@ -1225,6 +1226,8 @@
"month": "Měsíc",
"monthly_title_text_date_format": "LLLL y",
"more": "Více",
"moved_to_archive": "{count, plural, one {Přesunuta # položka} few {Přesunuty # položky} other {Přesunuto # položek}} do archivu",
"moved_to_library": "{count, plural, one {Přesunuta # položka} few {Přesunuty # položky} other {Přesunuto # položek}} do knihovny",
"moved_to_trash": "Přesunuto do koše",
"multiselect_grid_edit_date_time_err_read_only": "Nelze upravit datum položek pouze pro čtení, přeskakuji",
"multiselect_grid_edit_gps_err_read_only": "Nelze upravit polohu položek pouze pro čtení, přeskakuji",
@@ -1257,6 +1260,8 @@
"no_favorites_message": "Přidejte si oblíbené položky a rychle najděte své nejlepší obrázky a videa",
"no_libraries_message": "Vytvořte si externí knihovnu pro zobrazení fotografií a videí",
"no_name": "Bez jména",
"no_notifications": "Žádná oznámení",
"no_people_found": "Nebyli nalezeni žádní odpovídající lidé",
"no_places": "Žádná místa",
"no_results": "Žádné výsledky",
"no_results_description": "Zkuste použít synonymum nebo obecnější klíčové slovo",
@@ -1432,6 +1437,8 @@
"recent_searches": "Nedávná vyhledávání",
"recently_added": "Nedávno přidané",
"recently_added_page_title": "Nedávno přidané",
"recently_taken": "Nedávno pořízené",
"recently_taken_page_title": "Nedávno pořízené",
"refresh": "Obnovit",
"refresh_encoded_videos": "Obnovit kódovaná videa",
"refresh_faces": "Obnovit obličeje",
@@ -1566,6 +1573,7 @@
"select_keep_all": "Vybrat ponechat vše",
"select_library_owner": "Vyberte vlastníka knihovny",
"select_new_face": "Výběr nového obličeje",
"select_person_to_tag": "Vyberte osobu, kterou chcete označit",
"select_photos": "Vybrat fotky",
"select_trash_all": "Vybrat vyhodit vše",
"select_user_for_sharing_page_err_album": "Nepodařilo se vytvořit album",
@@ -1889,11 +1897,11 @@
"week": "Týden",
"welcome": "Vítejte",
"welcome_to_immich": "Vítejte v Immichi",
"wifi_name": "Název WiFi",
"wifi_name": "Název Wi-Fi",
"year": "Rok",
"years_ago": "Před {years, plural, one {rokem} other {# lety}}",
"yes": "Ano",
"you_dont_have_any_shared_links": "Nemáte žádné sdílené odkazy",
"your_wifi_name": "Váš název WiFi",
"your_wifi_name": "Název vaší Wi-Fi",
"zoom_image": "Zvětšit obrázek"
}

View File

@@ -72,6 +72,9 @@
"image_format_description": "WebP producerer mindre filer end JPEG, men er langsommere at komprimere.",
"image_fullsize_description": "Fuld størrelses billede uden metadata, brugt når zoomet ind",
"image_fullsize_enabled": "Aktiver fuld størrelses billede generering",
"image_fullsize_enabled_description": "Generer fuld-størrelses billede for ikke-web-venlige formater. Når \"Foretræk indlejret forhåndsvisning\" er slået til, bliver indlejrede forhåndsvisninger brugt direkte uden konvertering. Påvirker ikke web-venlige formater såsom JPEG.",
"image_fullsize_quality_description": "Fuld-størrelses billede kvalitet fra 1-100. Højere er bedre, men producerer større filer.",
"image_fullsize_title": "Full-størrelses billede indstillinger",
"image_prefer_embedded_preview": "Foretræk indlejret forhåndsvisning",
"image_prefer_embedded_preview_setting_description": "Brug indlejrede forhåndsvisninger i RAW fotos som input til billedbehandling og når det er tilgængeligt. Dette kan give mere nøjagtige farver for nogle billeder, men kvaliteten af forhåndsvisningen er kameraafhængig, og billedet kan have flere komprimeringsartefakter.",
"image_prefer_wide_gamut": "Foretrækker bred farveskala",
@@ -189,20 +192,13 @@
"oauth_auto_register": "Autoregistrér",
"oauth_auto_register_description": "Registrér automatisk nye brugere efter at have logget ind med OAuth",
"oauth_button_text": "Knaptekst",
"oauth_client_id": "Kunde-ID",
"oauth_client_secret": "Kundehemmelighed",
"oauth_enable_description": "Log ind med OAuth",
"oauth_issuer_url": "Udsteder-URL",
"oauth_mobile_redirect_uri": "Mobilomdiregerings-URL",
"oauth_mobile_redirect_uri_override": "Tilsidesættelse af mobil omdiregerings-URL",
"oauth_mobile_redirect_uri_override_description": "Aktiver, når OAuth-udbyderen ikke tillader en mobil URI, som '{callback}'",
"oauth_profile_signing_algorithm": "Log-ind-algoritme",
"oauth_profile_signing_algorithm_description": "Algoritme til signering af brugerprofilen.",
"oauth_scope": "Omfang",
"oauth_settings": "OAuth",
"oauth_settings_description": "Administrer OAuth login-indstillinger",
"oauth_settings_more_details": "Læs flere detaljer om funktionen i <link>dokumentationen</link>.",
"oauth_signing_algorithm": "Signeringsalgoritme",
"oauth_storage_label_claim": "Lagringsmærkat fordring",
"oauth_storage_label_claim_description": "Sæt automatisk brugerens lagringsmærkat til denne fordrings værdi.",
"oauth_storage_quota_claim": "Lagringskvotefordring",

View File

@@ -106,7 +106,7 @@
"library_scanning_enable_description": "Regelmäßiges Scannen der Bibliothek aktivieren",
"library_settings": "Externe Bibliothek",
"library_settings_description": "Einstellungen externer Bibliotheken verwalten",
"library_tasks_description": "Überprüfe externe Bibliotheken auf neue oder veränderte Medien",
"library_tasks_description": "Überprüfe externe Bibliotheken auf neue und/oder veränderte Medien",
"library_watching_enable_description": "Überwache externe Bibliotheken auf Dateiänderungen",
"library_watching_settings": "Bibliotheksüberwachung (EXPERIMENTELL)",
"library_watching_settings_description": "Automatisch auf geänderte Dateien prüfen",
@@ -192,32 +192,28 @@
"oauth_auto_register": "Automatische Registrierung",
"oauth_auto_register_description": "Automatische Registrierung neuer Benutzer nach der OAuth-Anmeldung",
"oauth_button_text": "Button-Text",
"oauth_client_id": "Client-ID",
"oauth_client_secret": "Client-Geheimnis",
"oauth_client_secret_description": "Erforderlich wenn PKCE (Proof Key for Code Exchange) nicht vom OAuth- Anbieter unterstützt wird",
"oauth_enable_description": "Anmeldung mit OAuth",
"oauth_issuer_url": "Aussteller-URL",
"oauth_mobile_redirect_uri": "Mobile Umleitungs-URI",
"oauth_mobile_redirect_uri_override": "Mobile Umleitungs-URI überschreiben",
"oauth_mobile_redirect_uri_override_description": "Einschalten, wenn der OAuth-Anbieter keine mobile URI wie '{callback}' erlaubt",
"oauth_profile_signing_algorithm": "Algorithmus zur Profilsignierung",
"oauth_profile_signing_algorithm_description": "Dieser Algorithmus wird für die Signatur des Benutzerprofils verwendet.",
"oauth_scope": "Umfang",
"oauth_settings": "OAuth",
"oauth_settings_description": "OAuth-Anmeldeeinstellungen verwalten",
"oauth_settings_more_details": "Weitere Informationen zu dieser Funktion findest du in der <link>Dokumentation</link>.",
"oauth_signing_algorithm": "Signier-Algorithmus",
"oauth_storage_label_claim": "Speicherpfadbezeichnung",
"oauth_storage_label_claim_description": "Die Speicherpfadbezeichnung des Benutzers automatisch auf den Wert dieser Eingabe setzen.",
"oauth_storage_quota_claim": "Speicherkontingentangabe",
"oauth_storage_quota_claim_description": "Setzen Sie das Speicherkontingent des Benutzers automatisch auf den angegebenen Wert.",
"oauth_storage_quota_default": "Standard-Speicherplatzkontingent (GiB)",
"oauth_storage_quota_default_description": "Kontingent in GiB, das verwendet werden soll, wenn keines übermittelt wird (gib 0 für ein unbegrenztes Kontingent ein).",
"oauth_timeout": "Zeitüberschreitung bei Anfrage",
"oauth_timeout_description": "Zeitüberschreitung für Anfragen in Millisekunden",
"offline_paths": "Offline-Pfade",
"offline_paths_description": "Die Ergebnisse könnten durch manuelles Löschen von Dateien, die nicht Teil einer externen Bibliothek sind, verursacht sein.",
"password_enable_description": "Login mit E-Mail und Passwort",
"password_settings": "Passwort-Login",
"offline_paths_description": "Dies könnte durch manuelles Löschen von Dateien, die nicht Teil einer externen Bibliothek sind, verursacht sein.",
"password_enable_description": "Mit E-Mail und Passwort anmelden",
"password_settings": "Passwort-Anmeldung",
"password_settings_description": "Passwort-Anmeldeeinstellungen verwalten",
"paths_validated_successfully": "Alle Pfade wurden erfolgreich validiert",
"paths_validated_successfully": "Alle Pfade erfolgreich überprüft",
"person_cleanup_job": "Personen aufräumen",
"quota_size_gib": "Kontingent (GiB)",
"refreshing_all_libraries": "Alle Bibliotheken aktualisieren",
@@ -251,7 +247,7 @@
"storage_template_hash_verification_enabled_description": "Aktiviert die Hash-Verifizierung. Deaktiviere diese Option nur, wenn du dir über die damit verbundenen Auswirkungen im Klaren bist",
"storage_template_migration": "Migration von Speichervorlagen",
"storage_template_migration_description": "Diese Aufgabe wendet die aktuelle <link>{template}</link> auf zuvor hochgeladene Dateien an",
"storage_template_migration_info": "Die Vorlage wird alle Dateierweiterungen in Kleinbuchstaben umwandeln. Vorlagenänderungen gelten nur für neue Dateien. Um die Vorlage rückwirkend auf bereits hochgeladene Assets anzuwenden, führe den <link>{job}</link> aus.",
"storage_template_migration_info": "Die Speichervorlage wird alle Dateierweiterungen in Kleinbuchstaben umwandeln. Vorlagenänderungen gelten nur für neue Dateien. Um die Vorlage rückwirkend auf bereits hochgeladene Assets anzuwenden, führe den <link>{job}</link> aus.",
"storage_template_migration_job": "Speichervorlagenmigrations-Aufgabe",
"storage_template_more_details": "Weitere Details zu dieser Funktion findest du unter <template-link>Speichervorlage</template-link> und dessen <implications-link>Implikationen</implications-link>",
"storage_template_onboarding_description": "Wenn aktiviert, sortiert diese Funktion Dateien automatisch basierend auf einer benutzerdefinierten Vorlage. Aufgrund von Stabilitätsproblemen ist die Funktion standardmäßig deaktiviert. Weitere Informationen findest du in der <link>Dokumentation</link>.",
@@ -481,18 +477,18 @@
"assets_added_to_album_count": "{count, plural, one {# Datei} other {# Dateien}} zum Album hinzugefügt",
"assets_added_to_name_count": "{count, plural, one {# Element} other {# Elemente}} zu {hasName, select, true {<b>{name}</b>} other {neuem Album}} hinzugefügt",
"assets_count": "{count, plural, one {# Datei} other {# Dateien}}",
"assets_deleted_permanently": "{} Datei/en permanent gelöscht",
"assets_deleted_permanently_from_server": "{} Datei/en wurden permanent vom Immich Server gelöscht",
"assets_deleted_permanently": "{} Element(e) permanent gelöscht",
"assets_deleted_permanently_from_server": "{} Element(e) permanent vom Immich-Server gelöscht",
"assets_moved_to_trash_count": "{count, plural, one {# Datei} other {# Dateien}} in den Papierkorb verschoben",
"assets_permanently_deleted_count": "{count, plural, one {# Datei} other {# Dateien}} endgültig gelöscht",
"assets_removed_count": "{count, plural, one {# Datei} other {# Dateien}} entfernt",
"assets_removed_permanently_from_device": "{} Datei/en wurden permanent vom Gerät gelöscht",
"assets_removed_permanently_from_device": "{} Element(e) permanent von Ihrem Gerät gelöscht",
"assets_restore_confirmation": "Bist du sicher, dass du alle Dateien aus dem Papierkorb wiederherstellen willst? Diese Aktion kann nicht rückgängig gemacht werden! Beachte, dass Offline-Dateien auf diese Weise nicht wiederhergestellt werden können.",
"assets_restored_count": "{count, plural, one {# Datei} other {# Dateien}} wiederhergestellt",
"assets_restored_successfully": "{} Datei/en erfolgreich wiederhergestellt",
"assets_trashed": "{} Datei/en gelöscht",
"assets_restored_successfully": "{} Element(e) erfolgreich wiederhergestellt",
"assets_trashed": "{} Element(e) gelöscht",
"assets_trashed_count": "{count, plural, one {# Datei} other {# Dateien}} in den Papierkorb verschoben",
"assets_trashed_from_server": "{} Datei/en vom Immich-Server gelöscht",
"assets_trashed_from_server": "{} Element(e) vom Immich-Server gelöscht",
"assets_were_part_of_album_count": "{count, plural, one {# Datei ist} other {# Dateien sind}} bereits im Album vorhanden",
"authorized_devices": "Verwendete Geräte",
"automatic_endpoint_switching_subtitle": "Verbinden Sie sich lokal über ein bestimmtes WLAN, wenn es verfügbar ist, und verwenden Sie andere Verbindungsmöglichkeiten anderswo",
@@ -535,7 +531,7 @@
"backup_controller_page_backup": "Sicherung",
"backup_controller_page_backup_selected": "Ausgewählt: ",
"backup_controller_page_backup_sub": "Gesicherte Fotos und Videos",
"backup_controller_page_created": "Erstellt: {}",
"backup_controller_page_created": "Erstellt am: {}",
"backup_controller_page_desc_backup": "Aktiviere die Sicherung, um Elemente immer automatisch auf den Server zu laden, während du die App benutzt.",
"backup_controller_page_excluded": "Ausgeschlossen: ",
"backup_controller_page_failed": "Fehlgeschlagen ({})",
@@ -580,7 +576,7 @@
"cache_settings_duplicated_assets_clear_button": "LEEREN",
"cache_settings_duplicated_assets_subtitle": "Fotos und Videos, die von der App blockiert werden",
"cache_settings_duplicated_assets_title": "Duplikate ({})",
"cache_settings_image_cache_size": "{} Bilder im Zwischenspeicher",
"cache_settings_image_cache_size": "Bilder im Zwischenspeicher ({} Bilder)",
"cache_settings_statistics_album": "Vorschaubilder der Bibliothek",
"cache_settings_statistics_assets": "{} Elemente ({})",
"cache_settings_statistics_full": "Originalbilder",
@@ -588,7 +584,7 @@
"cache_settings_statistics_thumbnail": "Vorschaubilder",
"cache_settings_statistics_title": "Zwischenspeicher-Nutzung",
"cache_settings_subtitle": "Kontrollieren, wie Immich den Zwischenspeicher nutzt",
"cache_settings_thumbnail_size": "{} Vorschaubilder im Zwischenspeicher",
"cache_settings_thumbnail_size": "Vorschaubilder im Zwischenspeicher ({} Bilder)",
"cache_settings_tile_subtitle": "Lokalen Speicher verwalten",
"cache_settings_tile_title": "Lokaler Speicher",
"cache_settings_title": "Zwischenspeicher Einstellungen",
@@ -647,8 +643,8 @@
"comments_and_likes": "Kommentare & Likes",
"comments_are_disabled": "Kommentare sind deaktiviert",
"common_create_new_album": "Neues Album erstellen",
"common_server_error": "Bitte überprüfe Deine Netzwerkverbindung und stelle sicher, dass die App und Server Versionen kompatibel sind.",
"completed": "Fertig",
"common_server_error": "Bitte überprüfe deine Netzwerkverbindung und stelle sicher, dass die App und Server Versionen kompatibel sind.",
"completed": "Abgeschlossen",
"confirm": "Bestätigen",
"confirm_admin_password": "Administrator Passwort bestätigen",
"confirm_delete_face": "Bist du sicher dass du das Gesicht von {name} aus der Datei entfernen willst?",
@@ -853,10 +849,12 @@
"failed_to_keep_this_delete_others": "Fehler beim Löschen der anderen Dateien",
"failed_to_load_asset": "Fehler beim Laden der Datei",
"failed_to_load_assets": "Fehler beim Laden der Dateien",
"failed_to_load_notifications": "Fehler beim Laden der Benachrichtigungen",
"failed_to_load_people": "Fehler beim Laden von Personen",
"failed_to_remove_product_key": "Fehler beim Entfernen des Produktschlüssels",
"failed_to_stack_assets": "Dateien konnten nicht gestapelt werden",
"failed_to_unstack_assets": "Dateien konnten nicht entstapelt werden",
"failed_to_update_notification_status": "Benachrichtigungsstatus aktualisieren fehlgeschlagen",
"import_path_already_exists": "Dieser Importpfad existiert bereits.",
"incorrect_email_or_password": "Ungültige E-Mail oder Passwort",
"paths_validation_failed": "{paths, plural, one {# Pfad konnte} other {# Pfade konnten}} nicht validiert werden",
@@ -960,7 +958,7 @@
"exif_bottom_sheet_person_age": "Alter {}",
"exif_bottom_sheet_person_age_months": "{} Monate alt",
"exif_bottom_sheet_person_age_year_months": "1 Jahr, {} Monate alt",
"exif_bottom_sheet_person_age_years": "{} alt",
"exif_bottom_sheet_person_age_years": "Alter {}",
"exit_slideshow": "Diashow beenden",
"expand_all": "Alle aufklappen",
"experimental_settings_new_asset_list_subtitle": "In Arbeit",
@@ -969,7 +967,7 @@
"experimental_settings_title": "Experimentell",
"expire_after": "Verfällt nach",
"expired": "Verfallen",
"expires_date": "Läuft {date} ab",
"expires_date": "Läuft am {date} ab",
"explore": "Erkunden",
"explorer": "Datei-Explorer",
"export": "Exportieren",
@@ -1125,7 +1123,7 @@
"local_network": "Lokales Netzwerk",
"local_network_sheet_info": "Die App stellt über diese URL eine Verbindung zum Server her, wenn sie das angegebene WLAN-Netzwerk verwendet",
"location_permission": "Standort Genehmigung",
"location_permission_content": "Um die automatische Umschaltfunktion nutzen zu können, benötigt Immich eine genaue Standortberechtigung, damit es den Namen des aktuellen WLAN-Netzwerks ermitteln kann",
"location_permission_content": "Um die automatische Umschaltfunktion nutzen zu können, benötigt Immich genaue Standortberechtigung, damit es den Namen des aktuellen WLAN-Netzwerks ermitteln kann",
"location_picker_choose_on_map": "Auf der Karte auswählen",
"location_picker_latitude_error": "Gültigen Breitengrad eingeben",
"location_picker_latitude_hint": "Breitengrad eingeben",
@@ -1190,15 +1188,18 @@
"map_settings": "Karteneinstellungen",
"map_settings_dark_mode": "Dunkler Modus",
"map_settings_date_range_option_day": "Letzte 24 Stunden",
"map_settings_date_range_option_days": "Letzte {} Tage",
"map_settings_date_range_option_days": "Letzten {} Tage",
"map_settings_date_range_option_year": "Letztes Jahr",
"map_settings_date_range_option_years": "Letzte {} Jahre",
"map_settings_date_range_option_years": "Letzten {} Jahre",
"map_settings_dialog_title": "Karteneinstellungen",
"map_settings_include_show_archived": "Archivierte anzeigen",
"map_settings_include_show_partners": "Partner einbeziehen",
"map_settings_only_show_favorites": "Nur Favoriten anzeigen",
"map_settings_theme_settings": "Karten Design",
"map_zoom_to_see_photos": "Ansicht verkleinern um Fotos zu sehen",
"mark_all_as_read": "Alle als gelesen markieren",
"mark_as_read": "Als gelesen markieren",
"marked_all_as_read": "Alle als gelesen markiert",
"matches": "Treffer",
"media_type": "Medientyp",
"memories": "Erinnerungen",
@@ -1208,7 +1209,7 @@
"memories_start_over": "Erneut beginnen",
"memories_swipe_to_close": "Nach oben Wischen zum schließen",
"memories_year_ago": "ein Jahr her",
"memories_years_ago": "{} Jahre her",
"memories_years_ago": "Vor {} Jahren",
"memory": "Erinnerung",
"memory_lane_title": "Foto-Erinnerungen {title}",
"menu": "Menü",
@@ -1225,6 +1226,8 @@
"month": "Monat",
"monthly_title_text_date_format": "MMMM y",
"more": "Mehr",
"moved_to_archive": "{count, plural, one {# Datei} other {# Dateien}} archiviert",
"moved_to_library": "{count, plural, one {# Datei} other {# Dateien}} in die Bibliothek verschoben",
"moved_to_trash": "In den Papierkorb verschoben",
"multiselect_grid_edit_date_time_err_read_only": "Das Datum und die Uhrzeit von schreibgeschützten Inhalten kann nicht verändert werden, überspringen",
"multiselect_grid_edit_gps_err_read_only": "Der Aufnahmeort von schreibgeschützten Inhalten kann nicht verändert werden, überspringen",
@@ -1257,6 +1260,8 @@
"no_favorites_message": "Füge Favoriten hinzu, um deine besten Bilder und Videos schnell zu finden",
"no_libraries_message": "Eine externe Bibliothek erstellen, um deine Fotos und Videos anzusehen",
"no_name": "Kein Name",
"no_notifications": "Keine Benachrichtigungen",
"no_people_found": "Keine passenden Personen gefunden",
"no_places": "Keine Orte",
"no_results": "Keine Ergebnisse",
"no_results_description": "Versuche es mit einem Synonym oder einem allgemeineren Stichwort",
@@ -1377,7 +1382,7 @@
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_out_of_date_major": "Mobile-App ist veraltet. Bitte aktualisiere auf die neueste Major-Version.",
"profile_drawer_client_out_of_date_minor": "Mobile-App ist veraltet. Bitte aktualisiere auf die neueste Minor-Version.",
"profile_drawer_client_server_up_to_date": "Die App-Version / Server-Version sind aktuell",
"profile_drawer_client_server_up_to_date": "Die App- und Server-Versionen sind aktuell",
"profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "Server-Version ist veraltet. Bitte aktualisiere auf die neueste Major-Version.",
"profile_drawer_server_out_of_date_minor": "Server-Version ist veraltet. Bitte aktualisiere auf die neueste Minor-Version.",
@@ -1432,6 +1437,8 @@
"recent_searches": "Letzte Suchen",
"recently_added": "Kürzlich hinzugefügt",
"recently_added_page_title": "Zuletzt hinzugefügt",
"recently_taken": "Kürzlich aufgenommen",
"recently_taken_page_title": "Kürzlich aufgenommen",
"refresh": "Aktualisieren",
"refresh_encoded_videos": "Kodierte Videos aktualisieren",
"refresh_faces": "Gesichter aktualisieren",
@@ -1566,6 +1573,7 @@
"select_keep_all": "Alle behalten",
"select_library_owner": "Bibliotheksbesitzer auswählen",
"select_new_face": "Neues Gesicht auswählen",
"select_person_to_tag": "Wählen Sie eine Person zum Markieren aus",
"select_photos": "Fotos auswählen",
"select_trash_all": "Alle löschen",
"select_user_for_sharing_page_err_album": "Album konnte nicht erstellt werden",
@@ -1596,7 +1604,7 @@
"setting_languages_apply": "Anwenden",
"setting_languages_subtitle": "App-Sprache ändern",
"setting_languages_title": "Sprachen",
"setting_notifications_notify_failures_grace_period": "Benachrichtigung bei Fehler/n in der Hintergrundsicherung: {}",
"setting_notifications_notify_failures_grace_period": "Benachrichtigung bei Fehler(n) in der Hintergrundsicherung: {}",
"setting_notifications_notify_hours": "{} Stunden",
"setting_notifications_notify_immediately": "sofort",
"setting_notifications_notify_minutes": "{} Minuten",
@@ -1636,25 +1644,25 @@
"shared_link_create_error": "Fehler beim Erstellen der Linkfreigabe",
"shared_link_edit_description_hint": "Beschreibung eingeben",
"shared_link_edit_expire_after_option_day": "1 Tag",
"shared_link_edit_expire_after_option_days": "{} Tage",
"shared_link_edit_expire_after_option_days": "{} Tagen",
"shared_link_edit_expire_after_option_hour": "1 Stunde",
"shared_link_edit_expire_after_option_hours": "{} Stunden",
"shared_link_edit_expire_after_option_minute": "1 Minute",
"shared_link_edit_expire_after_option_minutes": "{} Minuten",
"shared_link_edit_expire_after_option_months": "{} Monate",
"shared_link_edit_expire_after_option_months": "{} Monaten",
"shared_link_edit_expire_after_option_year": "{} Jahr",
"shared_link_edit_password_hint": "Passwort eingeben",
"shared_link_edit_submit_button": "Link aktualisieren",
"shared_link_error_server_url_fetch": "Fehler beim Ermitteln der Server-URL",
"shared_link_expires_day": "Verfällt in {} Tag",
"shared_link_expires_days": "Verfällt in {} Tagen",
"shared_link_expires_hour": "Verfällt in {} Stunde",
"shared_link_expires_hours": "Verfällt in {} Stunden",
"shared_link_expires_minute": "Verfällt in {} Minute",
"shared_link_expires_minutes": "Verfällt in {} Minuten",
"shared_link_expires_day": "Läuft ab in {} Tag",
"shared_link_expires_days": "Läuft ab in {} Tagen",
"shared_link_expires_hour": "Läuft ab in {} Stunde",
"shared_link_expires_hours": "Läuft ab in {} Stunden",
"shared_link_expires_minute": "Läuft ab in {} Minute",
"shared_link_expires_minutes": "Läuft ab in {} Minuten",
"shared_link_expires_never": "Läuft nie ab",
"shared_link_expires_second": "Verfällt in {} Sekunde",
"shared_link_expires_seconds": "Verfällt in {} Sekunden",
"shared_link_expires_second": "Läuft ab in {} Sekunde",
"shared_link_expires_seconds": "Läuft ab in {} Sekunden",
"shared_link_individual_shared": "Individuell geteilt",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_manage_links": "Geteilte Links verwalten",
@@ -1745,7 +1753,7 @@
"tag_assets": "Dateien taggen",
"tag_created": "Tag erstellt: {tag}",
"tag_feature_description": "Durchsuchen von Fotos und Videos, gruppiert nach logischen Tag-Themen",
"tag_not_found_question": "Kein Tag zu finden? <link>Erstelle einen neuen Tag.</link>",
"tag_not_found_question": "Kein Tag vorhanden? <link>Erstelle einen neuen Tag.</link>",
"tag_people": "Personen taggen",
"tag_updated": "Tag aktualisiert: {tag}",
"tagged_assets": "{count, plural, one {# Datei} other {# Dateien}} getagged",
@@ -1832,7 +1840,7 @@
"upload_status_errors": "Fehler",
"upload_status_uploaded": "Hochgeladen",
"upload_success": "Hochladen erfolgreich. Aktualisiere die Seite, um neue hochgeladene Dateien zu sehen.",
"upload_to_immich": "Zu Immich hochladen ({})",
"upload_to_immich": "Auf Immich hochladen ({})",
"uploading": "Wird hochgeladen",
"url": "URL",
"usage": "Verwendung",

View File

@@ -14,7 +14,7 @@
"add_a_location": "Προσθήκη μίας τοποθεσίας",
"add_a_name": "Προσθήκη ονόματος",
"add_a_title": "Προσθήκη τίτλου",
"add_endpoint": "Add endpoint",
"add_endpoint": "Προσθήκη τελικού σημείου",
"add_exclusion_pattern": "Προσθήκη μοτίβου αποκλεισμού",
"add_import_path": "Προσθήκη μονοπατιού εισαγωγής",
"add_location": "Προσθήκη τοποθεσίας",
@@ -192,20 +192,13 @@
"oauth_auto_register": "Αυτόματη καταχώρηση",
"oauth_auto_register_description": "Αυτόματη καταχώρηση νέου χρήστη αφού συνδεθεί με OAuth",
"oauth_button_text": "Κείμενο κουμπιού",
"oauth_client_id": "Ταυτότητα πελάτη (Client)",
"oauth_client_secret": "Μυστικός κωδικός πελάτη",
"oauth_enable_description": "Σύνδεση με OAuth",
"oauth_issuer_url": "Διεύθυνση URL εκδότη",
"oauth_mobile_redirect_uri": "URI Ανακατεύθυνσης για κινητά τηλέφωνα",
"oauth_mobile_redirect_uri_override": "Προσπέλαση URI ανακατεύθυνσης για κινητά τηλέφωνα",
"oauth_mobile_redirect_uri_override_description": "Ενεργοποιήστε το όταν ο πάροχος OAuth δεν επιτρέπει μια URI για κινητά, όπως το '{callback}'",
"oauth_profile_signing_algorithm": "Αλγόριθμος σύνδεσης προφίλ",
"oauth_profile_signing_algorithm_description": "Αλγόριθμος που χρησιμοποιείται για την σύνδεση των χρηστών.",
"oauth_scope": "Εύρος",
"oauth_settings": "OAuth",
"oauth_settings_description": "Διαχείριση ρυθμίσεων σύνδεσης OAuth",
"oauth_settings_more_details": "Για περισσότερες λεπτομέρειες σχετικά με αυτήν τη δυνατότητα, ανατρέξτε στην <link>τεκμηρίωση</link>.",
"oauth_signing_algorithm": "Αλγόριθμος υπογραφής",
"oauth_storage_label_claim": "Δήλωση ετικέτας αποθήκευσης",
"oauth_storage_label_claim_description": "Ορίζει αυτόματα την ετικέτα αποθήκευσης του χρήστη στη δηλωμένη τιμή.",
"oauth_storage_quota_claim": "Δήλωση ποσοστού αποθήκευσης",
@@ -375,7 +368,7 @@
"advanced_settings_enable_alternate_media_filter_title": "[ΠΕΙΡΑΜΑΤΙΚΟ] Χρήση εναλλακτικού φίλτρου συγχρονισμού άλμπουμ συσκευής",
"advanced_settings_log_level_title": "Επίπεδο σύνδεσης: {}",
"advanced_settings_prefer_remote_subtitle": "Μερικές συσκευές αργούν πολύ να φορτώσουν μικρογραφίες από αρχεία στη συσκευή. Ενεργοποιήστε αυτήν τη ρύθμιση για να φορτώνονται αντί αυτού απομακρυσμένες εικόνες.",
"advanced_settings_prefer_remote_title": "Προτίμηση απομακρυσμένων εικόνων.",
"advanced_settings_prefer_remote_title": "Προτίμηση απομακρυσμένων εικόνων",
"advanced_settings_proxy_headers_subtitle": "Καθορισμός κεφαλίδων διακομιστή μεσολάβησης που το Immich πρέπει να στέλνει με κάθε αίτημα δικτύου",
"advanced_settings_proxy_headers_title": "Κεφαλίδες διακομιστή μεσολάβησης",
"advanced_settings_self_signed_ssl_subtitle": "Παρακάμπτει τον έλεγχο πιστοποιητικού SSL του διακομιστή. Απαραίτητο για αυτο-υπογεγραμμένα πιστοποιητικά.",
@@ -405,7 +398,7 @@
"album_share_no_users": "Φαίνεται ότι έχετε κοινοποιήσει αυτό το άλμπουμ σε όλους τους χρήστες ή δεν έχετε χρήστες για να το κοινοποιήσετε.",
"album_thumbnail_card_item": "1 αντικείμενο",
"album_thumbnail_card_items": "{} αντικείμενα",
"album_thumbnail_card_shared": "· Κοινόχρηστο",
"album_thumbnail_card_shared": " Κοινόχρηστο",
"album_thumbnail_shared_by": "Κοινοποιημένο από {}",
"album_updated": "Το άλμπουμ, ενημερώθηκε",
"album_updated_setting_description": "Λάβετε ειδοποίηση μέσω email όταν ένα κοινόχρηστο άλμπουμ έχει νέα αρχεία",
@@ -474,46 +467,46 @@
"asset_skipped_in_trash": "Στον κάδο απορριμμάτων",
"asset_uploaded": "Ανεβάστηκε",
"asset_uploading": "Ανεβάζεται…",
"asset_viewer_settings_subtitle": "Manage your gallery viewer settings",
"asset_viewer_settings_subtitle": "Διαχείριση ρυθμίσεων προβολής συλλογής",
"asset_viewer_settings_title": "Προβολή Στοιχείων",
"assets": "Αντικείμενα",
"assets_added_count": "Προστέθηκε {count, plural, one {# αρχείο} other {# αρχεία}}",
"assets_added_to_album_count": "Προστέθηκε {count, plural, one {# αρχείο} other {# αρχεία}} στο άλμπουμ",
"assets_added_to_name_count": "Προστέθηκε {count, plural, one {# αρχείο} other {# αρχεία}} στο {hasName, select, true {<b>{name}</b>} other {νέο άλμπουμ}}",
"assets_count": "{count, plural, one {# αρχείο} other {# αρχεία}}",
"assets_deleted_permanently": "{} στοιχείο(-α) διαγράφηκε(-αν) οριστικά",
"assets_deleted_permanently_from_server": "{} στοιχείο(α) διαγράφηκε(-αν) οριστικά από τον διακομιστή Immich",
"assets_moved_to_trash_count": "Μετακινήθηκε/καν {count, plural, one {# αρχείο} other {# αρχεία}} στον κάδο απορριμμάτων",
"assets_permanently_deleted_count": "Διαγράφηκε/καν μόνιμα {count, plural, one {# αρχείο} other {# αρχεία}}",
"assets_deleted_permanently": "{} τα στοιχεία διαγράφηκαν οριστικά",
"assets_deleted_permanently_from_server": "{} τα στοιχεία διαγράφηκαν οριστικά από το διακομιστή Immich",
"assets_moved_to_trash_count": "Μετακινήθηκαν {count, plural, one {# αρχείο} other {# αρχεία}} στον κάδο απορριμμάτων",
"assets_permanently_deleted_count": "Διαγράφηκαν μόνιμα {count, plural, one {# αρχείο} other {# αρχεία}}",
"assets_removed_count": "Αφαιρέθηκαν {count, plural, one {# αρχείο} other {# αρχεία}}",
"assets_removed_permanently_from_device": "{} στοιχεία καταργήθηκαν οριστικά από τη συσκευή σας",
"assets_removed_permanently_from_device": "{} τα στοιχεία καταργήθηκαν οριστικά από τη συσκευή σας",
"assets_restore_confirmation": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε όλα τα στοιχεία που βρίσκονται στον κάδο απορριμμάτων; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί! Λάβετε υπόψη ότι δεν θα είναι δυνατή η επαναφορά στοιχείων εκτός σύνδεσης.",
"assets_restored_count": "Έγινε επαναφορά {count, plural, one {# στοιχείου} other {# στοιχείων}}",
"assets_restored_successfully": "{} στοιχεία αποκαταστάθηκαν με επιτυχία",
"assets_restored_successfully": "{} τα στοιχεία αποκαταστάθηκαν με επιτυχία",
"assets_trashed": "{} στοιχεία μεταφέρθηκαν στον κάδο απορριμμάτων",
"assets_trashed_count": "Μετακιν. στον κάδο απορριμάτων {count, plural, one {# στοιχείο} other {# στοιχεία}}",
"assets_trashed_from_server": "{} στοιχεία μεταφέρθηκαν στον κάδο απορριμμάτων από τον διακομιστή Immich",
"assets_trashed_from_server": "{} στοιχεία μεταφέρθηκαν στον κάδο απορριμμάτων από το διακομιστή Immich",
"assets_were_part_of_album_count": "{count, plural, one {Το στοιχείο ανήκει} other {Τα στοιχεία ανήκουν}} ήδη στο άλμπουμ",
"authorized_devices": "Εξουσιοδοτημένες Συσκευές",
"automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere",
"automatic_endpoint_switching_title": "Automatic URL switching",
"automatic_endpoint_switching_subtitle": "Σύνδεση τοπικά μέσω του καθορισμένου Wi-Fi όταν είναι διαθέσιμο και χρήση εναλλακτικών συνδέσεων αλλού",
"automatic_endpoint_switching_title": "Αυτόματη εναλλαγή URL",
"back": "Πίσω",
"back_close_deselect": "Πίσω, κλείσιμο ή αποεπιλογή",
"background_location_permission": "Background location permission",
"background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name",
"background_location_permission": "Άδεια τοποθεσίας στο παρασκήνιο",
"background_location_permission_content": "Το Immich για να μπορεί να αλλάζει δίκτυα όταν τρέχει στο παρασκήνιο, πρέπει *πάντα* να έχει πρόσβαση στην ακριβή τοποθεσία ώστε η εφαρμογή να μπορεί να διαβάζει το όνομα του δικτύου Wi-Fi",
"backup_album_selection_page_albums_device": "Άλμπουμ στη συσκευή ({})",
"backup_album_selection_page_albums_tap": "Πάτημα για συμπερίληψη, διπλό πάτημα για εξαίρεση",
"backup_album_selection_page_assets_scatter": "Τα στοιχεία μπορεί να διασκορπιστούν σε πολλά άλμπουμ. Έτσι, τα άλμπουμ μπορούν να περιληφθούν ή να εξαιρεθούν κατά τη διαδικασία δημιουργίας αντιγράφων ασφαλείας.",
"backup_album_selection_page_assets_scatter": "Τα στοιχεία μπορεί να διασκορπιστούν σε πολλά άλμπουμ. Έτσι, τα άλμπουμ μπορούν να περιληφθούν ή να εξαιρεθούν κατά τη διαδικασία δημιουργίας αντιγράφων ασφαλείας.",
"backup_album_selection_page_select_albums": "Επιλογή άλμπουμ",
"backup_album_selection_page_selection_info": "Πληροφορίες επιλογής",
"backup_album_selection_page_total_assets": "Συνολικά μοναδικά στοιχεία",
"backup_all": "Όλα",
"backup_background_service_backup_failed_message": "Αποτυχία δημιουργίας αντιγράφων ασφαλείας. Επανάληψη...",
"backup_background_service_connection_failed_message": "Αποτυχία σύνδεσης με το διακομιστή. Επανάληψη...",
"backup_background_service_backup_failed_message": "Αποτυχία δημιουργίας αντιγράφων ασφαλείας. Επανάληψη",
"backup_background_service_connection_failed_message": "Αποτυχία σύνδεσης με το διακομιστή. Επανάληψη",
"backup_background_service_current_upload_notification": "Μεταφόρτωση {}",
"backup_background_service_default_notification": "Έλεγχος για νέα στοιχεία...",
"backup_background_service_default_notification": "Έλεγχος για νέα στοιχεία",
"backup_background_service_error_title": "Σφάλμα δημιουργίας αντιγράφων ασφαλείας",
"backup_background_service_in_progress_notification": "Δημιουργία αντιγράφων ασφαλείας των στοιχείων σας...",
"backup_background_service_in_progress_notification": "Δημιουργία αντιγράφων ασφαλείας των στοιχείων σας",
"backup_background_service_upload_failure_notification": "Αποτυχία μεταφόρτωσης {}",
"backup_controller_page_albums": "Δημιουργία αντιγράφων ασφαλείας άλμπουμ",
"backup_controller_page_background_app_refresh_disabled_content": "Ενεργοποιήστε την ανανέωση εφαρμογής στο παρασκήνιο στις Ρυθμίσεις > Γενικά > Ανανέωση Εφαρμογής στο Παρασκήνιο για να χρησιμοποιήσετε την δημιουργία αντιγράφων ασφαλείας στο παρασκήνιο.",
@@ -531,7 +524,7 @@
"backup_controller_page_background_is_on": "Η αυτόματη δημιουργία αντιγράφων ασφαλείας στο παρασκήνιο είναι ενεργοποιημένη",
"backup_controller_page_background_turn_off": "Απενεργοποίηση υπηρεσίας παρασκηνίου",
"backup_controller_page_background_turn_on": "Ενεργοποίηση υπηρεσίας παρασκηνίου",
"backup_controller_page_background_wifi": "Μόνο σε σύνδεση WiFi",
"backup_controller_page_background_wifi": "Μόνο σε σύνδεση Wi-Fi",
"backup_controller_page_backup": "Αντίγραφα ασφαλείας",
"backup_controller_page_backup_selected": "Επιλεγμένα: ",
"backup_controller_page_backup_sub": "Φωτογραφίες και βίντεο για τα οποία έχουν δημιουργηθεί αντίγραφα ασφαλείας",
@@ -547,13 +540,13 @@
"backup_controller_page_remainder_sub": "Υπόλοιπες φωτογραφίες και βίντεο για αντιγραφή ασφαλείας από την επιλογή",
"backup_controller_page_server_storage": "Χωρητικότητα Διακομιστή",
"backup_controller_page_start_backup": "Έναρξη δημιουργίας αντιγράφου ασφαλείας",
"backup_controller_page_status_off": "Η αυτόματη δημιουργία αντιγράφου ασφαλείας στο προσκήνιο είναι απενεργοποιημένη\n",
"backup_controller_page_status_off": "Η αυτόματη δημιουργία αντιγράφου ασφαλείας στο προσκήνιο, είναι απενεργοποιημένη",
"backup_controller_page_status_on": "Η αυτόματη δημιουργία αντιγράφου ασφαλείας στο προσκήνιο είναι ενεργοποιημένη",
"backup_controller_page_storage_format": "{} από {} σε χρήση",
"backup_controller_page_to_backup": "Άλμπουμ για δημιουργία αντιγράφου ασφαλείας",
"backup_controller_page_total_sub": "Όλες οι μοναδικές φωτογραφίες και βίντεο από τα επιλεγμένα άλμπουμ\n",
"backup_controller_page_turn_off": "Απενεργοποίηση δημιουργίας αντιγράφου ασφαλείας στο προσκήνιο\n",
"backup_controller_page_turn_on": "Ενεργοποίηση δημιουργίας αντιγράφου ασφαλείας στο προσκήνιο\n",
"backup_controller_page_total_sub": "Όλες οι μοναδικές φωτογραφίες και βίντεο από τα επιλεγμένα άλμπουμ",
"backup_controller_page_turn_off": "Απενεργοποίηση δημιουργίας αντιγράφου ασφαλείας στο προσκήνιο",
"backup_controller_page_turn_on": "Ενεργοποίηση δημιουργίας αντιγράφου ασφαλείας στο προσκήνιο",
"backup_controller_page_uploading_file_info": "Μεταφόρτωση πληροφοριών αρχείου",
"backup_err_only_album": "Δεν είναι δυνατή η αφαίρεση του μοναδικού άλμπουμ",
"backup_info_card_assets": "στοιχεία",
@@ -562,7 +555,7 @@
"backup_manual_success": "Επιτυχία",
"backup_manual_title": "Κατάσταση μεταφόρτωσης",
"backup_options_page_title": "Επιλογές αντιγράφων ασφαλείας",
"backup_setting_subtitle": "Manage background and foreground upload settings",
"backup_setting_subtitle": "Διαχείριση ρυθμίσεων μεταφόρτωσης στο παρασκήνιο και στο προσκήνιο",
"backward": "Προς τα πίσω",
"birthdate_saved": "Η ημερομηνία γέννησης αποθηκεύτηκε επιτυχώς",
"birthdate_set_description": "Η ημερομηνία γέννησης χρησιμοποιείται για τον υπολογισμό της ηλικίας αυτού του ατόμου, τη χρονική στιγμή μιας φωτογραφίας.",
@@ -579,7 +572,7 @@
"cache_settings_clear_cache_button_title": "Καθαρίζει τη προσωρινή μνήμη της εφαρμογής. Αυτό θα επηρεάσει σημαντικά την απόδοση της εφαρμογής μέχρι να αναδημιουργηθεί η προσωρινή μνήμη.",
"cache_settings_duplicated_assets_clear_button": "ΕΚΚΑΘΑΡΙΣΗ",
"cache_settings_duplicated_assets_subtitle": "Φωτογραφίες και βίντεο που έχουν μπει στη μαύρη λίστα από την εφαρμογή",
"cache_settings_duplicated_assets_title": "Διπλά στοιχεία ({})",
"cache_settings_duplicated_assets_title": "Διπλότυπα στοιχεία ({})",
"cache_settings_image_cache_size": "Μέγεθος προσωρινής μνήμης εικόνων ({} στοιχεία)",
"cache_settings_statistics_album": "Μικρογραφίες βιβλιοθήκης",
"cache_settings_statistics_assets": "{} στοιχεία ({})",
@@ -597,12 +590,12 @@
"camera_model": "Μοντέλο κάμερας",
"cancel": "Ακύρωση",
"cancel_search": "Ακύρωση αναζήτησης",
"canceled": "Canceled",
"canceled": "Ακυρωμένο",
"cannot_merge_people": "Αδύνατη η συγχώνευση ατόμων",
"cannot_undo_this_action": "Δεν μπορείτε να αναιρέσετε αυτήν την ενέργεια!",
"cannot_update_the_description": "Αδύνατη η ενημέρωση της περιγραφής",
"change_date": "Αλλαγή ημερομηνίας",
"change_display_order": "Change display order",
"change_display_order": "Αλλαγή σειράς εμφάνισης",
"change_expiration_time": "Αλλαγή χρόνου λήξης",
"change_location": "Αλλαγή τοποθεσίας",
"change_name": "Αλλαγή ονομασίας",
@@ -617,9 +610,9 @@
"change_your_password": "Αλλάξτε τον κωδικό σας",
"changed_visibility_successfully": "Η προβολή, άλλαξε με επιτυχία",
"check_all": "Επιλογή Όλων",
"check_corrupt_asset_backup": "Check for corrupt asset backups",
"check_corrupt_asset_backup_button": "Perform check",
"check_corrupt_asset_backup_description": "Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.",
"check_corrupt_asset_backup": "Έλεγχος για κατεστραμμένα αντίγραφα ασφαλείας στοιχείων",
"check_corrupt_asset_backup_button": "Εκτέλεση ελέγχου",
"check_corrupt_asset_backup_description": "Εκτέλεσε αυτόν τον έλεγχο μόνο μέσω Wi-Fi και αφού έχουν αποθηκευτεί όλα τα αντίγραφα ασφαλείας των στοιχείων. Η διαδικασία μπορεί να διαρκέσει μερικά λεπτά.",
"check_logs": "Ελέγξτε τα αρχεία καταγραφής",
"choose_matching_people_to_merge": "Επιλέξτε τα αντίστοιχα άτομα για συγχώνευση",
"city": "Πόλη",
@@ -648,7 +641,7 @@
"comments_are_disabled": "Τα σχόλια είναι απενεργοποιημένα",
"common_create_new_album": "Δημιουργία νέου άλμπουμ",
"common_server_error": "Ελέγξτε τη σύνδεσή σας, βεβαιωθείτε ότι ο διακομιστής είναι προσβάσιμος και ότι οι εκδόσεις της εφαρμογής/διακομιστή είναι συμβατές.",
"completed": "Completed",
"completed": "Ολοκληρώθηκε",
"confirm": "Επιβεβαίωση",
"confirm_admin_password": "Επιβεβαίωση κωδικού Διαχειριστή",
"confirm_delete_face": "Είστε σίγουροι ότι θέλετε να διαγράψετε το πρόσωπο του/της {name} από το στοιχείο;",
@@ -664,7 +657,7 @@
"control_bottom_app_bar_delete_from_local": "Διαγραφή από τη συσκευή",
"control_bottom_app_bar_edit_location": "Επεξεργασία Τοποθεσίας",
"control_bottom_app_bar_edit_time": "Επεξεργασία Ημερομηνίας & Ώρας",
"control_bottom_app_bar_share_link": "Share Link",
"control_bottom_app_bar_share_link": "Κοινοποιήστε το σύνδεσμο",
"control_bottom_app_bar_share_to": "Κοινοποίηση Σε",
"control_bottom_app_bar_trash_from_immich": "Μετακίνηση στα Απορρίμματα",
"copied_image_to_clipboard": "Η εικόνα αντιγράφηκε στο πρόχειρο.",
@@ -699,7 +692,7 @@
"crop": "Αποκοπή",
"curated_object_page_title": "Πράγματα",
"current_device": "Τρέχουσα συσκευή",
"current_server_address": "Current server address",
"current_server_address": "Τρέχουσα διεύθυνση διακομιστή",
"custom_locale": "Προσαρμοσμένη Τοπική Ρύθμιση",
"custom_locale_description": "Μορφοποιήστε τις ημερομηνίες και τους αριθμούς, σύμφωνα με τη γλώσσα και την περιοχή",
"daily_title_text_date": "Ε, MMM dd",
@@ -750,7 +743,7 @@
"direction": "Κατεύθυνση",
"disabled": "Απενεργοποιημένο",
"disallow_edits": "Απαγόρευση επεξεργασιών",
"discord": "Discord",
"discord": "Πλατφόρμα Discord",
"discover": "Ανίχνευση",
"dismiss_all_errors": "Παράβλεψη όλων των σφαλμάτων",
"dismiss_error": "Παράβλεψη σφάλματος",
@@ -811,16 +804,16 @@
"editor_crop_tool_h2_aspect_ratios": "Αναλογίες διαστάσεων",
"editor_crop_tool_h2_rotation": "Περιστροφή",
"email": "Email",
"empty_folder": "This folder is empty",
"empty_folder": "Αυτός ο φάκελος είναι κενός",
"empty_trash": "Άδειασμα κάδου απορριμμάτων",
"empty_trash_confirmation": "Είστε σίγουροι οτι θέλετε να αδειάσετε τον κάδο απορριμμάτων; Αυτό θα αφαιρέσει μόνιμα όλα τα στοιχεία του κάδου απορριμμάτων του Immich. \nΑυτή η ενέργεια δεν μπορεί να αναιρεθεί!",
"enable": "Ενεργοποίηση",
"enabled": "Ενεργοποιημένο",
"end_date": "Τελική ημερομηνία",
"enqueued": "Enqueued",
"enter_wifi_name": "Enter WiFi name",
"enqueued": "Τοποθετήθηκε στη λίστα αναμονής",
"enter_wifi_name": "Εισαγωγή ονόματος Wi-Fi",
"error": "Σφάλμα",
"error_change_sort_album": "Failed to change album sort order",
"error_change_sort_album": "Απέτυχε η αλλαγή σειράς του άλμπουμ",
"error_delete_face": "Σφάλμα διαγραφής προσώπου από το στοιχείο",
"error_loading_image": "Σφάλμα κατά τη φόρτωση της εικόνας",
"error_saving_image": "Σφάλμα: {}",
@@ -857,6 +850,7 @@
"failed_to_remove_product_key": "Αποτυχία αφαίρεσης κλειδιού προϊόντος",
"failed_to_stack_assets": "Αποτυχία στην συμπίεση των στοιχείων",
"failed_to_unstack_assets": "Αποτυχία στην αποσυμπίεση των στοιχείων",
"failed_to_update_notification_status": "Αποτυχία ενημέρωσης της κατάστασης ειδοποίησης",
"import_path_already_exists": "Αυτή η διαδρομή εισαγωγής υπάρχει ήδη.",
"incorrect_email_or_password": "Λανθασμένο email ή κωδικός πρόσβασης",
"paths_validation_failed": "{paths, plural, one {# διαδρομή} other {# διαδρομές}} απέτυχαν κατά την επικύρωση",
@@ -955,12 +949,12 @@
"exif_bottom_sheet_description": "Προσθήκη Περιγραφής...",
"exif_bottom_sheet_details": "ΛΕΠΤΟΜΕΡΕΙΕΣ",
"exif_bottom_sheet_location": "ΤΟΠΟΘΕΣΙΑ",
"exif_bottom_sheet_people": "ΑΝΘΡΩΠΟΙ",
"exif_bottom_sheet_people": "ΑΤΟΜΑ",
"exif_bottom_sheet_person_add_person": "Προσθήκη ονόματος",
"exif_bottom_sheet_person_age": "Age {}",
"exif_bottom_sheet_person_age_months": "Age {} months",
"exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months",
"exif_bottom_sheet_person_age_years": "Age {}",
"exif_bottom_sheet_person_age": "Ηλικία {}",
"exif_bottom_sheet_person_age_months": "Ηλικία {} μήνες",
"exif_bottom_sheet_person_age_year_months": "Ηλικία 1 έτους, {} μηνών",
"exif_bottom_sheet_person_age_years": "Ηλικία {}",
"exit_slideshow": "Έξοδος από την παρουσίαση",
"expand_all": "Ανάπτυξη όλων",
"experimental_settings_new_asset_list_subtitle": "Σε εξέλιξη",
@@ -977,12 +971,12 @@
"extension": "Επέκταση",
"external": "Εξωτερικός",
"external_libraries": "Εξωτερικές βιβλιοθήκες",
"external_network": "External network",
"external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom",
"external_network": "Εξωτερικό δίκτυο",
"external_network_sheet_info": "Όταν δεν είστε συνδεδεμένοι στο προτιμώμενο δίκτυο Wi-Fi, η εφαρμογή θα συνδεθεί με τον διακομιστή μέσω του πρώτου από τα παρακάτω URLs που μπορεί να βρει διαθέσιμο, ξεκινώντας από το πάνω προς το κάτω",
"face_unassigned": "Μη ανατεθειμένο",
"failed": "Failed",
"failed": "Απέτυχε",
"failed_to_load_assets": "Αποτυχία φόρτωσης στοιχείων",
"failed_to_load_folder": "Failed to load folder",
"failed_to_load_folder": "Αποτυχία φόρτωσης φακέλου",
"favorite": "Αγαπημένο",
"favorite_or_unfavorite_photo": "Ορίστε μία φωτογραφία ως αγαπημένη ή αφαιρέστε την από τα αγαπημένα",
"favorites": "Αγαπημένα",
@@ -996,21 +990,22 @@
"filetype": "Τύπος αρχείου",
"filter": "Φίλτρο",
"filter_people": "Φιλτράρισμα ατόμων",
"filter_places": "Φιλτράρισμα τοποθεσιών",
"find_them_fast": "Βρείτε τους γρήγορα με αναζήτηση κατά όνομα",
"fix_incorrect_match": "Διόρθωση λανθασμένης αντιστοίχισης",
"folder": "Folder",
"folder_not_found": "Folder not found",
"folder": "Φάκελος",
"folder_not_found": "Ο φάκελος δεν βρέθηκε",
"folders": "Φάκελοι",
"folders_feature_description": "Περιήγηση στην προβολή φακέλου για τις φωτογραφίες και τα βίντεο στο σύστημα αρχείων",
"forward": "Προς τα εμπρός",
"general": "Γενικά",
"get_help": "Ζητήστε βοήθεια",
"get_wifiname_error": "Could not get Wi-Fi name. Make sure you have granted the necessary permissions and are connected to a Wi-Fi network",
"get_wifiname_error": "Δεν ήταν δυνατή η λήψη του ονόματος Wi-Fi. Βεβαιωθείτε ότι έχετε δώσει τις απαραίτητες άδειες και ότι είστε συνδεδεμένοι σε δίκτυο Wi-Fi",
"getting_started": "Ξεκινώντας",
"go_back": "Πηγαίνετε πίσω",
"go_to_folder": "Μετάβαση στο φάκελο",
"go_to_search": "Πηγαίνετε στην αναζήτηση",
"grant_permission": "Grant permission",
"grant_permission": "Επιτρέψτε την άδεια",
"group_albums_by": "Ομαδοποίηση άλμπουμ κατά...",
"group_country": "Ομαδοποίηση κατά χώρα",
"group_no": "Καμία ομοδοποίηση",
@@ -1044,7 +1039,7 @@
"home_page_delete_remote_err_local": "Τοπικά στοιχεία στη διαγραφή απομακρυσμένης επιλογής, παραλείπεται",
"home_page_favorite_err_local": "Δεν μπορώ ακόμα να αγαπήσω τα τοπικά στοιχεία, παραλείπεται",
"home_page_favorite_err_partner": "Δεν είναι ακόμα δυνατή η πρόσθεση στοιχείων συντρόφου στα αγαπημένα, παραλείπεται",
"home_page_first_time_notice": "Εάν αυτή είναι η πρώτη φορά που χρησιμοποιείτε την εφαρμογή, βεβαιωθείτε ότι έχετε επιλέξει ένα άλμπουμ αντίγραφου ασφαλείας, ώστε το χρονοδιάγραμμα να μπορεί να συμπληρώσει φωτογραφίες και βίντεο στα άλμπουμ.",
"home_page_first_time_notice": "Εάν αυτή είναι η πρώτη φορά που χρησιμοποιείτε την εφαρμογή, βεβαιωθείτε ότι έχετε επιλέξει ένα άλμπουμ αντίγραφου ασφαλείας, ώστε το χρονοδιάγραμμα να μπορεί να συμπληρώσει φωτογραφίες και βίντεο στα άλμπουμ",
"home_page_share_err_local": "Δεν είναι δυνατή η κοινή χρήση τοπικών στοιχείων μέσω συνδέσμου, παραλείπεται",
"home_page_upload_err_limit": "Μπορείτε να ανεβάσετε μόνο 30 στοιχεία κάθε φορά, παραλείπεται",
"host": "Φιλοξενία",
@@ -1122,9 +1117,9 @@
"loading": "Φόρτωση",
"loading_search_results_failed": "Η φόρτωση αποτελεσμάτων αναζήτησης απέτυχε",
"local_network": "Local network",
"local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network",
"location_permission": "Location permission",
"location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name",
"local_network_sheet_info": "Η εφαρμογή θα συνδεθεί με τον διακομιστή μέσω αυτού του URL όταν χρησιμοποιείται το καθορισμένο δίκτυο Wi-Fi",
"location_permission": "Άδεια τοποθεσίας",
"location_permission_content": "Για να χρησιμοποιηθεί η λειτουργία αυτόματης εναλλαγής, το Immich χρειάζεται άδεια για την ακριβή τοποθεσία της συσκευής ώστε να μπορεί να διαβάζει το όνομα του τρέχοντος δικτύου Wi-Fi",
"location_picker_choose_on_map": "Επιλέξτε στο χάρτη",
"location_picker_latitude_error": "Εισαγάγετε ένα έγκυρο γεωγραφικό πλάτος",
"location_picker_latitude_hint": "Εισαγάγετε το γεωγραφικό πλάτος σας εδώ",
@@ -1198,6 +1193,9 @@
"map_settings_only_show_favorites": "Εμφάνιση μόνο αγαπημένων",
"map_settings_theme_settings": "Θέμα χάρτη",
"map_zoom_to_see_photos": "Σμικρύνετε για να δείτε φωτογραφίες",
"mark_all_as_read": "Επισήμανση όλων ως αναγνωσμένα",
"mark_as_read": "Επισήμανση ως αναγνωσμένο",
"marked_all_as_read": "Όλα επισημάνθηκαν ως αναγνωσμένα",
"matches": "Αντιστοιχίες",
"media_type": "Τύπος πολυμέσου",
"memories": "Αναμνήσεις",
@@ -1207,7 +1205,7 @@
"memories_start_over": "Ξεκινήστε από την αρχή",
"memories_swipe_to_close": "Σύρετε προς τα πάνω για να κλείσετε",
"memories_year_ago": "Πριν ένα χρόνο",
"memories_years_ago": "Πριν από {} χρόνια",
"memories_years_ago": "Πριν από {} έτη",
"memory": "Ανάμνηση",
"memory_lane_title": "Διαδρομή Αναμνήσεων {title}",
"menu": "Μενού",
@@ -1231,8 +1229,8 @@
"my_albums": "Τα άλμπουμ μου",
"name": "Όνομα",
"name_or_nickname": "Όνομα ή ψευδώνυμο",
"networking_settings": "Networking",
"networking_subtitle": "Manage the server endpoint settings",
"networking_settings": "Δικτύωση",
"networking_subtitle": "Διαχείριση ρυθμίσεων τελικών σημείων διακομιστή",
"never": "Ποτέ",
"new_album": "Νέο Άλμπουμ",
"new_api_key": "Νέο API Key",
@@ -1256,12 +1254,13 @@
"no_favorites_message": "Προσθέστε αγαπημένα για να βρείτε γρήγορα τις καλύτερες φωτογραφίες και τα βίντεό σας",
"no_libraries_message": "Δημιουργήστε μια εξωτερική βιβλιοθήκη για να προβάλετε τις φωτογραφίες και τα βίντεό σας",
"no_name": "Χωρίς Όνομα",
"no_notifications": "Καμία ειδοποίηση",
"no_places": "Καμία τοποθεσία",
"no_results": "Κανένα αποτέλεσμα",
"no_results_description": "Δοκιμάστε ένα συνώνυμο ή πιο γενική λέξη-κλειδί",
"no_shared_albums_message": "Δημιουργήστε ένα άλμπουμ για να μοιράζεστε φωτογραφίες και βίντεο με άτομα στο δίκτυό σας",
"not_in_any_album": "Σε κανένα άλμπουμ",
"not_selected": "Not selected",
"not_selected": "Δεν επιλέχθηκε",
"note_apply_storage_label_to_previously_uploaded assets": "Σημείωση: Για να εφαρμόσετε την Ετικέτα Αποθήκευσης σε στοιχεία που έχουν μεταφορτωθεί προηγουμένως, εκτελέστε το",
"notes": "Σημειώσεις",
"notification_permission_dialog_content": "Για να ενεργοποιήσετε τις ειδοποιήσεις, μεταβείτε στις Ρυθμίσεις και επιλέξτε να επιτρέπεται.",
@@ -1286,6 +1285,7 @@
"onboarding_welcome_user": "Καλωσόρισες, {user}",
"online": "Σε σύνδεση",
"only_favorites": "Μόνο αγαπημένα",
"open": "Άνοιγμα",
"open_in_map_view": "Άνοιγμα σε προβολή χάρτη",
"open_in_openstreetmap": "Άνοιγμα στο OpenStreetMap",
"open_the_search_filters": "Ανοίξτε τα φίλτρα αναζήτησης",
@@ -1363,7 +1363,7 @@
"play_motion_photo": "Αναπαραγωγή Κινούμενης Φωτογραφίας",
"play_or_pause_video": "Αναπαραγωγή ή παύση βίντεο",
"port": "Θύρα",
"preferences_settings_subtitle": "Manage the app's preferences",
"preferences_settings_subtitle": "Διαχειριστείτε τις προτιμήσεις της εφαρμογής",
"preferences_settings_title": "Προτιμήσεις",
"preset": "Προκαθορισμένη ρύθμιση",
"preview": "Προεπισκόπηση",
@@ -1430,6 +1430,8 @@
"recent_searches": "Πρόσφατες αναζητήσεις",
"recently_added": "Προστέθηκαν πρόσφατα",
"recently_added_page_title": "Προστέθηκαν Πρόσφατα",
"recently_taken": "Λήφθηκαν πρόσφατα",
"recently_taken_page_title": "Λήφθηκαν Πρόσφατα",
"refresh": "Ανανέωση",
"refresh_encoded_videos": "Ανανέωση κωδικοποιημένων βίντεο",
"refresh_faces": "Ανανέωση προσώπων",
@@ -1514,7 +1516,7 @@
"search_filter_date_title": "Επιλέξτε εύρος ημερομηνιών",
"search_filter_display_option_not_in_album": "Όχι στο άλμπουμ",
"search_filter_display_options": "Επιλογές εμφάνισης",
"search_filter_filename": "Search by file name",
"search_filter_filename": "Αναζήτηση με όνομα αρχείου",
"search_filter_location": "Τοποθεσία",
"search_filter_location_title": "Επιλέξτε τοποθεσία",
"search_filter_media_type": "Τύπος Μέσου",
@@ -1522,17 +1524,17 @@
"search_filter_people_title": "Επιλέξτε άτομα",
"search_for": "Αναζήτηση για",
"search_for_existing_person": "Αναζήτηση υπάρχοντος ατόμου",
"search_no_more_result": "No more results",
"search_no_more_result": "Δεν υπάρχουν άλλα αποτελέσματα",
"search_no_people": "Κανένα άτομο",
"search_no_people_named": "Κανένα άτομο με όνομα \"{name}\"",
"search_no_result": "No results found, try a different search term or combination",
"search_no_result": "Δεν βρέθηκαν αποτελέσματα, προσπαθήστε με διαφορετικές ορολογίες αναζήτησης ή συνδυασμούς",
"search_options": "Επιλογές αναζήτησης",
"search_page_categories": "Κατηγορίες",
"search_page_motion_photos": "Κινούμενες Φωτογραφίες",
"search_page_no_objects": "Μη διαθέσιμες πληροφορίες αντικειμένων",
"search_page_no_places": "Μη διαθέσιμες πληροφορίες για μέρη",
"search_page_screenshots": "Στιγμιότυπα οθόνης",
"search_page_search_photos_videos": "Search for your photos and videos",
"search_page_search_photos_videos": "Αναζήτηση για τις φωτογραφίες και τα βίντεό σας",
"search_page_selfies": "Σέλφι",
"search_page_things": "Πράγματα",
"search_page_view_all_button": "Προβολή όλων",
@@ -1544,7 +1546,7 @@
"search_result_page_new_search_hint": "Νέα Αναζήτηση",
"search_settings": "Ρυθμίσεις αναζήτησης",
"search_state": "Αναζήτηση νομού...",
"search_suggestion_list_smart_search_hint_1": "Η έξυπνη αναζήτηση είναι ενεργοποιημένη από προεπιλογή, για αναζήτηση μεταδεδομένων χρησιμοποιήστε το συντακτικό",
"search_suggestion_list_smart_search_hint_1": "Η έξυπνη αναζήτηση είναι ενεργοποιημένη από προεπιλογή, για αναζήτηση μεταδεδομένων χρησιμοποιήστε το συντακτικό ",
"search_suggestion_list_smart_search_hint_2": "m:όρος-αναζήτησης",
"search_tags": "Αναζήτηση ετικετών...",
"search_timezone": "Αναζήτηση ζώνης ώρας...",
@@ -1571,7 +1573,7 @@
"selected_count": "{count, plural, other {# επιλεγμένοι}}",
"send_message": "Αποστολή μηνύματος",
"send_welcome_email": "Αποστολή email καλωσορίσματος",
"server_endpoint": "Server Endpoint",
"server_endpoint": "Τελικό σημείο Διακομιστή",
"server_info_box_app_version": "Έκδοση εφαρμογής",
"server_info_box_server_url": "URL διακομιστή",
"server_offline": "Διακομιστής Εκτός Σύνδεσης",
@@ -1592,7 +1594,7 @@
"setting_image_viewer_preview_title": "Φόρτωση εικόνας προεπισκόπησης",
"setting_image_viewer_title": "Εικόνες",
"setting_languages_apply": "Εφαρμογή",
"setting_languages_subtitle": "Change the app's language",
"setting_languages_subtitle": "Αλλάξτε τη γλώσσα της εφαρμογής",
"setting_languages_title": "Γλώσσες",
"setting_notifications_notify_failures_grace_period": "Ειδοποίηση αποτυχιών δημιουργίας αντιγράφων ασφαλείας στο παρασκήνιο: {}",
"setting_notifications_notify_hours": "{} ώρες",
@@ -1606,8 +1608,8 @@
"setting_notifications_total_progress_subtitle": "Συνολική πρόοδος μεταφόρτωσης (ολοκληρώθηκε/σύνολο στοιχείων)",
"setting_notifications_total_progress_title": "Εμφάνιση συνολικής προόδου δημιουργίας αντιγράφων ασφαλείας παρασκηνίου",
"setting_video_viewer_looping_title": "Συνεχής Επανάληψη",
"setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.",
"setting_video_viewer_original_video_title": "Force original video",
"setting_video_viewer_original_video_subtitle": "Όταν μεταδίδετε ένα βίντεο από τον διακομιστή, αναπαράγετε το αυθεντικό ακόμη και όταν υπάρχει διαθέσιμο με διαφορετική κωδικοποίηση. Μπορεί να προκαλέσει καθυστέρηση φόρτωσης. Τα βίντεο που είναι διαθέσιμα τοπικά, αναπαράγονται στην αυθεντική ποιότητα, ανεξαρτήτως αυτής της ρύθμισης.",
"setting_video_viewer_original_video_title": "Αναγκαστική αναπαραγωγή αυθεντικού βίντεο",
"settings": "Ρυθμίσεις",
"settings_require_restart": "Επανεκκινήστε το Immich για να εφαρμόσετε αυτήν τη ρύθμιση",
"settings_saved": "Οι ρυθμίσεις αποθηκεύτηκαν",
@@ -1622,12 +1624,12 @@
"shared_album_section_people_action_error": "Σφάλμα αποχώρησης/κατάργησης από το άλμπουμ",
"shared_album_section_people_action_leave": "Αποχώρηση χρήστη από το άλμπουμ",
"shared_album_section_people_action_remove_user": "Κατάργηση χρήστη από το άλμπουμ",
"shared_album_section_people_title": "ΑΝΘΡΩΠΟΙ",
"shared_album_section_people_title": "ΑΤΟΜΑ",
"shared_by": "Σε κοινή χρήση από",
"shared_by_user": "Σε κοινή χρήση από {user}",
"shared_by_you": "Σε κοινή χρήση από εσάς",
"shared_from_partner": "Φωτογραφίες από {partner}",
"shared_intent_upload_button_progress_text": "{} / {} Uploaded",
"shared_intent_upload_button_progress_text": "{} / {} Μεταφορτωμένα",
"shared_link_app_bar_title": "Κοινόχρηστοι Σύνδεσμοι",
"shared_link_clipboard_copied_massage": "Αντιγράφηκε στο πρόχειρο",
"shared_link_clipboard_text": "Σύνδεσμος: {}\nΚωδικός πρόσβασης: {}",
@@ -1806,7 +1808,7 @@
"unlink_motion_video": "Αποσυνδέστε το βίντεο κίνησης",
"unlink_oauth": "Αποσύνδεση OAuth",
"unlinked_oauth_account": "Ο λογαριασμός OAuth αποσυνδέθηκε",
"unmute_memories": "Αποσυνδέστε τις αναμνήσεις",
"unmute_memories": "Ενεργοποίηση Αναμνήσεων",
"unnamed_album": "Ανώνυμο Άλμπουμ",
"unnamed_album_delete_confirmation": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το άλμπουμ;",
"unnamed_share": "Ανώνυμη Κοινή Χρήση",
@@ -1830,11 +1832,11 @@
"upload_status_errors": "Σφάλματα",
"upload_status_uploaded": "Μεταφορτώθηκαν",
"upload_success": "Η μεταφόρτωση ολοκληρώθηκε, ανανεώστε τη σελίδα για να δείτε τα νέα αντικείμενα.",
"upload_to_immich": "Upload to Immich ({})",
"uploading": "Uploading",
"upload_to_immich": "Μεταφόρτωση στο Immich ({})",
"uploading": "Μεταφορτώνεται",
"url": "URL",
"usage": "Χρήση",
"use_current_connection": "use current connection",
"use_current_connection": "χρήση τρέχουσας σύνδεσης",
"use_custom_date_range": "Χρήση προσαρμοσμένου εύρους ημερομηνιών",
"user": "Χρήστης",
"user_id": "ID Χρήστη",
@@ -1849,14 +1851,14 @@
"users": "Χρήστες",
"utilities": "Βοηθητικά προγράμματα",
"validate": "Επικύρωση",
"validate_endpoint_error": "Please enter a valid URL",
"validate_endpoint_error": "Παρακαλώ εισάγετε ένα έγκυρο URL",
"variables": "Μεταβλητές",
"version": "Έκδοση",
"version_announcement_closing": "Ο φίλος σου, Alex",
"version_announcement_message": "Γειά σας! Μια νέα έκδοση του Immich είναι διαθέσιμη. Παρακαλούμε αφιερώστε λίγο χρόνο για να διαβάσετε τις <link>σημειώσεις έκδοσης</link> ώστε να βεβαιωθείτε ότι η ρύθμιση σας είναι ενημερωμένη και να αποφύγετε τυχόν σφάλματα, ειδικά αν χρησιμοποιείτε το WatchTower ή οποιοδήποτε μηχανισμό που διαχειρίζεται αυτόματα την ενημέρωση της εγκατάστασης του Immich σας.",
"version_announcement_overlay_release_notes": "σημειώσεις έκδοσης",
"version_announcement_overlay_text_1": "Γειά σας, υπάρχει μια νέα έκδοση του",
"version_announcement_overlay_text_2": "παρακαλώ αφιερώστε χρόνο να επισκεφθείτε το",
"version_announcement_overlay_text_2": "παρακαλώ αφιερώστε χρόνο να επισκεφθείτε το ",
"version_announcement_overlay_text_3": " και βεβαιωθείτε ότι το docker-compose και το .env σας είναι ενημερωμένη για την αποφυγή τυχόν εσφαλμένων διαμορφώσεων, ειδικά εάν χρησιμοποιείτε το WatchTower ή οποιονδήποτε μηχανισμό που χειρίζεται την αυτόματη ενημέρωση του διακομιστή σας.",
"version_announcement_overlay_title": "Διαθέσιμη νέα έκδοση διακομιστή 🎉",
"version_history": "Ιστορικό Εκδόσεων",
@@ -1887,11 +1889,11 @@
"week": "Εβδομάδα",
"welcome": "Καλωσορίσατε",
"welcome_to_immich": "Καλωσορίσατε στο Ιmmich",
"wifi_name": "WiFi Name",
"wifi_name": "Όνομα Wi-Fi",
"year": "Έτος",
"years_ago": "πριν από {years, plural, one {# χρόνο} other {# χρόνια}}",
"yes": "Ναι",
"you_dont_have_any_shared_links": "Δεν έχετε κοινόχρηστους συνδέσμους",
"your_wifi_name": "Your WiFi name",
"your_wifi_name": "Το όνομα του Wi-Fi σας",
"zoom_image": "Ζουμ Εικόνας"
}

View File

@@ -1,4 +1,17 @@
{
"user_pin_code_settings": "PIN Code",
"user_pin_code_settings_description": "Manage your PIN code",
"current_pin_code": "Current PIN code",
"new_pin_code": "New PIN code",
"setup_pin_code": "Setup a PIN code",
"confirm_new_pin_code": "Confirm new PIN code",
"change_pin_code": "Change PIN code",
"unable_to_change_pin_code": "Unable to change PIN code",
"unable_to_setup_pin_code": "Unable to setup PIN code",
"pin_code_changed_successfully": "Successfully changed PIN code",
"pin_code_setup_successfully": "Successfully setup a PIN code",
"pin_code_reset_successfully": "Successfully reset PIN code",
"reset_pin_code": "Reset PIN code",
"about": "About",
"account": "Account",
"account_settings": "Account Settings",
@@ -53,6 +66,7 @@
"confirm_email_below": "To confirm, type \"{email}\" below",
"confirm_reprocess_all_faces": "Are you sure you want to reprocess all faces? This will also clear named people.",
"confirm_user_password_reset": "Are you sure you want to reset {user}'s password?",
"confirm_user_pin_code_reset": "Are you sure you want to reset {user}'s PIN code?",
"create_job": "Create job",
"cron_expression": "Cron expression",
"cron_expression_description": "Set the scanning interval using the cron format. For more information please refer to e.g. <link>Crontab Guru</link>",
@@ -192,26 +206,22 @@
"oauth_auto_register": "Auto register",
"oauth_auto_register_description": "Automatically register new users after signing in with OAuth",
"oauth_button_text": "Button text",
"oauth_client_id": "Client ID",
"oauth_client_secret": "Client Secret",
"oauth_client_secret_description": "Required if PKCE (Proof Key for Code Exchange) is not supported by the OAuth provider",
"oauth_enable_description": "Login with OAuth",
"oauth_issuer_url": "Issuer URL",
"oauth_mobile_redirect_uri": "Mobile redirect URI",
"oauth_mobile_redirect_uri_override": "Mobile redirect URI override",
"oauth_mobile_redirect_uri_override_description": "Enable when OAuth provider does not allow a mobile URI, like '{callback}'",
"oauth_profile_signing_algorithm": "Profile signing algorithm",
"oauth_profile_signing_algorithm_description": "Algorithm used to sign the user profile.",
"oauth_scope": "Scope",
"oauth_settings": "OAuth",
"oauth_settings_description": "Manage OAuth login settings",
"oauth_settings_more_details": "For more details about this feature, refer to the <link>docs</link>.",
"oauth_signing_algorithm": "Signing algorithm",
"oauth_storage_label_claim": "Storage label claim",
"oauth_storage_label_claim_description": "Automatically set the user's storage label to the value of this claim.",
"oauth_storage_quota_claim": "Storage quota claim",
"oauth_storage_quota_claim_description": "Automatically set the user's storage quota to the value of this claim.",
"oauth_storage_quota_default": "Default storage quota (GiB)",
"oauth_storage_quota_default_description": "Quota in GiB to be used when no claim is provided (Enter 0 for unlimited quota).",
"oauth_timeout": "Request Timeout",
"oauth_timeout_description": "Timeout for requests in milliseconds",
"offline_paths": "Offline Paths",
"offline_paths_description": "These results may be due to manual deletion of files that are not part of an external library.",
"password_enable_description": "Login with email and password",
@@ -352,6 +362,7 @@
"user_delete_delay_settings_description": "Number of days after removal to permanently delete a user's account and assets. The user deletion job runs at midnight to check for users that are ready for deletion. Changes to this setting will be evaluated at the next execution.",
"user_delete_immediately": "<b>{user}</b>'s account and assets will be queued for permanent deletion <b>immediately</b>.",
"user_delete_immediately_checkbox": "Queue user and assets for immediate deletion",
"user_details": "User Details",
"user_management": "User Management",
"user_password_has_been_reset": "The user's password has been reset:",
"user_password_reset_description": "Please provide the temporary password to the user and inform them they will need to change the password at their next login.",
@@ -373,7 +384,7 @@
"advanced": "Advanced",
"advanced_settings_enable_alternate_media_filter_subtitle": "Use this option to filter media during sync based on alternate criteria. Only try this if you have issues with the app detecting all albums.",
"advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Use alternate device album sync filter",
"advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_log_level_title": "Log level: {level}",
"advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.",
"advanced_settings_prefer_remote_title": "Prefer remote images",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request",
@@ -404,9 +415,9 @@
"album_remove_user_confirmation": "Are you sure you want to remove {user}?",
"album_share_no_users": "Looks like you have shared this album with all users or you don't have any user to share with.",
"album_thumbnail_card_item": "1 item",
"album_thumbnail_card_items": "{} items",
"album_thumbnail_card_items": "{count} items",
"album_thumbnail_card_shared": " · Shared",
"album_thumbnail_shared_by": "Shared by {}",
"album_thumbnail_shared_by": "Shared by {user}",
"album_updated": "Album updated",
"album_updated_setting_description": "Receive an email notification when a shared album has new assets",
"album_user_left": "Left {album}",
@@ -444,7 +455,7 @@
"archive": "Archive",
"archive_or_unarchive_photo": "Archive or unarchive photo",
"archive_page_no_archived_assets": "No archived assets found",
"archive_page_title": "Archive ({})",
"archive_page_title": "Archive ({count})",
"archive_size": "Archive size",
"archive_size_description": "Configure the archive size for downloads (in GiB)",
"archived": "Archived",
@@ -481,18 +492,18 @@
"assets_added_to_album_count": "Added {count, plural, one {# asset} other {# assets}} to the album",
"assets_added_to_name_count": "Added {count, plural, one {# asset} other {# assets}} to {hasName, select, true {<b>{name}</b>} other {new album}}",
"assets_count": "{count, plural, one {# asset} other {# assets}}",
"assets_deleted_permanently": "{} asset(s) deleted permanently",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server",
"assets_deleted_permanently": "{count} asset(s) deleted permanently",
"assets_deleted_permanently_from_server": "{count} asset(s) deleted permanently from the Immich server",
"assets_moved_to_trash_count": "Moved {count, plural, one {# asset} other {# assets}} to trash",
"assets_permanently_deleted_count": "Permanently deleted {count, plural, one {# asset} other {# assets}}",
"assets_removed_count": "Removed {count, plural, one {# asset} other {# assets}}",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device",
"assets_removed_permanently_from_device": "{count} asset(s) removed permanently from your device",
"assets_restore_confirmation": "Are you sure you want to restore all your trashed assets? You cannot undo this action! Note that any offline assets cannot be restored this way.",
"assets_restored_count": "Restored {count, plural, one {# asset} other {# assets}}",
"assets_restored_successfully": "{} asset(s) restored successfully",
"assets_trashed": "{} asset(s) trashed",
"assets_restored_successfully": "{count} asset(s) restored successfully",
"assets_trashed": "{count} asset(s) trashed",
"assets_trashed_count": "Trashed {count, plural, one {# asset} other {# assets}}",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server",
"assets_trashed_from_server": "{count} asset(s) trashed from the Immich server",
"assets_were_part_of_album_count": "{count, plural, one {Asset was} other {Assets were}} already part of the album",
"authorized_devices": "Authorized Devices",
"automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere",
@@ -501,7 +512,7 @@
"back_close_deselect": "Back, close, or deselect",
"background_location_permission": "Background location permission",
"background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name",
"backup_album_selection_page_albums_device": "Albums on device ({})",
"backup_album_selection_page_albums_device": "Albums on device ({count})",
"backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude",
"backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.",
"backup_album_selection_page_select_albums": "Select albums",
@@ -510,11 +521,11 @@
"backup_all": "All",
"backup_background_service_backup_failed_message": "Failed to backup assets. Retrying…",
"backup_background_service_connection_failed_message": "Failed to connect to the server. Retrying…",
"backup_background_service_current_upload_notification": "Uploading {}",
"backup_background_service_current_upload_notification": "Uploading {filename}",
"backup_background_service_default_notification": "Checking for new assets…",
"backup_background_service_error_title": "Backup error",
"backup_background_service_in_progress_notification": "Backing up your assets…",
"backup_background_service_upload_failure_notification": "Failed to upload {}",
"backup_background_service_upload_failure_notification": "Failed to upload {filename}",
"backup_controller_page_albums": "Backup Albums",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
@@ -525,22 +536,22 @@
"backup_controller_page_background_battery_info_title": "Battery optimizations",
"backup_controller_page_background_charging": "Only while charging",
"backup_controller_page_background_configure_error": "Failed to configure the background service",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_delay": "Delay new assets backup: {duration}",
"backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app",
"backup_controller_page_background_is_off": "Automatic background backup is off",
"backup_controller_page_background_is_on": "Automatic background backup is on",
"backup_controller_page_background_turn_off": "Turn off background service",
"backup_controller_page_background_turn_on": "Turn on background service",
"backup_controller_page_background_wifi": "Only on WiFi",
"backup_controller_page_background_wifi": "Only on Wi-Fi",
"backup_controller_page_backup": "Backup",
"backup_controller_page_backup_selected": "Selected: ",
"backup_controller_page_backup_sub": "Backed up photos and videos",
"backup_controller_page_created": "Created on: {}",
"backup_controller_page_created": "Created on: {date}",
"backup_controller_page_desc_backup": "Turn on foreground backup to automatically upload new assets to the server when opening the app.",
"backup_controller_page_excluded": "Excluded: ",
"backup_controller_page_failed": "Failed ({})",
"backup_controller_page_filename": "File name: {} [{}]",
"backup_controller_page_id": "ID: {}",
"backup_controller_page_failed": "Failed ({count})",
"backup_controller_page_filename": "File name: {filename} [{size}]",
"backup_controller_page_id": "ID: {id}",
"backup_controller_page_info": "Backup Information",
"backup_controller_page_none_selected": "None selected",
"backup_controller_page_remainder": "Remainder",
@@ -549,7 +560,7 @@
"backup_controller_page_start_backup": "Start Backup",
"backup_controller_page_status_off": "Automatic foreground backup is off",
"backup_controller_page_status_on": "Automatic foreground backup is on",
"backup_controller_page_storage_format": "{} of {} used",
"backup_controller_page_storage_format": "{used} of {total} used",
"backup_controller_page_to_backup": "Albums to be backed up",
"backup_controller_page_total_sub": "All unique photos and videos from selected albums",
"backup_controller_page_turn_off": "Turn off foreground backup",
@@ -574,21 +585,21 @@
"bulk_keep_duplicates_confirmation": "Are you sure you want to keep {count, plural, one {# duplicate asset} other {# duplicate assets}}? This will resolve all duplicate groups without deleting anything.",
"bulk_trash_duplicates_confirmation": "Are you sure you want to bulk trash {count, plural, one {# duplicate asset} other {# duplicate assets}}? This will keep the largest asset of each group and trash all other duplicates.",
"buy": "Purchase Immich",
"cache_settings_album_thumbnails": "Library page thumbnails ({} assets)",
"cache_settings_album_thumbnails": "Library page thumbnails ({count} assets)",
"cache_settings_clear_cache_button": "Clear cache",
"cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.",
"cache_settings_duplicated_assets_clear_button": "CLEAR",
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
"cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
"cache_settings_image_cache_size": "Image cache size ({} assets)",
"cache_settings_duplicated_assets_title": "Duplicated Assets ({count})",
"cache_settings_image_cache_size": "Image cache size ({count} assets)",
"cache_settings_statistics_album": "Library thumbnails",
"cache_settings_statistics_assets": "{} assets ({})",
"cache_settings_statistics_assets": "{count} assets ({size})",
"cache_settings_statistics_full": "Full images",
"cache_settings_statistics_shared": "Shared album thumbnails",
"cache_settings_statistics_thumbnail": "Thumbnails",
"cache_settings_statistics_title": "Cache usage",
"cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application",
"cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)",
"cache_settings_thumbnail_size": "Thumbnail cache size ({count} assets)",
"cache_settings_tile_subtitle": "Control the local storage behaviour",
"cache_settings_tile_title": "Local Storage",
"cache_settings_title": "Caching Settings",
@@ -658,7 +669,7 @@
"contain": "Contain",
"context": "Context",
"continue": "Continue",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_album_info_shared": "{count} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
@@ -767,7 +778,7 @@
"download_enqueue": "Download enqueued",
"download_error": "Download Error",
"download_failed": "Download failed",
"download_filename": "file: {}",
"download_filename": "file: {filename}",
"download_finished": "Download finished",
"download_include_embedded_motion_videos": "Embedded videos",
"download_include_embedded_motion_videos_description": "Include videos embedded in motion photos as a separate file",
@@ -818,12 +829,12 @@
"enabled": "Enabled",
"end_date": "End date",
"enqueued": "Enqueued",
"enter_wifi_name": "Enter WiFi name",
"enter_wifi_name": "Enter Wi-Fi name",
"error": "Error",
"error_change_sort_album": "Failed to change album sort order",
"error_delete_face": "Error deleting face from asset",
"error_loading_image": "Error loading image",
"error_saving_image": "Error: {}",
"error_saving_image": "Error: {error}",
"error_title": "Error - Something went wrong",
"errors": {
"cannot_navigate_next_asset": "Cannot navigate to the next asset",
@@ -853,10 +864,12 @@
"failed_to_keep_this_delete_others": "Failed to keep this asset and delete the other assets",
"failed_to_load_asset": "Failed to load asset",
"failed_to_load_assets": "Failed to load assets",
"failed_to_load_notifications": "Failed to load notifications",
"failed_to_load_people": "Failed to load people",
"failed_to_remove_product_key": "Failed to remove product key",
"failed_to_stack_assets": "Failed to stack assets",
"failed_to_unstack_assets": "Failed to un-stack assets",
"failed_to_update_notification_status": "Failed to update notification status",
"import_path_already_exists": "This import path already exists.",
"incorrect_email_or_password": "Incorrect email or password",
"paths_validation_failed": "{paths, plural, one {# path} other {# paths}} failed validation",
@@ -924,6 +937,7 @@
"unable_to_remove_reaction": "Unable to remove reaction",
"unable_to_repair_items": "Unable to repair items",
"unable_to_reset_password": "Unable to reset password",
"unable_to_reset_pin_code": "Unable to reset PIN code",
"unable_to_resolve_duplicate": "Unable to resolve duplicate",
"unable_to_restore_assets": "Unable to restore assets",
"unable_to_restore_trash": "Unable to restore trash",
@@ -957,10 +971,10 @@
"exif_bottom_sheet_location": "LOCATION",
"exif_bottom_sheet_people": "PEOPLE",
"exif_bottom_sheet_person_add_person": "Add name",
"exif_bottom_sheet_person_age": "Age {}",
"exif_bottom_sheet_person_age_months": "Age {} months",
"exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months",
"exif_bottom_sheet_person_age_years": "Age {}",
"exif_bottom_sheet_person_age": "Age {age}",
"exif_bottom_sheet_person_age_months": "Age {months} months",
"exif_bottom_sheet_person_age_year_months": "Age 1 year, {months} months",
"exif_bottom_sheet_person_age_years": "Age {years}",
"exit_slideshow": "Exit Slideshow",
"expand_all": "Expand all",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
@@ -1175,8 +1189,8 @@
"manage_your_devices": "Manage your logged-in devices",
"manage_your_oauth_connection": "Manage your OAuth connection",
"map": "Map",
"map_assets_in_bound": "{} photo",
"map_assets_in_bounds": "{} photos",
"map_assets_in_bound": "{count} photo",
"map_assets_in_bounds": "{count} photos",
"map_cannot_get_user_location": "Cannot get user's location",
"map_location_dialog_yes": "Yes",
"map_location_picker_page_use_location": "Use this location",
@@ -1190,15 +1204,18 @@
"map_settings": "Map settings",
"map_settings_dark_mode": "Dark mode",
"map_settings_date_range_option_day": "Past 24 hours",
"map_settings_date_range_option_days": "Past {} days",
"map_settings_date_range_option_days": "Past {days} days",
"map_settings_date_range_option_year": "Past year",
"map_settings_date_range_option_years": "Past {} years",
"map_settings_date_range_option_years": "Past {years} years",
"map_settings_dialog_title": "Map Settings",
"map_settings_include_show_archived": "Include Archived",
"map_settings_include_show_partners": "Include Partners",
"map_settings_only_show_favorites": "Show Favorite Only",
"map_settings_theme_settings": "Map Theme",
"map_zoom_to_see_photos": "Zoom out to see photos",
"mark_as_read": "Mark as read",
"mark_all_as_read": "Mark all as read",
"marked_all_as_read": "Marked all as read",
"matches": "Matches",
"media_type": "Media type",
"memories": "Memories",
@@ -1208,7 +1225,7 @@
"memories_start_over": "Start Over",
"memories_swipe_to_close": "Swipe up to close",
"memories_year_ago": "A year ago",
"memories_years_ago": "{} years ago",
"memories_years_ago": "{years} years ago",
"memory": "Memory",
"memory_lane_title": "Memory Lane {title}",
"menu": "Menu",
@@ -1225,6 +1242,8 @@
"month": "Month",
"monthly_title_text_date_format": "MMMM y",
"more": "More",
"moved_to_archive": "Moved {count, plural, one {# asset} other {# assets}} to archive",
"moved_to_library": "Moved {count, plural, one {# asset} other {# assets}} to library",
"moved_to_trash": "Moved to trash",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
@@ -1257,9 +1276,11 @@
"no_favorites_message": "Add favorites to quickly find your best pictures and videos",
"no_libraries_message": "Create an external library to view your photos and videos",
"no_name": "No Name",
"no_people_found": "No matching people found",
"no_places": "No places",
"no_results": "No results",
"no_results_description": "Try a synonym or more general keyword",
"no_notifications": "No notifications",
"no_shared_albums_message": "Create an album to share photos and videos with people in your network",
"not_in_any_album": "Not in any album",
"not_selected": "Not selected",
@@ -1270,6 +1291,7 @@
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"notification_toggle_setting_description": "Enable email notifications",
"email_notifications": "Email notifications",
"notifications": "Notifications",
"notifications_setting_description": "Manage notifications",
"oauth": "OAuth",
@@ -1311,7 +1333,7 @@
"partner_page_partner_add_failed": "Failed to add partner",
"partner_page_select_partner": "Select partner",
"partner_page_shared_to_title": "Shared to",
"partner_page_stop_sharing_content": "{} will no longer be able to access your photos.",
"partner_page_stop_sharing_content": "{partner} will no longer be able to access your photos.",
"partner_sharing": "Partner Sharing",
"partners": "Partners",
"password": "Password",
@@ -1374,6 +1396,7 @@
"previous_or_next_photo": "Previous or next photo",
"primary": "Primary",
"privacy": "Privacy",
"profile": "Profile",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
"profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
@@ -1568,6 +1591,7 @@
"select_keep_all": "Select keep all",
"select_library_owner": "Select library owner",
"select_new_face": "Select new face",
"select_person_to_tag": "Select a person to tag",
"select_photos": "Select photos",
"select_trash_all": "Select trash all",
"select_user_for_sharing_page_err_album": "Failed to create album",
@@ -1598,12 +1622,12 @@
"setting_languages_apply": "Apply",
"setting_languages_subtitle": "Change the app's language",
"setting_languages_title": "Languages",
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
"setting_notifications_notify_hours": "{} hours",
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {duration}",
"setting_notifications_notify_hours": "{count} hours",
"setting_notifications_notify_immediately": "immediately",
"setting_notifications_notify_minutes": "{} minutes",
"setting_notifications_notify_minutes": "{count} minutes",
"setting_notifications_notify_never": "never",
"setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_notify_seconds": "{count} seconds",
"setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset",
"setting_notifications_single_progress_title": "Show background backup detail progress",
"setting_notifications_subtitle": "Adjust your notification preferences",
@@ -1617,7 +1641,7 @@
"settings_saved": "Settings saved",
"share": "Share",
"share_add_photos": "Add photos",
"share_assets_selected": "{} selected",
"share_assets_selected": "{count} selected",
"share_dialog_preparing": "Preparing...",
"shared": "Shared",
"shared_album_activities_input_disable": "Comment is disabled",
@@ -1631,32 +1655,32 @@
"shared_by_user": "Shared by {user}",
"shared_by_you": "Shared by you",
"shared_from_partner": "Photos from {partner}",
"shared_intent_upload_button_progress_text": "{} / {} Uploaded",
"shared_intent_upload_button_progress_text": "{current} / {total} Uploaded",
"shared_link_app_bar_title": "Shared Links",
"shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
"shared_link_clipboard_text": "Link: {link}\nPassword: {password}",
"shared_link_create_error": "Error while creating shared link",
"shared_link_edit_description_hint": "Enter the share description",
"shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_days": "{} days",
"shared_link_edit_expire_after_option_days": "{count} days",
"shared_link_edit_expire_after_option_hour": "1 hour",
"shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_hours": "{count} hours",
"shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_months": "{} months",
"shared_link_edit_expire_after_option_year": "{} year",
"shared_link_edit_expire_after_option_minutes": "{count} minutes",
"shared_link_edit_expire_after_option_months": "{count} months",
"shared_link_edit_expire_after_option_year": "{count} year",
"shared_link_edit_password_hint": "Enter the share password",
"shared_link_edit_submit_button": "Update link",
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
"shared_link_expires_day": "Expires in {} day",
"shared_link_expires_days": "Expires in {} days",
"shared_link_expires_hour": "Expires in {} hour",
"shared_link_expires_hours": "Expires in {} hours",
"shared_link_expires_minute": "Expires in {} minute",
"shared_link_expires_minutes": "Expires in {} minutes",
"shared_link_expires_day": "Expires in {count} day",
"shared_link_expires_days": "Expires in {count} days",
"shared_link_expires_hour": "Expires in {count} hour",
"shared_link_expires_hours": "Expires in {count} hours",
"shared_link_expires_minute": "Expires in {count} minute",
"shared_link_expires_minutes": "Expires in {count} minutes",
"shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Expires in {} second",
"shared_link_expires_seconds": "Expires in {} seconds",
"shared_link_expires_second": "Expires in {count} second",
"shared_link_expires_seconds": "Expires in {count} seconds",
"shared_link_individual_shared": "Individual shared",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_manage_links": "Manage Shared links",
@@ -1732,6 +1756,7 @@
"storage": "Storage space",
"storage_label": "Storage label",
"storage_usage": "{used} of {available} used",
"storage_quota": "Storage Quota",
"submit": "Submit",
"suggestions": "Suggestions",
"sunrise_on_the_beach": "Sunrise on the beach",
@@ -1757,7 +1782,7 @@
"theme_selection": "Theme selection",
"theme_selection_description": "Automatically set the theme to light or dark based on your browser's system preference",
"theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles",
"theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})",
"theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({count})",
"theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.",
"theme_setting_colorful_interface_title": "Colorful interface",
"theme_setting_image_viewer_quality_subtitle": "Adjust the quality of the detail image viewer",
@@ -1792,11 +1817,11 @@
"trash_no_results_message": "Trashed photos and videos will show up here.",
"trash_page_delete_all": "Delete All",
"trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich",
"trash_page_info": "Trashed items will be permanently deleted after {} days",
"trash_page_info": "Trashed items will be permanently deleted after {days} days",
"trash_page_no_assets": "No trashed assets",
"trash_page_restore_all": "Restore All",
"trash_page_select_assets_btn": "Select assets",
"trash_page_title": "Trash ({})",
"trash_page_title": "Trash ({count})",
"trashed_items_will_be_permanently_deleted_after": "Trashed items will be permanently deleted after {days, plural, one {# day} other {# days}}.",
"type": "Type",
"unarchive": "Unarchive",
@@ -1834,8 +1859,9 @@
"upload_status_errors": "Errors",
"upload_status_uploaded": "Uploaded",
"upload_success": "Upload success, refresh the page to see new upload assets.",
"upload_to_immich": "Upload to Immich ({})",
"upload_to_immich": "Upload to Immich ({count})",
"uploading": "Uploading",
"id": "ID",
"url": "URL",
"usage": "Usage",
"use_current_connection": "use current connection",
@@ -1843,6 +1869,8 @@
"user": "User",
"user_id": "User ID",
"user_liked": "{user} liked {type, select, photo {this photo} video {this video} asset {this asset} other {it}}",
"created_at": "Created",
"updated_at": "Updated",
"user_purchase_settings": "Purchase",
"user_purchase_settings_description": "Manage your purchase",
"user_role_set": "Set {user} as {role}",
@@ -1891,11 +1919,11 @@
"week": "Week",
"welcome": "Welcome",
"welcome_to_immich": "Welcome to Immich",
"wifi_name": "WiFi Name",
"wifi_name": "Wi-Fi Name",
"year": "Year",
"years_ago": "{years, plural, one {# year} other {# years}} ago",
"yes": "Yes",
"you_dont_have_any_shared_links": "You don't have any shared links",
"your_wifi_name": "Your WiFi name",
"your_wifi_name": "Your Wi-Fi name",
"zoom_image": "Zoom Image"
}

View File

@@ -192,20 +192,13 @@
"oauth_auto_register": "Registro automático",
"oauth_auto_register_description": "Registre automáticamente nuevos usuarios después de iniciar sesión con OAuth",
"oauth_button_text": "Texto del botón",
"oauth_client_id": "ID Cliente",
"oauth_client_secret": "Secreto Cliente",
"oauth_enable_description": "Iniciar sesión con OAuth",
"oauth_issuer_url": "URL del emisor",
"oauth_mobile_redirect_uri": "URI de redireccionamiento móvil",
"oauth_mobile_redirect_uri_override": "Sobreescribir URI de redirección móvil",
"oauth_mobile_redirect_uri_override_description": "Habilitar cuando el proveedor de OAuth no permite una URI móvil, como '{callback}'",
"oauth_profile_signing_algorithm": "Algoritmo de firma de perfiles",
"oauth_profile_signing_algorithm_description": "Algoritmo utilizado para firmar el perfil del usuario.",
"oauth_scope": "Ámbito",
"oauth_settings": "OAuth",
"oauth_settings_description": "Administrar la configuración de inicio de sesión de OAuth",
"oauth_settings_more_details": "Para más detalles acerca de esta característica, consulte la <link>documentación</link>.",
"oauth_signing_algorithm": "Algoritmo de firma",
"oauth_storage_label_claim": "Petición de etiqueta de almacenamiento",
"oauth_storage_label_claim_description": "Establece la etiqueta del almacenamiento del usuario automáticamente a este valor reclamado.",
"oauth_storage_quota_claim": "Reclamar quota de almacenamiento",
@@ -387,7 +380,7 @@
"advanced_settings_troubleshooting_title": "Solución de problemas",
"age_months": "Tiempo {months, plural, one {# mes} other {# meses}}",
"age_year_months": "1 año, {months, plural, one {# mes} other {# meses}}",
"age_years": "Antigüedad {years, plural, one {# año} other {# años}}",
"age_years": "Edad {years, plural, one {# año} other {# años}}",
"album_added": "Álbum añadido",
"album_added_notification_setting_description": "Reciba una notificación por correo electrónico cuando lo agreguen a un álbum compartido",
"album_cover_updated": "Portada del álbum actualizada",
@@ -481,7 +474,7 @@
"assets_added_to_album_count": "Añadido {count, plural, one {# asset} other {# assets}} al álbum",
"assets_added_to_name_count": "Añadido {count, plural, one {# asset} other {# assets}} a {hasName, select, true {<b>{name}</b>} other {new album}}",
"assets_count": "{count, plural, one {# activo} other {# activos}}",
"assets_deleted_permanently": "{} elementos(s) eliminado(s) permanentemente",
"assets_deleted_permanently": "{} elemento(s) eliminado(s) permanentemente",
"assets_deleted_permanently_from_server": "{} recurso(s) eliminado(s) de forma permanente del servidor de Immich",
"assets_moved_to_trash_count": "{count, plural, one {# elemento movido} other {# elementos movidos}} a la papelera",
"assets_permanently_deleted_count": "Eliminado permanentemente {count, plural, one {# elemento} other {# elementos}}",
@@ -531,7 +524,7 @@
"backup_controller_page_background_is_on": "La copia de seguridad en segundo plano automática está activada",
"backup_controller_page_background_turn_off": "Desactivar el servicio en segundo plano",
"backup_controller_page_background_turn_on": "Activar el servicio en segundo plano",
"backup_controller_page_background_wifi": "Solo en WiFi",
"backup_controller_page_background_wifi": "Solo en Wi-Fi",
"backup_controller_page_backup": "Copia de Seguridad",
"backup_controller_page_backup_selected": "Seleccionado: ",
"backup_controller_page_backup_sub": "Fotos y videos respaldados",
@@ -818,7 +811,7 @@
"enabled": "Habilitado",
"end_date": "Fecha final",
"enqueued": "Añadido a la cola",
"enter_wifi_name": "Enter WiFi name",
"enter_wifi_name": "Introduce el nombre Wi-Fi",
"error": "Error",
"error_change_sort_album": "No se pudo cambiar el orden de visualización del álbum",
"error_delete_face": "Error al eliminar la cara del archivo",
@@ -853,10 +846,12 @@
"failed_to_keep_this_delete_others": "No se pudo conservar este activo y eliminar los demás",
"failed_to_load_asset": "Error al cargar el elemento",
"failed_to_load_assets": "Error al cargar los elementos",
"failed_to_load_notifications": "Error al cargar las notificaciones",
"failed_to_load_people": "Error al cargar a los usuarios",
"failed_to_remove_product_key": "No se pudo eliminar la clave del producto",
"failed_to_stack_assets": "No se pudieron agrupar los archivos",
"failed_to_unstack_assets": "Error al desagrupar los archivos",
"failed_to_update_notification_status": "Error al actualizar el estado de la notificación",
"import_path_already_exists": "Esta ruta de importación ya existe.",
"incorrect_email_or_password": "Contraseña o email incorrecto",
"paths_validation_failed": "Falló la validación en {paths, plural, one {# carpeta} other {# carpetas}}",
@@ -1199,6 +1194,9 @@
"map_settings_only_show_favorites": "Mostrar solo favoritas",
"map_settings_theme_settings": "Apariencia del Mapa",
"map_zoom_to_see_photos": "Alejar para ver fotos",
"mark_all_as_read": "Marcar todos como leídos",
"mark_as_read": "Marcar como leído",
"marked_all_as_read": "Todos marcados como leídos",
"matches": "Coincidencias",
"media_type": "Tipo de medio",
"memories": "Recuerdos",
@@ -1257,6 +1255,7 @@
"no_favorites_message": "Agregue favoritos para encontrar rápidamente sus mejores fotos y videos",
"no_libraries_message": "Crea una biblioteca externa para ver tus fotos y vídeos",
"no_name": "Sin nombre",
"no_notifications": "Ninguna notificación",
"no_places": "Sin lugares",
"no_results": "Sin resultados",
"no_results_description": "Pruebe con un sinónimo o una palabra clave más general",
@@ -1845,7 +1844,7 @@
"user_liked": "{user} le gustó {type, select, photo {this photo} video {this video} asset {this asset} other {it}}",
"user_purchase_settings": "Compra",
"user_purchase_settings_description": "Gestiona tu compra",
"user_role_set": "Carbiar {user} a {role}",
"user_role_set": "Establecer {user} como {role}",
"user_usage_detail": "Detalle del uso del usuario",
"user_usage_stats": "Estadísticas de uso de la cuenta",
"user_usage_stats_description": "Ver estadísticas de uso de la cuenta",
@@ -1891,11 +1890,11 @@
"week": "Semana",
"welcome": "Bienvenido",
"welcome_to_immich": "Bienvenido a Immich",
"wifi_name": "WiFi Name",
"wifi_name": "Nombre Wi-Fi",
"year": "Año",
"years_ago": "Hace {years, plural, one {# año} other {# años}}",
"yes": "Sí",
"you_dont_have_any_shared_links": "No tienes ningún enlace compartido",
"your_wifi_name": "El nombre de tu WiFi",
"your_wifi_name": "El nombre de tu Wi-Fi",
"zoom_image": "Acercar Imagen"
}

View File

@@ -192,26 +192,22 @@
"oauth_auto_register": "Automaatne registreerimine",
"oauth_auto_register_description": "Registreeri uued kasutajad automaatselt OAuth abil sisselogimisel",
"oauth_button_text": "Nupu tekst",
"oauth_client_id": "Kliendi ID",
"oauth_client_secret": "Kliendi saladus",
"oauth_client_secret_description": "Nõutud, kui PKCE (Proof Key for Code Exchange) ei ole OAuth pakkuja poolt toetatud",
"oauth_enable_description": "Sisene OAuth abil",
"oauth_issuer_url": "Väljastaja URL",
"oauth_mobile_redirect_uri": "Mobiilne ümbersuunamise URI",
"oauth_mobile_redirect_uri_override": "Mobiilse ümbersuunamise URI ülekirjutamine",
"oauth_mobile_redirect_uri_override_description": "Lülita sisse, kui OAuth pakkuja ei luba mobiilset URI-d, näiteks '{callback}'",
"oauth_profile_signing_algorithm": "Profiili allkirjastamise algoritm",
"oauth_profile_signing_algorithm_description": "Algoritm, mida kasutatakse kasutajaprofiili allkirjastamiseks.",
"oauth_scope": "Skoop",
"oauth_settings": "OAuth",
"oauth_settings_description": "Halda OAuth sisselogimise seadeid",
"oauth_settings_more_details": "Selle funktsiooni kohta rohkem teada saamiseks loe <link>dokumentatsiooni</link>.",
"oauth_signing_algorithm": "Allkirjastamise algoritm",
"oauth_storage_label_claim": "Talletussildi väide",
"oauth_storage_label_claim_description": "Sea kasutaja talletussildiks automaatselt selle väite väärtus.",
"oauth_storage_quota_claim": "Talletuskvoodi väide",
"oauth_storage_quota_claim_description": "Sea kasutaja talletuskvoodiks automaatselt selle väite väärtus.",
"oauth_storage_quota_default": "Vaikimisi talletuskvoot (GiB)",
"oauth_storage_quota_default_description": "Kvoot (GiB), mida kasutada, kui ühtegi väidet pole esitatud (piiramatu kvoodi jaoks sisesta 0).",
"oauth_timeout": "Päringu ajalõpp",
"oauth_timeout_description": "Päringute ajalõpp millisekundites",
"offline_paths": "Ühenduseta failiteed",
"offline_paths_description": "Need tulemused võivad olla põhjustatud manuaalselt kustutatud failidest, mis ei ole osa välisest kogust.",
"password_enable_description": "Logi sisse e-posti aadressi ja parooliga",
@@ -371,9 +367,18 @@
"admin_password": "Administraatori parool",
"administration": "Administratsioon",
"advanced": "Täpsemad valikud",
"advanced_settings_enable_alternate_media_filter_subtitle": "Kasuta seda valikut, et filtreerida sünkroonimise ajal üksuseid alternatiivsete kriteeriumite alusel. Proovi seda ainult siis, kui rakendusel on probleeme kõigi albumite tuvastamisega.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTAALNE] Kasuta alternatiivset seadme albumi sünkroonimise filtrit",
"advanced_settings_log_level_title": "Logimistase: {}",
"advanced_settings_prefer_remote_subtitle": "Mõned seadmed laadivad seadmes olevate üksuste pisipilte piinavalt aeglaselt. Aktiveeri see seadistus, et laadida selle asemel kaugpilte.",
"advanced_settings_prefer_remote_title": "Eelista kaugpilte",
"advanced_settings_proxy_headers_subtitle": "Määra vaheserveri päised, mida Immich peaks iga päringuga saatma",
"advanced_settings_proxy_headers_title": "Vaheserveri päised",
"advanced_settings_self_signed_ssl_subtitle": "Jätab serveri lõpp-punkti SSL-sertifikaadi kontrolli vahele. Nõutud endasigneeritud sertifikaatide jaoks.",
"advanced_settings_self_signed_ssl_title": "Luba endasigneeritud SSL-sertifikaadid",
"advanced_settings_sync_remote_deletions_subtitle": "Kustuta või taasta üksus selles seadmes automaatself, kui sama tegevus toimub veebis",
"advanced_settings_sync_remote_deletions_title": "Sünkrooni kaugkustutamised [EKSPERIMENTAALNE]",
"advanced_settings_troubleshooting_subtitle": "Luba lisafunktsioonid tõrkeotsinguks",
"advanced_settings_troubleshooting_title": "Tõrkeotsing",
"age_months": "Vanus {months, plural, one {# kuu} other {# kuud}}",
"age_year_months": "Vanus 1 aasta, {months, plural, one {# kuu} other {# kuud}}",
@@ -407,6 +412,7 @@
"album_viewer_appbar_share_err_remove": "Üksuste albumist eemaldamisel tekkis probleeme",
"album_viewer_appbar_share_err_title": "Albumi pealkirja muutmine ebaõnnestus",
"album_viewer_appbar_share_leave": "Lahku albumist",
"album_viewer_appbar_share_to": "Jaga",
"album_viewer_page_share_add_users": "Lisa kasutajaid",
"album_with_link_access": "Luba kõigil, kellel on link, näha selle albumi fotosid ja isikuid.",
"albums": "Albumid",
@@ -433,6 +439,7 @@
"archive": "Arhiiv",
"archive_or_unarchive_photo": "Arhiveeri või taasta foto",
"archive_page_no_archived_assets": "Arhiveeritud üksuseid ei leitud",
"archive_page_title": "Arhiveeri ({})",
"archive_size": "Arhiivi suurus",
"archive_size_description": "Seadista arhiivi suurus allalaadimiseks (GiB)",
"archived": "Arhiveeritud",
@@ -452,6 +459,8 @@
"asset_list_layout_settings_group_by": "Grupeeri üksused",
"asset_list_layout_settings_group_by_month_day": "Kuu + päev",
"asset_list_layout_sub_title": "Asetus",
"asset_list_settings_subtitle": "Fotoruudustiku paigutuse sätted",
"asset_list_settings_title": "Fotoruudustik",
"asset_offline": "Üksus pole kättesaadav",
"asset_offline_description": "Seda välise kogu üksust ei leitud kettalt. Abi saamiseks palun võta ühendust oma Immich'i administraatoriga.",
"asset_restored_successfully": "Üksus edukalt taastatud",
@@ -459,20 +468,29 @@
"asset_skipped_in_trash": "Prügikastis",
"asset_uploaded": "Üleslaaditud",
"asset_uploading": "Üleslaadimine…",
"asset_viewer_settings_subtitle": "Halda galeriivaaturi seadeid",
"asset_viewer_settings_title": "Üksuste vaatur",
"assets": "Üksused",
"assets_added_count": "{count, plural, one {# üksus} other {# üksust}} lisatud",
"assets_added_to_album_count": "{count, plural, one {# üksus} other {# üksust}} albumisse lisatud",
"assets_added_to_name_count": "{count, plural, one {# üksus} other {# üksust}} lisatud {hasName, select, true {albumisse <b>{name}</b>} other {uude albumisse}}",
"assets_count": "{count, plural, one {# üksus} other {# üksust}}",
"assets_deleted_permanently": "{} üksus(t) jäädavalt kustutatud",
"assets_deleted_permanently_from_server": "{} üksus(t) Immich'i serverist jäädavalt kustutatud",
"assets_moved_to_trash_count": "{count, plural, one {# üksus} other {# üksust}} liigutatud prügikasti",
"assets_permanently_deleted_count": "{count, plural, one {# üksus} other {# üksust}} jäädavalt kustutatud",
"assets_removed_count": "{count, plural, one {# üksus} other {# üksust}} eemaldatud",
"assets_removed_permanently_from_device": "{} üksus(t) seadmest jäädavalt eemaldatud",
"assets_restore_confirmation": "Kas oled kindel, et soovid oma prügikasti liigutatud üksused taastada? Seda ei saa tagasi võtta! Pane tähele, et sel meetodil ei saa taastada ühenduseta üksuseid.",
"assets_restored_count": "{count, plural, one {# üksus} other {# üksust}} taastatud",
"assets_restored_successfully": "{} üksus(t) edukalt taastatud",
"assets_trashed": "{} üksus(t) liigutatud prügikasti",
"assets_trashed_count": "{count, plural, one {# üksus} other {# üksust}} liigutatud prügikasti",
"assets_trashed_from_server": "{} üksus(t) liigutatud Immich'i serveris prügikasti",
"assets_were_part_of_album_count": "{count, plural, one {Üksus oli} other {Üksused olid}} juba osa albumist",
"authorized_devices": "Autoriseeritud seadmed",
"automatic_endpoint_switching_subtitle": "Ühendu lokaalselt üle valitud WiFi-võrgu, kui see on saadaval, ja kasuta mujal alternatiivseid ühendusi",
"automatic_endpoint_switching_title": "Automaatne URL-i ümberlülitamine",
"back": "Tagasi",
"back_close_deselect": "Tagasi, sulge või tühista valik",
"backup_album_selection_page_select_albums": "Vali albumid",
@@ -481,7 +499,16 @@
"backup_all": "Kõik",
"backup_background_service_default_notification": "Uute üksuste kontrollimine…",
"backup_background_service_error_title": "Varundamise viga",
"backup_controller_page_background_app_refresh_disabled_content": "Taustal varundamise kasutamiseks luba rakenduse taustal värskendamine: Seaded > Üldine > Rakenduse taustal värskendamine.",
"backup_controller_page_background_app_refresh_disabled_title": "Rakenduse taustal värskendamine keelatud",
"backup_controller_page_background_battery_info_link": "Näita mulle, kuidas",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_configure_error": "Taustateenuse seadistamine ebaõnnestus",
"backup_controller_page_background_description": "Lülita taustateenus sisse, et uusi üksuseid automaatselt varundada, ilma et peaks rakendust avama",
"backup_controller_page_background_is_off": "Automaatne varundamine on välja lülitatud",
"backup_controller_page_background_is_on": "Automaatne varundamine on sisse lülitatud",
"backup_controller_page_background_turn_off": "Lülita taustateenus välja",
"backup_controller_page_background_turn_on": "Lülita taustateenus sisse",
"backup_controller_page_background_wifi": "Ainult WiFi-võrgus",
"backup_controller_page_backup_sub": "Varundatud fotod ja videod",
"backup_controller_page_desc_backup": "Lülita sisse esiplaanil varundamine, et rakenduse avamisel uued üksused automaatselt serverisse üles laadida.",
@@ -504,7 +531,12 @@
"bulk_trash_duplicates_confirmation": "Kas oled kindel, et soovid {count, plural, one {# dubleeritud üksuse} other {# dubleeritud üksust}} masskustutada? Sellega jäetakse alles iga grupi suurim üksus ning duplikaadid liigutatakse prügikasti.",
"buy": "Osta Immich",
"cache_settings_clear_cache_button": "Tühjenda puhver",
"cache_settings_statistics_album": "Kogu pisipildid",
"cache_settings_statistics_full": "Täismõõdus pildid",
"cache_settings_statistics_shared": "Jagatud albumite pisipildid",
"cache_settings_statistics_thumbnail": "Pisipildid",
"cache_settings_statistics_title": "Puhvri kasutus",
"cache_settings_thumbnail_size": "Pisipiltide puhvri suurus ({} üksust)",
"camera": "Kaamera",
"camera_brand": "Kaamera mark",
"camera_model": "Kaamera mudel",
@@ -733,10 +765,12 @@
"failed_to_keep_this_delete_others": "Selle üksuse säilitamine ja ülejäänute kustutamine ebaõnnestus",
"failed_to_load_asset": "Üksuse laadimine ebaõnnestus",
"failed_to_load_assets": "Üksuste laadimine ebaõnnestus",
"failed_to_load_notifications": "Teavituste laadimine ebaõnnestus",
"failed_to_load_people": "Isikute laadimine ebaõnnestus",
"failed_to_remove_product_key": "Tootevõtme eemaldamine ebaõnnestus",
"failed_to_stack_assets": "Üksuste virnastamine ebaõnnestus",
"failed_to_unstack_assets": "Üksuste eraldamine ebaõnnestus",
"failed_to_update_notification_status": "Teavituste seisundi uuendamine ebaõnnestus",
"import_path_already_exists": "See imporditee on juba olemas.",
"incorrect_email_or_password": "Vale e-posti aadress või parool",
"paths_validation_failed": "{paths, plural, one {# tee} other {# teed}} ei valideerunud",
@@ -883,11 +917,15 @@
"group_owner": "Grupeeri omaniku kaupa",
"group_places_by": "Grupeeri kohad...",
"group_year": "Grupeeri aasta kaupa",
"haptic_feedback_switch": "Luba haptiline tagasiside",
"haptic_feedback_title": "Haptiline tagasiside",
"has_quota": "On kvoot",
"header_settings_add_header_tip": "Lisa päis",
"header_settings_field_validator_msg": "Väärtus ei saa olla tühi",
"header_settings_header_name_input": "Päise nimi",
"header_settings_header_value_input": "Päise väärtus",
"headers_settings_tile_subtitle": "Määra vaheserveri päised, mida rakendus peaks iga päringuga saatma",
"headers_settings_tile_title": "Kohandatud vaheserveri päised",
"hi_user": "Tere {name} ({email})",
"hide_all_people": "Peida kõik isikud",
"hide_gallery": "Peida galerii",
@@ -989,7 +1027,12 @@
"login_form_err_http": "Palun täpsusta http:// või https://",
"login_form_err_invalid_email": "Vigane e-posti aadress",
"login_form_err_invalid_url": "Vigane URL",
"login_form_err_leading_whitespace": "Eelnevad tühikud",
"login_form_err_trailing_whitespace": "Järgnevad tühikud",
"login_form_password_hint": "parool",
"login_form_save_login": "Jää sisselogituks",
"login_form_server_empty": "Sisesta serveri URL.",
"login_form_server_error": "Serveriga ühendumine ebaõnnestus.",
"login_has_been_disabled": "Sisselogimine on keelatud.",
"login_password_changed_success": "Parool edukalt uuendatud",
"logout_all_device_confirmation": "Kas oled kindel, et soovid kõigist seadmetest välja logida?",
@@ -1009,17 +1052,27 @@
"manage_your_devices": "Halda oma autenditud seadmeid",
"manage_your_oauth_connection": "Halda oma OAuth ühendust",
"map": "Kaart",
"map_assets_in_bound": "{} foto",
"map_assets_in_bounds": "{} fotot",
"map_location_dialog_yes": "Jah",
"map_location_picker_page_use_location": "Kasuta seda asukohta",
"map_marker_for_images": "Kaardimarker kohas {city}, {country} tehtud piltide jaoks",
"map_marker_with_image": "Kaardimarker pildiga",
"map_settings": "Kaardi seaded",
"map_settings_date_range_option_day": "Viimased 24 tundi",
"map_settings_date_range_option_days": "Viimased {} päeva",
"map_settings_date_range_option_year": "Viimane aasta",
"map_settings_date_range_option_years": "Viimased {} aastat",
"map_settings_dialog_title": "Kaardi seaded",
"mark_all_as_read": "Märgi kõik loetuks",
"mark_as_read": "Märgi loetuks",
"marked_all_as_read": "Kõik märgiti loetuks",
"matches": "Ühtivad failid",
"media_type": "Meediumi tüüp",
"memories": "Mälestused",
"memories_setting_description": "Halda, mida sa oma mälestustes näed",
"memories_year_ago": "Aasta tagasi",
"memories_years_ago": "{} aastat tagasi",
"memory": "Mälestus",
"memory_lane_title": "Mälestus {title}",
"menu": "Menüü",
@@ -1034,7 +1087,10 @@
"missing": "Puuduvad",
"model": "Mudel",
"month": "Kuu",
"monthly_title_text_date_format": "MMMM y",
"more": "Rohkem",
"moved_to_archive": "{count, plural, one {# üksus} other {# üksust}} liigutatud arhiivi",
"moved_to_library": "{count, plural, one {# üksus} other {# üksust}} liigutatud kogusse",
"moved_to_trash": "Liigutatud prügikasti",
"multiselect_grid_edit_date_time_err_read_only": "Kirjutuskaitsega üksus(t)e kuupäeva ei saa muuta, jätan vahele",
"multiselect_grid_edit_gps_err_read_only": "Kirjutuskaitsega üksus(t)e asukohta ei saa muuta, jätan vahele",
@@ -1066,6 +1122,7 @@
"no_favorites_message": "Lisa lemmikud, et oma parimaid fotosid ja videosid kiiresti leida",
"no_libraries_message": "Lisa väline kogu oma fotode ja videote vaatamiseks",
"no_name": "Nimetu",
"no_notifications": "Teavitusi pole",
"no_places": "Kohti ei ole",
"no_results": "Vasteid pole",
"no_results_description": "Proovi sünonüümi või üldisemat märksõna",
@@ -1073,6 +1130,9 @@
"not_in_any_album": "Pole üheski albumis",
"note_apply_storage_label_to_previously_uploaded assets": "Märkus: Et rakendada talletussilt varem üleslaaditud üksustele, käivita",
"notes": "Märkused",
"notification_permission_list_tile_content": "Anna luba teavituste saatmiseks.",
"notification_permission_list_tile_enable_button": "Luba teavitused",
"notification_permission_list_tile_title": "Teavituste luba",
"notification_toggle_setting_description": "Luba e-posti teel teavitused",
"notifications": "Teavitused",
"notifications_setting_description": "Halda teavitusi",
@@ -1083,6 +1143,7 @@
"offline_paths_description": "Need tulemused võivad olla põhjustatud manuaalselt kustutatud failidest, mis ei ole osa välisest kogust.",
"ok": "Ok",
"oldest_first": "Vanemad eespool",
"on_this_device": "Sellel seadmel",
"onboarding": "Kasutuselevõtt",
"onboarding_privacy_description": "Järgnevad (valikulised) funktsioonid sõltuvad välistest teenustest ning neid saab igal ajal administraatori seadetes välja lülitada.",
"onboarding_theme_description": "Vali oma serverile värviteema. Saad seda hiljem seadetes muuta.",
@@ -1090,6 +1151,7 @@
"onboarding_welcome_user": "Tere tulemast, {user}",
"online": "Ühendatud",
"only_favorites": "Ainult lemmikud",
"open": "Ava",
"open_in_map_view": "Ava kaardi vaates",
"open_in_openstreetmap": "Ava OpenStreetMap",
"open_the_search_filters": "Ava otsingufiltrid",
@@ -1106,6 +1168,7 @@
"partner_can_access": "{partner} pääseb ligi",
"partner_can_access_assets": "Kõik su fotod ja videod, välja arvatud arhiveeritud ja kustutatud",
"partner_can_access_location": "Asukohad, kus su fotod tehti",
"partner_list_user_photos": "Kasutaja {user} fotod",
"partner_list_view_all": "Vaata kõiki",
"partner_page_partner_add_failed": "Partneri lisamine ebaõnnestus",
"partner_page_select_partner": "Vali partner",
@@ -1138,6 +1201,7 @@
"permanently_deleted_asset": "Üksus jäädavalt kustutatud",
"permanently_deleted_assets_count": "{count, plural, one {# üksus} other {# üksust}} jäädavalt kustutatud",
"permission_onboarding_back": "Tagasi",
"permission_onboarding_continue_anyway": "Jätka sellegipoolest",
"person": "Isik",
"person_birthdate": "Sündinud {date}",
"person_hidden": "{name}{hidden, select, true { (peidetud)} other {}}",
@@ -1155,6 +1219,7 @@
"play_motion_photo": "Esita liikuv foto",
"play_or_pause_video": "Esita või peata video",
"port": "Port",
"preferences_settings_subtitle": "Halda rakenduse eelistusi",
"preferences_settings_title": "Eelistused",
"preset": "Eelseadistus",
"preview": "Eelvaade",
@@ -1292,6 +1357,7 @@
"search_camera_model": "Otsi kaamera mudelit...",
"search_city": "Otsi linna...",
"search_country": "Otsi riiki...",
"search_filter_apply": "Rakenda filter",
"search_filter_camera_title": "Vali kaamera tüüp",
"search_filter_date": "Kuupäev",
"search_filter_date_interval": "{start} kuni {end}",
@@ -1338,6 +1404,7 @@
"select_keep_all": "Vali jäta kõik alles",
"select_library_owner": "Vali kogu omanik",
"select_new_face": "Vali uus nägu",
"select_person_to_tag": "Vali sildistamiseks isik",
"select_photos": "Vali fotod",
"select_trash_all": "Vali kõik prügikasti",
"select_user_for_sharing_page_err_album": "Albumi lisamine ebaõnnestus",
@@ -1359,13 +1426,26 @@
"set_date_of_birth": "Määra sünnikuupäev",
"set_profile_picture": "Sea profiilipilt",
"set_slideshow_to_fullscreen": "Kuva slaidiesitlus täisekraanil",
"setting_image_viewer_help": "Detailivaatur laadib kõigepealt väikese pisipildi, seejärel keskmises mõõdus eelvaate (kui lubatud) ja lõpuks originaalpildi (kui lubatud).",
"setting_image_viewer_preview_subtitle": "Luba keskmise resolutsiooniga pildi laadimine. Keela, et laadida kohe originaalpilt või kasutada ainult pisipilti.",
"setting_image_viewer_preview_title": "Laadi pildi eelvaade",
"setting_image_viewer_title": "Pildid",
"setting_languages_apply": "Rakenda",
"setting_languages_subtitle": "Muuda rakenduse keelt",
"setting_languages_title": "Keeled",
"setting_notifications_notify_hours": "{} tundi",
"setting_notifications_notify_immediately": "kohe",
"setting_notifications_notify_minutes": "{} minutit",
"setting_notifications_notify_never": "mitte kunagi",
"setting_notifications_notify_seconds": "{} sekundit",
"setting_notifications_single_progress_title": "Kuva taustal varundamise detailset edenemist",
"setting_notifications_subtitle": "Halda oma teavituste eelistusi",
"setting_notifications_total_progress_title": "Kuva taustal varundamise üldist edenemist",
"settings": "Seaded",
"settings_saved": "Seaded salvestatud",
"share": "Jaga",
"share_add_photos": "Lisa fotosid",
"share_assets_selected": "{} valitud",
"shared": "Jagatud",
"shared_album_section_people_action_error": "Viga albumist eemaldamisel/lahkumisel",
"shared_album_section_people_action_leave": "Eemalda kasutaja albumist",
@@ -1377,10 +1457,25 @@
"shared_from_partner": "Fotod partnerilt {partner}",
"shared_link_app_bar_title": "Jagatud lingid",
"shared_link_clipboard_copied_massage": "Kopeeritud lõikelauale",
"shared_link_clipboard_text": "Link: {}\nParool: {}",
"shared_link_create_error": "Viga jagatud lingi loomisel",
"shared_link_edit_expire_after_option_day": "1 päev",
"shared_link_edit_expire_after_option_days": "{} päeva",
"shared_link_edit_expire_after_option_hour": "1 tund",
"shared_link_edit_expire_after_option_hours": "{} tundi",
"shared_link_edit_expire_after_option_minute": "1 minut",
"shared_link_edit_expire_after_option_minutes": "{} minutit",
"shared_link_edit_expire_after_option_months": "{} kuud",
"shared_link_edit_expire_after_option_year": "{} aasta",
"shared_link_expires_day": "Aegub {} päeva pärast",
"shared_link_expires_days": "Aegub {} päeva pärast",
"shared_link_expires_hour": "Aegub {} tunni pärast",
"shared_link_expires_hours": "Aegub {} tunni pärast",
"shared_link_expires_minute": "Aegub {} minuti pärast",
"shared_link_expires_minutes": "Aegub {} minuti pärast",
"shared_link_expires_never": "Ei aegu",
"shared_link_expires_second": "Aegub {} sekundi pärast",
"shared_link_expires_seconds": "Aegub {} sekundi pärast",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_manage_links": "Halda jagatud linke",
"shared_link_options": "Jagatud lingi valikud",
@@ -1475,6 +1570,10 @@
"theme": "Teema",
"theme_selection": "Teema valik",
"theme_selection_description": "Sea automaatselt hele või tume teema vastavalt veebilehitseja eelistustele",
"theme_setting_colorful_interface_subtitle": "Rakenda taustapindadele primaarne värv.",
"theme_setting_colorful_interface_title": "Värviline kasutajaliides",
"theme_setting_image_viewer_quality_subtitle": "Kohanda detailvaaturi kvaliteeti",
"theme_setting_image_viewer_quality_title": "Pildivaaturi kvaliteet",
"theme_setting_primary_color_title": "Põhivärv",
"theme_setting_system_primary_color_title": "Kasuta süsteemset värvi",
"theme_setting_system_theme_switch": "Automaatne (järgi süsteemi seadet)",
@@ -1497,6 +1596,7 @@
"trash_all": "Kõik prügikasti",
"trash_count": "Liiguta {count, number} prügikasti",
"trash_delete_asset": "Kustuta üksus",
"trash_emptied": "Prügikast tühjendatud",
"trash_no_results_message": "Siia ilmuvad prügikasti liigutatud fotod ja videod.",
"trash_page_delete_all": "Kustuta kõik",
"trash_page_restore_all": "Taasta kõik",
@@ -1557,6 +1657,7 @@
"version": "Versioon",
"version_announcement_closing": "Sinu sõber, Alex",
"version_announcement_message": "Hei! Saadaval on uus Immich'i versioon. Palun võta aega, et lugeda <link>väljalasketeadet</link> ning veendu, et su seadistus on ajakohane, et vältida konfiguratsiooniprobleeme, eriti kui kasutad WatchTower'it või muud mehhanismi, mis Immich'it automaatselt uuendab.",
"version_announcement_overlay_title": "Uus serveri versioon saadaval 🎉",
"version_history": "Versiooniajalugu",
"version_history_item": "Versioon {version} paigaldatud {date}",
"video": "Video",

View File

@@ -153,20 +153,13 @@
"oauth_auto_register": "ثبت خودکار",
"oauth_auto_register_description": "کاربران جدید را پس از ورود با OAuth به طور خودکار ثبت نام کن",
"oauth_button_text": "متن دکمه",
"oauth_client_id": "شناسه کاربر",
"oauth_client_secret": "شناسه محرمانه کاربر",
"oauth_enable_description": "ورود توسط OAuth",
"oauth_issuer_url": "نشانی وب صادر کننده",
"oauth_mobile_redirect_uri": "تغییر مسیر URI موبایل",
"oauth_mobile_redirect_uri_override": "تغییر مسیر URI تلفن همراه",
"oauth_mobile_redirect_uri_override_description": "زمانی که 'app.immich:/' یک URI پرش نامعتبر است، فعال کنید.",
"oauth_profile_signing_algorithm": "الگوریتم امضای پروفایل",
"oauth_profile_signing_algorithm_description": "الگوریتم مورد استفاده برای امضای پروفایل کاربر.",
"oauth_scope": "محدوده",
"oauth_settings": "OAuth",
"oauth_settings_description": "مدیریت تنظیمات ورود به سیستم OAuth",
"oauth_settings_more_details": "برای جزئیات بیشتر در مورد این ویژگی، به <link>مستندات</link> مراجعه کنید.",
"oauth_signing_algorithm": "الگوریتم امضا",
"oauth_storage_label_claim": "درخواست برچسب فضای ذخیره سازی",
"oauth_storage_label_claim_description": "تنظیم خودکار برچسب فضای ذخیره‌سازی کاربر به مقدار درخواست شده.",
"oauth_storage_quota_claim": "درخواست سهمیه فضای ذخیره سازی",

File diff suppressed because it is too large Load Diff

View File

@@ -39,11 +39,11 @@
"authentication_settings_disable_all": "Êtes-vous sûr de vouloir désactiver toutes les méthodes de connexion? La connexion sera complètement désactivée.",
"authentication_settings_reenable": "Pour réactiver, utilisez une <link>Commande Serveur</link>.",
"background_task_job": "Tâches de fond",
"backup_database": "Sauvegarde de la base de données",
"backup_database_enable_description": "Activer la sauvegarde",
"backup_keep_last_amount": "Nombre de sauvegardes à conserver",
"backup_settings": "Paramètres de la sauvegarde",
"backup_settings_description": "Gérer les paramètres de la sauvegarde",
"backup_database": "Création d'une image de la base de données",
"backup_database_enable_description": "Activer la création d'images de la base de données",
"backup_keep_last_amount": "Nombre d'images à conserver",
"backup_settings": "Paramètres de création d'images de la base de données",
"backup_settings_description": "Gérer les paramètres de création d'images de la base de données. Note : ces tâches ne sont pas contrôlées et vous ne serez pas averti(e) en cas d'échec.",
"check_all": "Tout cocher",
"cleanup": "Nettoyage",
"cleared_jobs": "Tâches supprimées pour : {job}",
@@ -63,7 +63,7 @@
"external_library_created_at": "Bibliothèque externe (créée le {date})",
"external_library_management": "Gestion de la bibliothèque externe",
"face_detection": "Détection des visages",
"face_detection_description": "Détection des visages dans les médias à l'aide de l'apprentissage automatique. Pour les vidéos, seule la miniature est prise en compte. « Actualiser » (re)traite tous les médias. « Réinitialiser » retraite tous les médias en repartant de zéro. « Manquant » met en file d'attente les médias qui n'ont pas encore été pris en compte. Lorsque la détection est terminée, tous les visages détectés sont ensuite mis en file d'attente pour la reconnaissance faciale.",
"face_detection_description": "Détection des visages dans les médias à l'aide de l'apprentissage automatique. Pour les vidéos, seule la miniature est prise en compte. « Actualiser » (re)traite tous les médias. « Réinitialiser » retraite tous les visages en repartant de zéro. « Manquant » met en file d'attente les médias qui n'ont pas encore été pris en compte. Lorsque la détection est terminée, tous les visages détectés sont ensuite mis en file d'attente pour la reconnaissance faciale.",
"facial_recognition_job_description": "Regrouper les visages détectés en personnes. Cette étape est exécutée une fois la détection des visages terminée. « Réinitialiser » (re)regroupe tous les visages. « Manquant » met en file d'attente les visages auxquels aucune personne n'a été attribuée.",
"failed_job_command": "La commande {command} a échoué pour la tâche: {job}",
"force_delete_user_warning": "ATTENTION: Cette opération entraîne la suppression immédiate de l'utilisateur et de tous ses médias. Cette opération ne peut être annulée et les fichiers ne peuvent être récupérés.",
@@ -169,7 +169,7 @@
"migration_job_description": "Migration des miniatures pour les médias et les visages vers la dernière structure de dossiers",
"no_paths_added": "Aucun chemin n'a été ajouté",
"no_pattern_added": "Aucun schéma d'exclusion n'a été ajouté",
"note_apply_storage_label_previous_assets": "Remarque: pour appliquer l'étiquette de stockage à des médias précédemment envoyés, exécutez la commande",
"note_apply_storage_label_previous_assets": "Remarque : pour appliquer l'étiquette de stockage à des médias précédemment téléversés, exécutez",
"note_cannot_be_changed_later": "REMARQUE: Il n'est pas possible de modifier ce paramètre ultérieurement!",
"notification_email_from_address": "Depuis l'adresse",
"notification_email_from_address_description": "Adresse courriel de l'expéditeur, par exemple: « Serveur de photos Immich <nepasrepondre@exemple.org> »",
@@ -192,26 +192,22 @@
"oauth_auto_register": "Inscription automatique",
"oauth_auto_register_description": "Inscrire automatiquement de nouveaux utilisateurs après leur connexion avec OAuth",
"oauth_button_text": "Texte du bouton",
"oauth_client_id": "ID du client",
"oauth_client_secret": "Secret du client",
"oauth_client_secret_description": "Nécessaire si le protocole PKCE (Proof Key for Code Exchange) n'est pas supporté mar le fournisseur d'authentification OAuth",
"oauth_enable_description": "Connexion avec OAuth",
"oauth_issuer_url": "URL de l'émetteur",
"oauth_mobile_redirect_uri": "URI de redirection mobile",
"oauth_mobile_redirect_uri_override": "Remplacer l'URI de redirection mobile",
"oauth_mobile_redirect_uri_override_description": "Activer quand le fournisseur d'OAuth ne permet pas un URI mobile, comme '{callback} '",
"oauth_profile_signing_algorithm": "Algorithme de signature de profil",
"oauth_profile_signing_algorithm_description": "Algorithme utilisé pour signer le profil utilisateur.",
"oauth_scope": "Périmètre",
"oauth_settings": "OAuth",
"oauth_settings_description": "Gérer les paramètres de connexion OAuth",
"oauth_settings_more_details": "Pour plus de détails sur cette fonctionnalité, consultez <link>ce lien</link>.",
"oauth_signing_algorithm": "Algorithme de signature",
"oauth_storage_label_claim": "Demande d'étiquette de stockage",
"oauth_storage_label_claim_description": "Définir automatiquement l'étiquette de stockage de l'utilisateur sur la valeur de cette revendication.",
"oauth_storage_quota_claim": "Demande de quota de stockage",
"oauth_storage_quota_claim_description": "Définir automatiquement le quota de stockage de l'utilisateur par la valeur de cette demande.",
"oauth_storage_quota_default": "Quota de stockage par défaut (Go)",
"oauth_storage_quota_default_description": "Quota en Go à utiliser lorsqu'aucune valeur n'est précisée (saisir 0 pour un quota illimité).",
"oauth_timeout": "Expiration de la durée de la requête",
"oauth_timeout_description": "Délai d'expiration des requêtes en millisecondes",
"offline_paths": "Chemins d'accès hors ligne",
"offline_paths_description": "Ces résultats peuvent être dus à la suppression manuelle de fichiers qui ne font pas partie d'une bibliothèque externe.",
"password_enable_description": "Connexion avec courriel et mot de passe",
@@ -250,14 +246,14 @@
"storage_template_hash_verification_enabled": "Vérification du hachage activée",
"storage_template_hash_verification_enabled_description": "Active la vérification du hachage, ne désactivez pas cette option à moins d'être sûr de ce que vous faites",
"storage_template_migration": "Migration du modèle de stockage",
"storage_template_migration_description": "Appliquer le modèle courant <link>{template}</link> aux médias précédemment envoyés",
"storage_template_migration_info": "L'enregistrement des modèles convertit toutes les extensions en minuscule. Les changements de modèle ne s'appliqueront qu'aux nouveaux médias. Pour appliquer rétroactivement le modèle aux médias précédemment envoyés, exécutez la tâche <link>{job}</link>.",
"storage_template_migration_description": "Appliquer le modèle courant <link>{template}</link> aux médias précédemment téléversés",
"storage_template_migration_info": "L'enregistrement des modèles va convertir toutes les extensions en minuscule. Les changements de modèle ne s'appliqueront qu'aux nouveaux médias. Pour appliquer rétroactivement le modèle aux médias précédemment téléversés, exécutez la tâche <link>{job}</link>.",
"storage_template_migration_job": "Tâche de migration du modèle de stockage",
"storage_template_more_details": "Pour plus de détails sur cette fonctionnalité, reportez-vous au <template-link>Modèle de stockage</template-link> et à ses <implications-link>implications</implications-link>",
"storage_template_onboarding_description": "Lorsqu'elle est activée, cette fonctionnalité réorganise les fichiers basés sur un modèle défini par l'utilisateur. En raison de problèmes de stabilité, la fonction a été désactivée par défaut. Pour plus d'informations, veuillez consulter la <link>documentation</link>.",
"storage_template_path_length": "Limite approximative de la longueur du chemin: <b>{length, number}</b>/{limit, number}",
"storage_template_settings": "Modèle de stockage",
"storage_template_settings_description": "Gérer la structure des dossiers et le nom des fichiers du média envoyé",
"storage_template_settings_description": "Gérer la structure des dossiers et le nom des fichiers du média téléversé",
"storage_template_user_label": "<code>{label}</code> est l'étiquette de stockage de l'utilisateur",
"system_settings": "Paramètres du système",
"tag_cleanup_job": "Nettoyage des étiquettes",
@@ -345,7 +341,7 @@
"trash_settings": "Corbeille",
"trash_settings_description": "Gérer les paramètres de la corbeille",
"untracked_files": "Fichiers non suivis",
"untracked_files_description": "Ces fichiers ne sont pas suivis par l'application. Ils peuvent être le résultat d'échecs de déplacement, d'envois interrompus, ou d'abandons en raison d'un bug",
"untracked_files_description": "Ces fichiers ne sont pas suivis par l'application. Ils peuvent être le résultat d'échecs de déplacement, de téléversements interrompus, ou d'abandons en raison d'un bug",
"user_cleanup_job": "Nettoyage des utilisateurs",
"user_delete_delay": "La suppression définitive du compte et des médias de <b>{user}</b> sera programmée dans {delay, plural, one {# jour} other {# jours}}.",
"user_delete_delay_settings": "Délai de suppression",
@@ -372,7 +368,7 @@
"administration": "Administration",
"advanced": "Avancé",
"advanced_settings_enable_alternate_media_filter_subtitle": "Utilisez cette option pour filtrer les média durant la synchronisation avec des critères alternatifs. N'utilisez cela que lorsque l'application n'arrive pas à détecter tout les albums.",
"advanced_settings_enable_alternate_media_filter_title": "[EXEPRIMENTAL] Utiliser le filtre de synchronisation d'album alternatif",
"advanced_settings_enable_alternate_media_filter_title": "[EXPÉRIMENTAL] Utiliser le filtre de synchronisation d'album alternatif",
"advanced_settings_log_level_title": "Niveau de journalisation : {}",
"advanced_settings_prefer_remote_subtitle": "Certains appareils sont très lents à charger des miniatures à partir de ressources présentes sur l'appareil. Activez ce paramètre pour charger des images externes à la place.",
"advanced_settings_prefer_remote_title": "Préférer les images externes",
@@ -381,7 +377,7 @@
"advanced_settings_self_signed_ssl_subtitle": "Permet d'ignorer la vérification du certificat SSL pour le point d'accès du serveur. Requis pour les certificats auto-signés.",
"advanced_settings_self_signed_ssl_title": "Autoriser les certificats SSL auto-signés",
"advanced_settings_sync_remote_deletions_subtitle": "Supprimer ou restaurer automatiquement un média sur cet appareil lorsqu'une action a été faite sur le web",
"advanced_settings_sync_remote_deletions_title": "Synchroniser les suppressions depuis le serveur [EXPERIMENTAL]",
"advanced_settings_sync_remote_deletions_title": "Synchroniser les suppressions depuis le serveur [EXPÉRIMENTAL]",
"advanced_settings_tile_subtitle": "Paramètres d'utilisateur avancés",
"advanced_settings_troubleshooting_subtitle": "Activer des fonctions supplémentaires pour le dépannage",
"advanced_settings_troubleshooting_title": "Dépannage",
@@ -429,14 +425,14 @@
"allow_dark_mode": "Autoriser le mode sombre",
"allow_edits": "Autoriser les modifications",
"allow_public_user_to_download": "Permettre aux utilisateurs non connectés de télécharger",
"allow_public_user_to_upload": "Permettre l'envoi aux utilisateurs non connectés",
"allow_public_user_to_upload": "Permettre le téléversement aux utilisateurs non connectés",
"alt_text_qr_code": "Image du code QR",
"anti_clockwise": "Sens anti-horaire",
"api_key": "Clé API",
"api_key_description": "Cette valeur ne sera affichée qu'une seule fois. Assurez-vous de la copier avant de fermer la fenêtre.",
"api_key_empty": "Le nom de votre clé API ne doit pas être vide",
"api_keys": "Clés d'API",
"app_bar_signout_dialog_content": "Êtes-vous sûr de vouloir vous déconnecter?",
"app_bar_signout_dialog_content": "Êtes-vous sûr(e) de vouloir vous déconnecter?",
"app_bar_signout_dialog_ok": "Oui",
"app_bar_signout_dialog_title": "Se déconnecter",
"app_settings": "Paramètres de l'application",
@@ -451,8 +447,8 @@
"archived_count": "{count, plural, one {# archivé} other {# archivés}}",
"are_these_the_same_person": "Est-ce la même personne?",
"are_you_sure_to_do_this": "Êtes-vous sûr de vouloir faire ceci?",
"asset_action_delete_err_read_only": "Impossible de supprimer le(s) élément(s) en lecture seule.",
"asset_action_share_err_offline": "Impossible de récupérer le(s) élément(s) hors ligne.",
"asset_action_delete_err_read_only": "Impossible de supprimer le(s) média(s) en lecture seule, ils sont ignorés",
"asset_action_share_err_offline": "Impossible de récupérer le(s) média(s) hors ligne, ils sont ignorés",
"asset_added_to_album": "Ajouté à l'album",
"asset_adding_to_album": "Ajout à l'album…",
"asset_description_updated": "La description du média a été mise à jour",
@@ -472,7 +468,7 @@
"asset_restored_successfully": "Élément restauré avec succès",
"asset_skipped": "Sauté",
"asset_skipped_in_trash": "À la corbeille",
"asset_uploaded": "Envoyé",
"asset_uploaded": "Téléversé",
"asset_uploading": "Téléversement…",
"asset_viewer_settings_subtitle": "Modifier les paramètres du visualiseur photos",
"asset_viewer_settings_title": "Visualiseur d'éléments",
@@ -481,18 +477,18 @@
"assets_added_to_album_count": "{count, plural, one {# média ajouté} other {# médias ajoutés}} à l'album",
"assets_added_to_name_count": "{count, plural, one {# média ajouté} other {# médias ajoutés}} à {hasName, select, true {<b>{name}</b>} other {new album}}",
"assets_count": "{count, plural, one {# média} other {# médias}}",
"assets_deleted_permanently": "{} élément(s) supprimé(s) définitivement",
"assets_deleted_permanently_from_server": "{} élément(s) supprimé(s) définitivement du serveur Immich",
"assets_deleted_permanently": "{} média(s) supprimé(s) définitivement",
"assets_deleted_permanently_from_server": "{} média(s) supprimé(s) définitivement du serveur Immich",
"assets_moved_to_trash_count": "{count, plural, one {# média déplacé} other {# médias déplacés}} dans la corbeille",
"assets_permanently_deleted_count": "{count, plural, one {# média supprimé} other {# médias supprimés}} définitivement",
"assets_removed_count": "{count, plural, one {# média supprimé} other {# médias supprimés}}",
"assets_removed_permanently_from_device": "{} élément(s) supprimé(s) définitivement de votre appareil",
"assets_removed_permanently_from_device": "{} média(s) supprimé(s) définitivement de votre appareil",
"assets_restore_confirmation": "Êtes-vous sûr de vouloir restaurer tous vos médias de la corbeille? Vous ne pouvez pas annuler cette action! Notez que les médias hors ligne ne peuvent être restaurés de cette façon.",
"assets_restored_count": "{count, plural, one {# média restauré} other {# médias restaurés}}",
"assets_restored_successfully": "Élément restauré avec succès",
"assets_trashed": "{} élément(s) déplacé(s) vers la corbeille",
"assets_trashed": "{} média(s) déplacé(s) vers la corbeille",
"assets_trashed_count": "{count, plural, one {# média} other {# médias}} mis à la corbeille",
"assets_trashed_from_server": "{} élément(s) déplacé(s) vers la corbeille du serveur Immich",
"assets_trashed_from_server": "{} média(s) déplacé(s) vers la corbeille du serveur Immich",
"assets_were_part_of_album_count": "{count, plural, one {Un média est} other {Des médias sont}} déjà dans l'album",
"authorized_devices": "Appareils autorisés",
"automatic_endpoint_switching_subtitle": "Se connecter localement lorsque connecté au WI-FI spécifié mais utiliser une adresse alternative lorsque connecté à un autre réseau",
@@ -508,13 +504,13 @@
"backup_album_selection_page_selection_info": "Informations sur la sélection",
"backup_album_selection_page_total_assets": "Total des éléments uniques",
"backup_all": "Tout",
"backup_background_service_backup_failed_message": "Échec de la sauvegarde des éléments. Nouvelle tentative...",
"backup_background_service_connection_failed_message": "Impossible de se connecter au serveur. Nouvelle tentative...",
"backup_background_service_current_upload_notification": "Envoi {}",
"backup_background_service_default_notification": "Recherche de nouveaux éléments...",
"backup_background_service_backup_failed_message": "Échec de la sauvegarde des médias. Nouvelle tentative",
"backup_background_service_connection_failed_message": "Impossible de se connecter au serveur. Nouvelle tentative",
"backup_background_service_current_upload_notification": "Téléversement {}",
"backup_background_service_default_notification": "Recherche de nouveaux médias…",
"backup_background_service_error_title": "Erreur de sauvegarde",
"backup_background_service_in_progress_notification": "Sauvegarde de vos éléments...",
"backup_background_service_upload_failure_notification": "Échec lors de l'envoi {}",
"backup_background_service_in_progress_notification": "Sauvegarde de vos médias…",
"backup_background_service_upload_failure_notification": "Échec lors du téléversement {}",
"backup_controller_page_albums": "Sauvegarder les albums",
"backup_controller_page_background_app_refresh_disabled_content": "Activez le rafraîchissement de l'application en arrière-plan dans Paramètres > Général > Rafraîchissement de l'application en arrière-plan afin d'utiliser la sauvegarde en arrière-plan.",
"backup_controller_page_background_app_refresh_disabled_title": "Rafraîchissement de l'application en arrière-plan désactivé",
@@ -525,19 +521,19 @@
"backup_controller_page_background_battery_info_title": "Optimisation de la batterie",
"backup_controller_page_background_charging": "Seulement pendant la charge",
"backup_controller_page_background_configure_error": "Échec de la configuration du service d'arrière-plan",
"backup_controller_page_background_delay": "Retarder la sauvegarde des nouveaux éléments : {}",
"backup_controller_page_background_description": "Activez le service d'arrière-plan pour sauvegarder automatiquement tous les nouveaux éléments sans avoir à ouvrir l'application.",
"backup_controller_page_background_delay": "Retarder la sauvegarde des nouveaux médias : {}",
"backup_controller_page_background_description": "Activez le service d'arrière-plan pour sauvegarder automatiquement tous les nouveaux médias sans avoir à ouvrir l'application",
"backup_controller_page_background_is_off": "La sauvegarde automatique en arrière-plan est désactivée",
"backup_controller_page_background_is_on": "La sauvegarde automatique en arrière-plan est activée",
"backup_controller_page_background_turn_off": "Désactiver le service d'arrière-plan",
"backup_controller_page_background_turn_on": "Activer le service d'arrière-plan",
"backup_controller_page_background_wifi": "Uniquement sur WiFi",
"backup_controller_page_background_wifi": "Uniquement en wifi",
"backup_controller_page_backup": "Sauvegardé",
"backup_controller_page_backup_selected": "Sélectionné: ",
"backup_controller_page_backup_selected": "Sélectionné : ",
"backup_controller_page_backup_sub": "Photos et vidéos sauvegardées",
"backup_controller_page_created": "Créé le : {}",
"backup_controller_page_desc_backup": "Activez la sauvegarde pour envoyer automatiquement les nouveaux éléments sur le serveur.",
"backup_controller_page_excluded": "Exclus: ",
"backup_controller_page_desc_backup": "Activez la sauvegarde au premier plan pour téléverser automatiquement les nouveaux médias sur le serveur lors de l'ouverture de l'application.",
"backup_controller_page_excluded": "Exclus : ",
"backup_controller_page_failed": "Échec de l'opération ({})",
"backup_controller_page_filename": "Nom du fichier : {} [{}]",
"backup_controller_page_id": "ID : {}",
@@ -554,15 +550,15 @@
"backup_controller_page_total_sub": "Toutes les photos et vidéos uniques des albums sélectionnés",
"backup_controller_page_turn_off": "Désactiver la sauvegarde",
"backup_controller_page_turn_on": "Activer la sauvegarde",
"backup_controller_page_uploading_file_info": "Transfert des informations du fichier",
"backup_controller_page_uploading_file_info": "Téléversement des informations du fichier",
"backup_err_only_album": "Impossible de retirer le seul album",
"backup_info_card_assets": "éléments",
"backup_manual_cancelled": "Annulé",
"backup_manual_in_progress": "Téléchargement déjà en cours. Essayez après un instant",
"backup_manual_success": "Succès ",
"backup_manual_title": "Statut du téléchargement ",
"backup_manual_in_progress": "Téléversement déjà en cours. Réessayez plus tard",
"backup_manual_success": "Succès",
"backup_manual_title": "Statut du téléversement",
"backup_options_page_title": "Options de sauvegarde",
"backup_setting_subtitle": "Ajuster les paramètres de sauvegarde",
"backup_setting_subtitle": "Ajuster les paramètres de téléversement au premier et en arrière-plan",
"backward": "Arrière",
"birthdate_saved": "Date de naissance enregistrée avec succès",
"birthdate_set_description": "La date de naissance est utilisée pour calculer l'âge de cette personne au moment où la photo a été prise.",
@@ -574,21 +570,21 @@
"bulk_keep_duplicates_confirmation": "Êtes-vous sûr de vouloir conserver {count, plural, one {# doublon} other {# doublons}}? Cela résoudra tous les groupes de doublons sans rien supprimer.",
"bulk_trash_duplicates_confirmation": "Êtes-vous sûr de vouloir mettre à la corbeille {count, plural, one {# doublon} other {# doublons}}? Cette opération permet de conserver le plus grand média de chaque groupe et de mettre à la corbeille tous les autres doublons.",
"buy": "Acheter Immich",
"cache_settings_album_thumbnails": "Page des miniatures de la bibliothèque ({} éléments)",
"cache_settings_album_thumbnails": "Page des miniatures de la bibliothèque ({} médias)",
"cache_settings_clear_cache_button": "Effacer le cache",
"cache_settings_clear_cache_button_title": "Efface le cache de l'application. Cela aura un impact significatif sur les performances de l'application jusqu'à ce que le cache soit reconstruit.",
"cache_settings_duplicated_assets_clear_button": "EFFACER",
"cache_settings_duplicated_assets_subtitle": "Photos et vidéos qui sont exclues par l'application",
"cache_settings_duplicated_assets_title": "Éléments dupliqués ({})",
"cache_settings_image_cache_size": "Taille du cache des images ({} éléments)",
"cache_settings_duplicated_assets_title": "Médias dupliqués ({})",
"cache_settings_image_cache_size": "Taille du cache des images ({} médias)",
"cache_settings_statistics_album": "Miniatures de la bibliothèque",
"cache_settings_statistics_assets": "{} éléments ({})",
"cache_settings_statistics_assets": "{} médias ({})",
"cache_settings_statistics_full": "Images complètes",
"cache_settings_statistics_shared": "Miniatures de l'album partagé",
"cache_settings_statistics_thumbnail": "Miniatures",
"cache_settings_statistics_title": "Utilisation du cache",
"cache_settings_subtitle": "Contrôler le comportement de mise en cache de l'application mobile Immich",
"cache_settings_thumbnail_size": "Taille du cache des miniatures ({} éléments)",
"cache_settings_thumbnail_size": "Taille du cache des miniatures ({} médias)",
"cache_settings_tile_subtitle": "Contrôler le comportement du stockage local",
"cache_settings_tile_title": "Stockage local",
"cache_settings_title": "Paramètres de mise en cache",
@@ -658,13 +654,13 @@
"contain": "Contenu",
"context": "Contexte",
"continue": "Continuer",
"control_bottom_app_bar_album_info_shared": "{} éléments · Partagés",
"control_bottom_app_bar_album_info_shared": "{} médias · Partagés",
"control_bottom_app_bar_create_new_album": "Créer un nouvel album",
"control_bottom_app_bar_delete_from_immich": "Supprimer de Immich",
"control_bottom_app_bar_delete_from_local": "Supprimer de l'appareil",
"control_bottom_app_bar_edit_location": "Modifier la localisation",
"control_bottom_app_bar_edit_time": "Modifier la date et l'heure",
"control_bottom_app_bar_share_link": "Share Link",
"control_bottom_app_bar_share_link": "Lien partagé",
"control_bottom_app_bar_share_to": "Partager à",
"control_bottom_app_bar_trash_from_immich": "Déplacer vers la corbeille",
"copied_image_to_clipboard": "Image copiée dans le presse-papiers.",
@@ -699,7 +695,7 @@
"crop": "Recadrer",
"curated_object_page_title": "Objets",
"current_device": "Appareil actuel",
"current_server_address": "Adresse actuelle du serveur ",
"current_server_address": "Adresse actuelle du serveur",
"custom_locale": "Paramètres régionaux personnalisés",
"custom_locale_description": "Afficher les dates et nombres en fonction des paramètres régionaux",
"daily_title_text_date": "E, dd MMM",
@@ -722,10 +718,10 @@
"delete": "Supprimer",
"delete_album": "Supprimer l'album",
"delete_api_key_prompt": "Voulez-vous vraiment supprimer cette clé API?",
"delete_dialog_alert": "Ces éléments seront définitivement supprimés de Immich et de votre appareil.",
"delete_dialog_alert_local": "Ces éléments seront définitivement supprimés de votre appareil mais resteront disponibles sur le serveur d'Immich.",
"delete_dialog_alert_local_non_backed_up": "Certains éléments ne sont pas sauvegardés sur Immich et seront définitivement supprimés de votre appareil.",
"delete_dialog_alert_remote": "Ces éléments seront définitivement supprimés du serveur Immich.",
"delete_dialog_alert": "Ces médias seront définitivement supprimés de Immich et de votre appareil",
"delete_dialog_alert_local": "Ces médias seront définitivement supprimés de votre appareil mais resteront disponibles sur le serveur d'Immich",
"delete_dialog_alert_local_non_backed_up": "Certains médias ne sont pas sauvegardés sur Immich et seront définitivement supprimés de votre appareil",
"delete_dialog_alert_remote": "Ces médias seront définitivement supprimés du serveur Immich",
"delete_dialog_ok_force": "Supprimer tout de même",
"delete_dialog_title": "Supprimer définitivement",
"delete_duplicates_confirmation": "Êtes-vous certain de vouloir supprimer définitivement ces doublons?",
@@ -782,7 +778,7 @@
"downloading": "Téléchargement",
"downloading_asset_filename": "Téléchargement du média {filename}",
"downloading_media": "Téléchargement du média",
"drop_files_to_upload": "Déposez les fichiers n'importe où pour envoyer",
"drop_files_to_upload": "Déposez les fichiers n'importe où pour téléverser",
"duplicates": "Doublons",
"duplicates_description": "Examiner chaque groupe et indiquer s'il y a des doublons",
"duration": "Durée",
@@ -818,7 +814,7 @@
"enabled": "Activé",
"end_date": "Date de fin",
"enqueued": "Mis en file",
"enter_wifi_name": "Entrez le nom du réseau ",
"enter_wifi_name": "Entrez le nom du réseau wifi",
"error": "Erreur",
"error_change_sort_album": "Impossible de modifier l'ordre de tri des albums",
"error_delete_face": "Erreur lors de la suppression du visage pour le média",
@@ -853,10 +849,12 @@
"failed_to_keep_this_delete_others": "Impossible de conserver ce média et de supprimer les autres médias",
"failed_to_load_asset": "Impossible de charger le média",
"failed_to_load_assets": "Impossible de charger les médias",
"failed_to_load_notifications": "Erreur de récupération des notifications",
"failed_to_load_people": "Impossible de charger les personnes",
"failed_to_remove_product_key": "Échec de suppression de la clé du produit",
"failed_to_stack_assets": "Impossible d'empiler les médias",
"failed_to_unstack_assets": "Impossible de dépiler les médias",
"failed_to_update_notification_status": "Erreur de mise à jour du statut des notifications",
"import_path_already_exists": "Ce chemin d'importation existe déjà.",
"incorrect_email_or_password": "Courriel ou mot de passe incorrect",
"paths_validation_failed": "Validation échouée pour {paths, plural, one {# un chemin} other {# plusieurs chemins}}",
@@ -949,7 +947,7 @@
"unable_to_update_settings": "Impossible de mettre à jour les paramètres",
"unable_to_update_timeline_display_status": "Impossible de mettre à jour le statut d'affichage de la vue chronologique",
"unable_to_update_user": "Impossible de mettre à jour l'utilisateur",
"unable_to_upload_file": "Impossible d'envoyer le fichier"
"unable_to_upload_file": "Impossible de téléverser le fichier"
},
"exif": "Exif",
"exif_bottom_sheet_description": "Ajouter une description...",
@@ -965,7 +963,7 @@
"expand_all": "Tout développer",
"experimental_settings_new_asset_list_subtitle": "En cours de développement",
"experimental_settings_new_asset_list_title": "Activer la grille de photos expérimentale",
"experimental_settings_subtitle": "Utilisez à vos dépends!",
"experimental_settings_subtitle": "Utilisez à vos dépends!",
"experimental_settings_title": "Expérimental",
"expire_after": "Expire",
"expired": "Expiré",
@@ -978,7 +976,7 @@
"external": "Externe",
"external_libraries": "Bibliothèques externes",
"external_network": "Réseau externe",
"external_network_sheet_info": "Quand vous n'êtes pas connecté à votre réseau préféré, l'application va tenter de se connecter aux adresses ci-dessous, en commençant par la première",
"external_network_sheet_info": "Quand vous n'êtes pas connecté(e) à votre réseau wifi préféré, l'application va tenter de se connecter aux adresses ci-dessous, en commençant par la première",
"face_unassigned": "Non attribué",
"failed": "Échec",
"failed_to_load_assets": "Échec du chargement des ressources",
@@ -996,6 +994,7 @@
"filetype": "Type de fichier",
"filter": "Filtres",
"filter_people": "Filtrer les personnes",
"filter_places": "Filtrer par lieu",
"find_them_fast": "Pour les retrouver rapidement par leur nom",
"fix_incorrect_match": "Corriger une association incorrecte",
"folder": "Dossier",
@@ -1005,12 +1004,12 @@
"forward": "Avant",
"general": "Général",
"get_help": "Obtenir de l'aide",
"get_wifiname_error": "Impossible d'obtenir le nom du réseau Wi-Fi. Assurez-vous d'avoir donné les permissions nécessaires à l'application et que vous êtes connecté à un réseau Wi-Fi.",
"get_wifiname_error": "Impossible d'obtenir le nom du réseau wifi. Assurez-vous d'avoir donné les permissions nécessaires à l'application et que vous êtes connecté à un réseau wifi",
"getting_started": "Commencer",
"go_back": "Retour",
"go_to_folder": "Dossier",
"go_to_search": "Faire une recherche",
"grant_permission": "Accorder les permissions ",
"grant_permission": "Accorder les permissions",
"group_albums_by": "Grouper les albums par...",
"group_country": "Grouper par pays",
"group_no": "Pas de groupe",
@@ -1034,23 +1033,23 @@
"hide_person": "Masquer la personne",
"hide_unnamed_people": "Cacher les personnes non nommées",
"home_page_add_to_album_conflicts": "{added} éléments ajoutés à l'album {album}. Les éléments {failed} sont déjà dans l'album.",
"home_page_add_to_album_err_local": "Impossible d'ajouter des éléments locaux aux albums pour le moment, étape ignorée",
"home_page_add_to_album_err_local": "Impossible d'ajouter des médias locaux aux albums, ils sont ignorés",
"home_page_add_to_album_success": "{added} éléments ajoutés à l'album {album}.",
"home_page_album_err_partner": "Il n'est pas encore possible d'ajouter des éléments d'un partenaire à un album.",
"home_page_archive_err_local": "Impossible d'archiver les ressources locales pour l'instant, étape ignorée",
"home_page_archive_err_partner": "Impossible d'archiver les éléments d'un partenaire.",
"home_page_album_err_partner": "Impossible d'ajouter des médias d'un partenaire à un album, ils sont ignorés",
"home_page_archive_err_local": "Impossible d'archiver les médias locaux, ils sont ignorés",
"home_page_archive_err_partner": "Impossible d'archiver les médias d'un partenaire, ils sont ignorés",
"home_page_building_timeline": "Construction de la chronologie",
"home_page_delete_err_partner": "Ne peut pas supprimer les éléments d'un partenaire.",
"home_page_delete_remote_err_local": "Des éléments locaux sont dans la sélection de suppression à distance, ils sont donc ignorés.",
"home_page_favorite_err_local": "Impossible d'ajouter des éléments locaux aux favoris pour le moment, étape ignorée",
"home_page_favorite_err_partner": "Il n'est pas encore possible de mettre en favori les éléments d'un partenaire.",
"home_page_first_time_notice": "Si c'est la première fois que vous utilisez l'application, veillez à choisir un ou plusieurs albums de sauvegarde afin que la chronologie puisse alimenter les photos et les vidéos de cet ou ces albums.",
"home_page_share_err_local": "Impossible de partager par lien les médias locaux, cette opération est donc ignorée.",
"home_page_upload_err_limit": "Limite de téléchargement de 30 éléments en même temps, demande ignorée",
"home_page_delete_err_partner": "Impossible de supprimer les médias d'un partenaire, ils sont ignorés",
"home_page_delete_remote_err_local": "Des médias locaux sont dans la sélection de suppression à distance, ils sont ignorés",
"home_page_favorite_err_local": "Impossible d'ajouter des médias locaux aux favoris, ils sont ignorés",
"home_page_favorite_err_partner": "Impossible de mettre en favori les médias d'un partenaire, ils sont ignorés",
"home_page_first_time_notice": "Si c'est la première fois que vous utilisez l'application, veillez à choisir un ou plusieurs albums de sauvegarde afin que la chronologie puisse alimenter les photos et les vidéos de cet ou ces albums",
"home_page_share_err_local": "Impossible de partager par lien les médias locaux, ils sont ignorés",
"home_page_upload_err_limit": "Impossible de téléverser plus de 30 médias en même temps, demande ignorée",
"host": "Hôte",
"hour": "Heure",
"ignore_icloud_photos": "Ignorer les photos iCloud",
"ignore_icloud_photos_description": "Les photos stockées sur iCloud ne sont pas enregistrées sur Immich",
"ignore_icloud_photos_description": "Les photos stockées sur iCloud ne sont pas téléversées sur le serveur Immich",
"image": "Image",
"image_alt_text_date": "{isVideo, select, true {Video} other {Image}} prise le {date}",
"image_alt_text_date_1_person": "{isVideo, select, true {Video} other {Image}} prise avec {person1} le {date}",
@@ -1123,8 +1122,8 @@
"loading_search_results_failed": "Chargement des résultats échoué",
"local_network": "Réseau local",
"local_network_sheet_info": "L'application va se connecter au serveur via cette URL quand l'appareil est connecté à ce réseau Wi-Fi",
"location_permission": "Autorisation de localisation ",
"location_permission_content": "Afin de pouvoir changer d'adresse automatiquement, Immich doit avoir accès à la localisation précise, afin d'accéder au le nom du réseau Wi-Fi utilisé",
"location_permission": "Autorisation de localisation",
"location_permission_content": "Afin de pouvoir changer d'adresse automatiquement, Immich doit avoir accès à la localisation précise, afin d'accéder au nom du réseau wifi utilisé",
"location_picker_choose_on_map": "Sélectionner sur la carte",
"location_picker_latitude_error": "Saisir une latitude correcte",
"location_picker_latitude_hint": "Saisir la latitude ici",
@@ -1135,8 +1134,8 @@
"logged_out_all_devices": "Déconnecté de tous les appareils",
"logged_out_device": "Déconnecté de l'appareil",
"login": "Connexion",
"login_disabled": "La connexion a été désactivée ",
"login_form_api_exception": "Erreur de l'API. Veuillez vérifier l'URL du serveur et et réessayer.",
"login_disabled": "La connexion a été désactivée",
"login_form_api_exception": "Erreur de l'API. Veuillez vérifier l'URL du serveur et réessayer.",
"login_form_back_button_text": "Retour",
"login_form_email_hint": "votrecourriel@email.com",
"login_form_endpoint_hint": "http://adresse-ip-serveur:port",
@@ -1179,12 +1178,12 @@
"map_cannot_get_user_location": "Impossible d'obtenir la localisation de l'utilisateur",
"map_location_dialog_yes": "Oui",
"map_location_picker_page_use_location": "Utiliser ma position",
"map_location_service_disabled_content": "Le service de localisation doit être activé pour afficher les éléments de votre emplacement actuel. Souhaitez-vous l'activer maintenant?",
"map_location_service_disabled_content": "Le service de localisation doit être activé pour afficher les médias de votre emplacement actuel. Souhaitez-vous l'activer maintenant?",
"map_location_service_disabled_title": "Service de localisation désactivé",
"map_marker_for_images": "Marqueur de carte pour les images prises à {city}, {country}",
"map_marker_with_image": "Marqueur de carte avec image",
"map_no_assets_in_bounds": "Pas de photos dans cette zone",
"map_no_location_permission_content": "L'autorisation de localisation est nécessaire pour afficher les éléments de votre emplacement actuel. Souhaitez-vous l'autoriser maintenant?",
"map_no_location_permission_content": "L'autorisation de localisation est nécessaire pour afficher les médias de votre emplacement actuel. Souhaitez-vous l'autoriser maintenant?",
"map_no_location_permission_title": "Permission de localisation refusée",
"map_settings": "Paramètres de la carte",
"map_settings_dark_mode": "Mode sombre",
@@ -1198,6 +1197,9 @@
"map_settings_only_show_favorites": "Afficher uniquement les favoris",
"map_settings_theme_settings": "Thème de la carte",
"map_zoom_to_see_photos": "Dézoomer pour voir les photos",
"mark_all_as_read": "Tout marquer comme lu",
"mark_as_read": "Marquer comme lu",
"marked_all_as_read": "Tout a été marqué comme lu",
"matches": "Correspondances",
"media_type": "Type de média",
"memories": "Souvenirs",
@@ -1224,14 +1226,16 @@
"month": "Mois",
"monthly_title_text_date_format": "MMMM y",
"more": "Plus",
"moved_to_archive": "{count, plural, one {# élément déplacé} other {# éléments déplacés}} vers les archives",
"moved_to_library": "{count, plural, one {# élément déplacé} other {# éléments déplacés}} vers la bibliothèque",
"moved_to_trash": "Déplacé dans la corbeille",
"multiselect_grid_edit_date_time_err_read_only": "Impossible de modifier la date d'un élément d'actif en lecture seule.",
"multiselect_grid_edit_gps_err_read_only": "Impossible de modifier l'emplacement d'un élément en lecture seule.",
"multiselect_grid_edit_date_time_err_read_only": "Impossible de modifier la date de médias en lecture seule, ils sont ignorés",
"multiselect_grid_edit_gps_err_read_only": "Impossible de modifier l'emplacement de médias en lecture seule, ils sont ignorés",
"mute_memories": "Mettre en sourdine les souvenirs",
"my_albums": "Mes albums",
"name": "Nom",
"name_or_nickname": "Nom ou surnom",
"networking_settings": "Réseau ",
"networking_settings": "Réseau",
"networking_subtitle": "Gérer les adresses du serveur",
"never": "Jamais",
"new_album": "Nouvel Album",
@@ -1248,21 +1252,23 @@
"no_albums_with_name_yet": "Il semble que vous n'ayez pas encore d'albums avec ce nom.",
"no_albums_yet": "Il semble que vous n'ayez pas encore d'album.",
"no_archived_assets_message": "Archiver des photos et vidéos pour les masquer dans votre bibliothèque",
"no_assets_message": "CLIQUER ICI POUR ENVOYER VOTRE PREMIÈRE PHOTO",
"no_assets_message": "CLIQUER ICI POUR TÉLÉVERSER VOTRE PREMIÈRE PHOTO",
"no_assets_to_show": "Aucun élément à afficher",
"no_duplicates_found": "Aucun doublon n'a été trouvé.",
"no_exif_info_available": "Aucune information exif disponible",
"no_explore_results_message": "Envoyez plus de photos pour explorer votre collection.",
"no_explore_results_message": "Téléversez plus de photos pour explorer votre collection.",
"no_favorites_message": "Ajouter des photos et vidéos à vos favoris pour les retrouver plus rapidement",
"no_libraries_message": "Créer une bibliothèque externe pour voir vos photos et vidéos dans un autre espace de stockage",
"no_name": "Pas de nom",
"no_notifications": "Pas de notification",
"no_people_found": "Aucune personne correspondante trouvée",
"no_places": "Pas de lieu",
"no_results": "Aucun résultat",
"no_results_description": "Essayez un synonyme ou un mot-clé plus général",
"no_shared_albums_message": "Créer un album pour partager vos photos et vidéos avec les personnes de votre réseau",
"not_in_any_album": "Dans aucun album",
"not_selected": "Non sélectionné",
"note_apply_storage_label_to_previously_uploaded assets": "Note: Pour appliquer l'étiquette de stockage aux médias déjà envoyés, lancer la",
"note_apply_storage_label_to_previously_uploaded assets": "Note : Pour appliquer l'étiquette de stockage aux médias déjà téléversés, exécutez",
"notes": "Notes",
"notification_permission_dialog_content": "Pour activer les notifications, allez dans Paramètres et sélectionnez Autoriser.",
"notification_permission_list_tile_content": "Accordez la permission d'activer les notifications.",
@@ -1344,9 +1350,9 @@
"permission_onboarding_get_started": "Commencer",
"permission_onboarding_go_to_settings": "Accéder aux paramètres",
"permission_onboarding_permission_denied": "Permission refusée. Pour utiliser Immich, accordez lautorisation pour les photos et vidéos dans les Paramètres.",
"permission_onboarding_permission_granted": "Permission accordée! Vous êtes prêts.",
"permission_onboarding_permission_granted": "Permission accordée! Vous êtes prêts.",
"permission_onboarding_permission_limited": "Permission limitée. Pour permettre à Immich de sauvegarder et de gérer l'ensemble de votre bibliothèque, accordez l'autorisation pour les photos et vidéos dans les Paramètres.",
"permission_onboarding_request": "Immich demande l'autorisation de visionner vos photos et vidéo",
"permission_onboarding_request": "Immich nécessite l'autorisation d'accéder à vos photos et vidéos.",
"person": "Personne",
"person_birthdate": "Né(e) le {date}",
"person_hidden": "{name}{hidden, select, true { (caché)} other {}}",
@@ -1431,6 +1437,8 @@
"recent_searches": "Recherches récentes",
"recently_added": "Récemment ajouté",
"recently_added_page_title": "Récemment ajouté",
"recently_taken": "Récemment photographié",
"recently_taken_page_title": "Récemment photographié",
"refresh": "Actualiser",
"refresh_encoded_videos": "Actualiser les vidéos encodées",
"refresh_faces": "Actualiser les visages",
@@ -1465,7 +1473,7 @@
"rename": "Renommer",
"repair": "Réparer",
"repair_no_results_message": "Les fichiers non importés ou absents s'afficheront ici",
"replace_with_upload": "Remplacer par téléchargement",
"replace_with_upload": "Remplacer par téléversement",
"repository": "Dépôt",
"require_password": "Demander le mot de passe",
"require_user_to_change_password_on_first_login": "Demander à l'utilisateur de changer son mot de passe lors de sa première connexion",
@@ -1481,7 +1489,7 @@
"restore_user": "Restaurer l'utilisateur",
"restored_asset": "Média restauré",
"resume": "Reprendre",
"retry_upload": "Réessayer l'envoi",
"retry_upload": "Réessayer le téléversement",
"review_duplicates": "Consulter les doublons",
"role": "Rôle",
"role_editor": "Éditeur",
@@ -1523,7 +1531,7 @@
"search_filter_people_title": "Sélectionner une personne",
"search_for": "Chercher",
"search_for_existing_person": "Rechercher une personne existante",
"search_no_more_result": "\nPlus de résultats",
"search_no_more_result": "Plus de résultats",
"search_no_people": "Aucune personne",
"search_no_people_named": "Aucune personne nommée « {name} »",
"search_no_result": "Aucun résultat trouvé, essayez un autre terme de recherche ou une autre combinaison",
@@ -1534,7 +1542,7 @@
"search_page_no_places": "Aucune information disponible sur la localisation",
"search_page_screenshots": "Captures d'écran",
"search_page_search_photos_videos": "Rechercher dans vos photos et vidéos",
"search_page_selfies": "Selfies",
"search_page_selfies": "Autoportraits (Selfies)",
"search_page_things": "Objets",
"search_page_view_all_button": "Voir tout",
"search_page_your_activity": "Votre activité",
@@ -1545,7 +1553,7 @@
"search_result_page_new_search_hint": "Nouvelle recherche",
"search_settings": "Paramètres de recherche",
"search_state": "Rechercher par état/région...",
"search_suggestion_list_smart_search_hint_1": "La recherche intelligente est activée par défaut. Pour rechercher des métadonnées, utilisez la syntaxe suivante",
"search_suggestion_list_smart_search_hint_1": "La recherche intelligente est activée par défaut. Pour rechercher des métadonnées, utilisez la syntaxe suivante ",
"search_suggestion_list_smart_search_hint_2": "m:votre-terme-de-recherche",
"search_tags": "Recherche d'étiquettes...",
"search_timezone": "Rechercher par fuseau horaire...",
@@ -1565,6 +1573,7 @@
"select_keep_all": "Choisir de tout garder",
"select_library_owner": "Sélectionner le propriétaire de la bibliothèque",
"select_new_face": "Sélectionner un nouveau visage",
"select_person_to_tag": "Sélectionner une personne à identifier",
"select_photos": "Sélectionner les photos",
"select_trash_all": "Choisir de tout supprimer",
"select_user_for_sharing_page_err_album": "Échec de la création de l'album",
@@ -1587,7 +1596,7 @@
"set_profile_picture": "Définir la photo de profil",
"set_slideshow_to_fullscreen": "Afficher le diaporama en plein écran",
"setting_image_viewer_help": "Le visualiseur de détails charge d'abord la petite miniature, puis l'aperçu de taille moyenne (s'il est activé), enfin l'original (s'il est activé).",
"setting_image_viewer_original_subtitle": "Activez cette option pour charger l'image en résolution originale (volumineux!). Désactiver pour réduire l'utilisation des données (réseau et cache de l'appareil).",
"setting_image_viewer_original_subtitle": "Activez cette option pour charger l'image en résolution originale (fichier volumineux!). Désactiver pour réduire l'utilisation des données (réseau et cache de l'appareil).",
"setting_image_viewer_original_title": "Charger l'image originale",
"setting_image_viewer_preview_subtitle": "Activer pour charger une image de résolution moyenne. Désactiver pour charger directement l'original ou utiliser uniquement la miniature.",
"setting_image_viewer_preview_title": "Charger l'image d'aperçu",
@@ -1595,16 +1604,16 @@
"setting_languages_apply": "Appliquer",
"setting_languages_subtitle": "Changer la langue de l'application",
"setting_languages_title": "Langues",
"setting_notifications_notify_failures_grace_period": "Notifier les échecs de sauvegarde en arrière-plan : {}",
"setting_notifications_notify_failures_grace_period": "Notifier les échecs de la sauvegarde en arrière-plan : {}",
"setting_notifications_notify_hours": "{} heures",
"setting_notifications_notify_immediately": "immédiatement",
"setting_notifications_notify_minutes": "{} minutes",
"setting_notifications_notify_never": "jamais",
"setting_notifications_notify_seconds": "{} secondes",
"setting_notifications_single_progress_subtitle": "Informations détaillées sur la progression du transfert par élément",
"setting_notifications_single_progress_subtitle": "Informations détaillées sur la progression du téléversement par média",
"setting_notifications_single_progress_title": "Afficher la progression du détail de la sauvegarde en arrière-plan",
"setting_notifications_subtitle": "Ajustez vos préférences de notification",
"setting_notifications_total_progress_subtitle": "Progression globale du transfert (effectué/total des éléments)",
"setting_notifications_total_progress_subtitle": "Progression globale du téléversement (effectué/total des médias)",
"setting_notifications_total_progress_title": "Afficher la progression totale de la sauvegarde en arrière-plan",
"setting_video_viewer_looping_title": "Boucle",
"setting_video_viewer_original_video_subtitle": "Lors de la diffusion d'une vidéo depuis le serveur, lisez l'original même si un transcodage est disponible. Cela peut entraîner de la mise en mémoire tampon. Les vidéos disponibles localement sont lues en qualité d'origine, quel que soit ce paramètre.",
@@ -1618,7 +1627,7 @@
"share_dialog_preparing": "Préparation...",
"shared": "Partagé",
"shared_album_activities_input_disable": "Les commentaires sont désactivés",
"shared_album_activity_remove_content": "Souhaitez-vous supprimer cette activité?",
"shared_album_activity_remove_content": "Souhaitez-vous supprimer cette activité?",
"shared_album_activity_remove_title": "Supprimer l'activité",
"shared_album_section_people_action_error": "Erreur lors de la suppression",
"shared_album_section_people_action_leave": "Supprimer l'utilisateur de l'album",
@@ -1628,9 +1637,9 @@
"shared_by_user": "Partagé par {user}",
"shared_by_you": "Partagé par vous",
"shared_from_partner": "Photos de {partner}",
"shared_intent_upload_button_progress_text": "{} / {} Envoyés",
"shared_intent_upload_button_progress_text": "{} / {} Téléversé",
"shared_link_app_bar_title": "Liens partagés",
"shared_link_clipboard_copied_massage": "Copié dans le presse-papier\n",
"shared_link_clipboard_copied_massage": "Copié dans le presse-papier",
"shared_link_clipboard_text": "Lien : {}\nMot de passe : {}",
"shared_link_create_error": "Erreur pendant la création du lien partagé",
"shared_link_edit_description_hint": "Saisir la description du partage",
@@ -1641,7 +1650,7 @@
"shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_months": "{} mois",
"shared_link_edit_expire_after_option_year": "{} années",
"shared_link_edit_expire_after_option_year": "{} an",
"shared_link_edit_password_hint": "Saisir le mot de passe de partage",
"shared_link_edit_submit_button": "Mettre à jour le lien",
"shared_link_error_server_url_fetch": "Impossible de récupérer l'url du serveur",
@@ -1738,8 +1747,8 @@
"swap_merge_direction": "Inverser la direction de fusion",
"sync": "Synchroniser",
"sync_albums": "Synchroniser dans des albums",
"sync_albums_manual_subtitle": "Synchroniser toutes les vidéos et photos sauvegardées dans les albums sélectionnés",
"sync_upload_album_setting_subtitle": "Créer et sauvegarde vos photos et vidéos dans les albums sélectionnés sur Immich",
"sync_albums_manual_subtitle": "Synchroniser toutes les vidéos et photos téléversées dans les albums sélectionnés",
"sync_upload_album_setting_subtitle": "Crée et téléverse vos photos et vidéos dans les albums sélectionnés sur Immich",
"tag": "Étiquette",
"tag_assets": "Étiqueter les médias",
"tag_created": "Étiquette créée: {tag}",
@@ -1754,7 +1763,7 @@
"theme_selection": "Sélection du thème",
"theme_selection_description": "Ajuster automatiquement le thème clair ou sombre via les préférences système",
"theme_setting_asset_list_storage_indicator_title": "Afficher l'indicateur de stockage sur les tuiles des éléments",
"theme_setting_asset_list_tiles_per_row_title": "Nombre d'éléments par ligne ({})",
"theme_setting_asset_list_tiles_per_row_title": "Nombre de médias par ligne ({})",
"theme_setting_colorful_interface_subtitle": "Appliquer la couleur principale sur les surfaces d'arrière-plan.",
"theme_setting_colorful_interface_title": "Interface colorée",
"theme_setting_image_viewer_quality_subtitle": "Ajustez la qualité de la visionneuse d'images détaillées",
@@ -1764,7 +1773,7 @@
"theme_setting_system_primary_color_title": "Utiliser la couleur du système",
"theme_setting_system_theme_switch": "Automatique (suivre les paramètres du système)",
"theme_setting_theme_subtitle": "Choisissez le thème de l'application",
"theme_setting_three_stage_loading_subtitle": "Le chargement en trois étapes peut améliorer les performances de chargement, mais entraîne une augmentation significative de la charge du réseau.",
"theme_setting_three_stage_loading_subtitle": "Le chargement en trois étapes peut améliorer les performances de chargement, mais entraîne une augmentation significative de la charge du réseau",
"theme_setting_three_stage_loading_title": "Activer le chargement en trois étapes",
"they_will_be_merged_together": "Elles seront fusionnées ensemble",
"third_party_resources": "Ressources tierces",
@@ -1788,8 +1797,8 @@
"trash_emptied": "Corbeille vidée",
"trash_no_results_message": "Les photos et vidéos supprimées s'afficheront ici.",
"trash_page_delete_all": "Tout supprimer",
"trash_page_empty_trash_dialog_content": "Voulez-vous vider les éléments de la corbeille? Ces objets seront définitivement retirés d'Immich",
"trash_page_info": "Les éléments mis à la corbeille seront définitivement supprimés au bout de {} jours.",
"trash_page_empty_trash_dialog_content": "Voulez-vous vider les médias de la corbeille? Ces objets seront définitivement retirés d'Immich",
"trash_page_info": "Les médias mis à la corbeille seront définitivement supprimés au bout de {} jours",
"trash_page_no_assets": "Aucun élément dans la corbeille",
"trash_page_restore_all": "Tout restaurer",
"trash_page_select_assets_btn": "Sélectionner les éléments",
@@ -1817,25 +1826,25 @@
"unstack": "Désempiler",
"unstacked_assets_count": "{count, plural, one {# média dépilé} other {# médias dépilés}}",
"untracked_files": "Fichiers non suivis",
"untracked_files_decription": "Ces fichiers ne sont pas suivis par l'application. Ils peuvent être le résultat de déplacements échoués, d'envois interrompus ou laissés pour compte à cause d'un bug",
"untracked_files_decription": "Ces fichiers ne sont pas suivis par l'application. Ils peuvent être le résultat de déplacements échoués, de téléversements interrompus ou abandonnés pour cause de bug",
"up_next": "Suite",
"updated_password": "Mot de passe mis à jour",
"upload": "Envoyer",
"upload_concurrency": "Envois simultanés",
"upload_dialog_info": "Voulez-vous sauvegarder la sélection vers le serveur?",
"upload_dialog_title": "Télécharger cet élément ",
"upload_errors": "L'envoi s'est achevé avec {count, plural, one {# erreur} other {# erreurs}}. Rafraîchir la page pour voir les nouveaux médias envoyés.",
"upload": "Téléverser",
"upload_concurrency": "Téléversements simultanés",
"upload_dialog_info": "Voulez-vous sauvegarder la sélection vers le serveur?",
"upload_dialog_title": "Téléverser le média",
"upload_errors": "Le téléversement s'est achevé avec {count, plural, one {# erreur} other {# erreurs}}. Rafraîchir la page pour voir les nouveaux médias téléversés.",
"upload_progress": "{remaining, number} restant(s) - {processed, number} traité(s)/{total, number}",
"upload_skipped_duplicates": "{count, plural, one {# doublon ignoré} other {# doublons ignorés}}",
"upload_status_duplicates": "Doublons",
"upload_status_errors": "Erreurs",
"upload_status_uploaded": "Envoyé",
"upload_success": "Envoi réussi. Rafraîchir la page pour voir les nouveaux médias envoyés.",
"upload_to_immich": "Envoyer vers Immich ({})",
"upload_status_uploaded": "Téléversé",
"upload_success": "Téléversement réussi. Rafraîchir la page pour voir les nouveaux médias téléversés.",
"upload_to_immich": "Téléverser vers Immich ({})",
"uploading": "Téléversement en cours",
"url": "URL",
"usage": "Utilisation",
"use_current_connection": "Utiliser le réseau actuel ",
"use_current_connection": "Utiliser le réseau actuel",
"use_custom_date_range": "Utilisez une plage de date personnalisée à la place",
"user": "Utilisateur",
"user_id": "ID Utilisateur",
@@ -1888,11 +1897,11 @@
"week": "Semaine",
"welcome": "Bienvenue",
"welcome_to_immich": "Bienvenue sur Immich",
"wifi_name": "Nom du réseau ",
"wifi_name": "Nom du réseau wifi",
"year": "Année",
"years_ago": "Il y a {years, plural, one {# an} other {# ans}}",
"yes": "Oui",
"you_dont_have_any_shared_links": "Vous n'avez aucun lien partagé",
"your_wifi_name": "Nom du réseau Wi-Fi ",
"your_wifi_name": "Nom du réseau wifi",
"zoom_image": "Zoomer"
}

View File

@@ -192,20 +192,13 @@
"oauth_auto_register": "Rexistro automático",
"oauth_auto_register_description": "Rexistrar automaticamente novos usuarios despois de iniciar sesión con OAuth",
"oauth_button_text": "Texto do botón",
"oauth_client_id": "ID de cliente",
"oauth_client_secret": "Segredo do cliente",
"oauth_enable_description": "Iniciar sesión con OAuth",
"oauth_issuer_url": "URL do emisor",
"oauth_mobile_redirect_uri": "URI de redirección móbil",
"oauth_mobile_redirect_uri_override": "Substitución de URI de redirección móbil",
"oauth_mobile_redirect_uri_override_description": "Activar cando o provedor OAuth non permite un URI móbil, como '{callback}'",
"oauth_profile_signing_algorithm": "Algoritmo de sinatura do perfil",
"oauth_profile_signing_algorithm_description": "Algoritmo usado para asinar o perfil do usuario.",
"oauth_scope": "Ámbito",
"oauth_settings": "OAuth",
"oauth_settings_description": "Xestionar a configuración de inicio de sesión OAuth",
"oauth_settings_more_details": "Para máis detalles sobre esta función, consulte a <link>documentación</link>.",
"oauth_signing_algorithm": "Algoritmo de sinatura",
"oauth_storage_label_claim": "Declaración de etiqueta de almacenamento",
"oauth_storage_label_claim_description": "Establecer automaticamente a etiqueta de almacenamento do usuario ao valor desta declaración.",
"oauth_storage_quota_claim": "Declaración de cota de almacenamento",
@@ -1889,11 +1882,11 @@
"week": "Semana",
"welcome": "Benvido/a",
"welcome_to_immich": "Benvido/a a Immich",
"wifi_name": "Nome da WiFi",
"wifi_name": "Nome da Wi-Fi",
"year": "Ano",
"years_ago": "Hai {years, plural, one {# ano} other {# anos}}",
"yes": "Si",
"you_dont_have_any_shared_links": "Non tes ningunha ligazón compartida",
"your_wifi_name": "O nome da túa WiFi",
"your_wifi_name": "O nome da túa Wi-Fi",
"zoom_image": "Ampliar Imaxe"
}

View File

@@ -192,26 +192,22 @@
"oauth_auto_register": "רישום אוטומטי",
"oauth_auto_register_description": "רשום אוטומטית משתמשים חדשים לאחר כניסה עם OAuth",
"oauth_button_text": "טקסט לחצן",
"oauth_client_id": "מזהה לקוח",
"oauth_client_secret": "סוד לקוח",
"oauth_client_secret_description": "נדרש כאשר ספק ה־OAuth אינו תומך ב־PKCE (מפתח הוכחה להחלפת קוד)",
"oauth_enable_description": "התחבר עם OAuth",
"oauth_issuer_url": "כתובת אתר המנפיק",
"oauth_mobile_redirect_uri": "URI להפניה מחדש בנייד",
"oauth_mobile_redirect_uri_override": "עקיפת URI להפניה מחדש בנייד",
"oauth_mobile_redirect_uri_override_description": "אפשר כאשר ספק OAuth לא מאפשר כתובת URI לנייד, כמו '{callback}'",
"oauth_profile_signing_algorithm": "אלגוריתם חתימת פרופיל",
"oauth_profile_signing_algorithm_description": "אלגוריתם המשמש לחתימה על פרופיל המשתמש.",
"oauth_scope": "רמת הרשאה",
"oauth_settings": "OAuth",
"oauth_settings_description": "ניהול הגדרות התחברות עם OAuth",
"oauth_settings_more_details": "למידע נוסף אודות תכונה זו, בדוק את ה<link>תיעוד</link>.",
"oauth_signing_algorithm": "אלגוריתם חתימה",
"oauth_storage_label_claim": "דרישת תווית אחסון",
"oauth_storage_label_claim_description": "הגדר אוטומטית את תווית האחסון של המשתמש לערך של דרישה זו.",
"oauth_storage_quota_claim": "דרישת מכסת אחסון",
"oauth_storage_quota_claim_description": "הגדר אוטומטית את מכסת האחסון של המשתמש לערך של דרישה זו.",
"oauth_storage_quota_default": "מכסת אחסון ברירת מחדל (GiB)",
"oauth_storage_quota_default_description": "מכסה ב-GiB לשימוש כאשר לא מסופקת דרישה (הזן 0 עבור מכסה בלתי מוגבלת).",
"oauth_timeout": "הבקשה נכשלה הזמן הקצוב הסתיים",
"oauth_timeout_description": "זמן קצוב לבקשות (במילישניות)",
"offline_paths": "נתיבים לא מקוונים",
"offline_paths_description": "תוצאות אלו עשויות להיות עקב מחיקה ידנית של קבצים שאינם חלק מספרייה חיצונית.",
"password_enable_description": "התחבר עם דוא\"ל וסיסמה",
@@ -853,10 +849,12 @@
"failed_to_keep_this_delete_others": "הפעולה נכשלה לא ניתן היה לשמור את התמונה הזו ולמחוק את שאר התמונות",
"failed_to_load_asset": "טעינת התמונה נכשלה",
"failed_to_load_assets": "טעינת התמונות נכשלה",
"failed_to_load_notifications": "אירעה שגיאה בעת טעינת ההתראות",
"failed_to_load_people": "נכשל באחזור אנשים",
"failed_to_remove_product_key": "הסרת מפתח מוצר נכשלה",
"failed_to_stack_assets": "יצירת ערימת תמונות נכשלה",
"failed_to_unstack_assets": "ביטול ערימת תמונות נכשלה",
"failed_to_update_notification_status": "שגיאה בעדכון ההתראה",
"import_path_already_exists": "נתיב הייבוא הזה כבר קיים.",
"incorrect_email_or_password": "דוא\"ל או סיסמה שגויים",
"paths_validation_failed": "{paths, plural, one {נתיב # נכשל} other {# נתיבים נכשלו}} אימות",
@@ -1177,7 +1175,7 @@
"map": "מפה",
"map_assets_in_bound": "תמונה {}",
"map_assets_in_bounds": "{} תמונות",
"map_cannot_get_user_location": "לא ניתן לקבל את מיקום המשתמש",
"map_cannot_get_user_location": "לא ניתן לקבוע את מיקום המשתמש",
"map_location_dialog_yes": "כן",
"map_location_picker_page_use_location": "השתמש במיקום הזה",
"map_location_service_disabled_content": "שירות המיקום צריך להיות מופעל כדי להציג תמונות מהמיקום הנוכחי שלך. האם ברצונך להפעיל אותו עכשיו?",
@@ -1199,6 +1197,9 @@
"map_settings_only_show_favorites": "הצג מועדפים בלבד",
"map_settings_theme_settings": "ערכת נושא למפה",
"map_zoom_to_see_photos": "הקטן את התצוגה כדי לראות תמונות",
"mark_all_as_read": "סמן הכל כנקרא",
"mark_as_read": "סמן כנקרא",
"marked_all_as_read": "כל ההתראות סומנו כנקראו",
"matches": "התאמות",
"media_type": "סוג מדיה",
"memories": "זכרונות",
@@ -1257,6 +1258,8 @@
"no_favorites_message": "הוסף מועדפים כדי למצוא במהירות את התמונות והסרטונים הכי טובים שלך",
"no_libraries_message": "צור ספרייה חיצונית כדי לראות את התמונות והסרטונים שלך",
"no_name": "אין שם",
"no_notifications": "אין התראות",
"no_people_found": "לא נמצאו אנשים תואמים",
"no_places": "אין מקומות",
"no_results": "אין תוצאות",
"no_results_description": "נסה להשתמש במילה נרדפת או במילת מפתח יותר כללית",
@@ -1377,7 +1380,7 @@
"profile_drawer_app_logs": "יומן",
"profile_drawer_client_out_of_date_major": "גרסת היישום לנייד מיושנת. נא לעדכן לגרסה הראשית האחרונה.",
"profile_drawer_client_out_of_date_minor": "גרסת היישום לנייד מיושנת. נא לעדכן לגרסה המשנית האחרונה.",
"profile_drawer_client_server_up_to_date": לקוח והשרת הם מעודכנים",
"profile_drawer_client_server_up_to_date": יישום והשרת מעודכנים",
"profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "השרת אינו מעודכן. נא לעדכן לגרסה הראשית האחרונה.",
"profile_drawer_server_out_of_date_minor": "השרת אינו מעודכן. נא לעדכן לגרסה המשנית האחרונה.",
@@ -1432,6 +1435,8 @@
"recent_searches": "חיפושים אחרונים",
"recently_added": "נוסף לאחרונה",
"recently_added_page_title": "נוסף לאחרונה",
"recently_taken": "צולם לאחרונה",
"recently_taken_page_title": "צולם לאחרונה",
"refresh": "רענן",
"refresh_encoded_videos": "רענן סרטונים מקודדים",
"refresh_faces": "רענן פנים",
@@ -1566,6 +1571,7 @@
"select_keep_all": "בחר שמור הכל",
"select_library_owner": "בחר את הבעלים של הספרייה",
"select_new_face": "בחר פנים חדשות",
"select_person_to_tag": "בחר אדם לתיוג",
"select_photos": "בחר תמונות",
"select_trash_all": "בחר העבר הכל לאשפה",
"select_user_for_sharing_page_err_album": "יצירת אלבום נכשלה",
@@ -1576,8 +1582,8 @@
"server_endpoint": "נקודת קצה שרת",
"server_info_box_app_version": "גרסת יישום",
"server_info_box_server_url": "כתובת שרת",
"server_offline": "שרת לא מקוון",
"server_online": "שרת מקוון",
"server_offline": "השרת מנותק",
"server_online": "החיבור לשרת פעיל",
"server_stats": "סטטיסטיקות שרת",
"server_version": "גרסת שרת",
"set": "הגדר",
@@ -1712,7 +1718,7 @@
"sort_people_by_similarity": "מיין אנשים לפי דמיון",
"sort_recent": "תמונה אחרונה ביותר",
"sort_title": "כותרת",
"source": "מקור",
"source": "קוד מקור",
"stack": "ערימה",
"stack_duplicates": "צור ערימת כפילויות",
"stack_select_one_photo": "בחר תמונה ראשית אחת עבור הערימה",
@@ -1754,7 +1760,7 @@
"theme": "ערכת נושא",
"theme_selection": "בחירת ערכת נושא",
"theme_selection_description": "הגדר אוטומטית את ערכת הנושא לבהיר או כהה בהתבסס על העדפת המערכת של הדפדפן שלך",
"theme_setting_asset_list_storage_indicator_title": "הצג סטטוס אחסון על גבי התמונות",
"theme_setting_asset_list_storage_indicator_title": "הצג סטטוס גיבוי על גבי התמונות",
"theme_setting_asset_list_tiles_per_row_title": "מספר תמונות בכל שורה ({})",
"theme_setting_colorful_interface_subtitle": "החל את הצבע העיקרי למשטחי רקע.",
"theme_setting_colorful_interface_title": "ממשק צבעוני",

View File

@@ -171,20 +171,13 @@
"oauth_auto_register": "ऑटो रजिस्टर",
"oauth_auto_register_description": "OAuth के साथ साइन इन करने के बाद स्वचालित रूप से नए उपयोगकर्ताओं को पंजीकृत करें",
"oauth_button_text": "टेक्स्ट बटन",
"oauth_client_id": "ग्राहक ID",
"oauth_client_secret": "ग्राहक गुप्त",
"oauth_enable_description": "OAuth से लॉगिन करें",
"oauth_issuer_url": "जारीकर्ता URL",
"oauth_mobile_redirect_uri": "मोबाइल रीडायरेक्ट यूआरआई",
"oauth_mobile_redirect_uri_override": "मोबाइल रीडायरेक्ट यूआरआई ओवरराइड",
"oauth_mobile_redirect_uri_override_description": "सक्षम करें जब 'app.immitch:/' एक अमान्य रीडायरेक्ट यूआरआई हो।",
"oauth_profile_signing_algorithm": "प्रोफ़ाइल हस्ताक्षर एल्गोरिथ्म",
"oauth_profile_signing_algorithm_description": "उपयोगकर्ता प्रोफ़ाइल पर हस्ताक्षर करने के लिए एल्गोरिदम का उपयोग किया जाता है।",
"oauth_scope": "स्कोप",
"oauth_settings": "ओऑथ",
"oauth_settings_description": "OAuth लॉगिन सेटिंग प्रबंधित करें",
"oauth_settings_more_details": "इस सुविधा के बारे में अधिक जानकारी के लिए, देखें <link>डॉक्स</link>।",
"oauth_signing_algorithm": "हस्ताक्षर एल्गोरिथ्म",
"oauth_storage_label_claim": "भंडारण लेबल का दावा",
"oauth_storage_label_claim_description": "इस दावे के मूल्य पर उपयोगकर्ता के भंडारण लेबल को स्वचालित रूप से सेट करें।",
"oauth_storage_quota_claim": "भंडारण कोटा का दावा",

File diff suppressed because it is too large Load Diff

View File

@@ -192,20 +192,13 @@
"oauth_auto_register": "Automatikus regisztráció",
"oauth_auto_register_description": "Új felhasználók automatikus regisztrálása az OAuth használatával történő bejelentkezés után",
"oauth_button_text": "Gomb szövege",
"oauth_client_id": "Kliens ID",
"oauth_client_secret": "Kliens Titok",
"oauth_enable_description": "Bejelentkezés OAuth használatával",
"oauth_issuer_url": "Kibocsátó URL",
"oauth_mobile_redirect_uri": "Mobil átirányítási URI",
"oauth_mobile_redirect_uri_override": "Mobil átirányítási URI felülírás",
"oauth_mobile_redirect_uri_override_description": "Engedélyezd, ha az OAuth szolgáltató tiltja a mobil URI-t, mint például '{callback}'",
"oauth_profile_signing_algorithm": "Profil aláíró algoritmus",
"oauth_profile_signing_algorithm_description": "A felhasználói profil aláírásához használt algoritmus.",
"oauth_scope": "Hatókör",
"oauth_settings": "OAuth",
"oauth_settings_description": "OAuth bejelentkezési beállítások kezelése",
"oauth_settings_more_details": "Erről a funkcióról további információt a <link>dokumentációban</link> találsz.",
"oauth_signing_algorithm": "Aláírás algoritmusa",
"oauth_storage_label_claim": "Tárhely címke igénylés",
"oauth_storage_label_claim_description": "A felhasználó tárhely címkéjének automatikus beállítása az igényeltre.",
"oauth_storage_quota_claim": "Tárhelykvóta igénylése",

View File

@@ -1,23 +1,24 @@
{
"about": "Մասին",
"account": "",
"account_settings": "",
"acknowledge": "",
"action": "",
"action": "Գործողություն",
"actions": "",
"active": "",
"activity": "",
"add": "",
"add": "Ավելացնել",
"add_a_description": "",
"add_a_location": "",
"add_a_name": "",
"add_a_location": "Ավելացնել տեղ",
"add_a_name": "Ավելացնել անուն",
"add_a_title": "",
"add_exclusion_pattern": "",
"add_import_path": "",
"add_location": "",
"add_location": "Ավելացնել տեղ",
"add_more_users": "",
"add_partner": "",
"add_path": "",
"add_photos": "",
"add_photos": "Ավելացնել նկարներ",
"add_to": "",
"add_to_album": "",
"add_to_shared_album": "",
@@ -136,17 +137,12 @@
"oauth_auto_register": "",
"oauth_auto_register_description": "",
"oauth_button_text": "",
"oauth_client_id": "",
"oauth_client_secret": "",
"oauth_enable_description": "",
"oauth_issuer_url": "",
"oauth_mobile_redirect_uri": "",
"oauth_mobile_redirect_uri_override": "",
"oauth_mobile_redirect_uri_override_description": "",
"oauth_scope": "",
"oauth_settings": "",
"oauth_settings_description": "",
"oauth_signing_algorithm": "",
"oauth_storage_label_claim": "",
"oauth_storage_label_claim_description": "",
"oauth_storage_quota_claim": "",
@@ -295,7 +291,10 @@
"asset_offline": "",
"assets": "",
"authorized_devices": "",
"back": "",
"back": "Հետ",
"backup_all": "Բոլոր",
"backup_controller_page_background_battery_info_link": "Ցույց տուր ինչպես",
"backup_controller_page_background_battery_info_ok": "Լավ",
"backward": "",
"blurred_background": "",
"camera": "",
@@ -307,8 +306,8 @@
"cannot_update_the_description": "",
"change_date": "",
"change_expiration_time": "",
"change_location": "",
"change_name": "",
"change_location": "Փոխել տեղը",
"change_name": "Փոխել անուն",
"change_name_successfully": "",
"change_password": "",
"change_your_password": "",
@@ -316,13 +315,15 @@
"check_all": "",
"check_logs": "",
"choose_matching_people_to_merge": "",
"city": "",
"city": "Քաղաք",
"clear": "",
"clear_all": "",
"clear_message": "",
"clear_value": "",
"client_cert_dialog_msg_confirm": "Լավ",
"close": "",
"collapse_all": "",
"color": "Գույն",
"color_theme": "",
"comment_options": "",
"comments_are_disabled": "",
@@ -333,6 +334,7 @@
"contain": "",
"context": "",
"continue": "",
"control_bottom_app_bar_edit_location": "Փոխել Տեղը",
"copied_image_to_clipboard": "",
"copied_to_clipboard": "",
"copy_error": "",
@@ -342,7 +344,7 @@
"copy_link_to_clipboard": "",
"copy_password": "",
"copy_to_clipboard": "",
"country": "",
"country": "Երկիր",
"cover": "",
"covers": "",
"create": "",
@@ -350,19 +352,22 @@
"create_library": "",
"create_link": "",
"create_link_to_share": "",
"create_new_person": "",
"create_new": "ՍՏԵՂԾԵԼ ՆՈՐ",
"create_new_person": "Ստեղծել նոր անձ",
"create_new_user": "",
"create_shared_album_page_share_select_photos": "Ընտրե Նկարներ",
"create_user": "",
"created": "",
"curated_object_page_title": "Բաներ",
"current_device": "",
"custom_locale": "",
"custom_locale_description": "",
"dark": "",
"dark": "Մութ",
"date_after": "",
"date_and_time": "",
"date_before": "",
"date_range": "",
"day": "",
"day": "Օր",
"default_locale": "",
"default_locale_description": "",
"delete": "",
@@ -401,7 +406,7 @@
"edit_import_paths": "",
"edit_key": "",
"edit_link": "",
"edit_location": "",
"edit_location": "Փոխել տեղը",
"edit_name": "",
"edit_people": "",
"edit_title": "",
@@ -484,6 +489,9 @@
"unable_to_update_timeline_display_status": "",
"unable_to_update_user": ""
},
"exif_bottom_sheet_person_add_person": "Ավելացնել անուն",
"exif_bottom_sheet_person_age": "Տարիք {}",
"exif_bottom_sheet_person_age_years": "Տարիք {}",
"exit_slideshow": "",
"expand_all": "",
"expire_after": "",
@@ -513,6 +521,7 @@
"go_to_search": "",
"group_albums_by": "",
"has_quota": "",
"hi_user": "Բարեւ {name} ({email})",
"hide_gallery": "",
"hide_password": "",
"hide_person": "",
@@ -570,6 +579,8 @@
"manage_your_devices": "",
"manage_your_oauth_connection": "",
"map": "",
"map_assets_in_bound": "{} նկար",
"map_assets_in_bounds": "{} նկարներ",
"map_marker_with_image": "",
"map_settings": "",
"matches": "",
@@ -636,6 +647,7 @@
"partner_can_access": "",
"partner_can_access_assets": "",
"partner_can_access_location": "",
"partner_list_user_photos": "{}-ին նկարները",
"partner_sharing": "",
"partners": "",
"password": "",
@@ -659,7 +671,7 @@
"permanent_deletion_warning_setting_description": "",
"permanently_delete": "",
"permanently_deleted_asset": "",
"photos": "",
"photos": "Նկարներ",
"photos_count": "",
"photos_from_previous_years": "",
"pick_a_location": "",
@@ -707,21 +719,28 @@
"retry_upload": "",
"review_duplicates": "",
"role": "",
"save": "",
"save": "Պահե",
"saved_api_key": "",
"saved_profile": "",
"saved_settings": "",
"say_something": "",
"scan_all_libraries": "",
"scan_library": "Նայե",
"scan_settings": "",
"search": "",
"search": "Փնտրե",
"search_albums": "",
"search_by_context": "",
"search_camera_make": "",
"search_camera_model": "",
"search_city": "",
"search_city": "Որոնե քաղաք…",
"search_country": "",
"search_filter_date": "Ամսաթիվ",
"search_filter_date_interval": "{start} մինչեւ {end}",
"search_filter_location": "Տեղ",
"search_filter_location_title": "Ընտրե տեղ",
"search_for_existing_person": "",
"search_no_people": "Ոչ մի անձ",
"search_page_motion_photos": "Շարժվող Նկարներ",
"search_people": "",
"search_places": "",
"search_state": "",
@@ -738,7 +757,7 @@
"select_keep_all": "",
"select_library_owner": "",
"select_new_face": "",
"select_photos": "",
"select_photos": "Ընտրե նկարներ",
"select_trash_all": "",
"selected": "",
"send_message": "",
@@ -750,13 +769,24 @@
"set_date_of_birth": "",
"set_profile_picture": "",
"set_slideshow_to_fullscreen": "",
"setting_notifications_notify_never": "երբեք",
"setting_notifications_notify_seconds": "{} վայրկյան",
"settings": "",
"settings_saved": "",
"share": "",
"share_add_photos": "Ավելացնել նկարներ",
"shared": "",
"shared_by": "",
"shared_by_you": "",
"shared_from_partner": "",
"shared_link_edit_expire_after_option_day": "1 օր",
"shared_link_edit_expire_after_option_days": "{} օր",
"shared_link_edit_expire_after_option_hour": "1 ժամ",
"shared_link_edit_expire_after_option_hours": "{} ժամ",
"shared_link_edit_expire_after_option_minute": "1 րոպե",
"shared_link_edit_expire_after_option_minutes": "{} րոպե",
"shared_link_edit_expire_after_option_months": "{} ամիս",
"shared_link_edit_expire_after_option_year": "{} տարի",
"shared_links": "",
"shared_photos_and_videos_count": "",
"shared_with_partner": "",
@@ -784,6 +814,8 @@
"slideshow": "",
"slideshow_settings": "",
"sort_albums_by": "",
"sort_oldest": "Ամենահին նկարը",
"sort_recent": "Ամենանոր նկարը",
"stack": "",
"stack_selected_photos": "",
"stacktrace": "",
@@ -808,22 +840,25 @@
"theme_selection": "",
"theme_selection_description": "",
"time_based_memories": "",
"timezone": "",
"timezone": "Ժամային գոտի",
"to_archive": "",
"to_favorite": "",
"to_trash": "Աղբ",
"toggle_settings": "",
"toggle_theme": "",
"total_usage": "",
"trash": "",
"trash": "Աղբ",
"trash_all": "",
"trash_no_results_message": "",
"trash_page_title": "Աղբ ({})",
"trashed_items_will_be_permanently_deleted_after": "",
"type": "",
"type": "Տեսակ",
"unarchive": "",
"unfavorite": "",
"unhide_person": "",
"unknown": "",
"unknown_year": "",
"unknown": "Անհայտ",
"unknown_country": "Անհայտ Երկիր",
"unknown_year": "Անհայտ Տարի",
"unlimited": "",
"unlink_oauth": "",
"unlinked_oauth_account": "",
@@ -835,6 +870,7 @@
"updated_password": "",
"upload": "",
"upload_concurrency": "",
"upload_status_errors": "Սխալներ",
"url": "",
"usage": "",
"user": "",
@@ -846,6 +882,7 @@
"validate": "",
"variables": "",
"version": "",
"version_announcement_closing": "Քո ընկերը՝ Ալեքսը",
"video": "",
"video_hover_setting": "",
"video_hover_setting_description": "",
@@ -857,11 +894,11 @@
"view_next_asset": "",
"view_previous_asset": "",
"waiting": "",
"week": "",
"welcome": "",
"week": "Շաբաթ",
"welcome": "Բարի գալուստ",
"welcome_to_immich": "",
"year": "",
"yes": "",
"year": "Տարի",
"yes": "Այո",
"you_dont_have_any_shared_links": "",
"zoom_image": ""
}

View File

@@ -192,26 +192,22 @@
"oauth_auto_register": "Pendaftaran otomatis",
"oauth_auto_register_description": "Daftar pengguna baru secara otomatis setelah log masuk dengan OAuth",
"oauth_button_text": "Teks tombol",
"oauth_client_id": "ID Klien",
"oauth_client_secret": "Rahasia Klien",
"oauth_client_secret_description": "Diperlukan jika PKCE (Proof Key for Code Exchange) tidak didukung oleh penyedia OAuth",
"oauth_enable_description": "Log masuk dengan OAuth",
"oauth_issuer_url": "URL Penerbit",
"oauth_mobile_redirect_uri": "URI pengalihan ponsel",
"oauth_mobile_redirect_uri_override": "Penimpaan URI penerusan ponsel",
"oauth_mobile_redirect_uri_override_description": "Aktifkan ketika provider OAuth tidak mengizinkan tautan mobile, seperti '{callback}'",
"oauth_profile_signing_algorithm": "Algoritma penandatanganan profil",
"oauth_profile_signing_algorithm_description": "Algoritma yang digunakan untuk menandatangani profil pengguna.",
"oauth_scope": "Cakupan",
"oauth_settings": "OAuth",
"oauth_settings_description": "Kelola pengaturan log masuk OAuth",
"oauth_settings_more_details": "Untuk detail lanjut tentang fitur ini, lihat <link>docs</link>.",
"oauth_signing_algorithm": "Algoritma penandatanganan",
"oauth_storage_label_claim": "Klaim label penyimpanan",
"oauth_storage_label_claim_description": "Atur label penyimpanan pengguna menjadi nilai klaim ini secara otomatis.",
"oauth_storage_quota_claim": "Klaim kuota penyimpanan",
"oauth_storage_quota_claim_description": "Atur kuota penyimpanan pengguna menjadi nilai klaim ini secara otomatis.",
"oauth_storage_quota_default": "Kuota penyimpanan bawaan (GiB)",
"oauth_storage_quota_default_description": "Kuota dalam GiB untuk digunakan ketika tidak ada klaim yang disediakan (Masukkan 0 untuk kuota tidak terbatas).",
"oauth_timeout": "Waktu Permintaan Habis",
"oauth_timeout_description": "Waktu habis untuk permintaan dalam milidetik",
"offline_paths": "Jalur Luring",
"offline_paths_description": "Hasil ini dapat terjadi karena penghapusan berkas manual yang tidak menjadi bagian dari pustaka eksternal.",
"password_enable_description": "Masuk dengan surel dan kata sandi",
@@ -374,7 +370,7 @@
"advanced_settings_enable_alternate_media_filter_subtitle": "Gunakan opsi ini untuk menyaring media saat sinkronisasi berdasarkan kriteria alternatif. Hanya coba ini dengan aplikasi mendeteksi semua album.",
"advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTAL] Gunakan saringan sinkronisasi album perangkat alternatif",
"advanced_settings_log_level_title": "Tingkat log: {}",
"advanced_settings_prefer_remote_subtitle": "Beberapa perangkat tidak dapat memuat thumbnail dengan cepat.\nMenyalakan ini akan memuat thumbnail dari server.",
"advanced_settings_prefer_remote_subtitle": "Beberapa perangkat tidak dapat memuat gambar kecil dengan cepat. Menyalakan ini akan memuat gambar kecil dari server.",
"advanced_settings_prefer_remote_title": "Prefer remote images",
"advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request",
"advanced_settings_proxy_headers_title": "Proxy Headers",
@@ -481,18 +477,18 @@
"assets_added_to_album_count": "Ditambahkan {count, plural, one {# aset} other {# aset}} ke album",
"assets_added_to_name_count": "Ditambahkan {count, plural, one {# aset} other {# aset}} ke {hasName, select, true {<b>{name}</b>} other {album baru}}",
"assets_count": "{count, plural, one {# aset} other {# aset}}",
"assets_deleted_permanently": "{} asset dihapus secara permanen",
"assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server",
"assets_deleted_permanently": "{} aset dihapus secara permanen",
"assets_deleted_permanently_from_server": "{} aset dihapus secara permanen dari server Immich",
"assets_moved_to_trash_count": "Dipindahkan {count, plural, one {# aset} other {# aset}} ke sampah",
"assets_permanently_deleted_count": "{count, plural, one {# aset} other {# aset}} dihapus secara permanen",
"assets_removed_count": "{count, plural, one {# aset} other {# aset}} dihapus",
"assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device",
"assets_removed_permanently_from_device": "{} aset dihapus secara permanen dari perangkat Anda",
"assets_restore_confirmation": "Apakah Anda yakin ingin memulihkan semua aset yang dibuang? Anda tidak dapat mengurungkan tindakan ini! Perlu diingat bahwa aset luring tidak dapat dipulihkan.",
"assets_restored_count": "{count, plural, one {# aset} other {# aset}} dipulihkan",
"assets_restored_successfully": "{} asset(s) restored successfully",
"assets_trashed": "{} asset(s) trashed",
"assets_restored_successfully": "{} aset berhasil dipulihkan",
"assets_trashed": "{} aset dipindahkan ke sampah",
"assets_trashed_count": "{count, plural, one {# aset} other {# aset}} dibuang ke sampah",
"assets_trashed_from_server": "{} asset(s) trashed from the Immich server",
"assets_trashed_from_server": "{} aset dipindahkan ke sampah dari server Immich",
"assets_were_part_of_album_count": "{count, plural, one {Aset telah} other {Aset telah}} menjadi bagian dari album",
"authorized_devices": "Perangkat Terautentikasi",
"automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere",
@@ -501,19 +497,19 @@
"back_close_deselect": "Kembali, tutup, atau batalkan pemilihan",
"background_location_permission": "Background location permission",
"background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name",
"backup_album_selection_page_albums_device": "Album perangkat ({})",
"backup_album_selection_page_albums_device": "Album di perangkat ({})",
"backup_album_selection_page_albums_tap": "Sentuh untuk memilih, sentuh 2x untuk mengecualikan",
"backup_album_selection_page_assets_scatter": "Aset dapat tersebar dalam banyak album. Sehingga album dapat dipilih atau dikecualikan saat proses pencadangan.",
"backup_album_selection_page_select_albums": "Pilih album",
"backup_album_selection_page_selection_info": "Album terpilih: ",
"backup_album_selection_page_selection_info": "Info Pilihan",
"backup_album_selection_page_total_assets": "Total aset unik",
"backup_all": "Semua",
"backup_background_service_backup_failed_message": "Gagal mencadangkan aset. Mencoba lagi...",
"backup_background_service_connection_failed_message": "Koneksi ke server gagal. Mencoba ulang...",
"backup_background_service_backup_failed_message": "Gagal mencadangkan aset. Mencoba lagi",
"backup_background_service_connection_failed_message": "Koneksi ke server gagal. Mencoba ulang",
"backup_background_service_current_upload_notification": "Mengunggah {}",
"backup_background_service_default_notification": "Memeriksa aset baru...",
"backup_background_service_default_notification": "Memeriksa aset baru",
"backup_background_service_error_title": "Backup error",
"backup_background_service_in_progress_notification": "Mencadangkan asetmu...",
"backup_background_service_in_progress_notification": "Mencadangkan asetmu",
"backup_background_service_upload_failure_notification": "Gagal mengunggah {}",
"backup_controller_page_albums": "Cadangkan album",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
@@ -525,13 +521,13 @@
"backup_controller_page_background_battery_info_title": "Optimisasi baterai",
"backup_controller_page_background_charging": "Hanya saat mengisi daya",
"backup_controller_page_background_configure_error": "Gagal mengatur layanan latar belakang",
"backup_controller_page_background_delay": "Tunda cadangkan aset baru: {}",
"backup_controller_page_background_delay": "Tunda pencadangan aset baru: {}",
"backup_controller_page_background_description": "Aktifkan layanan latar belakang untuk mencadangkan aset baru secara otomatis tanpa perlu membuka app",
"backup_controller_page_background_is_off": "Pencadangan otomatis di latar belakang nonaktif",
"backup_controller_page_background_is_on": "Pencadangan otomatis di latar belakang aktif",
"backup_controller_page_background_turn_off": "Matikan layanan latar belakang",
"backup_controller_page_background_turn_on": "Nyalakan layanan latar belakang",
"backup_controller_page_background_wifi": "Hanya melalui WiFi",
"backup_controller_page_background_wifi": "Hanya melalui Wi-Fi",
"backup_controller_page_backup": "Cadangkan",
"backup_controller_page_backup_selected": "Terpilih: ",
"backup_controller_page_backup_sub": "Foto dan video yang dicadangkan",
@@ -549,7 +545,7 @@
"backup_controller_page_start_backup": "Mulai Cadangkan",
"backup_controller_page_status_off": "Pencadangan otomatis di latar depan nonaktif",
"backup_controller_page_status_on": "Pencadangan otomatis di latar depan aktif",
"backup_controller_page_storage_format": "{} dari {} terpakai",
"backup_controller_page_storage_format": "{} dari {} digunakan",
"backup_controller_page_to_backup": "Album untuk dicadangkan",
"backup_controller_page_total_sub": "Semua foto dan video unik dari album terpilih",
"backup_controller_page_turn_off": "Nonaktifkan pencadangan latar depan",
@@ -574,13 +570,13 @@
"bulk_keep_duplicates_confirmation": "Apakah Anda yakin ingin menyimpan {count, plural, one {# aset duplikat} other {# aset duplikat}}? Ini akan menyelesaikan semua kelompok duplikat tanpa menghapus apa pun.",
"bulk_trash_duplicates_confirmation": "Apakah Anda yakin ingin membuang {count, plural, one {# aset duplikat} other {# aset duplikat}} secara bersamaan? Ini akan menyimpan aset terbesar dari setiap kelompok dan membuang semua duplikat lainnya.",
"buy": "Beli Immich",
"cache_settings_album_thumbnails": "Library page thumbnails ({} assets)",
"cache_settings_album_thumbnails": "Thumbnail halaman pustaka ({} aset)",
"cache_settings_clear_cache_button": "Hapus cache",
"cache_settings_clear_cache_button_title": "Membersihkan cache aplikasi. Performa aplikasi akan terpengaruh hingga cache dibuat kembali.",
"cache_settings_duplicated_assets_clear_button": "BERSIHKAN",
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
"cache_settings_duplicated_assets_title": "Aset Ganda ({})",
"cache_settings_image_cache_size": "Image cache size ({} assets)",
"cache_settings_duplicated_assets_title": "Aset Duplikat ({})",
"cache_settings_image_cache_size": "Ukuran cache gambar ({} aset)",
"cache_settings_statistics_album": "Pustaka thumbnail",
"cache_settings_statistics_assets": "{} aset ({})",
"cache_settings_statistics_full": "Full images",
@@ -610,7 +606,7 @@
"change_password": "Ubah Kata Sandi",
"change_password_description": "Ini merupakan pertama kali Anda masuk ke sistem atau ada permintaan untuk mengubah kata sandi Anda. Silakan masukkan kata sandi baru di bawah.",
"change_password_form_confirm_password": "Konfirmasi Sandi",
"change_password_form_description": "Halo {name},\n\nIni pertama kali anda masuk ke dalam sistem atau terdapat permintaan penggantian password.\nHarap masukkan password baru.",
"change_password_form_description": "Halo {name},\n\nIni pertama kali anda masuk ke dalam sistem atau terdapat permintaan penggantian kata sandi. Harap masukkan password baru.",
"change_password_form_new_password": "Sandi Baru",
"change_password_form_password_mismatch": "Sandi tidak cocok",
"change_password_form_reenter_new_password": "Masukkan Ulang Sandi Baru",
@@ -818,7 +814,7 @@
"enabled": "Diaktifkan",
"end_date": "Tanggal akhir",
"enqueued": "Enqueued",
"enter_wifi_name": "Enter WiFi name",
"enter_wifi_name": "Masukkan nama Wi-Fi",
"error": "Eror",
"error_change_sort_album": "Failed to change album sort order",
"error_delete_face": "Terjadi kesalahan menghapus wajah dari aset",
@@ -958,7 +954,7 @@
"exif_bottom_sheet_people": "ORANG",
"exif_bottom_sheet_person_add_person": "Tambah nama",
"exif_bottom_sheet_person_age": "Umur {}",
"exif_bottom_sheet_person_age_months": "Umur {} months",
"exif_bottom_sheet_person_age_months": "Umur {} bulan",
"exif_bottom_sheet_person_age_year_months": "Umur 1 tahun, {} bulan",
"exif_bottom_sheet_person_age_years": "Umur {}",
"exit_slideshow": "Keluar dari Salindia",
@@ -978,7 +974,7 @@
"external": "Eksternal",
"external_libraries": "Pustaka Eksternal",
"external_network": "External network",
"external_network_sheet_info": "When not on the preferred Wi-Fi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom",
"external_network_sheet_info": "Ketika tidak berada di jaringan Wi-Fi yang disukai, aplikasi akan terhubung ke server melalui URL pertama di bawah ini yang dapat dijangkaunya, mulai dari atas ke bawah",
"face_unassigned": "Tidak ada nama",
"failed": "Failed",
"failed_to_load_assets": "Gagal memuat aset",
@@ -1045,7 +1041,7 @@
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
"home_page_favorite_err_partner": "Can not favorite partner assets yet, skipping",
"home_page_first_time_notice": "Jika ini pertama kali Anda menggunakan aplikasi, pastikan untuk memilik album untuk dicadangkan agar linimasa anda terisi oleh foto dan video dalam album.",
"home_page_first_time_notice": "Jika ini pertama kali Anda menggunakan aplikasi, pastikan untuk memiliki album untuk dicadangkan agar lini masa anda terisi oleh foto dan video dalam album",
"home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_upload_err_limit": "Hanya dapat mengunggah maksimal 30 aset dalam satu waktu, melewatkan",
"host": "Hos",
@@ -1125,7 +1121,7 @@
"local_network": "Local network",
"local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network",
"location_permission": "Location permission",
"location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name",
"location_permission_content": "Untuk menggunakan fitur pengalihan otomatis, Immich memerlukan izin lokasi yang akurat agar dapat membaca nama jaringan Wi-Fi saat ini",
"location_picker_choose_on_map": "Pilih di peta",
"location_picker_latitude_error": "Masukkan lintang yang sah",
"location_picker_latitude_hint": "Masukkan lintang di sini",
@@ -1149,7 +1145,7 @@
"login_form_err_trailing_whitespace": "Trailing whitespace",
"login_form_failed_get_oauth_server_config": "Gagal logging menggunakan OAuth, periksa URL server",
"login_form_failed_get_oauth_server_disable": "Fitur OAuth tidak tersedia di server ini",
"login_form_failed_login": "Login gagal. Periksa URL server, email dan password.",
"login_form_failed_login": "Login gagal, periksa URL server, email dan kata sandi",
"login_form_handshake_exception": "There was an Handshake Exception with the server. Enable self-signed certificate support in the settings if you are using a self-signed certificate.",
"login_form_password_hint": "sandi",
"login_form_save_login": "Ingat saya",
@@ -1548,7 +1544,7 @@
"search_result_page_new_search_hint": "Pencarian Baru",
"search_settings": "Pengaturan pencarian",
"search_state": "Cari negara bagian...",
"search_suggestion_list_smart_search_hint_1": "Penelusuran cerdas aktif secara bawaan. Untuk menelusuri metadata, gunakan sintaks",
"search_suggestion_list_smart_search_hint_1": "Penelusuran cerdas aktif secara bawaan. Untuk menelusuri metadata, gunakan sintaks ",
"search_suggestion_list_smart_search_hint_2": "m:penelusuran-kamu",
"search_tags": "Cari tag...",
"search_timezone": "Cari zona waktu...",
@@ -1598,7 +1594,7 @@
"setting_languages_apply": "Terapkan",
"setting_languages_subtitle": "Change the app's language",
"setting_languages_title": "Bahasa",
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
"setting_notifications_notify_failures_grace_period": "Beritahu kegagalan cadangan latar belakang: {}",
"setting_notifications_notify_hours": "{} jam",
"setting_notifications_notify_immediately": "segera",
"setting_notifications_notify_minutes": "{} menit",
@@ -1617,7 +1613,7 @@
"settings_saved": "Pengaturan disimpan",
"share": "Bagikan",
"share_add_photos": "Tambah foto",
"share_assets_selected": "{} terpilih",
"share_assets_selected": "{} dipilih",
"share_dialog_preparing": "Menyiapkan...",
"shared": "Dibagikan",
"shared_album_activities_input_disable": "Comment is disabled",
@@ -1631,10 +1627,10 @@
"shared_by_user": "Dibagikan oleh {user}",
"shared_by_you": "Dibagikan oleh Anda",
"shared_from_partner": "Foto dari {partner}",
"shared_intent_upload_button_progress_text": "{} / {} Uploaded",
"shared_intent_upload_button_progress_text": "{} / {} Diunggah",
"shared_link_app_bar_title": "Link Berbagi",
"shared_link_clipboard_copied_massage": "Tersalin ke papan klip",
"shared_link_clipboard_text": "Tautan: {}\nSandi: {}",
"shared_link_clipboard_text": "Tautan: {}\nKata Sandi: {}",
"shared_link_create_error": "Terjadi kesalahan saat membuat link berbagi",
"shared_link_edit_description_hint": "Masukkan deskripsi link",
"shared_link_edit_expire_after_option_day": "1 hari",
@@ -1834,7 +1830,7 @@
"upload_status_errors": "Eror",
"upload_status_uploaded": "Diunggah",
"upload_success": "Pengunggahan berhasil, muat ulang laman untuk melihat aset terunggah yang baru.",
"upload_to_immich": "Upload to Immich ({})",
"upload_to_immich": "Unggah ke Immich ({})",
"uploading": "Uploading",
"url": "URL",
"usage": "Penggunaan",
@@ -1891,11 +1887,11 @@
"week": "Pekan",
"welcome": "Selamat datang",
"welcome_to_immich": "Selamat datang di Immich",
"wifi_name": "WiFi Name",
"wifi_name": "Nama Wi-Fi",
"year": "Tahun",
"years_ago": "{years, plural, one {# tahun} other {# tahun}} yang lalu",
"yes": "Ya",
"you_dont_have_any_shared_links": "Anda tidak memiliki tautan terbagi",
"your_wifi_name": "Your WiFi name",
"your_wifi_name": "Nama Wi-Fi Anda",
"zoom_image": "Perbesar Gambar"
}

View File

@@ -39,11 +39,11 @@
"authentication_settings_disable_all": "Sei sicuro di voler disabilitare tutte le modalità di accesso? Il login verrà disabilitato completamente.",
"authentication_settings_reenable": "Per ri-abilitare, utilizza un <link>Comando Server</link>.",
"background_task_job": "Attività in Background",
"backup_database": "Database di Backup",
"backup_database": "Crea Dump Database",
"backup_database_enable_description": "Abilita i backup del database",
"backup_keep_last_amount": "Quantità di backup precedenti da mantenere",
"backup_settings": "Impostazioni di backup",
"backup_settings_description": "Gestisci le impostazioni dei backup",
"backup_keep_last_amount": "Numero di backup da mantenere",
"backup_settings": "Impostazioni Dump database",
"backup_settings_description": "Gestisci le impostazioni dei backup. Nota: Questi jobs non sono monitorati e non riceverai notifiche in caso di errore.",
"check_all": "Controlla Tutto",
"cleanup": "Pulisci",
"cleared_jobs": "Cancellati i processi per: {job}",
@@ -192,26 +192,21 @@
"oauth_auto_register": "Registrazione automatica",
"oauth_auto_register_description": "Automaticamente registra nuovi utenti dopo il login OAuth",
"oauth_button_text": "Testo pulsante",
"oauth_client_id": "ID Cliente",
"oauth_client_secret": "Chiave segreta client",
"oauth_client_secret_description": "Richiesto se PKCE (Proof Key for Code Exchange) non è supportato dal provider OAuth",
"oauth_enable_description": "Login con OAuth",
"oauth_issuer_url": "URL emittente",
"oauth_mobile_redirect_uri": "URI reindirizzamento mobile",
"oauth_mobile_redirect_uri_override": "Sovrascrivi URI reindirizzamento cellulare",
"oauth_mobile_redirect_uri_override_description": "Abilita quando il gestore OAuth non consente un URL come '{callback}'",
"oauth_profile_signing_algorithm": "Algoritmo firma profilo",
"oauth_profile_signing_algorithm_description": "L'algoritmo usato per firmare il profilo utente.",
"oauth_scope": "Ambito di autorizzazione",
"oauth_settings": "OAuth",
"oauth_settings_description": "Gestisci impostazioni di login OAuth",
"oauth_settings_more_details": "Per più dettagli riguardo a questa funzionalità, consulta <link>la documentazione</link>.",
"oauth_signing_algorithm": "Algoritmo di firma",
"oauth_storage_label_claim": "Dichiarazione di ambito(claim) etichetta archiviazione",
"oauth_storage_label_claim_description": "Imposta automaticamente l'etichetta dell'archiviazione dell'utente al valore di questa dichiarazione di ambito(claim).",
"oauth_storage_quota_claim": "Dichiarazione di ambito(claim) limite archiviazione",
"oauth_storage_quota_claim_description": "Imposta automaticamente il limite di archiviazione dell'utente in base al valore di questa dichiarazione di ambito(claim).",
"oauth_storage_quota_default": "Limite predefinito di archiviazione (GiB)",
"oauth_storage_quota_default_description": "Limite in GiB da usare quanto nessuna dichiarazione di ambito(claim) è stata fornita (Inserisci 0 per archiviazione illimitata).",
"oauth_timeout": "",
"offline_paths": "Percorsi offline",
"offline_paths_description": "Questi risultati potrebbero essere dovuti all'eliminazione manuale di file che non fanno parte di una libreria esterna.",
"password_enable_description": "Login con email e password",
@@ -481,12 +476,12 @@
"assets_added_to_album_count": "{count, plural, one {# asset aggiunto} other {# asset aggiunti}} all'album",
"assets_added_to_name_count": "Aggiunti {count, plural, one {# asset} other {# assets}} a {hasName, select, true {<b>{name}</b>} other {new album}}",
"assets_count": "{count, plural, other {# asset}}",
"assets_deleted_permanently": "{} elementi rimossi definitivamente",
"assets_deleted_permanently_from_server": "{} elementi rimossi definitivamente dal server Immich",
"assets_deleted_permanently": "{} elementi cancellati definitivamente",
"assets_deleted_permanently_from_server": "{} elementi cancellati definitivamente dal server Immich",
"assets_moved_to_trash_count": "{count, plural, one {# asset spostato} other {# asset spostati}} nel cestino",
"assets_permanently_deleted_count": "{count, plural, one {# asset cancellato} other {# asset cancellati}} definitivamente",
"assets_removed_count": "{count, plural, one {# asset rimosso} other {# asset rimossi}}",
"assets_removed_permanently_from_device": "{} elementi rimossi definitivamente dal tuo dispositivo",
"assets_removed_permanently_from_device": "{} elementi cancellati definitivamente dal tuo dispositivo",
"assets_restore_confirmation": "Sei sicuro di voler ripristinare tutti gli asset cancellati? Non puoi annullare questa azione! Tieni presente che eventuali risorse offline NON possono essere ripristinate in questo modo.",
"assets_restored_count": "{count, plural, one {# asset ripristinato} other {# asset ripristinati}}",
"assets_restored_successfully": "{} elementi ripristinati",
@@ -531,7 +526,7 @@
"backup_controller_page_background_is_on": "Backup automatico attivo",
"backup_controller_page_background_turn_off": "Disabilita servizi in background",
"backup_controller_page_background_turn_on": "Abilita servizi in background",
"backup_controller_page_background_wifi": "Solo su WiFi",
"backup_controller_page_background_wifi": "Solo Wi-Fi",
"backup_controller_page_backup": "Backup",
"backup_controller_page_backup_selected": "Selezionati: ",
"backup_controller_page_backup_sub": "Foto e video caricati",
@@ -853,10 +848,12 @@
"failed_to_keep_this_delete_others": "Impossibile conservare questa risorsa ed eliminare le altre risorse",
"failed_to_load_asset": "Errore durante il caricamento della risorsa",
"failed_to_load_assets": "Errore durante il caricamento delle risorse",
"failed_to_load_notifications": "Errore nel caricamento delle notifiche",
"failed_to_load_people": "Caricamento delle persone non riuscito",
"failed_to_remove_product_key": "Rimozione del codice del prodotto fallita",
"failed_to_stack_assets": "Errore durante il raggruppamento degli assets",
"failed_to_unstack_assets": "Errore durante la separazione degli assets",
"failed_to_update_notification_status": "Aggiornamento stato notifiche fallito",
"import_path_already_exists": "Questo percorso di importazione già esiste.",
"incorrect_email_or_password": "Email o password non corretta",
"paths_validation_failed": "{paths, plural, one {# percorso} other {# percorsi}} hanno fallito la validazione",
@@ -1125,7 +1122,7 @@
"local_network": "Rete locale",
"local_network_sheet_info": "L'app si collegherà al server tramite questo URL quando è in uso la rete Wi-Fi specificata",
"location_permission": "Permesso di localizzazione",
"location_permission_content": "Per usare la funzione di cambio automatico, Immich necessita del permesso di localizzazione precisa così da poter leggere il nome della rete Wi-Fi in uso",
"location_permission_content": "Per usare la funzione di cambio automatico, Immich necessita del permesso di localizzazione così da poter leggere il nome della rete Wi-Fi in uso",
"location_picker_choose_on_map": "Scegli una mappa",
"location_picker_latitude_error": "Inserisci una latitudine valida",
"location_picker_latitude_hint": "Inserisci la tua latitudine qui",
@@ -1199,6 +1196,9 @@
"map_settings_only_show_favorites": "Mostra solo preferiti",
"map_settings_theme_settings": "Tema della mappa",
"map_zoom_to_see_photos": "Riduci lo zoom per vedere le foto",
"mark_all_as_read": "Segna tutto come letto",
"mark_as_read": "Segna come letto",
"marked_all_as_read": "Segnato tutto come letto",
"matches": "Corrispondenze",
"media_type": "Tipo Media",
"memories": "Ricordi",
@@ -1225,6 +1225,7 @@
"month": "Mese",
"monthly_title_text_date_format": "MMMM y",
"more": "Di più",
"moved_to_archive": "",
"moved_to_trash": "Spostato nel cestino",
"multiselect_grid_edit_date_time_err_read_only": "Non puoi modificare la data di risorse in sola lettura, azione ignorata",
"multiselect_grid_edit_gps_err_read_only": "Non puoi modificare la posizione di risorse in sola lettura, azione ignorata",
@@ -1257,6 +1258,8 @@
"no_favorites_message": "Aggiungi preferiti per trovare facilmente le tue migliori foto e video",
"no_libraries_message": "Crea una libreria esterna per vedere le tue foto e i tuoi video",
"no_name": "Nessun nome",
"no_notifications": "Nessuna notifica",
"no_people_found": "Nessuna persona trovata",
"no_places": "Nessun posto",
"no_results": "Nessun risultato",
"no_results_description": "Prova ad usare un sinonimo oppure una parola chiave più generica",
@@ -1432,6 +1435,8 @@
"recent_searches": "Ricerche recenti",
"recently_added": "Aggiunti recentemente",
"recently_added_page_title": "Aggiunti di recente",
"recently_taken": "Scattate di recente",
"recently_taken_page_title": "Scattate di Recente",
"refresh": "Aggiorna",
"refresh_encoded_videos": "Ricarica video codificati",
"refresh_faces": "Aggiorna facce",
@@ -1566,6 +1571,7 @@
"select_keep_all": "Seleziona mantieni tutto",
"select_library_owner": "Seleziona proprietario libreria",
"select_new_face": "Seleziona nuovo volto",
"select_person_to_tag": "Seleziona una persona da taggare",
"select_photos": "Seleziona foto",
"select_trash_all": "Seleziona cestina tutto",
"select_user_for_sharing_page_err_album": "Impossibile nel creare l'album",
@@ -1629,7 +1635,7 @@
"shared_by_user": "Condiviso da {user}",
"shared_by_you": "Condiviso da te",
"shared_from_partner": "Foto da {partner}",
"shared_intent_upload_button_progress_text": "{} / {} Inviati",
"shared_intent_upload_button_progress_text": "{} / {} Caricati",
"shared_link_app_bar_title": "Link condivisi",
"shared_link_clipboard_copied_massage": "Copiato negli appunti",
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
@@ -1646,9 +1652,9 @@
"shared_link_edit_password_hint": "Inserire la password di condivisione",
"shared_link_edit_submit_button": "Aggiorna link",
"shared_link_error_server_url_fetch": "Non è possibile trovare l'indirizzo del server",
"shared_link_expires_day": "Scade tra {} giorno",
"shared_link_expires_day": "Scade tra {} giorni",
"shared_link_expires_days": "Scade tra {} giorni",
"shared_link_expires_hour": "Scade tra {} ora",
"shared_link_expires_hour": "Scade tra {} ore",
"shared_link_expires_hours": "Scade tra {} ore",
"shared_link_expires_minute": "Scade tra {} minuto",
"shared_link_expires_minutes": "Scade tra {} minuti",
@@ -1832,7 +1838,7 @@
"upload_status_errors": "Errori",
"upload_status_uploaded": "Caricato",
"upload_success": "Caricamento completato con successo, aggiorna la pagina per vedere i nuovi asset caricati.",
"upload_to_immich": "Invio ad Immich ({})",
"upload_to_immich": "Carica su Immich ({})",
"uploading": "Caricamento",
"url": "URL",
"usage": "Utilizzo",
@@ -1889,7 +1895,7 @@
"week": "Settimana",
"welcome": "Benvenuto",
"welcome_to_immich": "Benvenuto in Immich",
"wifi_name": "Nome della rete Wi-Fi",
"wifi_name": "Nome rete Wi-Fi",
"year": "Anno",
"years_ago": "{years, plural, one {# anno} other {# anni}} fa",
"yes": "Si",

View File

@@ -1,5 +1,5 @@
{
"about": "アプリについて",
"about": "このアプリについて",
"account": "アカウント",
"account_settings": "アカウント設定",
"acknowledge": "了解",
@@ -28,7 +28,7 @@
"add_to_album_bottom_sheet_already_exists": "{album}に追加済み",
"add_to_shared_album": "共有アルバムに追加",
"add_url": "URLを追加",
"added_to_archive": "アーカイブに追加済",
"added_to_archive": "アーカイブにしました",
"added_to_favorites": "お気に入りに追加済",
"added_to_favorites_count": "{count, number} 枚の画像をお気に入りに追加済",
"admin": {
@@ -39,11 +39,11 @@
"authentication_settings_disable_all": "本当に全てのログイン方法を無効にしますか? ログインは完全に無効になります。",
"authentication_settings_reenable": "再び有効にするには、<link>サーバーコマンド</link>を使用してください。",
"background_task_job": "バックグラウンドタスク",
"backup_database": "データベースのバックアップ",
"backup_database_enable_description": "データベースバックアップを有効にする",
"backup_database": "データベースのバックアップを作成",
"backup_database_enable_description": "データベースバックアップの作成を有効にする",
"backup_keep_last_amount": "過去のバックアップの保持数",
"backup_settings": "バックアップ設定",
"backup_settings_description": "データベースのバックアップ設定の管理",
"backup_settings": "データベースバックアップ作成の設定",
"backup_settings_description": "データベースのバックアップ作成設定の管理 (このジョブはモニタリングされませんし、失敗が発生してもあなたに通知が行くことはありません)",
"check_all": "すべてを選択",
"cleanup": "クリーンアップ",
"cleared_jobs": "{job}のジョブをクリアしました",
@@ -72,6 +72,7 @@
"image_format_description": "WebPはJPEGよりもファイルサイズが小さいですが、エンコードに時間がかかります。",
"image_fullsize_description": "画像を拡大する時に使われるメタデータを取り除いた原寸大画像",
"image_fullsize_enabled": "原寸大画像生成を有効にする",
"image_fullsize_enabled_description": "Webで表示が難しいとされる画像フォーマットに対して原寸大画像を生成する。",
"image_fullsize_quality_description": "1から100まで原寸大画像の質です。高いほうがいいがファイルが大きくなります。",
"image_fullsize_title": "原寸大画像設定",
"image_prefer_embedded_preview": "埋め込みプレビューを優先",
@@ -191,20 +192,13 @@
"oauth_auto_register": "自動登録",
"oauth_auto_register_description": "OAuthでサインインしたあと、自動的に新規ユーザーを登録する",
"oauth_button_text": "ボタンテキスト",
"oauth_client_id": "クライアントID",
"oauth_client_secret": "クライアント シークレット",
"oauth_enable_description": "OAuthでログイン",
"oauth_issuer_url": "発行元URL",
"oauth_mobile_redirect_uri": "モバイル用リダイレクトURI",
"oauth_mobile_redirect_uri_override": "モバイル用リダイレクトURI上書き",
"oauth_mobile_redirect_uri_override_description": "'{callback}'など、モバイルURIがOAuthプロバイダーによって許可されていない場合に有効にしてください",
"oauth_profile_signing_algorithm": "プロファイルの署名アルゴリズム",
"oauth_profile_signing_algorithm_description": "ユーザープロファイルを署名するのに使用するアルゴリズム。",
"oauth_scope": "スコープ",
"oauth_settings": "OAuth",
"oauth_settings_description": "OAuthログイン設定を管理します",
"oauth_settings_more_details": "この機能の詳細については、<link>ドキュメント</link>を参照してください。",
"oauth_signing_algorithm": "署名アルゴリズム",
"oauth_storage_label_claim": "ストレージラベル クレーム",
"oauth_storage_label_claim_description": "ユーザーのストレージラベルを、このクレームの値に自動的に設定します。",
"oauth_storage_quota_claim": "ストレージクォータ クレーム",
@@ -370,6 +364,8 @@
"admin_password": "管理者パスワード",
"administration": "管理",
"advanced": "詳細設定",
"advanced_settings_enable_alternate_media_filter_subtitle": "別の基準に従ってメディアファイルにフィルターをかけて、同期を行います。アプリがすべてのアルバムを読み込んでくれない場合にのみ、この機能を試してください。",
"advanced_settings_enable_alternate_media_filter_title": "[試験運用] 別のデバイスのアルバム同期フィルターを使用する",
"advanced_settings_log_level_title": "ログレベル: {}",
"advanced_settings_prefer_remote_subtitle": "デバイスによっては、デバイス上にあるサムネイルのロードに非常に時間がかかることがあります。このオプションをに有効にする事により、サーバーから直接画像をロードすることが可能です。",
"advanced_settings_prefer_remote_title": "リモートを優先する",
@@ -377,6 +373,8 @@
"advanced_settings_proxy_headers_title": "プロキシヘッダ",
"advanced_settings_self_signed_ssl_subtitle": "SSLのチェックをスキップする。自己署名証明書が必要です。",
"advanced_settings_self_signed_ssl_title": "自己署名証明書を許可する",
"advanced_settings_sync_remote_deletions_subtitle": "Webでこの操作を行った際に、自動的にこのデバイス上から当該アセットを削除または復元する",
"advanced_settings_sync_remote_deletions_title": "リモート削除の同期 [試験運用]",
"advanced_settings_tile_subtitle": "追加ユーザー設定",
"advanced_settings_troubleshooting_subtitle": "トラブルシューティング用の詳細設定をオンにする",
"advanced_settings_troubleshooting_title": "トラブルシューティング",
@@ -399,8 +397,8 @@
"album_remove_user_confirmation": "本当に{user}を削除しますか?",
"album_share_no_users": "このアルバムを全てのユーザーと共有したか、共有するユーザーがいないようです。",
"album_thumbnail_card_item": "1枚",
"album_thumbnail_card_items": "{}",
"album_thumbnail_card_shared": "共有済み",
"album_thumbnail_card_items": "{}項目",
"album_thumbnail_card_shared": " · 共有済み",
"album_thumbnail_shared_by": "{}が共有中",
"album_updated": "アルバム更新",
"album_updated_setting_description": "共有アルバムに新しいアセットが追加されたとき通知を受け取る",
@@ -431,18 +429,18 @@
"api_key_description": "この値は一回のみ表示されます。 ウィンドウを閉じる前に必ずコピーしてください。",
"api_key_empty": "APIキー名は空白にできません",
"api_keys": "APIキー",
"app_bar_signout_dialog_content": " サインアウトしますか?",
"app_bar_signout_dialog_content": "サインアウトしますか?",
"app_bar_signout_dialog_ok": "はい",
"app_bar_signout_dialog_title": " サインアウト",
"app_bar_signout_dialog_title": "サインアウト",
"app_settings": "アプリ設定",
"appears_in": "これらに含まれます",
"archive": "アーカイブ",
"archive_or_unarchive_photo": "写真をアーカイブまたはアーカイブ解除",
"archive_page_no_archived_assets": "アーカイブ済みの写真またはビデオがありません",
"archive_page_title": "アーカイブ({})",
"archive_page_no_archived_assets": "アーカイブした写真またはビデオがありません",
"archive_page_title": "アーカイブ ({})",
"archive_size": "アーカイブサイズ",
"archive_size_description": "ダウンロードのアーカイブ サイズを設定(GiB 単位)",
"archived": "アーカイブ済み",
"archived": "アーカイブ",
"archived_count": "アーカイブされた{count, plural, other {#個の項目}}",
"are_these_the_same_person": "これらは同じ人物ですか?",
"are_you_sure_to_do_this": "本当にこれを行いますか?",
@@ -478,10 +476,10 @@
"assets_count": "{count, plural, one {#個} other {#個}}のアセット",
"assets_deleted_permanently": "{}項目を完全に削除しました",
"assets_deleted_permanently_from_server": "サーバー上の{}項目を完全に削除しました",
"assets_moved_to_trash_count": "{count, plural, one {#} other {#個}}のアセットをごみ箱に移動しました",
"assets_moved_to_trash_count": "{count, plural, one {#項目} other {#項目}}をゴミ箱に移動しました",
"assets_permanently_deleted_count": "{count, plural, one {#個} other {#個}}のアセットを完全に削除しました",
"assets_removed_count": "{count, plural, one {#} other {#個}}のアセットを削除しました",
"assets_removed_permanently_from_device": "端末から{}項目を完全に削除しました",
"assets_removed_count": "{count, plural, one {#項目} other {#項目}}を削除しました",
"assets_removed_permanently_from_device": "デバイスから{}項目を完全に削除しました",
"assets_restore_confirmation": "ごみ箱のアセットをすべて復元してもよろしいですか? この操作を元に戻すことはできません! オフラインのアセットはこの方法では復元できません。",
"assets_restored_count": "{count, plural, one {#個} other {#個}}のアセットを復元しました",
"assets_restored_successfully": "{}項目を復元しました",
@@ -496,7 +494,7 @@
"back_close_deselect": "戻る、閉じる、選択解除",
"background_location_permission": "バックグラウンド位置情報アクセス",
"background_location_permission_content": "正常にWi-Fiの名前(SSID)を獲得するにはアプリが常に詳細な位置情報にアクセスできる必要があります",
"backup_album_selection_page_albums_device": "端末上のアルバム数: {}",
"backup_album_selection_page_albums_device": "デバイス上のアルバム数: {}",
"backup_album_selection_page_albums_tap": "タップで選択、ダブルタップで除外",
"backup_album_selection_page_assets_scatter": "アルバムを選択・除外してバックアップする写真を選ぶ (同じ写真が複数のアルバムに登録されていることがあるため)",
"backup_album_selection_page_select_albums": "アルバムを選択",
@@ -520,7 +518,7 @@
"backup_controller_page_background_battery_info_title": "バッテリーの最適化",
"backup_controller_page_background_charging": "充電中のみ",
"backup_controller_page_background_configure_error": "バックグラウンドサービスの設定に失敗",
"backup_controller_page_background_delay": "新しい写真のバックアップ遅延: {}",
"backup_controller_page_background_delay": "新しい項目のバックアップ開始まで待つ時間: {}",
"backup_controller_page_background_description": "アプリを開いていないときもバックアップを行います",
"backup_controller_page_background_is_off": "バックグランドサービスがオフになっています",
"backup_controller_page_background_is_on": "バックグランドサービスがオンになっています",
@@ -530,7 +528,7 @@
"backup_controller_page_backup": "バックアップ",
"backup_controller_page_backup_selected": "選択中:",
"backup_controller_page_backup_sub": "バックアップされた写真と動画の数",
"backup_controller_page_created": "{} 作成",
"backup_controller_page_created": "作成日: {}",
"backup_controller_page_desc_backup": "アプリを開いているときに写真と動画をバックアップします",
"backup_controller_page_excluded": "除外中のアルバム:",
"backup_controller_page_failed": "失敗: ({})",
@@ -544,7 +542,7 @@
"backup_controller_page_start_backup": "バックアップ開始",
"backup_controller_page_status_off": "バックアップがオフになっています",
"backup_controller_page_status_on": "バックアップがオンになっています",
"backup_controller_page_storage_format": "使用済み({}) - 全体({})",
"backup_controller_page_storage_format": "使用中: {} / {}",
"backup_controller_page_to_backup": "バックアップされるアルバム",
"backup_controller_page_total_sub": "選択されたアルバムの写真と動画の数",
"backup_controller_page_turn_off": "バックアップをオフにする",
@@ -574,16 +572,16 @@
"cache_settings_clear_cache_button_title": "キャッシュを削除 (キャッシュが再生成されるまで、アプリのパフォーマンスが著しく低下します)",
"cache_settings_duplicated_assets_clear_button": "クリア",
"cache_settings_duplicated_assets_subtitle": "サーバーにアップロード済みと認識された写真や動画の数",
"cache_settings_duplicated_assets_title": "{}項目の重複",
"cache_settings_image_cache_size": "キャッシュのサイズ ({})",
"cache_settings_duplicated_assets_title": "重複した項目数: ({})",
"cache_settings_image_cache_size": "画像キャッシュのサイズ ({}項目)",
"cache_settings_statistics_album": "ライブラリのサムネイル",
"cache_settings_statistics_assets": "{} ({}中)",
"cache_settings_statistics_assets": "{}項目 ({}項目中)",
"cache_settings_statistics_full": "フル画像",
"cache_settings_statistics_shared": "共有アルバムのサムネイル",
"cache_settings_statistics_thumbnail": "サムネイル",
"cache_settings_statistics_title": "キャッシュ",
"cache_settings_subtitle": "キャッシュの動作を変更する",
"cache_settings_thumbnail_size": "サムネイルのキャッシュのサイズ ({})",
"cache_settings_thumbnail_size": "サムネイルのキャッシュのサイズ ({}項目)",
"cache_settings_tile_subtitle": "ローカルストレージの挙動を確認する",
"cache_settings_tile_title": "ローカルストレージ",
"cache_settings_title": "キャッシュの設定",
@@ -592,12 +590,12 @@
"camera_model": "カメラモデル",
"cancel": "キャンセル",
"cancel_search": "検索をキャンセル",
"canceled": "Canceled",
"canceled": "キャンセルされました",
"cannot_merge_people": "人物を統合できません",
"cannot_undo_this_action": "この操作は元に戻せません!",
"cannot_update_the_description": "説明を更新できません",
"change_date": "日時を変更",
"change_display_order": "Change display order",
"change_display_order": "表示順を変更",
"change_expiration_time": "有効期限を変更",
"change_location": "場所を変更",
"change_name": "名前を変更",
@@ -643,7 +641,7 @@
"comments_are_disabled": "コメントは無効化されています",
"common_create_new_album": "アルバムを作成",
"common_server_error": "ネットワーク接続を確認し、サーバーが接続できる状態にあるか確認してください。アプリとサーバーのバージョンが一致しているかも確認してください。",
"completed": "Completed",
"completed": "完了",
"confirm": "確認",
"confirm_admin_password": "管理者パスワードを確認",
"confirm_delete_face": "本当に『{name}』の顔をアセットから削除しますか?",
@@ -653,13 +651,13 @@
"contain": "収める",
"context": "状況",
"continue": "続ける",
"control_bottom_app_bar_album_info_shared": "{} · 共有",
"control_bottom_app_bar_album_info_shared": "{}項目 · 共有",
"control_bottom_app_bar_create_new_album": "アルバムを作成",
"control_bottom_app_bar_delete_from_immich": "Immichから削除",
"control_bottom_app_bar_delete_from_local": "端末上から削除",
"control_bottom_app_bar_edit_location": "位置情報を編集",
"control_bottom_app_bar_edit_time": "日時を変更",
"control_bottom_app_bar_share_link": "Share Link",
"control_bottom_app_bar_share_link": "共有リンク",
"control_bottom_app_bar_share_to": "次のユーザーに共有: ",
"control_bottom_app_bar_trash_from_immich": "ゴミ箱に入れる",
"copied_image_to_clipboard": "画像をクリップボードにコピーしました。",
@@ -718,8 +716,8 @@
"delete_album": "アルバムを削除",
"delete_api_key_prompt": "本当にこのAPI キーを削除しますか?",
"delete_dialog_alert": "サーバーとデバイスの両方から永久的に削除されます!",
"delete_dialog_alert_local": "選択された項目はデバイスから削除されますが、Immichには残ります",
"delete_dialog_alert_local_non_backed_up": "選択された項目のうち、Immichにバックアップされていない物が含まれています。デバイスから完全に削除されます。",
"delete_dialog_alert_local": "選択された項目はデバイスから削除されますが、サーバーには残ります",
"delete_dialog_alert_local_non_backed_up": "選択された項目の中に、サーバーにバックアップされていない物が含まれています。そのため、デバイスから完全に削除されます。",
"delete_dialog_alert_remote": "選択された項目はImmichから永久に削除されます",
"delete_dialog_ok_force": "削除します",
"delete_dialog_title": "永久的に削除",
@@ -806,16 +804,16 @@
"editor_crop_tool_h2_aspect_ratios": "アスペクト比",
"editor_crop_tool_h2_rotation": "回転",
"email": "メールアドレス",
"empty_folder": "This folder is empty",
"empty_folder": "このフォルダーは空です",
"empty_trash": "コミ箱を空にする",
"empty_trash_confirmation": "本当にゴミ箱を空にしますか? これにより、ゴミ箱内のすべてのアセットが Immich から永久に削除されます。\nこの操作を元に戻すことはできません!",
"enable": "有効化",
"enabled": "有効",
"end_date": "終了日",
"enqueued": "Enqueued",
"enqueued": "順番待ち中",
"enter_wifi_name": "Wi-Fiの名前(SSID)を入力",
"error": "エラー",
"error_change_sort_album": "Failed to change album sort order",
"error_change_sort_album": "アルバムの表示順の変更に失敗しました",
"error_delete_face": "アセットから顔の削除ができませんでした",
"error_loading_image": "画像の読み込みエラー",
"error_saving_image": "エラー: {}",
@@ -848,10 +846,12 @@
"failed_to_keep_this_delete_others": "ほかのアセットを削除できませんでした",
"failed_to_load_asset": "アセットを読み込めませんでした",
"failed_to_load_assets": "アセットを読み込めませんでした",
"failed_to_load_notifications": "通知の読み込みに失敗しました",
"failed_to_load_people": "人物を読み込めませんでした",
"failed_to_remove_product_key": "プロダクトキーを削除できませんでした",
"failed_to_stack_assets": "アセットをスタックできませんでした",
"failed_to_unstack_assets": "アセットをスタックから解除することができませんでした",
"failed_to_update_notification_status": "通知ステータスの更新に失敗しました",
"import_path_already_exists": "このインポートパスは既に存在します。",
"incorrect_email_or_password": "メールアドレスまたはパスワードが間違っています",
"paths_validation_failed": "{paths, plural, one {#個} other {#個}}のパスの検証に失敗しました",
@@ -952,10 +952,10 @@
"exif_bottom_sheet_location": "撮影場所",
"exif_bottom_sheet_people": "人物",
"exif_bottom_sheet_person_add_person": "名前を追加",
"exif_bottom_sheet_person_age": "Age {}",
"exif_bottom_sheet_person_age_months": "Age {} months",
"exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months",
"exif_bottom_sheet_person_age_years": "Age {}",
"exif_bottom_sheet_person_age": "{}",
"exif_bottom_sheet_person_age_months": "生後{}ヶ月",
"exif_bottom_sheet_person_age_year_months": "1歳{}ヶ月",
"exif_bottom_sheet_person_age_years": "{}",
"exit_slideshow": "スライドショーを終わる",
"expand_all": "全て展開",
"experimental_settings_new_asset_list_subtitle": "製作途中 (WIP)",
@@ -975,9 +975,9 @@
"external_network": "外部のネットワーク",
"external_network_sheet_info": "指定されたWi-Fiに繋がっていない時アプリはサーバーへの接続を指定されたURLで行います。優先順位は上から下です",
"face_unassigned": "未割り当て",
"failed": "Failed",
"failed": "失敗",
"failed_to_load_assets": "アセットのロードに失敗しました",
"failed_to_load_folder": "Failed to load folder",
"failed_to_load_folder": "フォルダーの読み込みに失敗",
"favorite": "お気に入り",
"favorite_or_unfavorite_photo": "写真をお気に入りまたはお気に入り解除",
"favorites": "お気に入り",
@@ -991,10 +991,11 @@
"filetype": "ファイルタイプ",
"filter": "フィルター",
"filter_people": "人物を絞り込み",
"filter_places": "場所をフィルター",
"find_them_fast": "名前で検索して素早く発見",
"fix_incorrect_match": "間違った一致を修正",
"folder": "Folder",
"folder_not_found": "Folder not found",
"folder": "フォルダー",
"folder_not_found": "フォルダーが見つかりませんでした",
"folders": "フォルダ",
"folders_feature_description": "ファイルシステム上の写真と動画のフォルダビューを閲覧する",
"forward": "前へ",
@@ -1071,7 +1072,7 @@
"include_shared_albums": "共有アルバムを含める",
"include_shared_partner_assets": "パートナーがシェアしたアセットを含める",
"individual_share": "1枚の共有",
"individual_shares": "個人の共有",
"individual_shares": "1枚ずつの共有",
"info": "情報",
"interval": {
"day_at_onepm": "毎日午後1時",
@@ -1169,8 +1170,8 @@
"manage_your_devices": "ログインデバイスを管理します",
"manage_your_oauth_connection": "OAuth接続を管理します",
"map": "地図",
"map_assets_in_bound": "{}項目",
"map_assets_in_bounds": "{}項目",
"map_assets_in_bound": "{}",
"map_assets_in_bounds": "{}",
"map_cannot_get_user_location": "位置情報がゲットできません",
"map_location_dialog_yes": "はい",
"map_location_picker_page_use_location": "この位置情報を使う",
@@ -1193,6 +1194,9 @@
"map_settings_only_show_favorites": "お気に入りのみを表示",
"map_settings_theme_settings": "地図の見た目",
"map_zoom_to_see_photos": "写真を見るにはズームアウト",
"mark_all_as_read": "すべて既読にする",
"mark_as_read": "既読にする",
"marked_all_as_read": "すべて既読にしました",
"matches": "マッチ",
"media_type": "メディアタイプ",
"memories": "メモリー",
@@ -1251,12 +1255,13 @@
"no_favorites_message": "お気に入りに追加すると最高の写真や動画をすぐに見つけられます",
"no_libraries_message": "あなたの写真や動画を表示するための外部ライブラリを作成しましょう",
"no_name": "名前なし",
"no_notifications": "通知なし",
"no_places": "場所なし",
"no_results": "結果がありません",
"no_results_description": "同義語やより一般的なキーワードを試してください",
"no_shared_albums_message": "アルバムを作成して写真や動画を共有しましょう",
"not_in_any_album": "どのアルバムにも入っていない",
"not_selected": "Not selected",
"not_selected": "選択なし",
"note_apply_storage_label_to_previously_uploaded assets": "注意: 以前にアップロードしたアセットにストレージラベルを適用するには以下を実行してください",
"notes": "注意",
"notification_permission_dialog_content": "通知を許可するには設定を開いてオンにしてください",
@@ -1281,6 +1286,7 @@
"onboarding_welcome_user": "ようこそ、{user} さん",
"online": "オンライン",
"only_favorites": "お気に入りのみ",
"open": "開く",
"open_in_map_view": "地図表示で見る",
"open_in_openstreetmap": "OpenStreetMapで開く",
"open_the_search_filters": "検索フィルタを開く",
@@ -1304,7 +1310,7 @@
"partner_page_partner_add_failed": "パートナーの追加に失敗",
"partner_page_select_partner": "パートナーを選択",
"partner_page_shared_to_title": "次のユーザーと共有します: ",
"partner_page_stop_sharing_content": "{}は写真へアクセスできなくなります",
"partner_page_stop_sharing_content": "{}は今後あなたの写真へアクセスできなくなります",
"partner_sharing": "パートナとの共有",
"partners": "パートナー",
"password": "パスワード",
@@ -1425,6 +1431,8 @@
"recent_searches": "最近の検索",
"recently_added": "最近追加された項目",
"recently_added_page_title": "最近",
"recently_taken": "最近撮られたもの",
"recently_taken_page_title": "最近の撮影",
"refresh": "更新",
"refresh_encoded_videos": "エンコードされた動画を更新",
"refresh_faces": "顔認識を更新",
@@ -1450,12 +1458,12 @@
"remove_url": "URLの削除",
"remove_user": "ユーザーを削除",
"removed_api_key": "削除されたAPI キー: {name}",
"removed_from_archive": "アーカイブから削除されました",
"removed_from_favorites": "お気に入りから削除しました",
"removed_from_favorites_count": "{count, plural, other {#項目}}お気に入りから削除しました",
"removed_from_archive": "アーカイブから外しました",
"removed_from_favorites": "お気に入りを外しました",
"removed_from_favorites_count": "{count, plural, other {#項目}}お気に入りからしました",
"removed_memory": "削除されたメモリー",
"removed_photo_from_memory": "メモリーから削除された写真",
"removed_tagged_assets": "{count, plural, one {#個のアセット} other {#個のアセット}}からタグを削除しました",
"removed_tagged_assets": "{count, plural, one {#項目} other {#項目}}からタグをしました",
"rename": "リネーム",
"repair": "修復",
"repair_no_results_message": "追跡されていないファイルや存在しないファイルがここに表示されます",
@@ -1509,7 +1517,7 @@
"search_filter_date_title": "撮影期間を選択",
"search_filter_display_option_not_in_album": "アルバムにありません",
"search_filter_display_options": "表示オプション",
"search_filter_filename": "Search by file name",
"search_filter_filename": "ファイル名で検索",
"search_filter_location": "場所",
"search_filter_location_title": "場所を選択",
"search_filter_media_type": "メディアの種類",
@@ -1517,17 +1525,17 @@
"search_filter_people_title": "人物を選択",
"search_for": "検索",
"search_for_existing_person": "既存の人物を検索",
"search_no_more_result": "No more results",
"search_no_more_result": "検索結果以上",
"search_no_people": "人物がいません",
"search_no_people_named": "「{name}」という名前の人物がいません",
"search_no_result": "No results found, try a different search term or combination",
"search_no_result": "検索結果なし",
"search_options": "検索オプション",
"search_page_categories": "カテゴリ",
"search_page_motion_photos": "モーションフォト",
"search_page_no_objects": "被写体に関するデータがなし",
"search_page_no_places": "場所に関するデータなし",
"search_page_screenshots": "スクリーンショット",
"search_page_search_photos_videos": "Search for your photos and videos",
"search_page_search_photos_videos": "写真や動画を検索",
"search_page_selfies": "自撮り",
"search_page_things": "被写体",
"search_page_view_all_button": "すべて表示",
@@ -1589,7 +1597,7 @@
"setting_languages_apply": "適用する",
"setting_languages_subtitle": "アプリの言語を変更する",
"setting_languages_title": "言語",
"setting_notifications_notify_failures_grace_period": "バックアップ失敗の通知: {}",
"setting_notifications_notify_failures_grace_period": "バックグラウンドバックアップ失敗の通知: {}",
"setting_notifications_notify_hours": "{}時間後",
"setting_notifications_notify_immediately": "すぐに行う",
"setting_notifications_notify_minutes": "{}分後",
@@ -1601,14 +1609,14 @@
"setting_notifications_total_progress_subtitle": "アップロードの進行状況 (完了済み/全体枚数)",
"setting_notifications_total_progress_title": "全体のバックアップの進行状況を表示",
"setting_video_viewer_looping_title": "ループ中",
"setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.",
"setting_video_viewer_original_video_title": "Force original video",
"setting_video_viewer_original_video_subtitle": "動画をストリーミングする際に、トランスコードされた動画が存在していても、あえてオリジナル画質の動画を再生します。ストリーミングに待ち時間が生じるかもしれません。なお、デバイス上に保存されている動画はこの設定の有無に関わらず、オリジナル画質の動画を再生します。",
"setting_video_viewer_original_video_title": "常にオリジナル画質の動画を再生する",
"settings": "設定",
"settings_require_restart": "Immichを再起動して設定を適用してください",
"settings_saved": "設定が保存されました",
"share": "共有",
"share_add_photos": "写真を追加",
"share_assets_selected": "{}選択されました",
"share_assets_selected": "{}選択",
"share_dialog_preparing": "準備中",
"shared": "共有済み",
"shared_album_activities_input_disable": "コメントはオフになってます",
@@ -1622,7 +1630,7 @@
"shared_by_user": "{user} により共有",
"shared_by_you": "あなたにより共有",
"shared_from_partner": "{partner} による写真",
"shared_intent_upload_button_progress_text": "{} / {} Uploaded",
"shared_intent_upload_button_progress_text": "{} / {} アップロード完了",
"shared_link_app_bar_title": "共有リンク",
"shared_link_clipboard_copied_massage": "クリップボードにコピーしました",
"shared_link_clipboard_text": "リンク: {}\nパスワード: {}",
@@ -1639,16 +1647,16 @@
"shared_link_edit_password_hint": "共有パスワードを入力する",
"shared_link_edit_submit_button": "リンクをアップデートする",
"shared_link_error_server_url_fetch": "サーバーのURLを取得できません",
"shared_link_expires_day": "{}日で切れます",
"shared_link_expires_days": "{}日で切れます",
"shared_link_expires_hour": "{}時間で切れます",
"shared_link_expires_hours": "{}時間で切れます",
"shared_link_expires_minute": "{}分で切れます",
"shared_link_expires_minutes": "{}分で切れます",
"shared_link_expires_day": "{}日後に有効期限切れ",
"shared_link_expires_days": "{}日後に有効期限切れ",
"shared_link_expires_hour": "{}時間後に有効期限切れ",
"shared_link_expires_hours": "{}時間後に有効期限切れ",
"shared_link_expires_minute": "{}分後に有効期限切れ",
"shared_link_expires_minutes": "{}分後に有効期限切れ",
"shared_link_expires_never": "有効期限はありません",
"shared_link_expires_second": "{}秒で切れます",
"shared_link_expires_seconds": "{}秒で切れます",
"shared_link_individual_shared": "個人共有",
"shared_link_expires_second": "{}秒後に有効期限切れ",
"shared_link_expires_seconds": "{}秒後に有効期限切れ",
"shared_link_individual_shared": "1枚ずつ共有されています",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_manage_links": "共有済みのリンクを管理",
"shared_link_options": "共有リンクのオプション",
@@ -1748,7 +1756,7 @@
"theme_selection": "テーマ選択",
"theme_selection_description": "ブラウザのシステム設定に基づいてテーマを明色または暗色に自動的に設定します",
"theme_setting_asset_list_storage_indicator_title": "ストレージに関する情報を表示",
"theme_setting_asset_list_tiles_per_row_title": "一ごとの表示枚数: {}",
"theme_setting_asset_list_tiles_per_row_title": "一ごとの表示枚数: {}",
"theme_setting_colorful_interface_subtitle": "アクセントカラーを背景にも使用する",
"theme_setting_colorful_interface_title": "カラフルなUI",
"theme_setting_image_viewer_quality_subtitle": "画像ビューの画質の設定",
@@ -1787,11 +1795,11 @@
"trash_page_no_assets": "ゴミ箱は空です",
"trash_page_restore_all": "すべて復元",
"trash_page_select_assets_btn": "項目を選択",
"trash_page_title": "削除({})",
"trash_page_title": "ゴミ箱 ({})",
"trashed_items_will_be_permanently_deleted_after": "ゴミ箱に入れられたアイテムは{days, plural, one {#日} other {#日}}後に完全に削除されます。",
"type": "タイプ",
"unarchive": "アーカイブを解除",
"unarchived_count": "{count, plural, other {#枚アーカイブしました}}",
"unarchived_count": "{count, plural, other {#枚アーカイブを解除しました}}",
"unfavorite": "お気に入りから外す",
"unhide_person": "人物の非表示を解除",
"unknown": "不明",
@@ -1825,8 +1833,8 @@
"upload_status_errors": "エラー",
"upload_status_uploaded": "アップロード済",
"upload_success": "アップロード成功、新しくアップロードされたアセットを見るにはページを更新してください。",
"upload_to_immich": "Upload to Immich ({})",
"uploading": "Uploading",
"upload_to_immich": "Immichにアップロード ({})",
"uploading": "アップロード中",
"url": "URL",
"usage": "使用容量",
"use_current_connection": "現在の接続情報を使用",

View File

@@ -59,7 +59,6 @@
"logging_settings": "ჟურნალი",
"map_settings": "რუკა",
"migration_job": "მიგრაცია",
"oauth_scope": "დიაპაზონი",
"oauth_settings": "OAuth",
"template_email_preview": "მინიატურა",
"transcoding_acceleration_vaapi": "VAAPI",

View File

@@ -141,17 +141,12 @@
"oauth_auto_register": "",
"oauth_auto_register_description": "",
"oauth_button_text": "",
"oauth_client_id": "",
"oauth_client_secret": "",
"oauth_enable_description": "",
"oauth_issuer_url": "",
"oauth_mobile_redirect_uri": "",
"oauth_mobile_redirect_uri_override": "",
"oauth_mobile_redirect_uri_override_description": "",
"oauth_scope": "",
"oauth_settings": "",
"oauth_settings_description": "",
"oauth_signing_algorithm": "",
"oauth_storage_label_claim": "",
"oauth_storage_label_claim_description": "",
"oauth_storage_quota_claim": "",

View File

@@ -1 +1,26 @@
{}
{
"about": "ಕುರಿತು",
"account": "ಖಾತೆ",
"account_settings": "ಖಾತೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು",
"acknowledge": "ಅಂಗೀಕರಿಸಿ",
"action": "ಕಾರ್ಯ",
"action_common_update": "ನವೀಕರಿಸಿ",
"actions": "ಕ್ರಿಯೆಗಳು",
"active": "ಸಕ್ರಿಯ",
"activity": "ಚಟುವಟಿಕೆ",
"add": "ಸೇರಿಸಿ",
"add_a_description": "ವಿವರಣೆಯನ್ನು ಸೇರಿಸಿ",
"add_a_location": "ಸ್ಥಳವನ್ನು ಸೇರಿಸಿ",
"add_a_name": "ಹೆಸರನ್ನು ಸೇರಿಸಿ",
"add_a_title": "ಶೀರ್ಷಿಕೆಯನ್ನು ಸೇರಿಸಿ",
"add_endpoint": "ಎಂಡ್‌ಪಾಯಿಂಟ್ ಸೇರಿಸಿ",
"add_exclusion_pattern": "ಹೊರಗಿಡುವಿಕೆ ಮಾದರಿಯನ್ನು ಸೇರಿಸಿ",
"add_import_path": "ಆಮದು ಮಾರ್ಗವನ್ನು ಸೇರಿಸಿ",
"add_location": "ಸ್ಥಳ ಸೇರಿಸಿ",
"add_more_users": "ಹೆಚ್ಚಿನ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ",
"add_partner": "ಪಾಲುದಾರರನ್ನು ಸೇರಿಸಿ",
"add_path": "ಹಾದಿಯನ್ನು ಸೇರಿಸಿ",
"add_photos": "ಫೋಟೋಗಳನ್ನು ಸೇರಿಸಿ",
"add_to": "ಸೇರಿಸಿ…",
"add_to_album": "ಆಲ್ಬಮ್‌ಗೆ ಸೇರಿಸಿ"
}

View File

@@ -43,7 +43,7 @@
"backup_database_enable_description": "데이터베이스 덤프 활성화",
"backup_keep_last_amount": "보관할 이전 덤프의 수",
"backup_settings": "데이터베이스 덤프 설정",
"backup_settings_description": "데이터베이스 덤프 설정을 관리합니다. 참고: 이 작업모니터링되지 않으며, 실패 시 알림을 받지 않습니다.",
"backup_settings_description": "데이터베이스 덤프 설정을 관리합니다. 참고: 이 작업은 진행 및 실패 여부를 확인할 수 없습니다.",
"check_all": "모두 확인",
"cleanup": "정리",
"cleared_jobs": "작업 중단: {job}",
@@ -70,7 +70,7 @@
"forcing_refresh_library_files": "모든 라이브러리 파일 강제 새로고침 중...",
"image_format": "형식",
"image_format_description": "WebP는 JPEG보다 파일 크기가 작지만, 인코딩에 더 많은 시간이 소요됩니다.",
"image_fullsize_description": "확대 보기 시 사용되는, 메타데이터가 없는 전체 크기 이미지",
"image_fullsize_description": "메타데이터가 제거된 전체 크기 이미지로, 확대 보기 시 사용됩니다.",
"image_fullsize_enabled": "전체 크기 이미지 생성 활성화",
"image_fullsize_enabled_description": "웹에 적합하지 않은 형식인 경우 전체 크기 이미지를 생성합니다. \"내장 미리보기 우선 사용\"이 활성화되어 있으면, 변환 없이 내장된 미리보기를 그대로 사용합니다. JPEG과 같은 웹 친화적인 형식에는 영향을 주지 않습니다.",
"image_fullsize_quality_description": "전체 크기 이미지의 품질 (1~100). 숫자가 높을수록 품질이 좋지만 파일 크기도 커집니다.",
@@ -79,7 +79,7 @@
"image_prefer_embedded_preview_setting_description": "RAW 사진에 포함된 내장 미리보기를 이미지 처리 시 입력으로 사용합니다(사용 가능한 경우에 한함). 이 방식은 일부 이미지에서 더 정확한 색상을 얻을 수 있지만, 미리보기의 품질은 카메라에 따라 다르며 압축으로 인한 품질 저하가 나타날 수 있습니다.",
"image_prefer_wide_gamut": "광색역 우선 사용",
"image_prefer_wide_gamut_setting_description": "섬네일에 Display P3 색역을 사용합니다. 광색역 이미지를 보다 생생하게 표현할 수 있지만, 구형 브라우저나 장치에서는 다르게 보일 수 있습니다. sRGB 이미지의 경우 색상 왜곡을 방지하기 위해 그대로 유지됩니다.",
"image_preview_description": "단일 항목을 보거나 기계 학습에 사용되는, 메타데이터가 제거된 중간 크기 이미지",
"image_preview_description": "메타데이터가 제거된 중간 크기 이미지로, 단일 항목을 보거나 기계 학습에 사용됩니다.",
"image_preview_quality_description": "미리보기 품질 (1~100). 숫자가 높을수록 품질이 좋아지지만, 파일 크기가 커지고 앱 반응 속도가 느려질 수 있습니다. 너무 낮게 설정하면 기계 학습 품질에 영향을 줄 수 있습니다.",
"image_preview_title": "미리보기 설정",
"image_quality": "품질",
@@ -118,7 +118,7 @@
"machine_learning_duplicate_detection": "중복 감지",
"machine_learning_duplicate_detection_enabled": "중복 감지 활성화",
"machine_learning_duplicate_detection_enabled_description": "비활성화된 경우에도 완전히 동일한 항목은 중복 제거됩니다.",
"machine_learning_duplicate_detection_setting_description": "CLIP 임베딩을 사용하여 비슷한 항목 찾기",
"machine_learning_duplicate_detection_setting_description": "CLIP 임베딩을 사용하여 중복 가능성이 높은 항목 찾기",
"machine_learning_enabled": "기계 학습 활성화",
"machine_learning_enabled_description": "비활성화된 경우 아래 설정 여부와 관계없이 모든 기계 학습 기능이 비활성화됩니다.",
"machine_learning_facial_recognition": "얼굴 인식",
@@ -138,7 +138,7 @@
"machine_learning_settings": "기계 학습 설정",
"machine_learning_settings_description": "기계 학습 기능 및 설정 관리",
"machine_learning_smart_search": "스마트 검색",
"machine_learning_smart_search_description": "CLIP 임베딩으로 자연어를 사용하여 이미지 검색",
"machine_learning_smart_search_description": "CLIP 임베딩을 사용한 내용 기반 이미지 검색",
"machine_learning_smart_search_enabled": "스마트 검색 활성화",
"machine_learning_smart_search_enabled_description": "비활성화된 경우 스마트 검색을 위한 이미지 처리를 진행하지 않습니다.",
"machine_learning_url_description": "기계 학습 서버의 URL을 입력합니다. URL이 여러 개인 경우 첫 번째 서버부터 마지막까지 성공적으로 응답할 때까지 한 번에 하나씩 순서대로 요청을 시도합니다. 응답하지 않는 서버는 다시 사용 가능할 때까지 일시적으로 제외됩니다.",
@@ -192,26 +192,22 @@
"oauth_auto_register": "자동 가입",
"oauth_auto_register_description": "OAuth로 새 사용자가 로그인하는 경우 자동으로 가입",
"oauth_button_text": "버튼 텍스트",
"oauth_client_id": "클라이언트 ID",
"oauth_client_secret": "클라이언트 시크릿",
"oauth_client_secret_description": "OAuth 제공자가 PKCE(Proof Key for Code Exchange)를 지원하지 않는 경우 필요합니다.",
"oauth_enable_description": "OAuth 로그인",
"oauth_issuer_url": "발급자 URL",
"oauth_mobile_redirect_uri": "모바일 리다이렉트 URI",
"oauth_mobile_redirect_uri_override": "모바일 리다이렉트 URI 재정의",
"oauth_mobile_redirect_uri_override_description": "OAuth 공급자가 '{callback}'과 같은 모바일 URI를 제공하지 않는 경우 활성화하세요.",
"oauth_profile_signing_algorithm": "사용자 정보 서명 알고리즘",
"oauth_profile_signing_algorithm_description": "사용자 정보 서명에 사용되는 알고리즘을 선택합니다.",
"oauth_scope": "스코프",
"oauth_settings": "OAuth",
"oauth_settings_description": "OAuth 로그인 설정 관리",
"oauth_settings_more_details": "이 기능에 대한 자세한 내용은 <link>문서</link>를 참조하세요.",
"oauth_signing_algorithm": "서명 알고리즘",
"oauth_storage_label_claim": "스토리지 레이블 선택",
"oauth_storage_label_claim_description": "스토리지 레이블을 사용자가 입력한 값으로 자동 설정합니다.",
"oauth_storage_quota_claim": "스토리지 할당량 선택",
"oauth_storage_quota_claim_description": "스토리지 할당량을 사용자가 입력한 값으로 자동 설정합니다.",
"oauth_storage_quota_default": "스토리지 할당량 기본값 (GiB)",
"oauth_storage_quota_default_description": "입력하지 않은 경우 사용할 GiB 단위의 기본 할당량 (무제한 할당량의 경우 0 입력)",
"oauth_timeout": "요청 타임아웃",
"oauth_timeout_description": "요청 타임아웃 (밀리초 단위)",
"offline_paths": "누락된 파일",
"offline_paths_description": "외부 라이브러리의 항목이 아닌 파일을 수동으로 삭제한 경우 발생할 수 있습니다.",
"password_enable_description": "이메일과 비밀번호로 로그인",
@@ -222,20 +218,20 @@
"quota_size_gib": "할당량 (GiB)",
"refreshing_all_libraries": "모든 라이브러리 다시 스캔 중...",
"registration": "관리자 계정 생성",
"registration_description": "첫 번째로 생성되는 사용자 관리자 권한을 부여받으며, 관리 사용자 생성이 가능합니다.",
"registration_description": "당신은 첫 번째 사용자이며 관리자 권한이 자동으로 부여됩니다. 관리 작업과 사용자 생성이 가능합니다.",
"repair_all": "모두 수리",
"repair_matched_items": "항목 {count, plural, one {#개} other {#개}}가 일치합니다.",
"repaired_items": "항목 {count, plural, one {#개} other {#개}}를 복구했습니다.",
"require_password_change_on_login": "첫 로그인 시 비밀번호 변경 요구",
"reset_settings_to_default": "설정을 기본값으로 복원",
"reset_settings_to_recent_saved": "마지막으로 저장된 설정으로 복원",
"reset_settings_to_recent_saved": "마지막으로 저장된 설정 복원",
"scanning_library": "라이브러리 스캔 중",
"search_jobs": "작업 검색…",
"send_welcome_email": "환영 이메일 전송",
"server_external_domain_settings": "외부 도메인",
"server_external_domain_settings_description": "공개 공유 링크에 사용할 도메인 (http(s):// 포함)",
"server_public_users": "모든 사용자",
"server_public_users_description": "공유 앨범에 사용자를 추가할 경우 모든 사용자(이름, 이메일)가 나열됩니다. 비활성화 경우, 관리자만 사용자 목록을 사용할 수 있습니다.",
"server_public_users_description": "공유 앨범에 사용자를 추가할 모든 사용자이름 이메일을 목록에 표시합니다. 비활성화 경우 관리자인 경우에만 사용자 목록이 표시됩니다.",
"server_settings": "서버 설정",
"server_settings_description": "서버 설정 관리",
"server_welcome_message": "환영 메시지",
@@ -251,7 +247,7 @@
"storage_template_hash_verification_enabled_description": "해시 검증을 활성화합니다. 이 설정의 결과를 확실히 이해하지 않는 한 비활성화하지 마세요.",
"storage_template_migration": "스토리지 템플릿 마이그레이션",
"storage_template_migration_description": "이전에 업로드된 항목에 현재 <link>{template}</link> 적용",
"storage_template_migration_info": "스토리지 템플릿은 모든 확장자를 소문자로 변환합니다. 템플릿 변경 사항은 새로 업로드한 항목에만 적용됩니다. 기존에 업로드된 항목에 적용하려면 <link>{job}</link>을 실행하세요.",
"storage_template_migration_info": "스토리지 템플릿은 모든 확장자를 소문자로 변환하며, 변경 사항은 새로 업로드한 항목에만 적용됩니다. 기존에 업로드된 항목에 적용하려면 <link>{job}</link>을 실행하세요.",
"storage_template_migration_job": "스토리지 템플릿 마이그레이션 작업",
"storage_template_more_details": "이 기능에 대한 자세한 내용은 <template-link>스토리지 템플릿</template-link> 및 <implications-link>설명</implications-link>을 참조하세요.",
"storage_template_onboarding_description": "이 기능을 활성화하면 사용자 정의 템플릿을 사용하여 파일을 자동으로 정리할 수 있습니다. 안정성 문제로 인해 해당 기능은 기본적으로 비활성화되어 있습니다. 자세한 내용은 <link>문서</link>를 참조하세요.",
@@ -261,14 +257,14 @@
"storage_template_user_label": "사용자의 스토리지 레이블: <code>{label}</code>",
"system_settings": "시스템 설정",
"tag_cleanup_job": "태그 정리",
"template_email_available_tags": "템플릿에 다음 변수를 사용할 수 있습니다: {tags}",
"template_email_available_tags": "템플릿에 다음 변수를 사용할 수 있습니다: {tags}",
"template_email_if_empty": "비어 있는 경우 기본 템플릿이 사용됩니다.",
"template_email_invite_album": "앨범 초대 템플릿",
"template_email_invite_album": "앨범 초대 템플릿",
"template_email_preview": "미리보기",
"template_email_settings": "이메일 템플릿",
"template_email_settings_description": "사용자 정의 이메일 템플릿 관리",
"template_email_update_album": "앨범 템플릿 업데이트",
"template_email_welcome": "웰컴 메일 템플릿",
"template_email_update_album": "앨범 업데이트 안내 템플릿",
"template_email_welcome": "환영 메일 템플릿",
"template_settings": "알림 템플릿",
"template_settings_description": "알림을 위한 사용자 지정 템플릿을 관리합니다.",
"theme_custom_css_settings": "사용자 정의 CSS",
@@ -340,18 +336,18 @@
"transcoding_video_codec": "동영상 코덱",
"transcoding_video_codec_description": "VP9는 효율적이고 웹 호환성이 높지만 트랜스코딩에 다소 긴 시간이 소요됩니다. HEVC는 성능은 비슷하나 웹 호환성이 낮습니다. H.264는 호환성이 가장 높지만 인코딩된 파일 크기가 크고, AV1은 가장 효율적이나 오래된 기기와의 호환성이 낮습니다.",
"trash_enabled_description": "휴지통 활성화",
"trash_number_of_days": "삭제 보류 기간",
"trash_number_of_days_description": "휴지통으로 이동된 항목의 삭제 보류 기간",
"trash_number_of_days": "삭제 유예 기간",
"trash_number_of_days_description": "휴지통으로 이동된 항목의 삭제 유예 기간",
"trash_settings": "휴지통 설정",
"trash_settings_description": "휴지통 설정 관리",
"untracked_files": "추적되지 않는 파일",
"untracked_files_description": "애플리케이션에서 추적되지 않는 파일 목록입니다. 이동 실패, 업로드 중단 또는 버그로 인해 발생할 수 있습니다.",
"user_cleanup_job": "사용자 정리",
"user_delete_delay": "<b>{user}</b>님이 업로드한 항목이 {delay, plural, one {#일} other {#일}} 후 영구적으로 삭제됩니다.",
"user_delete_delay_settings": "삭제 보류 기간",
"user_delete_delay_settings_description": "사용자를 영구적으로 삭제하기 전 보류 기간을 설정합니다. 사용자 삭제 매일 자정, 보류 기간이 지난 사용자를 확인한 후 진행됩니다. 변경 사항은 다음 작업부터 적용됩니다.",
"user_delete_delay_settings": "삭제 유예 기간",
"user_delete_delay_settings_description": "사용자 계정과 항목이 완전히 삭제되기까지의 유예 기간(일)을 설정합니다. 사용자 삭제 작업은 매일 자정에 실행되어 삭제 대상 여부를 확인합니다. 이 설정의 변경 사항은 다음 작업 실행 시 반영됩니다.",
"user_delete_immediately": "<b>{user}</b>님이 업로드한 항목이 <b>영구적으로 삭제됩니다</b>.",
"user_delete_immediately_checkbox": "보류 기간 없이 즉시 삭제",
"user_delete_immediately_checkbox": "유예 기간 없이 즉시 삭제",
"user_management": "사용자 관리",
"user_password_has_been_reset": "사용자의 비밀번호가 초기화되었습니다:",
"user_password_reset_description": "이 비밀번호를 해당 사용자에게 알려주세요. 임시 비밀번호로 로그인한 뒤 비밀번호를 반드시 변경해야 합니다.",
@@ -442,7 +438,7 @@
"app_settings": "앱 설정",
"appears_in": "다음 앨범에 포함됨",
"archive": "보관함",
"archive_or_unarchive_photo": "보관함으로 이동 또는 제",
"archive_or_unarchive_photo": "보관 처리 또는 제",
"archive_page_no_archived_assets": "보관된 항목 없음",
"archive_page_title": "보관함 ({})",
"archive_size": "압축 파일 크기",
@@ -492,7 +488,7 @@
"assets_restored_successfully": "항목 {}개를 복원했습니다.",
"assets_trashed": "휴지통으로 항목 {}개 이동됨",
"assets_trashed_count": "휴지통으로 항목 {count, plural, one {#개} other {#개}} 이동됨",
"assets_trashed_from_server": "휴지통으로 서버에 있는 항목 {}개가 이동되었습니다.",
"assets_trashed_from_server": "서버에 있는 항목 {}개가 휴지통으로 이동되었습니다.",
"assets_were_part_of_album_count": "앨범에 이미 존재하는 {count, plural, one {항목} other {항목}}입니다.",
"authorized_devices": "인증된 기기",
"automatic_endpoint_switching_subtitle": "지정된 Wi-Fi가 사용 가능한 경우 내부망을 통해 연결하고, 그렇지 않으면 다른 연결 방식을 사용합니다.",
@@ -570,16 +566,16 @@
"bugs_and_feature_requests": "버그 제보 & 기능 요청",
"build": "빌드",
"build_image": "빌드 이미지",
"bulk_delete_duplicates_confirmation": "비슷한 항목 {count, plural, one {#개} other {#개}} 삭제하시겠습니까? 크기가 가장 큰 항목을 제외한 나머지 항목들이 영구적으로 삭제니다. 이 작업은 되돌릴 수 없습니다!",
"bulk_keep_duplicates_confirmation": "비슷한 항목 {count, plural, one {#개} other {#개}} 유지하시겠습니까? 파일을 삭제하지 않고 확인 것으로 판단합니다.",
"bulk_trash_duplicates_confirmation": "비슷한 항목 {count, plural, one {#개} other {#개}} 휴지통으로 이동하시겠습니까? 크기가 가장 큰 항목을 제외한 나머지 항목들이 모두 휴지통으로 이동니다.",
"bulk_delete_duplicates_confirmation": "중복된 항목 {count, plural, one {#개} other {#개}} 일괄 삭제하시겠습니까? 각 그룹에서 가장 큰 항목만 남기고 나머지 중복 항목을 영구적으로 삭제니다. 이 작업은 되돌릴 수 없습니다!",
"bulk_keep_duplicates_confirmation": "중복된 항목 {count, plural, one {#개} other {#개}} 그대로 유지하시겠습니까? 이 작업은 어떤 항목도 삭제하지 않고, 모든 중복 그룹을 확인 것으로 처리합니다.",
"bulk_trash_duplicates_confirmation": "중복된 항목 {count, plural, one {#개} other {#개}} 일괄 휴지통으로 이동하시겠습니까? 이 작업은 각 그룹에서 가장 큰 항목만 남기고 나머지 중복 항목을 휴지통으로 이동니다.",
"buy": "Immich 구매",
"cache_settings_album_thumbnails": "라이브러리 섬네일 ({})",
"cache_settings_album_thumbnails": "라이브러리 페이지 섬네일 ({})",
"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_title": "중복 항목 ({})",
"cache_settings_duplicated_assets_title": "중복 항목 ({})",
"cache_settings_image_cache_size": "이미지 캐시 크기 ({})",
"cache_settings_statistics_album": "라이브러리 섬네일",
"cache_settings_statistics_assets": "항목 {}개 ({})",
@@ -728,7 +724,7 @@
"delete_dialog_alert_remote": "이 항목들이 Immich 서버에서 영구적으로 삭제됩니다.",
"delete_dialog_ok_force": "무시하고 삭제",
"delete_dialog_title": "영구적으로 삭제",
"delete_duplicates_confirmation": "비슷한 항목들을 영구적으로 삭제하시겠습니까?",
"delete_duplicates_confirmation": "이 중복 항목들을 영구적으로 삭제하시겠습니까?",
"delete_face": "얼굴 삭제",
"delete_key": "키 삭제",
"delete_library": "라이브러리 삭제",
@@ -783,8 +779,8 @@
"downloading_asset_filename": "{filename} 다운로드 중...",
"downloading_media": "미디어 다운로드 중",
"drop_files_to_upload": "아무 곳에나 파일을 드롭하여 업로드",
"duplicates": "비슷한 항목",
"duplicates_description": "비슷한 항목을 확인하고, 유지하거나 삭제할 항목 선택",
"duplicates": "중복 항목",
"duplicates_description": "각 그룹에서 중복된 항목을 확인하고 삭제할 항목 선택하세요.",
"duration": "기간",
"edit": "편집",
"edit_album": "앨범 수정",
@@ -818,7 +814,7 @@
"enabled": "활성화됨",
"end_date": "종료일",
"enqueued": "대기열에 추가됨",
"enter_wifi_name": "Enter WiFi name",
"enter_wifi_name": "Wi-Fi 이름 입력",
"error": "오류",
"error_change_sort_album": "앨범 표시 순서 변경 실패",
"error_delete_face": "얼굴 삭제 중 오류가 발생했습니다.",
@@ -853,10 +849,12 @@
"failed_to_keep_this_delete_others": "이 항목을 유지하고 다른 항목을 삭제하지 못했습니다.",
"failed_to_load_asset": "항목 로드 실패",
"failed_to_load_assets": "항목 로드 실패",
"failed_to_load_notifications": "알림 로드 실패",
"failed_to_load_people": "인물 로드 실패",
"failed_to_remove_product_key": "제품 키를 제거하지 못했습니다.",
"failed_to_stack_assets": "스택을 만들지 못했습니다.",
"failed_to_unstack_assets": "스택을 해제하지 못했습니다.",
"failed_to_update_notification_status": "알림 상태 업데이트 실패",
"import_path_already_exists": "이 가져올 경로는 이미 존재합니다.",
"incorrect_email_or_password": "잘못된 이메일 또는 비밀번호",
"paths_validation_failed": "경로 {paths, plural, one {#개} other {#개}}를 검증하지 못했습니다.",
@@ -924,7 +922,7 @@
"unable_to_remove_reaction": "반응을 제거할 수 없습니다.",
"unable_to_repair_items": "항목을 수리할 수 없습니다.",
"unable_to_reset_password": "비밀번호를 초기화할 수 없습니다.",
"unable_to_resolve_duplicate": "비슷한 항목을 처리할 수 없습니다.",
"unable_to_resolve_duplicate": "중복된 항목을 처리할 수 없습니다.",
"unable_to_restore_assets": "항목을 복원할 수 없습니다.",
"unable_to_restore_trash": "휴지통에서 항목을 복원할 수 없음",
"unable_to_restore_user": "사용자 삭제를 취소할 수 없습니다.",
@@ -978,7 +976,7 @@
"external": "외부",
"external_libraries": "외부 라이브러리",
"external_network": "외부 네트워크",
"external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom",
"external_network_sheet_info": "선호하는 Wi-Fi 네트워크에 연결되어 있지 않은 경우, 앱은 아래에 나열된 URL 중 연결 가능한 첫 번째 주소를 위에서부터 순서대로 사용합니다.",
"face_unassigned": "알 수 없음",
"failed": "실패함",
"failed_to_load_assets": "항목 로드 실패",
@@ -1002,7 +1000,7 @@
"folder": "폴더",
"folder_not_found": "폴더를 찾을 수 없음",
"folders": "폴더",
"folders_feature_description": "파일 시스템 사진 동영상을 폴더 로 탐색",
"folders_feature_description": "파일 시스템에 있는 사진 동영상을 폴더 보기로 탐색",
"forward": "앞으로",
"general": "일반",
"get_help": "도움 요청",
@@ -1025,7 +1023,7 @@
"header_settings_field_validator_msg": "값은 비워둘 수 없습니다.",
"header_settings_header_name_input": "헤더 이름",
"header_settings_header_value_input": "헤더 값",
"headers_settings_tile_subtitle": "앱이 각 네트워크 요청에 함께 전송할 프록시 헤더를 정의합니다.",
"headers_settings_tile_subtitle": "네트워크 요청에 함께 전송할 프록시 헤더를 정의합니다.",
"headers_settings_tile_title": "사용자 정의 프록시 헤더",
"hi_user": "안녕하세요 {name}님, ({email})",
"hide_all_people": "모든 인물 숨기기",
@@ -1045,13 +1043,13 @@
"home_page_delete_remote_err_local": "서버에서 삭제된 항목입니다. 건너뜁니다.",
"home_page_favorite_err_local": "기기의 항목은 즐겨찾기에 추가할 수 없습니다. 건너뜁니다.",
"home_page_favorite_err_partner": "파트너의 항목은 즐겨찾기에 추가할 수 없습니다. 건너뜁니다.",
"home_page_first_time_notice": "앱을 처음 사용하는 경우, 타임라인에 사진과 동영상이 표시될 수 있도록 백업 앨범을 선택해주세요.",
"home_page_first_time_notice": "앱을 처음 사용하는 경우, 기기에 있는 사진과 동영상을 타임라인에 표시하고 백업하려면 백업 앨범을 선택세요.",
"home_page_share_err_local": "기기에만 저장된 항목은 링크로 공유할 수 없어 건너뜁니다.",
"home_page_upload_err_limit": "한 번에 최대 30개의 항목만 업로드할 수 있습니다.",
"host": "호스트",
"hour": "시간",
"ignore_icloud_photos": "iCloud 사진 제외",
"ignore_icloud_photos_description": "iCloud에 저장된 사진 Immich 서버로 업로드되지 않습니다.",
"ignore_icloud_photos_description": "iCloud에 저장된 사진 Immich 업로드되지 않습니다.",
"image": "이미지",
"image_alt_text_date": "{date} 촬영한 {isVideo, select, true {동영상} other {사진}}",
"image_alt_text_date_1_person": "{date} {person1}님과 함께한 {isVideo, select, true {동영상} other {사진}}",
@@ -1199,6 +1197,9 @@
"map_settings_only_show_favorites": "즐겨찾기만 표시",
"map_settings_theme_settings": "지도 테마",
"map_zoom_to_see_photos": "축소하여 사진 보기",
"mark_all_as_read": "모두 읽음으로 표시",
"mark_as_read": "읽음으로 표시",
"marked_all_as_read": "모두 읽은 것으로 표시했습니다.",
"matches": "일치",
"media_type": "미디어 종류",
"memories": "추억",
@@ -1225,6 +1226,8 @@
"month": "월",
"monthly_title_text_date_format": "yyyy년 M월",
"more": "더보기",
"moved_to_archive": "보관함으로 항목 {count, plural, one {#개} other {#개}} 이동됨",
"moved_to_library": "라이브러리로 항목 {count, plural, one {#개} other {#개}} 이동됨",
"moved_to_trash": "휴지통으로 이동되었습니다.",
"multiselect_grid_edit_date_time_err_read_only": "읽기 전용 항목의 날짜는 변경할 수 없습니다. 건너뜁니다.",
"multiselect_grid_edit_gps_err_read_only": "읽기 전용 항목의 위치는 변경할 수 없습니다. 건너뜁니다.",
@@ -1232,7 +1235,7 @@
"my_albums": "내 앨범",
"name": "이름",
"name_or_nickname": "이름 또는 닉네임",
"networking_settings": "네트워킹",
"networking_settings": "연결",
"networking_subtitle": "서버 엔드포인트 설정 관리",
"never": "없음",
"new_album": "새 앨범",
@@ -1251,12 +1254,14 @@
"no_archived_assets_message": "사진과 동영상을 보관함으로 이동하여 목록에서 숨기기",
"no_assets_message": "여기를 클릭하여 첫 사진을 업로드하세요.",
"no_assets_to_show": "표시할 항목 없음",
"no_duplicates_found": "비슷한 항목을 찾을 수 없습니다.",
"no_duplicates_found": "중복된 항목이 없습니다.",
"no_exif_info_available": "EXIF 정보 없음",
"no_explore_results_message": "더 많은 사진을 업로드하여 탐색 기능을 사용하세요.",
"no_favorites_message": "즐겨찾기에 좋아하는 사진과 동영상을 추가하기",
"no_libraries_message": "외부 라이브러리를 생성하여 기존 사진과 동영상을 확인하세요.",
"no_name": "이름 없음",
"no_notifications": "알림 없음",
"no_people_found": "일치하는 인물 없음",
"no_places": "장소 없음",
"no_results": "결과가 없습니다.",
"no_results_description": "동의어 또는 더 일반적인 단어를 사용해 보세요.",
@@ -1331,7 +1336,7 @@
"pending": "진행 중",
"people": "인물",
"people_edits_count": "인물 {count, plural, one {#명} other {#명}}을 수정했습니다.",
"people_feature_description": "사진 동영상을 인물 그룹별로 탐색",
"people_feature_description": "사진 동영상을 인물 그룹별로 탐색",
"people_sidebar_description": "사이드바에 인물 링크 표시",
"permanent_deletion_warning": "영구 삭제 경고",
"permanent_deletion_warning_setting_description": "항목을 영구적으로 삭제하기 전 경고 메시지 표시",
@@ -1363,15 +1368,15 @@
"play": "재생",
"play_memories": "추억 재생",
"play_motion_photo": "모션 포토 재생",
"play_or_pause_video": "동영상 재생, 일시 정지",
"play_or_pause_video": "동영상 재생/일시 정지",
"port": "포트",
"preferences_settings_subtitle": "Manage the app's preferences",
"preferences_settings_title": "설정",
"preferences_settings_subtitle": "앱 설정 관리",
"preferences_settings_title": "개인 설정",
"preset": "사전 설정",
"preview": "미리 보기",
"previous": "이전",
"previous_memory": "이전 추억",
"previous_or_next_photo": "이전 또는 다음 이미지로",
"previous_or_next_photo": "이전/다음 사진으로",
"primary": "주요",
"privacy": "개인 정보",
"profile_drawer_app_logs": "로그",
@@ -1432,7 +1437,8 @@
"recent_searches": "최근 검색",
"recently_added": "최근 추가",
"recently_added_page_title": "최근 추가",
"recently_taken": "최근 촬영됨",
"recently_taken": "최근 항목",
"recently_taken_page_title": "최근 촬영됨",
"refresh": "새로고침",
"refresh_encoded_videos": "동영상 재인코딩",
"refresh_faces": "얼굴 새로고침",
@@ -1476,15 +1482,15 @@
"reset_password": "비밀번호 재설정",
"reset_people_visibility": "인물 표시 여부 초기화",
"reset_to_default": "기본값으로 복원",
"resolve_duplicates": "비슷한 항목 확인",
"resolved_all_duplicates": "비슷한 항목을 모두 확인했습니다.",
"resolve_duplicates": "중복된 항목 확인",
"resolved_all_duplicates": "중복된 항목을 모두 처리했습니다.",
"restore": "복원",
"restore_all": "모두 복원",
"restore_user": "사용자 복원",
"restored_asset": "항목이 복원되었습니다.",
"resume": "재개",
"retry_upload": "다시 시도",
"review_duplicates": "비슷한 항목 확인",
"review_duplicates": "중복된 항목 확인",
"role": "역할",
"role_editor": "편집자",
"role_viewer": "뷰어",
@@ -1503,7 +1509,7 @@
"search_albums": "앨범 검색",
"search_by_context": "내용 검색",
"search_by_description": "설명으로 검색",
"search_by_description_example": "설악산에서 즐기는 하이킹",
"search_by_description_example": "동해안에서 맞이하는 새해 일출",
"search_by_filename": "파일명 또는 확장자로 검색",
"search_by_filename_example": "예시: IMG_1234.JPG or PNG",
"search_camera_make": "카메라 제조사 검색...",
@@ -1528,14 +1534,14 @@
"search_no_more_result": "더이상 결과 없음",
"search_no_people": "인물이 없습니다.",
"search_no_people_named": "\"{name}\" 인물을 찾을 수 없음",
"search_no_result": "No results found, try a different search term or combination",
"search_no_result": "검색 결과가 없습니다. 다른 검색어나 조합으로 다시 시도해 보세요.",
"search_options": "검색 옵션",
"search_page_categories": "분류",
"search_page_motion_photos": "모션 포토",
"search_page_no_objects": "사용 가능한 사물 정보 없음",
"search_page_no_places": "사용 가능한 위치 정보 없음",
"search_page_screenshots": "스크린샷",
"search_page_search_photos_videos": "사진 및 동영상 검색하세요",
"search_page_search_photos_videos": "사진 및 동영상 검색",
"search_page_selfies": "셀피",
"search_page_things": "사물",
"search_page_view_all_button": "모두 보기",
@@ -1567,6 +1573,7 @@
"select_keep_all": "모두 유지",
"select_library_owner": "라이브러리 소유자 선택",
"select_new_face": "새 얼굴 선택",
"select_person_to_tag": "태그할 인물을 선택하세요.",
"select_photos": "사진 선택",
"select_trash_all": "모두 삭제",
"select_user_for_sharing_page_err_album": "앨범을 생성하지 못했습니다.",
@@ -1598,9 +1605,9 @@
"setting_languages_subtitle": "앱 언어 변경",
"setting_languages_title": "언어",
"setting_notifications_notify_failures_grace_period": "백그라운드 백업 실패 알림: {}",
"setting_notifications_notify_hours": "{}시간",
"setting_notifications_notify_hours": "{}시간",
"setting_notifications_notify_immediately": "즉시",
"setting_notifications_notify_minutes": "{}분",
"setting_notifications_notify_minutes": "{}분",
"setting_notifications_notify_never": "알리지 않음",
"setting_notifications_notify_seconds": "{}초",
"setting_notifications_single_progress_subtitle": "개별 항목의 상세 업로드 정보 표시",
@@ -1609,7 +1616,7 @@
"setting_notifications_total_progress_subtitle": "전체 업로드 진행률 (완료/전체)",
"setting_notifications_total_progress_title": "백그라운드 백업 전체 진행률 표시",
"setting_video_viewer_looping_title": "반복",
"setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.",
"setting_video_viewer_original_video_subtitle": "서버에서 동영상을 스트리밍할 때, 트랜스코딩된 버전이 있더라도 원본을 재생합니다. 이로 인해 버퍼링이 발생할 수 있습니다. 기기에 있는 동영상은 이 설정과 관계없이 항상 원본 화질로 재생됩니다.",
"setting_video_viewer_original_video_title": "원본 동영상 강제 사용",
"settings": "설정",
"settings_require_restart": "설정을 적용하려면 Immich를 다시 시작하세요.",
@@ -1668,7 +1675,7 @@
"sharing": "공유",
"sharing_enter_password": "이 페이지를 보려면 비밀번호를 입력하세요.",
"sharing_page_album": "공유 앨범",
"sharing_page_description": "공유 앨범을 만들어 주변 사람들 사진 동영상을 공유하세요.",
"sharing_page_description": "공유 앨범을 만들어 주변 사람들에게 사진 동영상을 공유하세요.",
"sharing_page_empty_list": "공유 앨범 없음",
"sharing_sidebar_description": "사이드바에 공유 링크 표시",
"sharing_silver_appbar_create_shared_album": "공유 앨범 생성",
@@ -1715,7 +1722,7 @@
"sort_title": "제목",
"source": "소스",
"stack": "스택",
"stack_duplicates": "비슷한 항목 스택",
"stack_duplicates": "중복된 항목 스택",
"stack_select_one_photo": "스택의 대표 사진 선택",
"stack_selected_photos": "선택한 이미지 스택",
"stacked_assets_count": "항목 {count, plural, one {#개} other {#개}} 스택됨",
@@ -1733,7 +1740,7 @@
"storage_usage": "{available} 중 {used} 사용",
"submit": "확인",
"suggestions": "추천",
"sunrise_on_the_beach": "동해안에서 맞이하는 새해 일출",
"sunrise_on_the_beach": "이미지에 존재하는 사물 검색",
"support": "지원",
"support_and_feedback": "지원 & 제안",
"support_third_party_description": "Immich가 서드파티 패키지로 설치 되었습니다. 링크를 눌러 먼저 패키지 문제인지 확인해 보세요.",
@@ -1745,7 +1752,7 @@
"tag": "태그",
"tag_assets": "항목 태그",
"tag_created": "태그 생성됨: {tag}",
"tag_feature_description": "사진 및 동영상을 주제별 그룹화된 태그로 탐색",
"tag_feature_description": "태그 주제별 그룹화된 사진과 동영상 탐색",
"tag_not_found_question": "태그를 찾을 수 없나요? <link>새 태그를 생성하세요.</link>",
"tag_people": "인물 태그",
"tag_updated": "태그 업데이트됨: {tag}",
@@ -1755,7 +1762,7 @@
"theme": "테마",
"theme_selection": "테마 설정",
"theme_selection_description": "브라우저 및 시스템 기본 설정에 따라 라이트 모드와 다크 모드를 자동으로 설정",
"theme_setting_asset_list_storage_indicator_title": "항목에 스토리지 동기화 여부 표시",
"theme_setting_asset_list_storage_indicator_title": "타일에 서버 동기화 상태 표시",
"theme_setting_asset_list_tiles_per_row_title": "한 줄에 표시할 항목 수 ({})",
"theme_setting_colorful_interface_subtitle": "배경에 대표 색상을 적용합니다.",
"theme_setting_colorful_interface_title": "미려한 인터페이스",
@@ -1781,7 +1788,7 @@
"to_trash": "삭제",
"toggle_settings": "설정 변경",
"toggle_theme": "다크 모드 사용",
"total": "합계",
"total": "전체",
"total_usage": "총 사용량",
"trash": "휴지통",
"trash_all": "모두 삭제",
@@ -1890,7 +1897,7 @@
"week": "주",
"welcome": "환영합니다",
"welcome_to_immich": "환영합니다",
"wifi_name": "WiFi Name",
"wifi_name": "W-Fi 이름",
"year": "년",
"years_ago": "{years, plural, one {#년} other {#년}} 전",
"yes": "네",

View File

@@ -182,20 +182,13 @@
"oauth_auto_register": "Automatinis registravimas",
"oauth_auto_register_description": "Automatiškai užregistruoti naujus naudotojus po prisijungimo per OAuth",
"oauth_button_text": "Mygtuko tekstas",
"oauth_client_id": "Kliento ID",
"oauth_client_secret": "Kliento paslaptis",
"oauth_enable_description": "Prisijungti su OAuth",
"oauth_issuer_url": "Teikėjo URL",
"oauth_mobile_redirect_uri": "Mobiliojo peradresavimo URI",
"oauth_mobile_redirect_uri_override": "Mobiliojo peradresavimo URI pakeitimas",
"oauth_mobile_redirect_uri_override_description": "Įjunkite, kai OAuth teikėjas nepalaiko mobiliojo URI, tokio kaip '{callback}'",
"oauth_profile_signing_algorithm": "Profilio registracijos algoritmas",
"oauth_profile_signing_algorithm_description": "Algoritmas naudojamas vartotojo profilio registracijai.",
"oauth_scope": "Apimtis",
"oauth_settings": "OAuth",
"oauth_settings_description": "Tvarkyti OAuth prisijungimo nustatymus",
"oauth_settings_more_details": "Detaliau apie šią funkciją galite paskaityti <link>dokumentacijoje</link>.",
"oauth_signing_algorithm": "",
"oauth_storage_label_claim": "",
"oauth_storage_label_claim_description": "",
"oauth_storage_quota_claim": "",

View File

@@ -150,19 +150,12 @@
"oauth_auto_register": "",
"oauth_auto_register_description": "",
"oauth_button_text": "Pogas teksts",
"oauth_client_id": "Klienta ID",
"oauth_client_secret": "Klienta noslēpums",
"oauth_enable_description": "Pieslēgties ar OAuth",
"oauth_issuer_url": "",
"oauth_mobile_redirect_uri": "",
"oauth_mobile_redirect_uri_override": "",
"oauth_mobile_redirect_uri_override_description": "",
"oauth_profile_signing_algorithm": "Profila parakstīšanas algoritms",
"oauth_profile_signing_algorithm_description": "Lietotāja profila parakstīšanai izmantotais algoritms.",
"oauth_scope": "",
"oauth_settings": "OAuth",
"oauth_settings_description": "OAuth pieteikšanās iestatījumu pārvaldība",
"oauth_signing_algorithm": "Parakstīšanas algoritms",
"oauth_storage_label_claim": "",
"oauth_storage_label_claim_description": "",
"oauth_storage_quota_claim": "",
@@ -203,8 +196,9 @@
"theme_custom_css_settings_description": "",
"theme_settings": "",
"theme_settings_description": "Immich tīmekļa saskarnes pielāgojumu pārvaldība",
"thumbnail_generation_job": "Sīktēlu ģenerēšana",
"thumbnail_generation_job_description": "",
"transcoding_acceleration_api": "",
"transcoding_acceleration_api": "Paātrināšanas API",
"transcoding_acceleration_api_description": "",
"transcoding_acceleration_nvenc": "NVENC (nepieciešams NVIDIA GPU)",
"transcoding_acceleration_qsv": "Quick Sync (nepieciešams 7. paaudzes vai jaunāks Intel procesors)",
@@ -214,10 +208,11 @@
"transcoding_accepted_audio_codecs_description": "",
"transcoding_accepted_video_codecs": "",
"transcoding_accepted_video_codecs_description": "",
"transcoding_advanced_options_description": "",
"transcoding_advanced_options_description": "Lielākajai daļai lietotāju nevajadzētu mainīt šīs opcijas",
"transcoding_audio_codec": "Audio kodeks",
"transcoding_audio_codec_description": "",
"transcoding_bitrate_description": "",
"transcoding_codecs_learn_more": "Lai uzzinātu vairāk par šeit lietoto terminoloģiju, skatiet FFmpeg dokumentāciju par <h264-link>H.264 kodeku</h264-link>, <hevc-link>HEVC kodeku</hevc-link> un <vp9-link>VP9 kodeku</vp9-link>.",
"transcoding_constant_quality_mode": "",
"transcoding_constant_quality_mode_description": "",
"transcoding_constant_rate_factor": "",

View File

@@ -71,12 +71,7 @@
"oauth_auto_launch": "Автоматско започнување",
"oauth_auto_register": "Автоматска регистрација",
"oauth_button_text": "Текст на копче",
"oauth_client_id": "Клиентски ID",
"oauth_client_secret": "Клиентска тајна",
"oauth_issuer_url": "URL на издавач",
"oauth_scope": "Опсег",
"oauth_settings": "OAuth",
"oauth_signing_algorithm": "Алгоритам за потпишување",
"offline_paths": "Офлајн патеки",
"password_settings": "Најава со лозинка",
"repair_all": "Поправи ги сите",

1
i18n/ml.json Normal file
View File

@@ -0,0 +1 @@
{}

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