Compare commits

...

192 Commits

Author SHA1 Message Date
midzelis f61b7a8a15 refactor(web): fixed-size scroll plane for timeline virtual scroll
Replaces the timeline's growing virtual scroll height with a fixed
500K-pixel scroll plane that recycles around an anchor month. Removes
the browser max-height ceiling and the O(N) layout cascade that ran on
every month height change.

- Months are positioned by planeTop, derived on demand by walking
  outward from the anchor in positionMonthsOnPlane.
- Soft repoint (trackAnchorToViewportTop) runs on every scroll; hard
  repoint (recenterPlane) slides the plane back toward PLANE_CENTER on
  idle or near plane edges.
- Height changes shift the anchor instead of scrollTop, fixing Safari
  momentum-scroll stutter when a viewport-top month settles.

Change-Id: I39cb61e7c4ff6cd5b0d59a7cc9c65b4e6a6a6964
2026-04-20 17:13:44 +00:00
Min Idzelis c78b1d8ab4 fix(web): prevent interaction with detail panel behind person side panel (#27309) 2026-04-20 15:26:06 +02:00
Jason Rasmussen 94a34436a3 chore: remove unused packages & code (#27925) 2026-04-20 08:39:46 -04:00
shenlong 0eef15a3ab chore(mobile): minor dependency updates (#27949)
* chore: minor dependency updates

* regenerate pod and remove unused imports

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-19 11:56:39 -05:00
shenlong 6982896549 feat: android periodic work manager task (#23563)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-19 11:55:07 -05:00
Matthew Momjian 2c812a2561 fix(docs): helmet file affected containers (#27939)
fix helmet file
2026-04-18 12:19:39 -04:00
Mert 0b1188e42e chore(server): separate ffmpeg arguments (#27937)
separate arguments
2026-04-18 15:33:44 +00:00
Freddie Floydd be20cd2bf9 chore(web): bump svelte-check version to silence big warning stack trace (#27935)
chore: bump svelte-check version to silence big warning log
2026-04-18 14:42:47 +00:00
LJspice b8591cb591 feat(server): add OIDC logout URL override option (#27389)
* feat(server): add OIDC logout URL override option
- Added toggle and field consistent with existing mobile redirect URI override.
- Existing auto-discovery remains default.
- Update tests and docs for new feature.

* fix(server): changes from review for OIDC logout URL override
- Rename 'logoutUri' to 'endSessionEndpoint'
- Remove toggle, just use override if provided
- Moved field in settings UI
2026-04-18 04:18:21 +00:00
Freddie Floydd 384d3a0984 fix(web): fix stale album page load (#27825)
* invalidate album data on album update to fix stale page load

* invalidate album data on album update to fix stale page load

* factor out callback, make async and await invalidate

* chore: formatting

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-04-17 21:24:33 -04:00
Freddie Floydd 03af669856 refactor(web): co-locate single-use components in /routes (#27921)
* co-locate single use components to /routes

* revert accidentally changed paths

* fix mangled path

* fmt

* fix accidentally moved multi-use components
2026-04-17 21:21:36 -04:00
renovate[bot] b0e4850d76 chore(deps): update dependency flutter to v3.41.6 (#27915)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-18 05:14:44 +05:30
Freddie Floydd 36ebcaf00c fix(web): compute hashes for uploads in chunks (#27878)
* add @noble/hashes as a dep for web

* hash files in chunks

* drop old reference to crypto in test code

* use web worker for file hashing
2026-04-17 19:08:46 -04:00
shenlong 7a86f2b7b9 chore: remove stale mobile/.isar submodule entry (#27913)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-18 04:29:13 +05:30
sparsh985 55f2b3b6a0 feat(server): add configurable OAuth prompt parameter (#26755)
* feat(server): add configurable OAuth prompt parameter

Add a `prompt` field to the OAuth system config, allowing admins to
configure the OIDC `prompt` parameter (e.g. `select_account`, `login`,
`consent`). Defaults to empty string (no prompt sent), preserving
backward compatibility.

This is useful for providers like Google where users want to be prompted
to select an account when multiple accounts are signed in.

Discussed in #20762

* chore: regenerate OpenAPI spec and clients for OAuth prompt field

* Adding e2e test cases

* feat: web setting

* feat: docs

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-04-17 21:20:07 +00:00
shenlong fd5e8d6521 chore: pump auto_route (#27876)
* chore: pump auto_route

* make build

* chore: use drift from pubdev (#27877)

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

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-17 20:28:36 +00:00
Freddie Floydd 6798d5df32 fix(server): require at least one field to be set when updating memory (#27842)
* add zod util to require one field is set in some schemas. appy to update memory endpoint

* add test
2026-04-17 20:18:48 +00:00
Min Idzelis 9d33853544 fix(web): respect abort signal after timeline bucket fetches (#27563)
Change-Id: I4bf7c7458883b50bd21484b1029d62526a6a6964
2026-04-17 16:18:14 -04:00
bo0tzz a46e46452c fix: run profile picture through thumbnail pipeline (#27890)
* fix: run profile picture through thumbnail pipeline

* fix: format
2026-04-17 16:15:59 -04:00
santanoce dbf30b77bf feat(server): added backchannel logout api endpoint (#26235)
* feat(server): added backchannel logout api endpoint

* test(server): fixed e2e tests

* fix(server): fixed suggested changes by reviewer

* feat(server): created function invalidateOAuth

* fix(server): fixed session.repository.sql

* test(server): added unit tests for backchannelLogout function

* test(server): added e2e tests for oidc backchnnel logout

* docs(server): added documentation on backchannel logout url

* docs(server): fixed typo

* feat(server): minor improvements of the oidc backchannel logout

* test(server): fixed tests after merge with main

* fix(server): fixed e2e test file

* refactor(server): tiny refactor of validateLogoutToken

* chore: cleanup

* fix: tests

* fix: make jwks extractable

---------

Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-04-17 18:45:33 +00:00
bo0tzz 8afca348ff fix: sanitize filenames before adding to zip (#27893)
* fix: sanitize filenames before adding to zip

* fix: lints

* chore: drop split()
2026-04-17 13:05:53 -04:00
shenlong 2070f775d6 refactor: remove riverpod generator (#27874)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-17 20:01:44 +05:30
bo0tzz a456a05052 chore: make filesystem backup docs even more explicit (#27013) 2026-04-17 15:42:40 +02:00
Sergey Katsubo b7eff33f90 chore(web): refactor date section of asset viewer (#24514)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-04-17 12:56:39 +00:00
Mees Frensel 18c0228f1b fix(web): remove json title from duplicate tool thumbnail (#27886) 2026-04-17 08:37:04 -04:00
Jason Rasmussen 2f8be45fe0 chore!: remove /api/server/theme endpoint (#27880)
chore: remove server/theme endpoint
2026-04-17 08:30:03 -04:00
Daniel Dietzler 41968fdcac feat: cache shared link (#27889) 2026-04-17 08:17:39 -04:00
Yaros 79c392ceba fix(docs): instructions on how to use local immich ui (#27813) 2026-04-17 12:29:14 +02:00
Mees Frensel 8fbeb64c59 fix(web): use event for zooming out after opening face editor (#27789) 2026-04-17 12:14:24 +02:00
Mees Frensel 7d181f0686 fix!: set duration to null when not present (#26982) 2026-04-17 11:57:10 +02:00
shenlong 2172dde7dc chore: remove immich lint (#27873)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-16 15:55:40 -05:00
Luis Nachtigall fce220b1d7 chore(mobile): update special format column detection (#27867) 2026-04-16 14:01:59 -04:00
shenlong 2a47c35eb7 chore: pump flutter to 3.41.6 (#27834)
* chore: pump flutter to 3.41.6

* more isar cleanup

* ignore experimental use for TableMigration

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-16 22:26:46 +05:30
Jason Rasmussen 6aadb7b5bd feat: dynamic languages (#27869)
Co-authored-by: xantin <github@xantin.be>
2026-04-16 12:37:37 -04:00
renovate[bot] 88bce52042 fix(deps): update dependency jose to v6 (#27862)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-04-16 18:36:07 +02:00
Timothy Dobras d046f16860 fix(oauth): normalize email claim to lowercase and trim before account lookup and registration (#26841)
* fix(oauth): normalize email claim to lowercase before account lookup and registration

* test(auth): add test for OAuth email case normalization

* chore: clean up

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-04-16 15:41:42 +00:00
renovate[bot] 88815a0345 chore(deps): update base-image to v202604141125 (major) (#27858)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 15:40:40 +00:00
Jason Rasmussen 57212f29bf chore: bump (#27866) 2026-04-16 11:32:33 -04:00
renovate[bot] 95fa8fbdab chore(deps): update machine-learning (#26970)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 11:32:08 -04:00
renovate[bot] 687b7cad6f chore(deps): update dependency terragrunt to v1 (#27860)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 10:36:15 -04:00
Steven Massaro ac2ebcee37 chore: improve randomness of /search/random endpoint (#27531) 2026-04-16 14:36:05 +00:00
bo0tzz 3356e81c85 fix!: do not allow insecure oauth requests by default (#27844)
* fix!: do not allow insecure oauth requests by default

* fix: format

* fix: make open-api

* fix: tests

* nit: casing

* chore: migration to allow insecure if current oauth uses http
2026-04-16 10:11:58 -04:00
renovate[bot] 9c642bd6fc chore(deps): update github-actions (#27857)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 15:29:48 +02:00
bo0tzz 9da0cb3cf4 chore: link to PR template in auto-close message (#27756) 2026-04-16 09:14:36 -04:00
renovate[bot] 4ff6cca4da fix(deps): update dependency pillow to >=12.2,<12.3 [security] (#27773)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 09:13:39 -04:00
renovate[bot] 2b7ae4981f chore(deps): update dependency pytest to v9.0.3 [security] (#27777)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 09:12:49 -04:00
renovate[bot] e63df4121a chore(deps): update dependency @types/node to ^24.12.2 (#27856)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 13:12:38 +00:00
renovate[bot] 03b4ab2935 fix(deps): update dependency simple-icons to v16 (#27855)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 13:07:35 +00:00
bo0tzz facd3bd331 fix: oauth issuerUrl validation (#27848) 2026-04-16 09:06:55 -04:00
renovate[bot] 20ddf2e7d2 fix(deps): update dependency nestjs-cls to v6 (#27852)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 13:45:42 +02:00
renovate[bot] 7f0025b3fc chore(deps): update dependency @types/nodemailer to v8 (#27851)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 13:28:23 +02:00
Mees Frensel 60f4dedb29 chore(web): small fixes for location picker modal (#27822) 2026-04-16 11:49:24 +02:00
Min Idzelis d5d2ebd9bf fix(web): close edit faces panel on Escape key press (#27519)
Move `showEditFaces` state to `assetViewerManager` so the edit faces
panel open/close state is globally accessible. Add Escape key handling
to `PersonSidePanel` that closes the assign-face sub-panel first, then
the edit faces panel. Guard the asset viewer's global Escape-to-close
action so it doesn't fire while either face panel is open.

Change-Id: I0c947fe0758aef0eac473f4cc72f6a3b6a6a6964
2026-04-15 20:22:20 -05:00
Yaros 37abbeba52 fix(mobile): readonly redirect when not logged in (#27728) 2026-04-15 20:20:08 -05:00
Min Idzelis 50557002b7 fix(web): stale adaptive image when original overlays preview (#27621)
AdaptiveImage stacks quality layers (thumbnail → preview → original) as they load. Without compositor layer promotion on the container, the browser could render a stale frame when the original-quality layer was overlaid on top of the preview-quality layer.

Add `will-change: transform` as a class on AdaptiveImage's root element so it gets a dedicated compositor layer from first paint. This also subsumes the imperative `style.willChange = 'transform'` that zoomImageAction was applying to the same element (the zoom target from photo-viewer is the AdaptiveImage root), so drop that now-redundant code.

Change-Id: Icd866a2bb5a5fce299c36404547fa0546a6a6964
2026-04-15 20:19:18 -05:00
Min Idzelis 4aa31d38bf fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early (#27713)
fix(web): cancel video preview fetch when bind:this is cleared early

In Svelte 5.53.9, `bind:this` is now cleared earlier in the unmount
sequence ("better bind:this cleanup timing"). The video thumbnail's
$effect was relying on the old order to read the bound `player` element
and clear its `src` to abort the in-flight `/api/assets/{id}/video/playback`
range request — but the bind is now `undefined` by the time the effect
runs, so the cleanup is silently skipped. The detached <video> keeps
its src, and Firefox does not abort an in-flight media fetch when the
element is detached/GC'd. Long-lived 206 range requests then saturate
Firefox's 6-connection HTTP/1.1 per-host limit and freeze the timeline
(see #27585).

Capture the player reference inside the effect and tear down via the
effect cleanup return — Svelte runs the prior cleanup (with the captured
ref) before `bind:this` is cleared. Use the canonical
`pause() / removeAttribute('src') / load()` sequence which actually aborts
the fetch in Firefox, even on a detached element.

Fixes #27585

Change-Id: I4d9fba859955f5c54f603c345e61d4206a6a6964
2026-04-15 20:18:59 -05:00
Min Idzelis 3d8df74b43 refactor(web): turn thumbhash action into Thumbhash component (#27741)
refactor(web): extract thumbhash canvas into Thumbhash component

Change-Id: If78955bed48b6e690df398e5e2ae61fb6a6a6964
2026-04-15 20:18:49 -05:00
renovate[bot] 2ff9f95527 chore(deps): update dependency python-multipart to v0.0.26 [security] (#27838)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-15 19:06:27 -04:00
Jason Rasmussen a69eecf3bc chore!: remove without assets (#27835)
* chore!: remove without assets

* fix: linting and e2e

---------

Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-04-15 18:34:22 -04:00
Jason Rasmussen 4ffa26c969 feat: auth logout page (#27831)
* feat: auth logout page

* feat: skip login if already logged in
2026-04-15 16:33:52 -04:00
Jason Rasmussen ac06514db5 feat: album map markers endpoint (#27830) 2026-04-15 15:58:34 -04:00
Jason Rasmussen 792cb9148b chore!: rename API key schemas (#27828)
chore!: rename API schemas
2026-04-15 15:58:26 -04:00
Daniel Dietzler 8ee5d3039a chore!: remove deviceId and deviceAssetId (#27818)
chore: remove deviceId and deviceAssetId
2026-04-15 15:00:33 -04:00
Jason Rasmussen d410131312 chore!: remove old timeline sync endpoints (#27804) 2026-04-15 13:58:48 -04:00
bo0tzz 5334a6254a fix: make web build stage deterministic (#27823) 2026-04-15 19:31:23 +02:00
shenlong 79fccdbee0 refactor: yeet old timeline (#27666)
* refactor: yank old timeline

# Conflicts:
#	mobile/lib/presentation/pages/editing/drift_edit.page.dart
#	mobile/lib/providers/websocket.provider.dart
#	mobile/lib/routing/router.dart

* more cleanup

* remove native code

* chore: bump sqlite-data version

* remove old background tasks from BGTaskSchedulerPermittedIdentifiers

* rebase

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-15 23:00:27 +05:30
Brandon Wees 6dd6053222 feat: mobile editing (#25397)
* feat: mobile editing

fix: openapi patch

this sucks :pepehands:

chore: migrate some changes from the filtering PR

chore: color tweak

fix: hide edit button on server versions

chore: translation

* chore: code review changes

chore: code review

* sealed class

* const constant

* enum

* concurrent queries

* chore: major cleanup to use riverpod provider

* fix: aspect ratio selection

* chore: typesafe websocket event parsing

* fix: wrong disable state for save button

* chore: remove isCancelled shim

* chore: cleanup postframe callback usage

* chore: clean import

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2026-04-15 09:26:40 -05:00
Mees Frensel 8454cb2631 chore: exit open-api script on errors (#27815) 2026-04-15 10:09:51 -04:00
Daniel Dietzler 603fc7401f fix: redirect original (#27759) 2026-04-15 15:43:09 +02:00
Jason Rasmussen ed70e0febf chore: stop using legacy partner create endpoint (#27806) 2026-04-15 16:16:43 +05:30
Jason Rasmussen 5f5e3344d5 chore!: remove unused token response param (#27805) 2026-04-15 00:58:00 -04:00
Brandon Wees 6da2d3d587 chore!: remove getRandom api endpoint (#27780)
* chore!: remove getRandom api endpoint

* chore: sync openapi

* fix: test

* chore: more cleanup
2026-04-14 21:32:12 -04:00
Jason Rasmussen 41d2d84b21 chore!: remove deprecated env variables (#27802) 2026-04-14 21:30:31 -04:00
Jason Rasmussen 6ba17bb86f refactor!: remove my shared link dto (#27023)
refactor!: remove deprecated shared link apis
2026-04-14 20:58:02 -04:00
Jason Rasmussen e1a84d3ab6 refactor!: remove replace asset (#27022) 2026-04-14 20:21:05 -04:00
Timon 7d8f843be6 refactor!: migrate class-validator to zod (#26597) 2026-04-14 23:39:03 +02:00
OdinOxin 3753b7a4d1 feat: sort users alphabetically when adding to album (#27731) 2026-04-14 21:21:22 +02:00
Jonathan Jogenfors 84a1fb27ca feat(web): lazy load library and server statistics (#26406)
* feat: add offline library statistics

* fix comments

* feat: add offline library statistics

* fix comments

* fix Daniel's comments

* fix Daniels comment 2
2026-04-14 12:54:09 -04:00
Yaros 81780b0cc0 fix(web): add partner photo to album from multiselect (#27767)
* fix(web): add partner photo to album

* chore: fix formatting

* fix: run-job assets

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-04-14 16:48:39 +00:00
Min Idzelis 5e81a5a054 feat(web): remove delay from Skeleton (#27580)
Change-Id: I95a37f1af832c005a8f009d6f07df8ac6a6a6964
2026-04-14 12:47:37 -04:00
Miguel Raposo e4e2f586b5 fix(server): render storage template date/time tokens in UTC (#24350) (#26917) 2026-04-14 18:45:14 +02:00
OdinOxin a001adf14a feat: filter users on share (#27732)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-04-14 16:43:45 +00:00
Daniel Dietzler 136814540a fix: asset multi select download shortcut (#27784) 2026-04-14 12:29:55 -04:00
Jason Rasmussen fed5cc1ae1 feat: upgrade immich/ui (#27792) 2026-04-14 16:18:12 +00:00
Yaros 641ab51b80 fix(web): selection clearing on preview (#27702)
* fix(web): selection clearing on preview

* chore: remove unnecessary checks
2026-04-14 10:06:32 -05:00
Yaros 3b47ca1c37 fix(mobile): add keys for person tiles in search (#27689)
* fix(mobile): key for person tiles in search

* chore: add key to avatar

* chore: use simple personId

* chore: rename key in person page
2026-04-14 10:05:09 -05:00
Jason Rasmussen 8fb2c7755d feat: commands (#27546) 2026-04-14 09:34:46 -04:00
Jason Rasmussen 1ba0989e15 refactor: auth manager (#27638) 2026-04-14 08:49:24 -04:00
renovate[bot] daed3f0966 chore(deps): update dependency @sveltejs/kit to v2.57.1 [security] (#27762)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-14 11:50:25 +02:00
renovate[bot] 46d612ad8c chore(deps): update dependency nodemailer to v8.0.5 [security] (#27623)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-14 11:49:26 +02:00
renovate[bot] 513dead2c2 chore(deps): update dependency @nestjs/core to v11.1.18 [security] (#27544)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-14 09:49:03 +00:00
renovate[bot] ca006c1569 fix(deps): update typescript-projects (#27573)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-04-14 11:41:09 +02:00
renovate[bot] 4e8e8304fd fix(deps): update react-email monorepo (major) (#27572)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-14 11:40:58 +02:00
Nicolas-micuda-becker d377d2e145 fix(web): center images in RTL layouts (#27678) (#27753) 2026-04-13 13:29:35 -05:00
shenlong 9c9feddf7d refactor: folder page to use new models (#27657)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-13 12:19:44 -05:00
Andreas Heinz bfcf34d8b5 feat(web): persist state of file path information in details panel (#27770)
feat(enhancement): persist state of file path info in details panel
2026-04-13 12:18:34 -05:00
github-actions 95e57a24cb chore: version v2.7.5 2026-04-13 14:27:31 +00:00
Weblate (bot) eada662981 chore(web): update translations (#27589)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/da/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/de_CH/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/eo/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/id/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ko/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/th/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/vi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/yue_Hant/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/
Translation: Immich/immich

Co-authored-by: Aliyss Snow <mangoworksbeta@gmail.com>
Co-authored-by: Bannawat Thongbai <kaji.kanlapat99@gmail.com>
Co-authored-by: Carlo Beltrame <weblate@pendantmusic.ch>
Co-authored-by: Dawnsink <dai@cosmopeace.com>
Co-authored-by: Edmundas <edmius@gmail.com>
Co-authored-by: Happy <59247878+happy2452354@users.noreply.github.com>
Co-authored-by: Jeppe Nellemann <jepnel@proton.me>
Co-authored-by: Linerly <linerly@proton.me>
Co-authored-by: Link Notig <TestMailProtonWhyNot@protonmail.com>
Co-authored-by: Mees Frensel <meesfrensel@gmail.com>
Co-authored-by: Mārtiņš Bruņenieks <martinsb@gmail.com>
Co-authored-by: Osama <laptooxz@proton.me>
Co-authored-by: PPNplus <ppnplus@protonmail.com>
Co-authored-by: Tim Morley <weblate.3919org@timsk.org>
Co-authored-by: UDP <udp@users.noreply.hosted.weblate.org>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Volodymyr Sakharov <savolodya@gmail.com>
Co-authored-by: Vykintas Vyšniauskas <vykintasv@gmail.com>
Co-authored-by: WellsTsai <dan50907@gmail.com>
Co-authored-by: brainheart95 <josephdm4d@gmail.com>
Co-authored-by: dvbthien <dvbthien@users.noreply.hosted.weblate.org>
Co-authored-by: 이찬웅 <lcw7527@gmail.com>
2026-04-13 14:25:01 +00:00
Zack Pollard 352f6ecc28 fix(server): add rate limit and deduplication to version check (#27747) 2026-04-13 12:35:46 +00:00
github-actions bee49cef02 chore: version v2.7.4 2026-04-10 16:32:26 +00:00
shenlong 6d0c6a4008 chore: pump cronet version (#27685)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2026-04-10 16:29:05 +00:00
Luis Nachtigall 8a975e5ea9 refactor(mobile): cleanup iOS image loading pipeline (#27672)
* refactor: replace DispatchQueue + DispatchSemaphore with OperationQueue for image processing

* implement RequestRegistry and UnfairLock for managing cancellable requests

* implement requests registry for local and remote image processing

* remove Cancellable protocol and cancel method from request registry

* refactor: introduce ImageRequest base class with unified cancellation and finish helpers

* refactor: add get method to RequestRegistry and streamline request removal in image processing

* add guard to cancel to prevent double onCancel calls

* fix duplicate code merge issue

* refactor(ios): enhance finish method to return callback status

* remove unfitting methods form ImageRequest.swift and fix memory issue

* revert bad merge

* refactor(ios): resolve cancellation issues

* refactor(ios): streamline image request completion handling

* add return statements

* refactor(ios): simplify image request cancellation and registry handling

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2026-04-10 10:56:35 -05:00
Luis Nachtigall d39e7da10d fix(mobile): fix flutter cache eviction on thumbnails (#27663)
* fix: add markFinished parameter to loadRequest and loadCodecRequest methods

* update loadRequest and loadCodecRequest methods to use isFinal

* Apply suggestions from code review

Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>

* remove redundant check

* fix: ensure isFinished is set correctly during cache eviction

* formatting

---------

Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
2026-04-10 10:28:55 -05:00
Daniel Dietzler bc400d68ac chore: move .tsbuildinfo file to dist folder (#27682) 2026-04-10 16:02:25 +02:00
renovate[bot] d7f038ec60 chore(deps): update dependency eslint-plugin-unicorn to v64 (#27575)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-04-10 10:23:42 +00:00
Mees Frensel 26957f37ce fix(server): hide original filename when not showing metadata (#27581) 2026-04-10 12:07:18 +02:00
github-actions 3254d31cd2 chore: version v2.7.3 2026-04-09 17:51:40 +00:00
Jason Rasmussen 7b269d1638 fix: ssr open graph tags (#27639)
fix: SSR open graph tags
2026-04-09 12:16:41 -04:00
Luis Nachtigall b5bed02300 fix(mobile): get provider refs before async gaps in backup page (#27597)
* fix(mobile): get provider refs before async gaps in backup page

* fix(mobile): use previously created provider refs in start backup function
2026-04-08 20:55:53 -05:00
Zack Pollard 5553910236 fix(web): don't cache empty search results for people search (#27632) 2026-04-09 02:33:04 +01:00
Zack Pollard 8d67c1f820 fix(server): people search not showing for 3 or less characters (#27629)
Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
2026-04-09 01:56:07 +01:00
Matthew Momjian ed0ec30917 fix(docs): updated docker deprecation link (#27633)
new link
2026-04-08 20:33:11 -04:00
Luis Nachtigall 2b0f6c9202 fix(mobile): improve image load cancellation handling (#27624)
fix(image): improve image load cancellation handling
2026-04-08 17:23:42 -04:00
André Erasmus 55ab8c65b6 fix(server): avoid false restore failures on large database imports (#27420)
* fix(server): increase restore health check timeout and reject with Error

* chore: clean up

---------

Co-authored-by: André Erasmus <25480506+NoBadDays@users.noreply.github.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-04-08 16:03:41 -04:00
Cullen Jennings 781d568f29 fix(docs): typo 'Start rating' to 'Star rating' (#27606) 2026-04-08 18:25:45 +00:00
Zack Pollard 6a361dae72 fix(server): use randomized cron for version check scheduling (#27626)
Also removes unnecessary rate limit
2026-04-08 19:15:38 +01:00
renovate[bot] 64766c8c06 chore(deps): update github-actions (#27560)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-08 17:32:54 +02:00
github-actions 6a63e814a5 chore: version v2.7.2 2026-04-07 20:58:38 +00:00
Jason Rasmussen 6441c3b77c fix: server build (#27599) 2026-04-07 20:53:04 +00:00
github-actions b03a649e74 chore: version v2.7.1 2026-04-07 20:22:28 +00:00
Mert 2903b2653b fix(server): library import batch size (#27595)
* lower batch size

* update test
2026-04-07 15:58:03 -04:00
Mert 9ba9a22c40 fix(ml): downgrade numpy (#27591)
downgrade numpy
2026-04-07 15:57:42 -04:00
bo0tzz f1882c2926 fix: csp quotes (#27592) 2026-04-07 15:54:30 -04:00
Daniel Dietzler 4278789083 chore: git ignore tsBuildInfo (#27594) 2026-04-07 15:53:10 -04:00
renovate[bot] 921c8a8de3 chore(deps): update dependency typescript to v6 (#27577)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-04-07 17:15:55 +02:00
github-actions afec61addc chore: version v2.7.0 2026-04-07 15:08:18 +00:00
Weblate (bot) a1a03efbcd chore(web): update translations (#27483)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/bg/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/el/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/gl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ko/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/th/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hans/
Translation: Immich/immich

Co-authored-by: Dawnsink <dai@cosmopeace.com>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Francesco Fiorentino <gallgricela+trotter@gmail.com>
Co-authored-by: Frank Paul Silye <frankps@gmail.com>
Co-authored-by: Gianni De Wachter <gianni.dewachter@gmail.com>
Co-authored-by: HackingAll <hacking.all.YT@gmail.com>
Co-authored-by: Haru Ijima <haruijimakun@gmail.com>
Co-authored-by: Hurricane_32 <rodrigorimo@hotmail.com>
Co-authored-by: Jarek Iwanus <jiwanus@proton.me>
Co-authored-by: Junghyuk Kwon <kwon@junghy.uk>
Co-authored-by: Krastyo Krastev <roshavi4ak@gmail.com>
Co-authored-by: Luis Peregrina <luis.a.peregrina@gmail.com>
Co-authored-by: MarcSerraPeralta <marcserraperalta@gmail.com>
Co-authored-by: Matjaž T. <matjaz@moj-svet.si>
Co-authored-by: Petri Hämäläinen <petri.hamalainen@mailbox.org>
Co-authored-by: Simen Haugen <simen00@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: TA <tobi@warsnich.de>
Co-authored-by: TV Box <realceday.tvbox@gmail.com>
Co-authored-by: Veerasak Kritsanapraphan <veerasak.kritsanapraphan@gmail.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: chamdim <chamdim@protonmail.com>
Co-authored-by: miksuk28 <mikhail@sukhanik.no>
Co-authored-by: muziqaz <muziqaz@users.noreply.hosted.weblate.org>
Co-authored-by: nanai <ivagamerytmc@gmail.com>
Co-authored-by: naxxerd <top.gear2951@dsme.no>
Co-authored-by: ray ra <verdonsky22@gmail.com>
Co-authored-by: 张建涛 <app521@gmail.com>
Co-authored-by: 안세훈 <on9686@gmail.com>
2026-04-07 15:05:52 +00:00
Dominik Szymański 1d0e5cf18d fix: allow bots to access /s/ urls (#27579)
#27548 Add Allow directive for custom share links social media preview
2026-04-07 09:22:53 -05:00
Min Idzelis de9ec95db1 fix(web): handle unhandled promise rejection in CancellableTask (#27553)
When a concurrent caller awaits `this.complete` inside `execute()` and
`cancel()` is called, the promise rejects with `undefined` outside of any
try/catch, causing "Uncaught (in promise) undefined" console spam during
rapid timeline scrolling.

- Wrap the `await this.complete` path in try/catch, returning 'CANCELED'
- Guard the `finally` block to only null `cancelToken` if it still belongs
  to this call, preventing a race condition with `cancel()` to `init()`

Change-Id: I65764dd664eb408433fc6e5fc2be4df56a6a6964
2026-04-07 09:22:29 -05:00
renovate[bot] 7f784952eb chore(deps): update dependency rollup-plugin-visualizer to v7 (#27576)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-07 11:01:23 +00:00
renovate[bot] 3d6c7ba353 chore(deps): update dependency @types/supertest to v7 (#27574)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-07 10:57:45 +00:00
renovate[bot] 3be97db118 fix(deps): update react monorepo to v19 (major) (#27571)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-07 12:53:33 +02:00
renovate[bot] 8f3a99ffbc chore(deps): update dependency eslint-plugin-compat to v7 (#27570)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-07 10:52:25 +00:00
renovate[bot] e6d114af10 chore(deps): update dependency terragrunt to v0.99.5 (#27567)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-07 12:37:29 +02:00
renovate[bot] 4e28811f09 chore(deps): update prom/prometheus docker digest to dda13e2 (#27566)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-07 11:49:05 +02:00
renovate[bot] 4987032e62 chore(deps): update docker.io/valkey/valkey:9 docker digest to 3b55fba (#27559)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-07 11:48:06 +02:00
renovate[bot] 572bad8ede chore(deps): update dependency vite to v8.0.5 [security] (#27543)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-06 18:20:10 +00:00
Afonso Mendonça Ribeiro 95c1f0efeb fix: timestamp handling for database backup in Web UI (#27359)
* Fix #26502: Fix timestamp handling for database backup in Web UI

Frontend parsed backup timestamps as UTC, but they were in the
server's local timezone, causing wrong relative times.

Add `timezone` field to DatabaseBackupDto to expose server timezone.
Update frontend to parse timestamps using this timezone.
Convert timestamps to user's local timezone before rendering.
Fallback to browser timezone if server timezone is missing.

Ensures correct relative time display in Web UI.

* fix: regenerate open-api types and remove custom backup type

- Ran `make open-api` to update types based on backend changes
- Removed custom BackupWithTimezone type in MaintenanceBackupsList
- Updated timezone props to use the newly generated native type

* fix: simplify timezone handling for database backups

- Updated DatabaseBackupDto to make timezone a required property
- Removed manual DateTime.local().zoneName fallbacks
- Cleaned up type casts after regenerating OpenAPI types

* fix: Add missing newline at end of spec file
2026-04-06 17:27:48 +02:00
Thomas fbe631fe91 fix(mobile): convert video controls from hook to stateful widget (#27514)
We are generally looking to move away from hooks as they are hard to
reason about and have weird bugs. In particular, the timer did not
properly capture the ref of the callback, and so it would execute on old
state. A standard stateful widget does not have this problem, and is
easier to organise.

Co-authored-by: Alex <alex.tran1502@gmail.com>
2026-04-06 10:13:45 -05:00
Putu Prema 2143a0c935 fix(mobile): transparent system navbar when trash bottom bar is visible (#27093)
* disable bottom safe area on trash bottom bar so that it extends below the system nav bar

* remove manual padding calculations

* re-add static vertical padding to maintain previous bottom bar height
2026-04-06 09:28:07 -05:00
Ray 136bd1e2eb feat(server): Add support for .ts files (#27529) 2026-04-06 15:50:05 +02:00
Min Idzelis 564065a3ed fix(web): reset cursor style when slideshow bar unmounts (#27521) 2026-04-06 14:07:49 +02:00
Min Idzelis 9bcce59719 fix(e2e): fix search gallery delete tests (#27536) 2026-04-06 14:00:50 +02:00
Luis Nachtigall cd86a83c33 refactor(mobile): introduce image request registry on iOS (#27486)
* refactor: replace DispatchQueue + DispatchSemaphore with OperationQueue for image processing

* implement RequestRegistry and UnfairLock for managing cancellable requests

* implement requests registry for local and remote image processing

* remove Cancellable protocol and cancel method from request registry

* use mutex

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2026-04-05 18:55:43 -04:00
Min Idzelis f29c06799f fix(web): isFullScreen initial value check is incorrect (#27520) 2026-04-05 21:19:58 +00:00
Luis Nachtigall 6fcf651d76 refactor(mobile): IOS replace DispatchQueue + DispatchSemaphore with OperationQueue for image processing (#27471)
refactor: replace DispatchQueue + DispatchSemaphore with OperationQueue for image processing
2026-04-05 16:11:02 -04:00
Zack Pollard 196307bca5 chore(server): use dev version check endpoint for non-production environments (#27508) 2026-04-05 10:52:59 +01:00
Thomas 776b9cbad5 fix(mobile): use key on video controls (#27512)
The widget is not recreated correctly when videoPlayName changes, which
can cause weird behaviour with hooks and timers (like timers not firing
when they should do). Using a key forces flutter to recreate the widget
properly and allow the assumptions in build to work correctly.
2026-04-04 21:54:34 -05:00
Thomas 960be0c27a fix(mobile): don't update search filters in-place (#26965)
* fix(mobile): don't update search filters in-place

Search filters are currently modified in-place, which can feel quite
janky. The chips behind the bottom sheet update instantly, and the
search page gets confused because filters have been applied but no
search has been initiated. Filters should keep their own copy of the
filter when they're opened, and the commit + search on apply.

The previous filter and pre-filter concepts were also cleaned up. They
added complexity, and `search()` now owns the full life cycle of the
filter.

This now also reverts the changes from #27155, as this solution should
be cleaner.

* refactor & color tweak

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2026-04-04 22:53:03 +00:00
Thomas 123119ca0d chore(mobile): reduce buffering timer duration (#27111)
3 seconds is too long for some people, and it can be confusing to see
the video not playing and no indication that it's buffering. Reducing
the duration of the timer should show the spinner faster and prevent
confusion.

Co-authored-by: Alex <alex.tran1502@gmail.com>
2026-04-04 21:25:40 +00:00
Thomas 1772f720bf fix(mobile): reset video controls hide timer when showing controls ch… (#26985)
fix(mobile): reset video controls hide timer when showing controls changes

The hide timer currently only resets when the status of the video
changes, but does not account for when the controls change. This means
that two things happen:

 1. The hide timer does not reset when the controls become visible
    again, the controls will stay visible forever or until the playback
    status changes.
 2. The hide timer will fire too quickly, and will hide the controls
    much sooner than 5 seconds if the controls are hidden and then shown
    again before the hide timer fires.
2026-04-04 16:12:56 -05:00
Thomas bcc29903de chore(mobile): persist video controls visibility when swiping (#26986)
At current, the controls for videos are always hidden when opening an
asset from the timeline, and when swiping between assets. The latter is
actually quite annoying, so it would be better UX if video controls were
hidden when opening from the timeline like before, but visibility of the
controls was retained when swiping between assets.
2026-04-04 16:11:59 -05:00
Thomas 767caf9bfe fix(mobile): ignore pointer events on toasts (#26990)
These toasts can sometimes cover UI elements and make them impossible to
interact with until they are dismissed. Specifically, deleting an asset
will show a toast over the video controls and prevent seeking.
2026-04-04 10:39:13 -05:00
Min Idzelis 649d14822a refactor(web): rename MonthGroup to TimelineMonth (#27447)
Rename MonthGroup class to TimelineMonth to better convey that it represents a single month within the timeline. Updates the file, class, and all references across 16 files.

Change-Id: Id50fd6d4b7d0e431571b67c0f81c0e316a6a6964
2026-04-03 13:27:12 -04:00
Jason Rasmussen 207672c481 fix: user-agent format (#27488)
* fix: user-agent format

* ci: fix static analysis

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-04-03 12:26:50 -04:00
John Maguire 4fcd9c2e0d feat: add preview button when selecting images (#27305)
* Add preview button when selecting images

* Fix test helper

* prettier

* styling

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2026-04-03 16:21:43 +00:00
renovate[bot] a2687d674e chore(deps): update dependency lodash-es to v4.18.1 [security] (#27448)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-03 18:16:05 +02:00
renovate[bot] fb1bc7f9e2 chore(deps): update dependency lodash to v4.18.1 [security] (#27461)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-03 18:15:31 +02:00
Mert 18e8d30b1c fix(server): double exif join (#27485) 2026-04-03 18:14:46 +02:00
Vogeluff 95ef60628c fix(web): always show search type button (#27043)
* fix(web): always show search type button

* fix(web): formatting fixes

* fix(web): search-type-button inactive styling outline/secondary

* chore: styling

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2026-04-03 15:37:03 +00:00
Mees Frensel a19b7148e5 feat(web): use ui meter component for storage (#27459) 2026-04-03 09:36:22 -05:00
Weblate (bot) 8e414e42f3 chore(web): update translations (#27029)
Co-authored-by: -J- <heyj0e@tuta.io>
Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Co-authored-by: André Nøbbe Christiansen <andre@nobbe.dk>
Co-authored-by: Arif Budiman <arifpedia@gmail.com>
Co-authored-by: Chao En, Kuo <daniel970275@gmail.com>
Co-authored-by: Cornelius Christiansen <christiansen.cornelius@gmail.com>
Co-authored-by: David Kurniawan <kurniawandavid17@gmail.com>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Deyan Stamboliev <deyan.stamboliev@gmail.com>
Co-authored-by: Fatah Rokbi <fatahrokbi@gmail.com>
Co-authored-by: Felipe Gomes <seutiaoemporio@gmail.com>
Co-authored-by: Fjuro <fjuro@users.noreply.hosted.weblate.org>
Co-authored-by: Francesco Miccoli <fra03mi@gmail.com>
Co-authored-by: Frank Paul Silye <frankps@gmail.com>
Co-authored-by: Gideon Wentink <gjwentink@gmail.com>
Co-authored-by: HackingAll <hacking.all.YT@gmail.com>
Co-authored-by: Hakan <gucsav@yahoo.com>
Co-authored-by: Hans Cats <hanscats@gmail.com>
Co-authored-by: Happy <59247878+happy2452354@users.noreply.github.com>
Co-authored-by: Hosted Weblate user 85894 <reo7s@users.noreply.hosted.weblate.org>
Co-authored-by: Hurricane_32 <rodrigorimo@hotmail.com>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Indrek Haav <indrekhaav@users.noreply.hosted.weblate.org>
Co-authored-by: Ivan Dimitrov <idimitrov08@gmail.com>
Co-authored-by: Jarek Iwanus <jiwanus@proton.me>
Co-authored-by: Jeppe Nellemann <jepnel@proton.me>
Co-authored-by: JiZPaper <JiZPaper@gmail.com>
Co-authored-by: Joseph <josephlegrand33+hosted.weblate.org@gmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Link Notig <TestMailProtonWhyNot@protonmail.com>
Co-authored-by: Marin Čorkalo <mcorkalo@gmail.com>
Co-authored-by: Marwan Jalaleddine <marwanjalaleddine@gmail.com>
Co-authored-by: Matjaž T. <matjaz@moj-svet.si>
Co-authored-by: Matthias Hirsch <ma.hirsch.hh@gmail.com>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
Co-authored-by: Niklas Trautwein <jniklast@gmail.com>
Co-authored-by: Olaf Nielsen <solluh@mail.de>
Co-authored-by: Oleksandr Yurov <oyurov@icloud.com>
Co-authored-by: Oscar Guillén <osguima3@gmail.com>
Co-authored-by: PigeonPeak <pigeonpeak@proton.me>
Co-authored-by: PontusÖsterlindh <pontus@osterlindh.com>
Co-authored-by: Psycho <unhomen@gmail.com>
Co-authored-by: Roi Gabay <roigby@gmail.com>
Co-authored-by: Runskrift <anders@rimfrost.nu>
Co-authored-by: Sepehr Behroozi <sep.behroozi@gmail.com>
Co-authored-by: Shimul Roy <stenasaha@gmail.com>
Co-authored-by: Skanda <skillwiz94@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: Szymon Kucharski <szymon.kucharski5@gmail.com>
Co-authored-by: TA <tobi@warsnich.de>
Co-authored-by: TV Box <realceday.tvbox@gmail.com>
Co-authored-by: Tage Lauritsen <tage@tunenet.dk>
Co-authored-by: Tim Morley <weblate.3919org@timsk.org>
Co-authored-by: UDP <udp@users.noreply.hosted.weblate.org>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: Xo <xocodokie@users.noreply.hosted.weblate.org>
Co-authored-by: Yllelder <yllelder@gmail.com>
Co-authored-by: anton garcias <isaga.percompartir@gmail.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: bural <bural@mailbox.org>
Co-authored-by: chamdim <chamdim@protonmail.com>
Co-authored-by: dacx910 <dacx910@users.noreply.hosted.weblate.org>
Co-authored-by: dark fury <nodo05nodo05@gmail.com>
Co-authored-by: dark&white <darkwhite@users.noreply.hosted.weblate.org>
Co-authored-by: dvbthien <dvbthien@users.noreply.hosted.weblate.org>
Co-authored-by: fabiosequeira <fabio.sequeira.t0126448@edu.atec.pt>
Co-authored-by: josu. <josugarralda@gmail.com>
Co-authored-by: kylo32 <kylo32@gmail.com>
Co-authored-by: millallo <millallo@tiscali.it>
Co-authored-by: muziqaz <muziqaz@users.noreply.hosted.weblate.org>
Co-authored-by: pcnc <paul@cioanca.eu>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: pythoncontroller <zinovlaun@gmail.com>
Co-authored-by: stefano trubian <trubianstefano@gmail.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: walpeDEV <walpe.aw@proton.me>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Co-authored-by: 藍焰-0Blue_Yan0 <jim080825@gmail.com>
2026-04-03 00:04:17 +01:00
Zack Pollard db0f86c749 feat: move version checks to our own infrastructure (#27450) 2026-04-02 23:32:26 +01:00
Jason Rasmussen adb6b39eec fix: migrations (#27477) 2026-04-02 17:49:26 -04:00
Jason Rasmussen c8ae99e7d7 fix: escape html (#27469) 2026-04-02 15:19:24 -04:00
Alex 37823bcd51 feat: create new person in face editor (#27364)
* feat: create new person in face editor

* add delay

* fix: test

* i18n

* fix: unit test

* pr feedback
2026-04-02 15:28:40 +00:00
Mees Frensel b465f2b58f fix: scrollbar ui theme colors (#27455) 2026-04-02 10:18:47 -05:00
Min Idzelis 2166f07b1f refactor(web): rename DayGroup to TimelineDay (#27446)
Rename DayGroup class to TimelineDay to better convey that it represents
a single day within the timeline. Updates the file, class, and all
references across 13 files.

Change-Id: I9faef9bad73cd5b11f40daaf5eb140dd6a6a6964
2026-04-01 19:30:54 -04:00
Min Idzelis c9e251c78c feat(web): highlight active person thumbnail in detail panel and edit faces panel (#27401)
- Dim non-hovered person thumbnails to 40% opacity when any face is active
- Add ring highlight on the active person's thumbnail
- Add focus-visible outline styling for keyboard navigation
- Apply same treatment to both detail panel people section and edit faces side panel

Change-Id: I4ac10fe4568b95f3e0e8d9104133180f6a6a6964

Co-authored-by: Alex <alex.tran1502@gmail.com>
2026-04-01 10:49:09 -05:00
Mees Frensel da4b88fc14 fix(web): transition bg and border-radius (#27438)
* fix(web): transition bg and border-radius

* also transition thumb
2026-04-01 09:34:49 -05:00
okxint d1e2e8ab4e fix(server): use substring matching for person name search (#26903) 2026-04-01 13:31:54 +00:00
Timon 2a619d3c10 fix(web): Enable stack selector in shared album view (#24641) 2026-04-01 15:19:14 +02:00
Brandon Wees c29493e3a0 fix: withFilePath select edited or unedited file (#27328)
* fix: withFilePath select edited or unedited file

* chore: test
2026-04-01 08:19:38 -04:00
renovate[bot] 4ef777d145 chore(deps): update dependency handlebars to v4.7.9 [security] (#27334)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-01 08:17:58 -04:00
renovate[bot] 0b40f4fd76 chore(deps): update dependency happy-dom to v20.8.9 [security] (#27350)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-01 08:16:45 -04:00
bo0tzz ecba4e2a62 chore: tee GITHUB_OUTPUT for debugging (#27378) 2026-04-01 08:15:43 -04:00
Michel Heusschen 4eb531197e fix(web): prevent AssetUpdate from adding unrelated timeline assets (#27369) 2026-04-01 08:14:28 -04:00
Alex 505a07a825 feat: add move to lock folder in folder view (#27384) 2026-04-01 08:10:39 -04:00
Robin Meese 548dbe8ad6 feat(docs): add keycloack example to oauth docs (#27425) 2026-04-01 13:39:36 +02:00
renovate[bot] 0c184940f4 chore(deps): update github-actions (#27416)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-31 15:58:36 +00:00
Channing Bellamy be180fd9da fix: detection of WebM container (#24182) 2026-03-31 11:44:51 -04:00
renovate[bot] 859f58174e chore(deps): update node.js to v24.14.1 (#27412)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-31 12:46:38 +02:00
renovate[bot] a6c7e76008 chore(deps): update grafana/grafana docker tag to v12.4.2 (#27411)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-31 12:39:33 +02:00
renovate[bot] 0ff94213e6 chore(deps): update dependency exiftool-vendored to v35.15.1 (#27415)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-31 12:39:11 +02:00
Yaros 6b1dd6f680 fix(mobile): favorite button not updating state (#27271) 2026-03-30 21:24:56 -05:00
Min Idzelis 7d4286bbc5 fix(web): add drop shadow to asset viewer nav bar and prevent button shrinking (#27404)
- Add subtle drop shadow to the asset viewer nav bar for better visual
  separation from the image behind it
- Add drop shadow to the OCR text recognition button in the lower right
- Prevent nav bar action buttons from shrinking to nothing by adding
  *:shrink-0 to the flex container, with p-1/-m-1 to avoid clipping
  focus outlines

Change-Id: I61cdc0ec66a65cde1c95b40c2c5428006a6a6964
2026-03-30 19:22:10 -05:00
Min Idzelis 18201a26d9 feat(web): OCR overlay interactivity during zoom (#27039)
Change-Id: Id62e1a0264df2de0f3177a59b24bc5176a6a6964
2026-03-30 19:19:53 -05:00
Daniel Dietzler a2e3635ac9 chore: use esm global import (#27408) 2026-03-31 00:22:07 +02:00
Min Idzelis ce346bf956 feat(web): dim photo outside hovered face bounding box (#27402)
When hovering over a detected face in the photo viewer, an SVG mask overlay
dims the rest of the image (40% black) while leaving the hovered face fully
visible. The overlay fades in/out smoothly via CSS opacity transition by
freezing the last highlighted box positions in state, preventing the overlay
from popping off instantly when the mouse leaves.

Change-Id: I07e2eb2b297820ec89812785fe7943846a6a6964
2026-03-30 16:16:38 -05:00
Mert a1a2939868 fix(mobile): low upload timeout on android (#27399)
fix timeout
2026-03-30 16:05:21 -05:00
renovate[bot] e8309585d6 fix(deps): update dependency nodemailer to v8 [security] (#27351)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-30 19:44:39 +02:00
Jason Rasmussen 17d4941089 refactor: asset select manager (#27330) 2026-03-30 15:45:57 +01:00
1385 changed files with 26349 additions and 77482 deletions
+6
View File
@@ -6,6 +6,12 @@ mobile/openapi/**/*.dart linguist-generated=true
mobile/lib/**/*.g.dart -diff -merge mobile/lib/**/*.g.dart -diff -merge
mobile/lib/**/*.g.dart linguist-generated=true mobile/lib/**/*.g.dart linguist-generated=true
mobile/android/**/*.g.kt -diff -merge
mobile/android/**/*.g.kt linguist-generated=true
mobile/ios/**/*.g.swift -diff -merge
mobile/ios/**/*.g.swift linguist-generated=true
mobile/lib/**/*.drift.dart -diff -merge mobile/lib/**/*.drift.dart -diff -merge
mobile/lib/**/*.drift.dart linguist-generated=true mobile/lib/**/*.drift.dart linguist-generated=true
+1 -1
View File
@@ -1 +1 @@
24.14.0 24.14.1
+3 -3
View File
@@ -30,7 +30,7 @@ jobs:
while IFS= read -r header; do while IFS= read -r header; do
printf '%s\n' "$BODY" | grep -qF "$header" || OK=false printf '%s\n' "$BODY" | grep -qF "$header" || OK=false
done < <(sed '/<!--/,/-->/d' .github/pull_request_template.md | grep "^## ") done < <(sed '/<!--/,/-->/d' .github/pull_request_template.md | grep "^## ")
echo "uses_template=$OK" >> "$GITHUB_OUTPUT" echo "uses_template=$OK" | tee --append "$GITHUB_OUTPUT"
close_template: close_template:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -51,7 +51,7 @@ jobs:
run: | run: |
gh api graphql \ gh api graphql \
-f prId="$NODE_ID" \ -f prId="$NODE_ID" \
-f body="This PR has been automatically closed as the description doesn't follow our template. After you edit it to match the template, the PR will automatically be reopened." \ -f body="This PR has been automatically closed as the description doesn't follow [our template](https://github.com/immich-app/immich/blob/main/.github/pull_request_template.md). After you edit it to match the template, the PR will automatically be reopened." \
-f query=' -f query='
mutation CommentAndClosePR($prId: ID!, $body: String!) { mutation CommentAndClosePR($prId: ID!, $body: String!) {
addComment(input: { addComment(input: {
@@ -128,7 +128,7 @@ jobs:
run: | run: |
REMAINING=$(gh pr view "$PR_NUMBER" --repo "${{ github.repository }}" --json labels \ REMAINING=$(gh pr view "$PR_NUMBER" --repo "${{ github.repository }}" --json labels \
--jq '[.labels[].name | select(startswith("auto-closed:"))] | length') --jq '[.labels[].name | select(startswith("auto-closed:"))] | length')
echo "remaining=$REMAINING" >> "$GITHUB_OUTPUT" echo "remaining=$REMAINING" | tee --append "$GITHUB_OUTPUT"
- name: Reopen PR - name: Reopen PR
if: ${{ steps.check_labels.outputs.remaining == '0' }} if: ${{ steps.check_labels.outputs.remaining == '0' }}
+6 -6
View File
@@ -114,14 +114,14 @@ jobs:
key: build-mobile-gradle-${{ runner.os }}-main key: build-mobile-gradle-${{ runner.os }}-main
- name: Setup Flutter SDK - name: Setup Flutter SDK
uses: subosito/flutter-action@0ca7a949e71ae44c8e688a51c5e7e93b2c87e295 # v2.22.0 uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0
with: with:
channel: 'stable' channel: 'stable'
flutter-version-file: ./mobile/pubspec.yaml flutter-version-file: ./mobile/pubspec.yaml
cache: true cache: true
- name: Setup Android SDK - name: Setup Android SDK
uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3.2.2 uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
with: with:
packages: '' packages: ''
@@ -153,7 +153,7 @@ jobs:
fi fi
- name: Publish Android Artifact - name: Publish Android Artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: release-apk-signed name: release-apk-signed
path: mobile/build/app/outputs/flutter-apk/*.apk path: mobile/build/app/outputs/flutter-apk/*.apk
@@ -191,7 +191,7 @@ jobs:
persist-credentials: false persist-credentials: false
- name: Setup Flutter SDK - name: Setup Flutter SDK
uses: subosito/flutter-action@0ca7a949e71ae44c8e688a51c5e7e93b2c87e295 # v2.22.0 uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0
with: with:
channel: 'stable' channel: 'stable'
flutter-version-file: ./mobile/pubspec.yaml flutter-version-file: ./mobile/pubspec.yaml
@@ -210,7 +210,7 @@ jobs:
working-directory: ./mobile working-directory: ./mobile
- name: Setup Ruby - name: Setup Ruby
uses: ruby/setup-ruby@319994f95fa847cf3fb3cd3dbe89f6dcde9f178f # v1.295.0 uses: ruby/setup-ruby@e65c17d16e57e481586a6a5a0282698790062f92 # v1.300.0
with: with:
ruby-version: '3.3' ruby-version: '3.3'
bundler-cache: true bundler-cache: true
@@ -291,7 +291,7 @@ jobs:
security delete-keychain build.keychain || true security delete-keychain build.keychain || true
- name: Upload IPA artifact - name: Upload IPA artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: ios-release-ipa name: ios-release-ipa
path: mobile/ios/Runner.ipa path: mobile/ios/Runner.ipa
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
persist-credentials: false persist-credentials: false
- name: Check for breaking API changes - name: Check for breaking API changes
uses: oasdiff/oasdiff-action/breaking@2a37bc82462349c03a533b8b608bebbaf57b3e60 # v0.0.33 uses: oasdiff/oasdiff-action/breaking@e6faebce24cf20ac38653d0d2c7f4aa80aaafc79 # v0.0.38
with: with:
base: https://raw.githubusercontent.com/${{ github.repository }}/main/open-api/immich-openapi-specs.json base: https://raw.githubusercontent.com/${{ github.repository }}/main/open-api/immich-openapi-specs.json
revision: open-api/immich-openapi-specs.json revision: open-api/immich-openapi-specs.json
+2 -2
View File
@@ -89,7 +89,7 @@ jobs:
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
- name: Login to GitHub Container Registry - name: Login to GitHub Container Registry
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
if: ${{ !github.event.pull_request.head.repo.fork }} if: ${{ !github.event.pull_request.head.repo.fork }}
with: with:
registry: ghcr.io registry: ghcr.io
@@ -115,7 +115,7 @@ jobs:
type=raw,value=latest,enable=${{ github.event_name == 'release' }} type=raw,value=latest,enable=${{ github.event_name == 'release' }}
- name: Build and push image - name: Build and push image
uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0 uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with: with:
file: cli/Dockerfile file: cli/Dockerfile
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
+1 -1
View File
@@ -35,7 +35,7 @@ jobs:
needs: [get_body, should_run] needs: [get_body, should_run]
if: ${{ needs.should_run.outputs.should_run == 'true' }} if: ${{ needs.should_run.outputs.should_run == 'true' }}
container: container:
image: ghcr.io/immich-app/mdq:main@sha256:df7188ba88abb0800d73cc97d3633280f0c0c3d4c441d678225067bf154150fb image: ghcr.io/immich-app/mdq:main@sha256:557cca601891b8b7d78b940071d35aaf7aaeb9b327d19b22cf282118edbc5272
outputs: outputs:
checked: ${{ steps.get_checkbox.outputs.checked }} checked: ${{ steps.get_checkbox.outputs.checked }}
steps: steps:
+3 -3
View File
@@ -57,7 +57,7 @@ jobs:
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0 uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file. # If you wish to specify custom queries, you can do so here or in a config file.
@@ -70,7 +70,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below) # If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild - name: Autobuild
uses: github/codeql-action/autobuild@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0 uses: github/codeql-action/autobuild@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
# ️ Command-line programs to run using the OS shell. # ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -83,6 +83,6 @@ jobs:
# ./location_of_script_within_repo/buildscript.sh # ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0 uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
with: with:
category: '/language:${{matrix.language}}' category: '/language:${{matrix.language}}'
+2 -2
View File
@@ -60,7 +60,7 @@ jobs:
suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn'] suffix: ['', '-cuda', '-rocm', '-openvino', '-armnn', '-rknn']
steps: steps:
- name: Login to GitHub Container Registry - name: Login to GitHub Container Registry
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with: with:
registry: ghcr.io registry: ghcr.io
username: ${{ github.repository_owner }} username: ${{ github.repository_owner }}
@@ -90,7 +90,7 @@ jobs:
suffix: [''] suffix: ['']
steps: steps:
- name: Login to GitHub Container Registry - name: Login to GitHub Container Registry
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with: with:
registry: ghcr.io registry: ghcr.io
username: ${{ github.repository_owner }} username: ${{ github.repository_owner }}
+1 -1
View File
@@ -86,7 +86,7 @@ jobs:
run: pnpm build run: pnpm build
- name: Upload build output - name: Upload build output
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: docs-build-output name: docs-build-output
path: docs/build/ path: docs/build/
+4 -4
View File
@@ -29,7 +29,7 @@ jobs:
run: echo 'The triggering workflow did not succeed' && exit 1 run: echo 'The triggering workflow did not succeed' && exit 1
- name: Get artifact - name: Get artifact
id: get-artifact id: get-artifact
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with: with:
github-token: ${{ steps.token.outputs.token }} github-token: ${{ steps.token.outputs.token }}
script: | script: |
@@ -48,7 +48,7 @@ jobs:
return { found: true, id: matchArtifact.id }; return { found: true, id: matchArtifact.id };
- name: Determine deploy parameters - name: Determine deploy parameters
id: parameters id: parameters
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
env: env:
HEAD_SHA: ${{ github.event.workflow_run.head_sha }} HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
with: with:
@@ -135,7 +135,7 @@ jobs:
- name: Load parameters - name: Load parameters
id: parameters id: parameters
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
env: env:
PARAM_JSON: ${{ needs.checks.outputs.parameters }} PARAM_JSON: ${{ needs.checks.outputs.parameters }}
with: with:
@@ -147,7 +147,7 @@ jobs:
core.setOutput("shouldDeploy", parameters.shouldDeploy); core.setOutput("shouldDeploy", parameters.shouldDeploy);
- name: Download artifact - name: Download artifact
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
env: env:
ARTIFACT_JSON: ${{ needs.checks.outputs.artifact }} ARTIFACT_JSON: ${{ needs.checks.outputs.artifact }}
with: with:
+4 -4
View File
@@ -16,7 +16,7 @@ jobs:
steps: steps:
- name: Generate a token - name: Generate a token
id: generate-token id: generate-token
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0 uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
with: with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
@@ -29,7 +29,7 @@ jobs:
persist-credentials: true persist-credentials: true
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 uses: pnpm/action-setup@08c4be7e2e672a47d11bd04269e27e5f3e8529cb # v6.0.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
@@ -42,13 +42,13 @@ jobs:
run: pnpm --recursive install && pnpm run --recursive --if-present --parallel format:fix run: pnpm --recursive install && pnpm run --recursive --if-present --parallel format:fix
- name: Commit and push - name: Commit and push
uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9.1.4 uses: EndBug/add-and-commit@290ea2c423ad77ca9c62ae0f5b224379612c0321 # v10.0.0
with: with:
default_author: github_actions default_author: github_actions
message: 'chore: fix formatting' message: 'chore: fix formatting'
- name: Remove label - name: Remove label
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
if: always() if: always()
with: with:
github-token: ${{ steps.generate-token.outputs.token }} github-token: ${{ steps.generate-token.outputs.token }}
+1 -1
View File
@@ -31,7 +31,7 @@ jobs:
- name: Generate a token - name: Generate a token
id: generate_token id: generate_token
if: ${{ inputs.skip != true }} if: ${{ inputs.skip != true }}
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0 uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
with: with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
+5 -5
View File
@@ -50,7 +50,7 @@ jobs:
steps: steps:
- name: Generate a token - name: Generate a token
id: generate-token id: generate-token
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0 uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
with: with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
@@ -63,10 +63,10 @@ jobs:
ref: main ref: main
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 uses: pnpm/action-setup@08c4be7e2e672a47d11bd04269e27e5f3e8529cb # v6.0.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
@@ -86,7 +86,7 @@ jobs:
- name: Commit and tag - name: Commit and tag
id: push-tag id: push-tag
uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9.1.4 uses: EndBug/add-and-commit@290ea2c423ad77ca9c62ae0f5b224379612c0321 # v10.0.0
with: with:
default_author: github_actions default_author: github_actions
message: 'chore: version ${{ steps.output.outputs.version }}' message: 'chore: version ${{ steps.output.outputs.version }}'
@@ -124,7 +124,7 @@ jobs:
steps: steps:
- name: Generate a token - name: Generate a token
id: generate-token id: generate-token
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0 uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
with: with:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
+4 -4
View File
@@ -19,7 +19,7 @@ jobs:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- uses: mshick/add-pr-comment@ffd016c7e151d97d69d21a843022fd4cd5b96fe5 # v3.9.0 - uses: mshick/add-pr-comment@64b8e914979889d746c99dea15a76e77ef64580a # v3.10.0
with: with:
github-token: ${{ steps.token.outputs.token }} github-token: ${{ steps.token.outputs.token }}
message-id: 'preview-status' message-id: 'preview-status'
@@ -37,7 +37,7 @@ jobs:
app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }}
private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with: with:
github-token: ${{ steps.token.outputs.token }} github-token: ${{ steps.token.outputs.token }}
script: | script: |
@@ -48,14 +48,14 @@ jobs:
name: 'preview' name: 'preview'
}) })
- uses: mshick/add-pr-comment@ffd016c7e151d97d69d21a843022fd4cd5b96fe5 # v3.9.0 - uses: mshick/add-pr-comment@64b8e914979889d746c99dea15a76e77ef64580a # v3.10.0
if: ${{ github.event.pull_request.head.repo.fork }} if: ${{ github.event.pull_request.head.repo.fork }}
with: with:
github-token: ${{ steps.token.outputs.token }} github-token: ${{ steps.token.outputs.token }}
message-id: 'preview-status' message-id: 'preview-status'
message: 'PRs from forks cannot have preview environments.' message: 'PRs from forks cannot have preview environments.'
- uses: mshick/add-pr-comment@ffd016c7e151d97d69d21a843022fd4cd5b96fe5 # v3.9.0 - uses: mshick/add-pr-comment@64b8e914979889d746c99dea15a76e77ef64580a # v3.10.0
if: ${{ !github.event.pull_request.head.repo.fork }} if: ${{ !github.event.pull_request.head.repo.fork }}
with: with:
github-token: ${{ steps.token.outputs.token }} github-token: ${{ steps.token.outputs.token }}
+1 -1
View File
@@ -61,7 +61,7 @@ jobs:
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup Flutter SDK - name: Setup Flutter SDK
uses: subosito/flutter-action@0ca7a949e71ae44c8e688a51c5e7e93b2c87e295 # v2.22.0 uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0
with: with:
channel: 'stable' channel: 'stable'
flutter-version-file: ./mobile/pubspec.yaml flutter-version-file: ./mobile/pubspec.yaml
+7 -7
View File
@@ -464,7 +464,7 @@ jobs:
run: docker compose logs --no-color > docker-compose-logs.txt run: docker compose logs --no-color > docker-compose-logs.txt
working-directory: ./e2e working-directory: ./e2e
- name: Archive Docker logs - name: Archive Docker logs
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always() if: always()
with: with:
name: e2e-server-docker-logs-${{ matrix.runner }} name: e2e-server-docker-logs-${{ matrix.runner }}
@@ -522,7 +522,7 @@ jobs:
run: pnpm test:web run: pnpm test:web
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Archive e2e test (web) results - name: Archive e2e test (web) results
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: success() || failure() if: success() || failure()
with: with:
name: e2e-web-test-results-${{ matrix.runner }} name: e2e-web-test-results-${{ matrix.runner }}
@@ -533,7 +533,7 @@ jobs:
run: pnpm test:web:ui run: pnpm test:web:ui
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Archive ui test (web) results - name: Archive ui test (web) results
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: success() || failure() if: success() || failure()
with: with:
name: e2e-ui-test-results-${{ matrix.runner }} name: e2e-ui-test-results-${{ matrix.runner }}
@@ -544,7 +544,7 @@ jobs:
run: pnpm test:web:maintenance run: pnpm test:web:maintenance
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Archive maintenance tests (web) results - name: Archive maintenance tests (web) results
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: success() || failure() if: success() || failure()
with: with:
name: e2e-maintenance-isolated-test-results-${{ matrix.runner }} name: e2e-maintenance-isolated-test-results-${{ matrix.runner }}
@@ -554,7 +554,7 @@ jobs:
run: docker compose logs --no-color > docker-compose-logs.txt run: docker compose logs --no-color > docker-compose-logs.txt
working-directory: ./e2e working-directory: ./e2e
- name: Archive Docker logs - name: Archive Docker logs
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always() if: always()
with: with:
name: e2e-web-docker-logs-${{ matrix.runner }} name: e2e-web-docker-logs-${{ matrix.runner }}
@@ -588,7 +588,7 @@ jobs:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Setup Flutter SDK - name: Setup Flutter SDK
uses: subosito/flutter-action@0ca7a949e71ae44c8e688a51c5e7e93b2c87e295 # v2.22.0 uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0
with: with:
channel: 'stable' channel: 'stable'
flutter-version-file: ./mobile/pubspec.yaml flutter-version-file: ./mobile/pubspec.yaml
@@ -620,7 +620,7 @@ jobs:
persist-credentials: false persist-credentials: false
token: ${{ steps.token.outputs.token }} token: ${{ steps.token.outputs.token }}
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0
with: with:
python-version: 3.11 python-version: 3.11
- name: Install dependencies - name: Install dependencies
+2
View File
@@ -28,3 +28,5 @@ vite.config.js.timestamp-*
.pnpm-store .pnpm-store
.devcontainer/library .devcontainer/library
.devcontainer/.env* .devcontainer/.env*
*.tsbuildinfo
*.tsbuildInfo
-3
View File
@@ -1,6 +1,3 @@
[submodule "mobile/.isar"]
path = mobile/.isar
url = https://github.com/isar/isar
[submodule "e2e/test-assets"] [submodule "e2e/test-assets"]
path = e2e/test-assets path = e2e/test-assets
url = https://github.com/immich-app/test-assets url = https://github.com/immich-app/test-assets
+1 -1
View File
@@ -1 +1 @@
24.14.0 24.14.1
+6 -6
View File
@@ -1,6 +1,6 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.6.3", "version": "2.7.5",
"description": "Command Line Interface (CLI) for Immich", "description": "Command Line Interface (CLI) for Immich",
"type": "module", "type": "module",
"exports": "./dist/index.js", "exports": "./dist/index.js",
@@ -20,7 +20,7 @@
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/micromatch": "^4.0.9", "@types/micromatch": "^4.0.9",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^24.12.0", "@types/node": "^24.12.2",
"@vitest/coverage-v8": "^4.0.0", "@vitest/coverage-v8": "^4.0.0",
"byte-size": "^9.0.0", "byte-size": "^9.0.0",
"cli-progress": "^3.12.0", "cli-progress": "^3.12.0",
@@ -28,13 +28,13 @@
"eslint": "^10.0.0", "eslint": "^10.0.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^63.0.0", "eslint-plugin-unicorn": "^64.0.0",
"globals": "^17.0.0", "globals": "^17.0.0",
"mock-fs": "^5.2.0", "mock-fs": "^5.2.0",
"prettier": "^3.7.4", "prettier": "^3.7.4",
"prettier-plugin-organize-imports": "^4.0.0", "prettier-plugin-organize-imports": "^4.0.0",
"typescript": "^5.3.3", "typescript": "^6.0.0",
"typescript-eslint": "^8.28.0", "typescript-eslint": "^8.58.0",
"vite": "^8.0.0", "vite": "^8.0.0",
"vitest": "^4.0.0", "vitest": "^4.0.0",
"vitest-fetch-mock": "^0.4.0", "vitest-fetch-mock": "^0.4.0",
@@ -68,6 +68,6 @@
"micromatch": "^4.0.8" "micromatch": "^4.0.8"
}, },
"volta": { "volta": {
"node": "24.14.0" "node": "24.14.1"
} }
} }
+6 -6
View File
@@ -4,7 +4,7 @@ import path from 'node:path';
import { setTimeout as sleep } from 'node:timers/promises'; import { setTimeout as sleep } from 'node:timers/promises';
import { describe, expect, it, MockedFunction, vi } from 'vitest'; import { describe, expect, it, MockedFunction, vi } from 'vitest';
import { Action, checkBulkUpload, defaults, getSupportedMediaTypes, Reason } from '@immich/sdk'; import { AssetRejectReason, AssetUploadAction, checkBulkUpload, defaults, getSupportedMediaTypes } from '@immich/sdk';
import createFetchMock from 'vitest-fetch-mock'; import createFetchMock from 'vitest-fetch-mock';
import { import {
@@ -120,7 +120,7 @@ describe('checkForDuplicates', () => {
vi.mocked(checkBulkUpload).mockResolvedValue({ vi.mocked(checkBulkUpload).mockResolvedValue({
results: [ results: [
{ {
action: Action.Accept, action: AssetUploadAction.Accept,
id: testFilePath, id: testFilePath,
}, },
], ],
@@ -144,10 +144,10 @@ describe('checkForDuplicates', () => {
vi.mocked(checkBulkUpload).mockResolvedValue({ vi.mocked(checkBulkUpload).mockResolvedValue({
results: [ results: [
{ {
action: Action.Reject, action: AssetUploadAction.Reject,
id: testFilePath, id: testFilePath,
assetId: 'fc5621b1-86f6-44a1-9905-403e607df9f5', assetId: 'fc5621b1-86f6-44a1-9905-403e607df9f5',
reason: Reason.Duplicate, reason: AssetRejectReason.Duplicate,
}, },
], ],
}); });
@@ -167,7 +167,7 @@ describe('checkForDuplicates', () => {
vi.mocked(checkBulkUpload).mockResolvedValue({ vi.mocked(checkBulkUpload).mockResolvedValue({
results: [ results: [
{ {
action: Action.Accept, action: AssetUploadAction.Accept,
id: testFilePath, id: testFilePath,
}, },
], ],
@@ -187,7 +187,7 @@ describe('checkForDuplicates', () => {
mocked.mockResolvedValue({ mocked.mockResolvedValue({
results: [ results: [
{ {
action: Action.Accept, action: AssetUploadAction.Accept,
id: testFilePath, id: testFilePath,
}, },
], ],
+2 -4
View File
@@ -1,9 +1,9 @@
import { import {
Action,
AssetBulkUploadCheckItem, AssetBulkUploadCheckItem,
AssetBulkUploadCheckResult, AssetBulkUploadCheckResult,
AssetMediaResponseDto, AssetMediaResponseDto,
AssetMediaStatus, AssetMediaStatus,
AssetUploadAction,
Permission, Permission,
addAssetsToAlbum, addAssetsToAlbum,
checkBulkUpload, checkBulkUpload,
@@ -234,7 +234,7 @@ export const checkForDuplicates = async (files: string[], { concurrency, skipHas
const results = response.results as AssetBulkUploadCheckResults; const results = response.results as AssetBulkUploadCheckResults;
for (const { id: filepath, assetId, action } of results) { for (const { id: filepath, assetId, action } of results) {
if (action === Action.Accept) { if (action === AssetUploadAction.Accept) {
newFiles.push(filepath); newFiles.push(filepath);
} else { } else {
// rejects are always duplicates // rejects are always duplicates
@@ -404,8 +404,6 @@ const uploadFile = async (input: string, stats: Stats): Promise<AssetMediaRespon
const { baseUrl, headers } = defaults; const { baseUrl, headers } = defaults;
const formData = new FormData(); const formData = new FormData();
formData.append('deviceAssetId', `${basename(input)}-${stats.size}`.replaceAll(/\s+/g, ''));
formData.append('deviceId', 'CLI');
formData.append('fileCreatedAt', stats.mtime.toISOString()); formData.append('fileCreatedAt', stats.mtime.toISOString());
formData.append('fileModifiedAt', stats.mtime.toISOString()); formData.append('fileModifiedAt', stats.mtime.toISOString());
formData.append('fileSize', String(stats.size)); formData.append('fileSize', String(stats.size));
+6 -2
View File
@@ -15,8 +15,12 @@
"incremental": true, "incremental": true,
"skipLibCheck": true, "skipLibCheck": true,
"esModuleInterop": true, "esModuleInterop": true,
"baseUrl": "./", "rootDir": "./src",
"paths": {
"src/*": ["./src/*"],
},
"tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo",
"types": ["vitest/globals"] "types": ["vitest/globals"]
}, },
"exclude": ["dist", "node_modules"] "exclude": ["dist", "node_modules", "vite.config.ts"]
} }
+1 -1
View File
@@ -1,5 +1,5 @@
[tools] [tools]
terragrunt = "0.99.4" terragrunt = "1.0.0"
opentofu = "1.11.5" opentofu = "1.11.5"
[tasks."tg:fmt"] [tasks."tg:fmt"]
+2 -1
View File
@@ -20,6 +20,7 @@ services:
- /tmp - /tmp
volumes: volumes:
- ..:/usr/src/app - ..:/usr/src/app
# - ../../ui:/usr/src/ui
- pnpm_cache:/buildcache/pnpm_cache - pnpm_cache:/buildcache/pnpm_cache
- server_node_modules:/usr/src/app/server/node_modules - server_node_modules:/usr/src/app/server/node_modules
- web_node_modules:/usr/src/app/web/node_modules - web_node_modules:/usr/src/app/web/node_modules
@@ -156,7 +157,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6 image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1
+3 -3
View File
@@ -56,7 +56,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6 image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1
restart: always restart: always
@@ -85,7 +85,7 @@ services:
container_name: immich_prometheus container_name: immich_prometheus
ports: ports:
- 9090:9090 - 9090:9090
image: prom/prometheus@sha256:4a61322ac1103a0e3aea2a61ef1718422a48fa046441f299d71e660a3bc71ae9 image: prom/prometheus@sha256:dda13e28bf95a5e5ca5b8ed56852006094c1c8e8871d9c9dbeed30aa6e55271f
volumes: volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml - ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus - prometheus-data:/prometheus
@@ -97,7 +97,7 @@ services:
command: ['./run.sh', '-disable-reporting'] command: ['./run.sh', '-disable-reporting']
ports: ports:
- 3000:3000 - 3000:3000
image: grafana/grafana:12.4.1-ubuntu@sha256:1a20dea76a2778773df17dbc365db86b1a4f2d57772b8590b6311038a3acb1db image: grafana/grafana:12.4.2-ubuntu@sha256:78839fe49e1425c02416fa8072591533a72bd9598e563b54a07d78f9e27fb5d3
volumes: volumes:
- grafana-data:/var/lib/grafana - grafana-data:/var/lib/grafana
+1 -1
View File
@@ -61,7 +61,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6 image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
user: '1000:1000' user: '1000:1000'
security_opt: security_opt:
- no-new-privileges:true - no-new-privileges:true
+1 -1
View File
@@ -49,7 +49,7 @@ services:
redis: redis:
container_name: immich_redis container_name: immich_redis
image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6 image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1
restart: always restart: always
+1 -1
View File
@@ -1 +1 @@
24.14.0 24.14.1
@@ -210,7 +210,7 @@ The provided restore process ensures your database is never in a broken state by
## Filesystem ## Filesystem
Immich stores two types of content in the filesystem: (a) original, unmodified assets (photos and videos), and (b) generated content. We recommend backing up the entire contents of `UPLOAD_LOCATION`, but only the original content is critical, which is stored in the following folders: Immich does not handle filesystem backups for you. You have to arrange these yourself! Immich stores two types of content in the filesystem: (a) original, unmodified assets (photos and videos), and (b) generated content. We recommend backing up the entire contents of `UPLOAD_LOCATION`, but only the original content is critical, which is stored in the following folders:
1. `UPLOAD_LOCATION/library` 1. `UPLOAD_LOCATION/library`
2. `UPLOAD_LOCATION/upload` 2. `UPLOAD_LOCATION/upload`
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

+44
View File
@@ -14,6 +14,7 @@ Immich supports 3rd party authentication via [OpenID Connect][oidc] (OIDC), an i
- [Authelia](https://www.authelia.com/integration/openid-connect/immich/) - [Authelia](https://www.authelia.com/integration/openid-connect/immich/)
- [Okta](https://www.okta.com/openid-connect/) - [Okta](https://www.okta.com/openid-connect/)
- [Google](https://developers.google.com/identity/openid-connect/openid-connect) - [Google](https://developers.google.com/identity/openid-connect/openid-connect)
- [Keycloak](https://www.keycloak.org)
## Prerequisites ## Prerequisites
@@ -49,6 +50,10 @@ Before enabling OAuth in Immich, a new client application needs to be configured
- `https://immich.example.com/auth/login` - `https://immich.example.com/auth/login`
- `https://immich.example.com/user-settings` - `https://immich.example.com/user-settings`
3. Configure Backchannel logout URL
If the authentication server supports it, the **Backchannel logout URL** can be specified, and it is of the form: `http://DOMAIN:PORT/api/oauth/backchannel-logout`.
## Enable OAuth ## Enable OAuth
Once you have a new OAuth client application configured, Immich can be configured using the Administration Settings page, available on the web (Administration -> Settings). Once you have a new OAuth client application configured, Immich can be configured using the Administration Settings page, available on the web (Administration -> Settings).
@@ -62,6 +67,8 @@ Once you have a new OAuth client application configured, Immich can be configure
| `scope` | string | openid email profile | Full list of scopes to send with the request (space delimited) | | `scope` | string | openid email profile | Full list of scopes to send with the request (space delimited) |
| `id_token_signed_response_alg` | string | RS256 | The algorithm used to sign the id token (examples: RS256, HS256) | | `id_token_signed_response_alg` | string | RS256 | The algorithm used to sign the id token (examples: RS256, HS256) |
| `userinfo_signed_response_alg` | string | none | The algorithm used to sign the userinfo response (examples: RS256, HS256) | | `userinfo_signed_response_alg` | string | none | The algorithm used to sign the userinfo response (examples: RS256, HS256) |
| `prompt` | string | (empty) | Prompt parameter for authorization url (examples: select_account, login, consent) |
| `end_session_endpoint` | URL | (empty) | Http(s) alternative end session endpoint (logout URI) |
| Request timeout | string | 30,000 (30 seconds) | Number of milliseconds to wait for http requests to complete before giving up | | Request timeout | string | 30,000 (30 seconds) | Number of milliseconds to wait for http requests to complete before giving up |
| Storage Label Claim | string | preferred_username | Claim mapping for the user's storage label**¹** | | Storage Label Claim | string | preferred_username | Claim mapping for the user's storage label**¹** |
| Role Claim | string | immich_role | Claim mapping for the user's role. (should return "user" or "admin")**¹** | | Role Claim | string | immich_role | Claim mapping for the user's role. (should return "user" or "admin")**¹** |
@@ -180,6 +187,7 @@ Configuration of OAuth in Immich System Settings
| Scope | openid email profile immich_scope | | Scope | openid email profile immich_scope |
| ID Token Signed Response Algorithm | RS256 | | ID Token Signed Response Algorithm | RS256 |
| Userinfo Signed Response Algorithm | RS256 | | Userinfo Signed Response Algorithm | RS256 |
| End Session Endpoint | https://auth.example.com/logout?rd=https://immich.example.com/ |
| Storage Label Claim | uid | | Storage Label Claim | uid |
| Storage Quota Claim | immich_quota | | Storage Quota Claim | immich_quota |
| Default Storage Quota (GiB) | 0 (empty for unlimited quota) | | Default Storage Quota (GiB) | 0 (empty for unlimited quota) |
@@ -253,4 +261,40 @@ Configuration of OAuth in Immich System Settings
</details> </details>
<details>
<summary>Keycloak Example</summary>
### Keycloak Example
Here's an example of OAuth configured for Keycloak:
Create your immich client on your Keycloak Realm.
<img src={require('./img/keycloak-general-settings.webp').default} width='100%' title="Keycloak Client general Settings" />
<img src={require('./img/keycloak-access-settings.webp').default} width='100%' title="Keycloak Client Access Settings" />
<img src={require('./img/keycloak-capability-config.webp').default} width='100%' title="Keycloak Client Capability Configuration" />
Configuration of OAuth in Immich System Settings
| Setting | Value |
| ---------------------------- | ----------------------------------------------------- |
| Issuer URL | `https://<KEYCLOAK_DOMAIN>/realms/<YOUR_REALM>` |
| Client ID | immich |
| Client Secret | can be optained from Clients -> immich -> Credentials |
| Scope | openid email profile |
| Signing Algorithm | RS256 |
| Storage Label Claim | preferred_username |
| Role Claim | immich_role |
| Storage Quota Claim | immich_quota |
| Default Storage Quota (GiB) | 0 (empty for unlimited quota) |
| Button Text | Sign in with Keycloak (recommended) |
| Auto Register | Enabled (optional) |
| Auto Launch | Enabled (optional) |
| Mobile Redirect URI Override | Disabled |
| Mobile Redirect URI | |
Role Claim can be managed via Client Role. Remember to create a mapper with claim name `immich_role`.
</details>
[oidc]: https://openid.net/connect/ [oidc]: https://openid.net/connect/
+3 -3
View File
@@ -80,9 +80,9 @@ To see local changes to `@immich/ui` in Immich, do the following:
1. Install `@immich/ui` as a sibling to `immich/`, for example `/home/user/immich` and `/home/user/ui` 1. Install `@immich/ui` as a sibling to `immich/`, for example `/home/user/immich` and `/home/user/ui`
2. Build the `@immich/ui` project via `pnpm run build` 2. Build the `@immich/ui` project via `pnpm run build`
3. Uncomment the corresponding volume in web service of the `docker/docker-compose.dev.yaml` file (`../../ui:/usr/ui`) 3. Uncomment the corresponding volume in web service of the `docker/docker-compose.dev.yml` file (`../../ui:/usr/src/ui`)
4. Uncomment the corresponding alias in the `web/vite.config.js` file (`'@immich/ui': path.resolve(\_\_dirname, '../../ui')`) 4. Uncomment the corresponding alias in the `web/vite.config.ts` file (`'@immich/ui': path.resolve(\_\_dirname, '../../ui/packages/ui')`)
5. Uncomment the import statement in `web/src/app.css` file `@import '/usr/ui/dist/theme/default.css';` and comment out `@import '@immich/ui/theme/default.css';` 5. Uncomment the import statement in `web/src/app.css` file `@import '../../../ui/packages/ui/dist/theme/default.css';` and comment out `@import '@immich/ui/theme/default.css';`
6. Start up the stack via `make dev` 6. Start up the stack via `make dev`
7. After making changes in `@immich/ui`, rebuild it (`pnpm run build`) 7. After making changes in `@immich/ui`, rebuild it (`pnpm run build`)
+1 -1
View File
@@ -26,7 +26,7 @@ You can search the following types of content:
| Time frame | Start and end date of a specific time bucket | | Time frame | Start and end date of a specific time bucket |
| Media type | Image or video or both | | Media type | Image or video or both |
| Display options | In Archive, in Favorites or Not in any album | | Display options | In Archive, in Favorites or Not in any album |
| Start rating | User-assigned start rating | | Star rating | User-assigned star rating |
<img src={require('./img/advanced-search-filters.webp').default} width="70%" title='Advanced search filters' /> <img src={require('./img/advanced-search-filters.webp').default} width="70%" title='Advanced search filters' />
+14 -14
View File
@@ -28,17 +28,17 @@ For the full list, refer to the [Immich source code](https://github.com/immich-a
## Video formats ## Video formats
| Format | Extension(s) | Supported? | Notes | | Format | Extension(s) | Supported? | Notes |
| :---------- | :-------------------- | :----------------: | :---- | | :---------- | :-------------------------- | :----------------: | :---- |
| `3GPP` | `.3gp` `.3gpp` | :white_check_mark: | | | `3GPP` | `.3gp` `.3gpp` | :white_check_mark: | |
| `AVI` | `.avi` | :white_check_mark: | | | `AVI` | `.avi` | :white_check_mark: | |
| `FLV` | `.flv` | :white_check_mark: | | | `FLV` | `.flv` | :white_check_mark: | |
| `M4V` | `.m4v` | :white_check_mark: | | | `M4V` | `.m4v` | :white_check_mark: | |
| `MATROSKA` | `.mkv` | :white_check_mark: | | | `MATROSKA` | `.mkv` | :white_check_mark: | |
| `MP2T` | `.mts` `.m2ts` `.m2t` | :white_check_mark: | | | `MP2T` | `.mts` `.m2ts` `.m2t` `.ts` | :white_check_mark: | |
| `MP4` | `.mp4` `.insv` | :white_check_mark: | | | `MP4` | `.mp4` `.insv` | :white_check_mark: | |
| `MPEG` | `.mpg` `.mpe` `.mpeg` | :white_check_mark: | | | `MPEG` | `.mpg` `.mpe` `.mpeg` | :white_check_mark: | |
| `MXF` | `.mxf` | :white_check_mark: | | | `MXF` | `.mxf` | :white_check_mark: | |
| `QUICKTIME` | `.mov` | :white_check_mark: | | | `QUICKTIME` | `.mov` | :white_check_mark: | |
| `WEBM` | `.webm` | :white_check_mark: | | | `WEBM` | `.webm` | :white_check_mark: | |
| `WMV` | `.wmv` | :white_check_mark: | | | `WMV` | `.wmv` | :white_check_mark: | |
-2
View File
@@ -20,8 +20,6 @@ def upload(file):
} }
data = { data = {
'deviceAssetId': f'{file}-{stats.st_mtime}',
'deviceId': 'python',
'fileCreatedAt': datetime.fromtimestamp(stats.st_mtime), 'fileCreatedAt': datetime.fromtimestamp(stats.st_mtime),
'fileModifiedAt': datetime.fromtimestamp(stats.st_mtime), 'fileModifiedAt': datetime.fromtimestamp(stats.st_mtime),
'isFavorite': 'false', 'isFavorite': 'false',
+1
View File
@@ -193,6 +193,7 @@ The default configuration looks like this:
"defaultStorageQuota": null, "defaultStorageQuota": null,
"enabled": false, "enabled": false,
"issuerUrl": "", "issuerUrl": "",
"endSessionEndpoint": "",
"mobileOverrideEnabled": false, "mobileOverrideEnabled": false,
"mobileRedirectUri": "", "mobileRedirectUri": "",
"profileSigningAlgorithm": "none", "profileSigningAlgorithm": "none",
+1 -1
View File
@@ -37,7 +37,7 @@ These environment variables are used by the `docker-compose.yml` file and do **N
| `IMMICH_LOG_FORMAT` | Log output format (`console`, `json`) | `console` | server | api, microservices | | `IMMICH_LOG_FORMAT` | Log output format (`console`, `json`) | `console` | server | api, microservices |
| `IMMICH_MEDIA_LOCATION` | Media location inside the container ⚠️**You probably shouldn't set this**<sup>\*2</sup>⚠️ | `/data` | server | api, microservices | | `IMMICH_MEDIA_LOCATION` | Media location inside the container ⚠️**You probably shouldn't set this**<sup>\*2</sup>⚠️ | `/data` | server | api, microservices |
| `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices | | `IMMICH_CONFIG_FILE` | Path to config file | | server | api, microservices |
| `IMMICH_HELMET_FILE` | Path to a json file with [helmet](https://www.npmjs.com/package/helmet) options. Set to `false` to disable. Set to `true` to use `server/helmet.json`. | `false` | server | api, microservices | | `IMMICH_HELMET_FILE` | Path to a json file with [helmet](https://www.npmjs.com/package/helmet) options. Set to `false` to disable. Set to `true` to use `server/helmet.json`. | `false` | server | api |
| `NO_COLOR` | Set to `true` to disable color-coded log output | `false` | server, machine learning | | | `NO_COLOR` | Set to `true` to disable color-coded log output | `false` | server, machine learning | |
| `CPU_CORES` | Number of cores available to the Immich server | auto-detected CPU core count | server | | | `CPU_CORES` | Number of cores available to the Immich server | auto-detected CPU core count | server | |
| `IMMICH_API_METRICS_PORT` | Port for the OTEL metrics | `8081` | server | api | | `IMMICH_API_METRICS_PORT` | Port for the OTEL metrics | `8081` | server | api |
+1 -1
View File
@@ -49,7 +49,7 @@ Immich requires [**Docker**](https://docs.docker.com/get-started/get-docker/) wi
The Compose plugin will be installed by both Docker Engine and Desktop by following the linked installation guides; it can also be [separately installed](https://docs.docker.com/compose/install/). The Compose plugin will be installed by both Docker Engine and Desktop by following the linked installation guides; it can also be [separately installed](https://docs.docker.com/compose/install/).
:::note :::note
Immich requires the command `docker compose`; the similarly named `docker-compose` is [deprecated](https://docs.docker.com/compose/migrate/) and is no longer supported by Immich. Immich requires the command `docker compose`; the similarly named `docker-compose` is [deprecated](https://docs.docker.com/retired/#docker-compose-v1-replaced-by-compose-v2) and is no longer supported by Immich.
::: :::
### Special requirements for Windows users ### Special requirements for Windows users
+2
View File
@@ -6,6 +6,8 @@ You can read more about the differences between storage template engine on and o
The admin user can set the template by using the template builder in the `Administration -> Settings -> Storage Template`. Immich provides a set of variables that you can use in constructing the template, along with additional custom text. If the template produces [multiple files with the same filename, they won't be overwritten](https://github.com/immich-app/immich/discussions/3324) as a sequence number is appended to the filename. The admin user can set the template by using the template builder in the `Administration -> Settings -> Storage Template`. Immich provides a set of variables that you can use in constructing the template, along with additional custom text. If the template produces [multiple files with the same filename, they won't be overwritten](https://github.com/immich-app/immich/discussions/3324) as a sequence number is appended to the filename.
Date and time variables in storage templates are rendered in the server's local timezone.
```bash title="Default template" ```bash title="Default template"
Year/Year-Month-Day/Filename.Extension Year/Year-Month-Day/Filename.Extension
``` ```
+5 -5
View File
@@ -30,17 +30,17 @@
"postcss": "^8.4.25", "postcss": "^8.4.25",
"prism-react-renderer": "^2.3.1", "prism-react-renderer": "^2.3.1",
"raw-loader": "^4.0.2", "raw-loader": "^4.0.2",
"react": "^18.0.0", "react": "^19.0.0",
"react-dom": "^18.0.0", "react-dom": "^19.0.0",
"tailwindcss": "^3.2.4", "tailwindcss": "^3.2.4",
"url": "^0.11.0" "url": "^0.11.0"
}, },
"devDependencies": { "devDependencies": {
"@docusaurus/module-type-aliases": "~3.9.0", "@docusaurus/module-type-aliases": "~3.9.0",
"@docusaurus/tsconfig": "^3.7.0", "@docusaurus/tsconfig": "^3.10.0",
"@docusaurus/types": "^3.7.0", "@docusaurus/types": "^3.7.0",
"prettier": "^3.7.4", "prettier": "^3.7.4",
"typescript": "^5.1.6" "typescript": "^6.0.0"
}, },
"browserslist": { "browserslist": {
"production": [ "production": [
@@ -58,6 +58,6 @@
"node": ">=20" "node": ">=20"
}, },
"volta": { "volta": {
"node": "24.14.0" "node": "24.14.1"
} }
} }
+4
View File
@@ -1,4 +1,8 @@
[ [
{
"label": "v2.7.5",
"url": "https://docs.v2.7.5.archive.immich.app"
},
{ {
"label": "v2.6.3", "label": "v2.6.3",
"url": "https://docs.v2.6.3.archive.immich.app" "url": "https://docs.v2.6.3.archive.immich.app"
+1 -5
View File
@@ -1,8 +1,4 @@
{ {
// This file is not used in compilation. It is here just for a nice editor experience. // This file is not used in compilation. It is here just for a nice editor experience.
"extends": "@docusaurus/tsconfig", "extends": "@docusaurus/tsconfig"
"compilerOptions": {
"baseUrl": "."
}
} }
+31 -3
View File
@@ -1,5 +1,12 @@
import { exportJWK, generateKeyPair } from 'jose'; import {
calculateJwkThumbprint,
exportJWK,
importPKCS8,
importSPKI,
SignJWT,
} from 'jose';
import Provider from 'oidc-provider'; import Provider from 'oidc-provider';
import { PRIVATE_KEY_PEM, PUBLIC_KEY_PEM } from './test-keys';
export enum OAuthClient { export enum OAuthClient {
DEFAULT = 'client-default', DEFAULT = 'client-default',
@@ -44,6 +51,29 @@ const claims = [
}, },
]; ];
const privateKey = await importPKCS8(PRIVATE_KEY_PEM, 'RS256', {
extractable: true,
});
const publicKey = await importSPKI(PUBLIC_KEY_PEM, 'RS256', {
extractable: true,
});
const kid = await calculateJwkThumbprint(await exportJWK(publicKey));
export async function generateLogoutToken(iss: string, sub: string) {
return await new SignJWT({
iss: iss,
aud: OAuthClient.DEFAULT,
iat: Math.floor(Date.now() / 1000),
jti: crypto.randomUUID(),
sub: sub,
events: {
'http://schemas.openid.net/event/backchannel-logout': {},
},
})
.setProtectedHeader({ alg: 'RS256', typ: 'logout+jwt', kid: kid })
.sign(privateKey);
}
const withDefaultClaims = (sub: string) => ({ const withDefaultClaims = (sub: string) => ({
sub, sub,
email: `${sub}@immich.app`, email: `${sub}@immich.app`,
@@ -66,8 +96,6 @@ const getClaims = (sub: string, use?: string) => {
}; };
const setup = async () => { const setup = async () => {
const { privateKey, publicKey } = await generateKeyPair('RS256');
const redirectUris = [ const redirectUris = [
'http://127.0.0.1:2285/auth/login', 'http://127.0.0.1:2285/auth/login',
'https://photos.immich.app/oauth/mobile-redirect', 'https://photos.immich.app/oauth/mobile-redirect',
+1 -1
View File
@@ -7,7 +7,7 @@
"start": "tsx startup.ts" "start": "tsx startup.ts"
}, },
"devDependencies": { "devDependencies": {
"jose": "^5.6.3", "jose": "^6.0.0",
"@types/oidc-provider": "^9.0.0", "@types/oidc-provider": "^9.0.0",
"oidc-provider": "^9.0.0", "oidc-provider": "^9.0.0",
"tsx": "^4.20.6" "tsx": "^4.20.6"
+38
View File
@@ -0,0 +1,38 @@
export const PRIVATE_KEY_PEM = `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCVj5C7hzN3E2HO
TcJ+DN/e2NSTQFj4rPylz4J8xjm8Es7l0k2kK5EEGvUNVGZbw7s055c+6kwP9eqg
B5XFE7+26Fcq1sou6Tbm310kU4dnMW5l2CgwrhaGyb1pNysao0AMLT60dFYqtUwn
ha9ceCsa+ZU1JrknVf3rONtppBvhWoI7CO9XX1keVQ0unHPzCWUjpXTzC8OGEbmB
2w7ZIUf8OfJkd5RZ4OtIpML71W9n13aDxT50x2/EW/pFLFtQ/oaleOKHpvlRXDRX
W86G4moUJym3gHMXMUj2aOcFG2UJnpLruKz3i5qZwYiTRlBP6O9EIQNCVtYxchuN
V1CCcBU1AgMBAAECggEAJLfXMu8Nx89ynPVyyUMMaFfoEpHC9iR0L5obQVpiPMYK
VRqVVLecdftPS9s7eQ58BNBRzdC0ZVu841aRYs3HLNbsZZhPkYZQpAxU//Dg5okY
fzj7Hv5yidt4HN9+Pd8z/3lRMnj4WapifLaBt8xJ2ujJBMBRxzJBsXDnT0+Kx7+y
bYDeuVfyUTEikaK3QZTbuRF3D3eiuN16GG+hv8UqTF2eYbPxdiLjYpTSHa4mH88C
qfJz2Xt4SEzmyeo3G+MO17wDFOwtEe8ojlJfULHnHJSFdUwTfYIFM1bg5/fJ9MOS
/fO3TSG+wkQqjQa6eoGssAzP87fL2XNLzlDtGY/7uQKBgQDHuJHOtf1EjOvNYiP7
EN+8QGs41ghzt9CQRQxWbHpusR3IW3P83KMXwYmrlG70oOUXBRGSB/ESXUofXc5W
pu5+Y55S44aUnu/a9yOBttYW0dtHZSL0zFT+PlVASwUzFZ2zcH1KXlUkSpfL5OAD
PyDDTnBZ2AWh45fRO9wLo6PPuQKBgQC/tI03RqU3mOjqukKbquYeIpXHfRU5Z0DM
u9ru1THYEl6fmkMXycxo/mvW3awyFuyKy/VodqIgKnFgumEqCHZh6OAMm/LC7TfA
l9tjFSs/MyOqQVD4kbX+z6Oq4c4GccDoXfsQ3gzECoBapegi/F+6/25y+/C8ghXb
J/Jg1GQXXQKBgQDFgWbfzuVZZyrBfu4qGLPJDMN7/114YizknwPma3xf/tN/EcGQ
K/k1QvWMMkvPq1UiAKcxjJ0AFjV482FcG9T6NDWbrtmmG88C8Sex3Ue2ZW2+GuwI
vhDHJIlV/Vp0/Elp7DJa2xLDwuh+gCZvz3vs6KL+ljxrrhCyn8mp0PfsMQKBgFFZ
KnuETOO0zVGdzFoGQTQUdP58A5+iQwsdxB+I9Ge+E80iRso3ZbhADj7VPhbbR3D2
b6LuhImluQrUzBpsEOAnU7vGCVPSGdBuIDiBaSKebsn2gYeZPWNtdQQ0YZq2dqek
Cb/0mfIuipzsvf7qnSza62F7q4IyqVegMegI+Jg5AoGATM3NMy7JZeKzSkm+3ohU
3xZOwgqKV9SH+0OeYWpuBxT7D7FlrKKI4NJ3XN3hg2f/DJAF6dH11CPe7pk94yol
HMbh+PQUQ6GYvAzxIOvagWboQ3lzeyubNMpyFjfOrIE/WOQCUBZ9tIwCHIarIuyi
QRuNOj3+U8T/n1Ww352HBdw=
-----END PRIVATE KEY-----`;
export const PUBLIC_KEY_PEM = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlY+Qu4czdxNhzk3Cfgzf
3tjUk0BY+Kz8pc+CfMY5vBLO5dJNpCuRBBr1DVRmW8O7NOeXPupMD/XqoAeVxRO/
tuhXKtbKLuk25t9dJFOHZzFuZdgoMK4Whsm9aTcrGqNADC0+tHRWKrVMJ4WvXHgr
GvmVNSa5J1X96zjbaaQb4VqCOwjvV19ZHlUNLpxz8wllI6V08wvDhhG5gdsO2SFH
/DnyZHeUWeDrSKTC+9VvZ9d2g8U+dMdvxFv6RSxbUP6GpXjih6b5UVw0V1vOhuJq
FCcpt4BzFzFI9mjnBRtlCZ6S67is94uamcGIk0ZQT+jvRCEDQlbWMXIbjVdQgnAV
NQIDAQAB
-----END PUBLIC KEY-----`;
+1 -1
View File
@@ -1 +1 @@
24.14.0 24.14.1
+1 -1
View File
@@ -44,7 +44,7 @@ services:
redis: redis:
container_name: immich-e2e-redis container_name: immich-e2e-redis
image: docker.io/valkey/valkey:9@sha256:3eeb09785cd61ec8e3be35f8804c8892080f3ca21934d628abc24ee4ed1698f6 image: docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9
healthcheck: healthcheck:
test: redis-cli ping || exit 1 test: redis-cli ping || exit 1
+6 -6
View File
@@ -1,6 +1,6 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "2.6.3", "version": "2.7.5",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",
@@ -32,15 +32,15 @@
"@playwright/test": "^1.44.1", "@playwright/test": "^1.44.1",
"@socket.io/component-emitter": "^3.1.2", "@socket.io/component-emitter": "^3.1.2",
"@types/luxon": "^3.4.2", "@types/luxon": "^3.4.2",
"@types/node": "^24.12.0", "@types/node": "^24.12.2",
"@types/pg": "^8.15.1", "@types/pg": "^8.15.1",
"@types/pngjs": "^6.0.4", "@types/pngjs": "^6.0.4",
"@types/supertest": "^6.0.2", "@types/supertest": "^7.0.0",
"dotenv": "^17.2.3", "dotenv": "^17.2.3",
"eslint": "^10.0.0", "eslint": "^10.0.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-unicorn": "^63.0.0", "eslint-plugin-unicorn": "^64.0.0",
"exiftool-vendored": "^35.0.0", "exiftool-vendored": "^35.0.0",
"globals": "^17.0.0", "globals": "^17.0.0",
"luxon": "^3.4.4", "luxon": "^3.4.4",
@@ -51,13 +51,13 @@
"sharp": "^0.34.5", "sharp": "^0.34.5",
"socket.io-client": "^4.7.4", "socket.io-client": "^4.7.4",
"supertest": "^7.0.0", "supertest": "^7.0.0",
"typescript": "^5.3.3", "typescript": "^6.0.0",
"typescript-eslint": "^8.28.0", "typescript-eslint": "^8.28.0",
"utimes": "^5.2.1", "utimes": "^5.2.1",
"vite-tsconfig-paths": "^6.1.1", "vite-tsconfig-paths": "^6.1.1",
"vitest": "^4.0.0" "vitest": "^4.0.0"
}, },
"volta": { "volta": {
"node": "24.14.0" "node": "24.14.1"
} }
} }
+6 -29
View File
@@ -130,12 +130,11 @@ describe('/albums', () => {
describe('GET /albums', () => { describe('GET /albums', () => {
it("should not show other users' favorites", async () => { it("should not show other users' favorites", async () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.get(`/albums/${user1Albums[0].id}?withoutAssets=false`) .get(`/albums/${user1Albums[0].id}`)
.set('Authorization', `Bearer ${user2.accessToken}`); .set('Authorization', `Bearer ${user2.accessToken}`);
expect(status).toEqual(200); expect(status).toEqual(200);
expect(body).toEqual({ expect(body).toEqual({
...user1Albums[0], ...user1Albums[0],
assets: [expect.objectContaining({ isFavorite: false })],
contributorCounts: [{ userId: user1.userId, assetCount: 1 }], contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
lastModifiedAssetTimestamp: expect.any(String), lastModifiedAssetTimestamp: expect.any(String),
startDate: expect.any(String), startDate: expect.any(String),
@@ -304,13 +303,12 @@ describe('/albums', () => {
describe('GET /albums/:id', () => { describe('GET /albums/:id', () => {
it('should return album info for own album', async () => { it('should return album info for own album', async () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.get(`/albums/${user1Albums[0].id}?withoutAssets=false`) .get(`/albums/${user1Albums[0].id}`)
.set('Authorization', `Bearer ${user1.accessToken}`); .set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200); expect(status).toBe(200);
expect(body).toEqual({ expect(body).toEqual({
...user1Albums[0], ...user1Albums[0],
assets: [expect.objectContaining({ id: user1Albums[0].assets[0].id })],
contributorCounts: [{ userId: user1.userId, assetCount: 1 }], contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
lastModifiedAssetTimestamp: expect.any(String), lastModifiedAssetTimestamp: expect.any(String),
startDate: expect.any(String), startDate: expect.any(String),
@@ -322,7 +320,7 @@ describe('/albums', () => {
it('should return album info for shared album (editor)', async () => { it('should return album info for shared album (editor)', async () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.get(`/albums/${user2Albums[0].id}?withoutAssets=false`) .get(`/albums/${user2Albums[0].id}`)
.set('Authorization', `Bearer ${user1.accessToken}`); .set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200); expect(status).toBe(200);
@@ -331,14 +329,14 @@ describe('/albums', () => {
it('should return album info for shared album (viewer)', async () => { it('should return album info for shared album (viewer)', async () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.get(`/albums/${user1Albums[3].id}?withoutAssets=false`) .get(`/albums/${user1Albums[3].id}`)
.set('Authorization', `Bearer ${user2.accessToken}`); .set('Authorization', `Bearer ${user2.accessToken}`);
expect(status).toBe(200); expect(status).toBe(200);
expect(body).toMatchObject({ id: user1Albums[3].id }); expect(body).toMatchObject({ id: user1Albums[3].id });
}); });
it('should return album info with assets when withoutAssets is undefined', async () => { it('should return album info', async () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.get(`/albums/${user1Albums[0].id}`) .get(`/albums/${user1Albums[0].id}`)
.set('Authorization', `Bearer ${user1.accessToken}`); .set('Authorization', `Bearer ${user1.accessToken}`);
@@ -346,25 +344,6 @@ describe('/albums', () => {
expect(status).toBe(200); expect(status).toBe(200);
expect(body).toEqual({ expect(body).toEqual({
...user1Albums[0], ...user1Albums[0],
assets: [expect.objectContaining({ id: user1Albums[0].assets[0].id })],
contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
lastModifiedAssetTimestamp: expect.any(String),
startDate: expect.any(String),
endDate: expect.any(String),
albumUsers: expect.any(Array),
shared: true,
});
});
it('should return album info without assets when withoutAssets is true', async () => {
const { status, body } = await request(app)
.get(`/albums/${user1Albums[0].id}?withoutAssets=true`)
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual({
...user1Albums[0],
assets: [],
contributorCounts: [{ userId: user1.userId, assetCount: 1 }], contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
assetCount: 1, assetCount: 1,
lastModifiedAssetTimestamp: expect.any(String), lastModifiedAssetTimestamp: expect.any(String),
@@ -379,13 +358,12 @@ describe('/albums', () => {
await utils.deleteAssets(user1.accessToken, [user1Asset2.id]); await utils.deleteAssets(user1.accessToken, [user1Asset2.id]);
const { status, body } = await request(app) const { status, body } = await request(app)
.get(`/albums/${user2Albums[0].id}?withoutAssets=true`) .get(`/albums/${user2Albums[0].id}`)
.set('Authorization', `Bearer ${user1.accessToken}`); .set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200); expect(status).toBe(200);
expect(body).toEqual({ expect(body).toEqual({
...user2Albums[0], ...user2Albums[0],
assets: [],
contributorCounts: [{ userId: user1.userId, assetCount: 1 }], contributorCounts: [{ userId: user1.userId, assetCount: 1 }],
assetCount: 1, assetCount: 1,
lastModifiedAssetTimestamp: expect.any(String), lastModifiedAssetTimestamp: expect.any(String),
@@ -426,7 +404,6 @@ describe('/albums', () => {
shared: false, shared: false,
albumUsers: [], albumUsers: [],
hasSharedLink: false, hasSharedLink: false,
assets: [],
assetCount: 0, assetCount: 0,
owner: expect.objectContaining({ email: user1.userEmail }), owner: expect.objectContaining({ email: user1.userEmail }),
isActivityEnabled: true, isActivityEnabled: true,
+5 -85
View File
@@ -1,7 +1,6 @@
import { import {
AssetMediaResponseDto, AssetMediaResponseDto,
AssetMediaStatus, AssetMediaStatus,
AssetResponseDto,
AssetTypeEnum, AssetTypeEnum,
AssetVisibility, AssetVisibility,
getAssetInfo, getAssetInfo,
@@ -19,7 +18,7 @@ import { Socket } from 'socket.io-client';
import { createUserDto, uuidDto } from 'src/fixtures'; import { createUserDto, uuidDto } from 'src/fixtures';
import { makeRandomImage } from 'src/generators'; import { makeRandomImage } from 'src/generators';
import { errorDto } from 'src/responses'; import { errorDto } from 'src/responses';
import { app, asBearerAuth, tempDir, TEN_TIMES, testAssetDir, utils } from 'src/utils'; import { app, asBearerAuth, tempDir, testAssetDir, utils } from 'src/utils';
import request from 'supertest'; import request from 'supertest';
import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { afterAll, beforeAll, describe, expect, it } from 'vitest';
@@ -95,8 +94,8 @@ describe('/asset', () => {
utils.createAsset(user1.accessToken), utils.createAsset(user1.accessToken),
utils.createAsset(user1.accessToken, { utils.createAsset(user1.accessToken, {
isFavorite: true, isFavorite: true,
fileCreatedAt: yesterday.toISO(), fileCreatedAt: yesterday.toUTC().toISO(),
fileModifiedAt: yesterday.toISO(), fileModifiedAt: yesterday.toUTC().toISO(),
assetData: { filename: 'example.mp4' }, assetData: { filename: 'example.mp4' },
}), }),
utils.createAsset(user1.accessToken), utils.createAsset(user1.accessToken),
@@ -380,62 +379,12 @@ describe('/asset', () => {
}); });
}); });
describe('GET /assets/random', () => {
beforeAll(async () => {
await Promise.all([
utils.createAsset(user1.accessToken),
utils.createAsset(user1.accessToken),
utils.createAsset(user1.accessToken),
utils.createAsset(user1.accessToken),
utils.createAsset(user1.accessToken),
utils.createAsset(user1.accessToken),
]);
await utils.waitForQueueFinish(admin.accessToken, 'thumbnailGeneration');
});
it.each(TEN_TIMES)('should return 1 random assets', async () => {
const { status, body } = await request(app)
.get('/assets/random')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
const assets: AssetResponseDto[] = body;
expect(assets.length).toBe(1);
expect(assets[0].ownerId).toBe(user1.userId);
});
it.each(TEN_TIMES)('should return 2 random assets', async () => {
const { status, body } = await request(app)
.get('/assets/random?count=2')
.set('Authorization', `Bearer ${user1.accessToken}`);
expect(status).toBe(200);
const assets: AssetResponseDto[] = body;
expect(assets.length).toBe(2);
for (const asset of assets) {
expect(asset.ownerId).toBe(user1.userId);
}
});
it.skip('should return 1 asset if there are 10 assets in the database but user 2 only has 1', async () => {
const { status, body } = await request(app)
.get('/assets/random')
.set('Authorization', `Bearer ${user2.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual([expect.objectContaining({ id: user2Assets[0].id })]);
});
});
describe('PUT /assets/:id', () => { describe('PUT /assets/:id', () => {
it('should require access', async () => { it('should require access', async () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.put(`/assets/${user2Assets[0].id}`) .put(`/assets/${user2Assets[0].id}`)
.set('Authorization', `Bearer ${user1.accessToken}`); .set('Authorization', `Bearer ${user1.accessToken}`)
.send({});
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission); expect(body).toEqual(errorDto.noPermission);
}); });
@@ -1142,8 +1091,6 @@ describe('/asset', () => {
const { body, status } = await request(app) const { body, status } = await request(app)
.post('/assets') .post('/assets')
.set('Authorization', `Bearer ${quotaUser.accessToken}`) .set('Authorization', `Bearer ${quotaUser.accessToken}`)
.field('deviceAssetId', 'example-image')
.field('deviceId', 'e2e')
.field('fileCreatedAt', new Date().toISOString()) .field('fileCreatedAt', new Date().toISOString())
.field('fileModifiedAt', new Date().toISOString()) .field('fileModifiedAt', new Date().toISOString())
.attach('assetData', makeRandomImage(), 'example.jpg'); .attach('assetData', makeRandomImage(), 'example.jpg');
@@ -1160,8 +1107,6 @@ describe('/asset', () => {
const { body, status } = await request(app) const { body, status } = await request(app)
.post('/assets') .post('/assets')
.set('Authorization', `Bearer ${quotaUser.accessToken}`) .set('Authorization', `Bearer ${quotaUser.accessToken}`)
.field('deviceAssetId', 'example-image')
.field('deviceId', 'e2e')
.field('fileCreatedAt', new Date().toISOString()) .field('fileCreatedAt', new Date().toISOString())
.field('fileModifiedAt', new Date().toISOString()) .field('fileModifiedAt', new Date().toISOString())
.attach('assetData', randomBytes(2014), 'example.jpg'); .attach('assetData', randomBytes(2014), 'example.jpg');
@@ -1215,29 +1160,4 @@ describe('/asset', () => {
expect(video.checksum).toStrictEqual(checksum); expect(video.checksum).toStrictEqual(checksum);
}); });
}); });
describe('POST /assets/exist', () => {
it('ignores invalid deviceAssetIds', async () => {
const response = await utils.checkExistingAssets(user1.accessToken, {
deviceId: 'test-assets-exist',
deviceAssetIds: ['invalid', 'INVALID'],
});
expect(response.existingIds).toHaveLength(0);
});
it('returns the IDs of existing assets', async () => {
await utils.createAsset(user1.accessToken, {
deviceId: 'test-assets-exist',
deviceAssetId: 'test-asset-0',
});
const response = await utils.checkExistingAssets(user1.accessToken, {
deviceId: 'test-assets-exist',
deviceAssetIds: ['test-asset-0'],
});
expect(response.existingIds).toEqual(['test-asset-0']);
});
});
}); });
+7 -7
View File
@@ -110,7 +110,7 @@ describe('/libraries', () => {
}); });
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(["All importPaths's elements must be unique"])); expect(body).toEqual(errorDto.badRequest(['[importPaths] Array must have unique items']));
}); });
it('should not create an external library with duplicate exclusion patterns', async () => { it('should not create an external library with duplicate exclusion patterns', async () => {
@@ -125,7 +125,7 @@ describe('/libraries', () => {
}); });
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(["All exclusionPatterns's elements must be unique"])); expect(body).toEqual(errorDto.badRequest(['[exclusionPatterns] Array must have unique items']));
}); });
}); });
@@ -157,7 +157,7 @@ describe('/libraries', () => {
.send({ name: '' }); .send({ name: '' });
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['name should not be empty'])); expect(body).toEqual(errorDto.badRequest(['[name] Too small: expected string to have >=1 characters']));
}); });
it('should change the import paths', async () => { it('should change the import paths', async () => {
@@ -181,7 +181,7 @@ describe('/libraries', () => {
.send({ importPaths: [''] }); .send({ importPaths: [''] });
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['each value in importPaths should not be empty'])); expect(body).toEqual(errorDto.badRequest(['[importPaths] Array items must not be empty']));
}); });
it('should reject duplicate import paths', async () => { it('should reject duplicate import paths', async () => {
@@ -191,7 +191,7 @@ describe('/libraries', () => {
.send({ importPaths: ['/path', '/path'] }); .send({ importPaths: ['/path', '/path'] });
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(["All importPaths's elements must be unique"])); expect(body).toEqual(errorDto.badRequest(['[importPaths] Array must have unique items']));
}); });
it('should change the exclusion pattern', async () => { it('should change the exclusion pattern', async () => {
@@ -215,7 +215,7 @@ describe('/libraries', () => {
.send({ exclusionPatterns: ['**/*.jpg', '**/*.jpg'] }); .send({ exclusionPatterns: ['**/*.jpg', '**/*.jpg'] });
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(["All exclusionPatterns's elements must be unique"])); expect(body).toEqual(errorDto.badRequest(['[exclusionPatterns] Array must have unique items']));
}); });
it('should reject an empty exclusion pattern', async () => { it('should reject an empty exclusion pattern', async () => {
@@ -225,7 +225,7 @@ describe('/libraries', () => {
.send({ exclusionPatterns: [''] }); .send({ exclusionPatterns: [''] });
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['each value in exclusionPatterns should not be empty'])); expect(body).toEqual(errorDto.badRequest(['[exclusionPatterns] Array items must not be empty']));
}); });
}); });
+4 -4
View File
@@ -109,7 +109,7 @@ describe('/map', () => {
.get('/map/reverse-geocode?lon=123') .get('/map/reverse-geocode?lon=123')
.set('Authorization', `Bearer ${admin.accessToken}`); .set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['lat must be a number between -90 and 90'])); expect(body).toEqual(errorDto.badRequest(['[lat] Invalid input: expected number, received NaN']));
}); });
it('should throw an error if a lat is not a number', async () => { it('should throw an error if a lat is not a number', async () => {
@@ -117,7 +117,7 @@ describe('/map', () => {
.get('/map/reverse-geocode?lat=abc&lon=123.456') .get('/map/reverse-geocode?lat=abc&lon=123.456')
.set('Authorization', `Bearer ${admin.accessToken}`); .set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['lat must be a number between -90 and 90'])); expect(body).toEqual(errorDto.badRequest(['[lat] Invalid input: expected number, received NaN']));
}); });
it('should throw an error if a lat is out of range', async () => { it('should throw an error if a lat is out of range', async () => {
@@ -125,7 +125,7 @@ describe('/map', () => {
.get('/map/reverse-geocode?lat=91&lon=123.456') .get('/map/reverse-geocode?lat=91&lon=123.456')
.set('Authorization', `Bearer ${admin.accessToken}`); .set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['lat must be a number between -90 and 90'])); expect(body).toEqual(errorDto.badRequest(['[lat] Too big: expected number to be <=90']));
}); });
it('should throw an error if a lon is not provided', async () => { it('should throw an error if a lon is not provided', async () => {
@@ -133,7 +133,7 @@ describe('/map', () => {
.get('/map/reverse-geocode?lat=75') .get('/map/reverse-geocode?lat=75')
.set('Authorization', `Bearer ${admin.accessToken}`); .set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['lon must be a number between -180 and 180'])); expect(body).toEqual(errorDto.badRequest(['[lon] Invalid input: expected number, received NaN']));
}); });
const reverseGeocodeTestCases = [ const reverseGeocodeTestCases = [
+118 -15
View File
@@ -1,9 +1,10 @@
import { OAuthClient, OAuthUser } from '@immich/e2e-auth-server'; import { OAuthClient, OAuthUser, generateLogoutToken } from '@immich/e2e-auth-server';
import { import {
LoginResponseDto, LoginResponseDto,
SystemConfigOAuthDto, SystemConfigOAuthDto,
getConfigDefaults, getConfigDefaults,
getMyUser, getMyUser,
getSessions,
startOAuth, startOAuth,
updateConfig, updateConfig,
} from '@immich/sdk'; } from '@immich/sdk';
@@ -76,6 +77,7 @@ const setupOAuth = async (token: string, dto: Partial<SystemConfigOAuthDto>) =>
...defaults.oauth, ...defaults.oauth,
buttonText: 'Login with Immich', buttonText: 'Login with Immich',
issuerUrl: `${authServer.internal}/.well-known/openid-configuration`, issuerUrl: `${authServer.internal}/.well-known/openid-configuration`,
allowInsecureRequests: true,
...dto, ...dto,
}; };
await updateConfig({ systemConfigDto: { ...defaults, oauth: merged } }, options); await updateConfig({ systemConfigDto: { ...defaults, oauth: merged } }, options);
@@ -87,21 +89,23 @@ describe(`/oauth`, () => {
beforeAll(async () => { beforeAll(async () => {
await utils.resetDatabase(); await utils.resetDatabase();
admin = await utils.adminSetup(); admin = await utils.adminSetup();
await setupOAuth(admin.accessToken, {
enabled: true,
clientId: OAuthClient.DEFAULT,
clientSecret: OAuthClient.DEFAULT,
buttonText: 'Login with Immich',
storageLabelClaim: 'immich_username',
});
}); });
describe('POST /oauth/authorize', () => { describe('POST /oauth/authorize', () => {
beforeAll(async () => {
await setupOAuth(admin.accessToken, {
enabled: true,
clientId: OAuthClient.DEFAULT,
clientSecret: OAuthClient.DEFAULT,
buttonText: 'Login with Immich',
storageLabelClaim: 'immich_username',
});
});
it(`should throw an error if a redirect uri is not provided`, async () => { it(`should throw an error if a redirect uri is not provided`, async () => {
const { status, body } = await request(app).post('/oauth/authorize').send({}); const { status, body } = await request(app).post('/oauth/authorize').send({});
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['redirectUri must be a string', 'redirectUri should not be empty'])); expect(body).toEqual(errorDto.badRequest(['[redirectUri] Invalid input: expected string, received undefined']));
}); });
it('should return a redirect uri', async () => { it('should return a redirect uri', async () => {
@@ -117,19 +121,56 @@ describe(`/oauth`, () => {
expect(params.get('redirect_uri')).toBe('http://127.0.0.1:2285/auth/login'); expect(params.get('redirect_uri')).toBe('http://127.0.0.1:2285/auth/login');
expect(params.get('state')).toBeDefined(); expect(params.get('state')).toBeDefined();
}); });
it('should not include the prompt parameter when not configured', async () => {
const { status, body } = await request(app)
.post('/oauth/authorize')
.send({ redirectUri: 'http://127.0.0.1:2285/auth/login' });
expect(status).toBe(201);
const params = new URL(body.url).searchParams;
expect(params.get('prompt')).toBeNull();
});
it('should include the prompt parameter when configured', async () => {
await setupOAuth(admin.accessToken, {
enabled: true,
clientId: OAuthClient.DEFAULT,
clientSecret: OAuthClient.DEFAULT,
prompt: 'select_account',
});
const { status, body } = await request(app)
.post('/oauth/authorize')
.send({ redirectUri: 'http://127.0.0.1:2285/auth/login' });
expect(status).toBe(201);
const params = new URL(body.url).searchParams;
expect(params.get('prompt')).toBe('select_account');
});
}); });
describe('POST /oauth/callback', () => { describe('POST /oauth/callback', () => {
beforeAll(async () => {
await setupOAuth(admin.accessToken, {
enabled: true,
clientId: OAuthClient.DEFAULT,
clientSecret: OAuthClient.DEFAULT,
buttonText: 'Login with Immich',
storageLabelClaim: 'immich_username',
});
});
it(`should throw an error if a url is not provided`, async () => { it(`should throw an error if a url is not provided`, async () => {
const { status, body } = await request(app).post('/oauth/callback').send({}); const { status, body } = await request(app).post('/oauth/callback').send({});
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['url must be a string', 'url should not be empty'])); expect(body).toEqual(errorDto.badRequest(['[url] Invalid input: expected string, received undefined']));
}); });
it(`should throw an error if the url is empty`, async () => { it(`should throw an error if the url is empty`, async () => {
const { status, body } = await request(app).post('/oauth/callback').send({ url: '' }); const { status, body } = await request(app).post('/oauth/callback').send({ url: '' });
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['url should not be empty'])); expect(body).toEqual(errorDto.badRequest(['[url] Too small: expected string to have >=1 characters']));
}); });
it(`should throw an error if the state is not provided`, async () => { it(`should throw an error if the state is not provided`, async () => {
@@ -158,10 +199,9 @@ describe(`/oauth`, () => {
it(`should throw an error if the codeVerifier doesn't match the challenge`, async () => { it(`should throw an error if the codeVerifier doesn't match the challenge`, async () => {
const callbackParams = await loginWithOAuth('oauth-auto-register'); const callbackParams = await loginWithOAuth('oauth-auto-register');
const { codeVerifier } = await loginWithOAuth('oauth-auto-register'); const { codeVerifier } = await loginWithOAuth('oauth-auto-register');
const { status, body } = await request(app) const { status } = await request(app)
.post('/oauth/callback') .post('/oauth/callback')
.send({ ...callbackParams, codeVerifier }); .send({ ...callbackParams, codeVerifier });
console.log(body);
expect(status).toBeGreaterThanOrEqual(400); expect(status).toBeGreaterThanOrEqual(400);
}); });
@@ -258,7 +298,7 @@ describe(`/oauth`, () => {
accessToken: expect.any(String), accessToken: expect.any(String),
isAdmin: false, isAdmin: false,
name: 'OAuth User', name: 'OAuth User',
userEmail: 'oauth-RS256-token@immich.app', userEmail: 'oauth-rs256-token@immich.app',
userId: expect.any(String), userId: expect.any(String),
}); });
}); });
@@ -333,6 +373,50 @@ describe(`/oauth`, () => {
}); });
}); });
describe(`POST /oauth/backchannel-logout`, () => {
it(`should throw an error if the logout_token is not provided`, async () => {
const { status, body } = await request(app).post('/oauth/backchannel-logout').send({});
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['[logout_token] Invalid input: expected string, received undefined']));
});
it(`should throw an error if an invalid logout token is provided`, async () => {
const { status, body } = await request(app)
.post('/oauth/backchannel-logout')
.send({ logout_token: 'invalid token' });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('Error backchannel logout: token validation failed'));
});
it(`should logout user if a valid logout token is provided`, async () => {
await setupOAuth(admin.accessToken, {
enabled: true,
clientId: OAuthClient.DEFAULT,
clientSecret: OAuthClient.DEFAULT,
autoRegister: true,
signingAlgorithm: 'RS256',
buttonText: 'Login with Immich',
});
const callbackParams = await loginWithOAuth('backchannel-logout-user');
const { status: callbackStatus, body: callbackBody } = await request(app)
.post('/oauth/callback')
.send(callbackParams);
expect(callbackStatus).toBe(201);
await expect(getSessions({ headers: asBearerAuth(callbackBody.accessToken) })).resolves.toHaveLength(1);
const logoutToken = await generateLogoutToken('http://0.0.0.0:2286', 'backchannel-logout-user');
const { status, body } = await request(app).post('/oauth/backchannel-logout').send({ logout_token: logoutToken });
expect(status).toBe(200);
expect(body).toMatchObject({});
await expect(getSessions({ headers: asBearerAuth(callbackBody.accessToken) })).rejects.toMatchObject({
status: 401,
});
});
});
describe('mobile redirect override', () => { describe('mobile redirect override', () => {
beforeAll(async () => { beforeAll(async () => {
await setupOAuth(admin.accessToken, { await setupOAuth(admin.accessToken, {
@@ -399,4 +483,23 @@ describe(`/oauth`, () => {
}); });
}); });
}); });
describe('allowInsecureRequests: false', () => {
beforeAll(async () => {
await setupOAuth(admin.accessToken, {
enabled: true,
clientId: OAuthClient.DEFAULT,
clientSecret: OAuthClient.DEFAULT,
allowInsecureRequests: false,
});
});
it('should reject OAuth discovery over HTTP', async () => {
const { status, body } = await request(app)
.post('/oauth/authorize')
.send({ redirectUri: 'http://127.0.0.1:2285/auth/login' });
expect(status).toBe(500);
expect(body).toMatchObject({ statusCode: 500 });
});
});
}); });
+1 -2
View File
@@ -74,7 +74,6 @@ describe('/search', () => {
const bytes = await readFile(join(testAssetDir, filename)); const bytes = await readFile(join(testAssetDir, filename));
assets.push( assets.push(
await utils.createAsset(admin.accessToken, { await utils.createAsset(admin.accessToken, {
deviceAssetId: `test-${filename}`,
assetData: { bytes, filename }, assetData: { bytes, filename },
...dto, ...dto,
}), }),
@@ -458,7 +457,7 @@ describe('/search', () => {
expect(Array.isArray(body)).toBe(true); expect(Array.isArray(body)).toBe(true);
if (Array.isArray(body)) { if (Array.isArray(body)) {
expect(body.length).toBeGreaterThan(10); expect(body.length).toBeGreaterThan(10);
expect(body[0].name).toEqual(name); expect(body[0].name).toEqual(expect.stringContaining(name));
expect(body[0].admin2name).toEqual(name); expect(body[0].admin2name).toEqual(name);
} }
}); });
@@ -207,16 +207,6 @@ describe('/server', () => {
}); });
}); });
describe('GET /server/theme', () => {
it('should respond with the server theme', async () => {
const { status, body } = await request(app).get('/server/theme');
expect(status).toBe(200);
expect(body).toEqual({
customCss: '',
});
});
});
describe('GET /server/license', () => { describe('GET /server/license', () => {
it('should require authentication', async () => { it('should require authentication', async () => {
const { status, body } = await request(app).get('/server/license'); const { status, body } = await request(app).get('/server/license');
@@ -243,9 +243,21 @@ describe('/shared-links', () => {
}); });
it('should get data for correct password protected link', async () => { it('should get data for correct password protected link', async () => {
const response = await request(app)
.post('/shared-links/login')
.send({ password: 'foo' })
.query({ key: linkWithPassword.key });
expect(response.status).toBe(201);
const cookies = response.get('Set-Cookie') ?? [];
expect(cookies).toHaveLength(1);
expect(cookies[0]).toContain('immich_shared_link_token');
const { status, body } = await request(app) const { status, body } = await request(app)
.get('/shared-links/me') .get('/shared-links/me')
.query({ key: linkWithPassword.key, password: 'foo' }); .query({ key: linkWithPassword.key })
.set('Cookie', cookies);
expect(status).toBe(200); expect(status).toBe(200);
expect(body).toEqual( expect(body).toEqual(
+2 -2
View File
@@ -309,7 +309,7 @@ describe('/tags', () => {
.get(`/tags/${uuidDto.invalid}`) .get(`/tags/${uuidDto.invalid}`)
.set('Authorization', `Bearer ${admin.accessToken}`); .set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID'])); expect(body).toEqual(errorDto.badRequest(['[id] Invalid UUID']));
}); });
it('should get tag details', async () => { it('should get tag details', async () => {
@@ -427,7 +427,7 @@ describe('/tags', () => {
.delete(`/tags/${uuidDto.invalid}`) .delete(`/tags/${uuidDto.invalid}`)
.set('Authorization', `Bearer ${admin.accessToken}`); .set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['id must be a UUID'])); expect(body).toEqual(errorDto.badRequest(['[id] Invalid UUID']));
}); });
it('should delete a tag', async () => { it('should delete a tag', async () => {
@@ -287,7 +287,8 @@ describe('/admin/users', () => {
it('should delete user', async () => { it('should delete user', async () => {
const { status, body } = await request(app) const { status, body } = await request(app)
.delete(`/admin/users/${userToDelete.userId}`) .delete(`/admin/users/${userToDelete.userId}`)
.set('Authorization', `Bearer ${admin.accessToken}`); .set('Authorization', `Bearer ${admin.accessToken}`)
.send({});
expect(status).toBe(200); expect(status).toBe(200);
expect(body).toMatchObject({ expect(body).toMatchObject({
+6 -2
View File
@@ -178,7 +178,9 @@ describe('/users', () => {
.set('Authorization', `Bearer ${admin.accessToken}`); .set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['download.archiveSize must be an integer number'])); expect(body).toEqual(
errorDto.badRequest(['[download.archiveSize] Invalid input: expected int, received number']),
);
}); });
it('should update download archive size', async () => { it('should update download archive size', async () => {
@@ -204,7 +206,9 @@ describe('/users', () => {
.set('Authorization', `Bearer ${admin.accessToken}`); .set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(400); expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['download.includeEmbeddedVideos must be a boolean value'])); expect(body).toEqual(
errorDto.badRequest(['[download.includeEmbeddedVideos] Invalid input: expected boolean, received number']),
);
}); });
it('should update download include embedded videos', async () => { it('should update download include embedded videos', async () => {
@@ -1,7 +1,9 @@
import { AssetMediaResponseDto, LoginResponseDto, SharedLinkType } from '@immich/sdk'; import { AssetMediaResponseDto, LoginResponseDto, SharedLinkType } from '@immich/sdk';
import { expect, test } from '@playwright/test'; import { expect, test } from '@playwright/test';
import { readFile } from 'node:fs/promises';
import { basename, join } from 'node:path';
import type { Socket } from 'socket.io-client'; import type { Socket } from 'socket.io-client';
import { utils } from 'src/utils'; import { testAssetDir, utils } from 'src/utils';
test.describe('Detail Panel', () => { test.describe('Detail Panel', () => {
let admin: LoginResponseDto; let admin: LoginResponseDto;
@@ -83,4 +85,42 @@ test.describe('Detail Panel', () => {
await utils.waitForWebsocketEvent({ event: 'assetUpdate', id: asset.id }); await utils.waitForWebsocketEvent({ event: 'assetUpdate', id: asset.id });
await expect(textarea).toHaveValue('new description'); await expect(textarea).toHaveValue('new description');
}); });
test.describe('Date editor', () => {
test('displays inferred asset timezone', async ({ context, page }) => {
const test = {
filepath: 'metadata/dates/datetimeoriginal-gps.jpg',
expected: {
dateTime: '2025-12-01T11:30',
// Test with a timezone which is NOT the first among timezones with the same offset
// This is to check that the editor does not simply fall back to the first available timezone with that offset
// America/Denver (-07:00) is not the first among timezones with offset -07:00
timeZoneWithOffset: 'America/Denver (-07:00)',
},
};
const asset = await utils.createAsset(admin.accessToken, {
assetData: {
bytes: await readFile(join(testAssetDir, test.filepath)),
filename: basename(test.filepath),
},
});
await utils.waitForWebsocketEvent({ event: 'assetUpload', id: asset.id });
// asset viewer -> detail panel -> date editor
await utils.setAuthCookies(context, admin.accessToken);
await page.goto(`/photos/${asset.id}`);
await page.waitForSelector('#immich-asset-viewer');
await page.getByRole('button', { name: 'Info' }).click();
await page.getByTestId('detail-panel-edit-date-button').click();
await page.waitForSelector('[role="dialog"]');
const datetime = page.locator('#datetime');
await expect(datetime).toHaveValue(test.expected.dateTime);
const timezone = page.getByRole('combobox', { name: 'Timezone' });
await expect(timezone).toHaveValue(test.expected.timeZoneWithOffset);
});
});
}); });
+2 -2
View File
@@ -16,8 +16,8 @@ test.describe('Duplicates Utility', () => {
test.beforeEach(async ({ context }) => { test.beforeEach(async ({ context }) => {
[firstAsset, secondAsset] = await Promise.all([ [firstAsset, secondAsset] = await Promise.all([
utils.createAsset(admin.accessToken, { deviceAssetId: 'duplicate-a' }), utils.createAsset(admin.accessToken, {}),
utils.createAsset(admin.accessToken, { deviceAssetId: 'duplicate-b' }), utils.createAsset(admin.accessToken, {}),
]); ]);
await updateAssets( await updateAssets(
@@ -77,18 +77,4 @@ test.describe('Photo Viewer', () => {
}); });
expect(tagAtCenter).toBe('IMG'); expect(tagAtCenter).toBe('IMG');
}); });
test('reloads photo when checksum changes', async ({ page }) => {
await page.goto(`/photos/${asset.id}`);
const preview = page.getByTestId('preview').filter({ visible: true });
await expect(preview).toHaveAttribute('src', /.+/);
const initialSrc = await preview.getAttribute('src');
const websocketEvent = utils.waitForWebsocketEvent({ event: 'assetUpdate', id: asset.id });
await utils.replaceAsset(admin.accessToken, asset.id);
await websocketEvent;
await expect(preview).not.toHaveAttribute('src', initialSrc!);
});
}); });
@@ -315,11 +315,9 @@ export function toAssetResponseDto(asset: MockTimelineAsset, owner?: UserRespons
return { return {
id: asset.id, id: asset.id,
deviceAssetId: `device-${asset.id}`,
ownerId: asset.ownerId, ownerId: asset.ownerId,
owner: owner || defaultOwner, owner: owner || defaultOwner,
libraryId: `library-${asset.ownerId}`, libraryId: `library-${asset.ownerId}`,
deviceId: `device-${asset.ownerId}`,
type: asset.isVideo ? AssetTypeEnum.Video : AssetTypeEnum.Image, type: asset.isVideo ? AssetTypeEnum.Video : AssetTypeEnum.Image,
originalPath: `/original/${asset.id}.${asset.isVideo ? 'mp4' : 'jpg'}`, originalPath: `/original/${asset.id}.${asset.isVideo ? 'mp4' : 'jpg'}`,
originalFileName: `${asset.id}.${asset.isVideo ? 'mp4' : 'jpg'}`, originalFileName: `${asset.id}.${asset.isVideo ? 'mp4' : 'jpg'}`,
@@ -334,7 +332,7 @@ export function toAssetResponseDto(asset: MockTimelineAsset, owner?: UserRespons
isArchived: false, isArchived: false,
isTrashed: asset.isTrashed, isTrashed: asset.isTrashed,
visibility: asset.visibility, visibility: asset.visibility,
duration: asset.duration || '0:00:00.00000', duration: asset.duration,
exifInfo, exifInfo,
livePhotoVideoId: asset.livePhotoVideoId, livePhotoVideoId: asset.livePhotoVideoId,
tags: [], tags: [],
@@ -429,7 +427,6 @@ export function getAlbum(
hasSharedLink: false, hasSharedLink: false,
isActivityEnabled: true, isActivityEnabled: true,
assetCount: albumAssets.length, assetCount: albumAssets.length,
assets: albumAssets,
startDate: albumAssets.length > 0 ? albumAssets.at(-1)?.fileCreatedAt : undefined, startDate: albumAssets.length > 0 ? albumAssets.at(-1)?.fileCreatedAt : undefined,
endDate: albumAssets.length > 0 ? albumAssets[0].fileCreatedAt : undefined, endDate: albumAssets.length > 0 ? albumAssets[0].fileCreatedAt : undefined,
lastModifiedAssetTimestamp: albumAssets.length > 0 ? albumAssets[0].fileCreatedAt : undefined, lastModifiedAssetTimestamp: albumAssets.length > 0 ? albumAssets[0].fileCreatedAt : undefined,
+2 -1
View File
@@ -1,5 +1,5 @@
import { BrowserContext } from '@playwright/test'; import { BrowserContext } from '@playwright/test';
import { playwrightHost } from 'playwright.config'; import { playwrightHost } from 'src/../playwright.config';
export const setupBaseMockApiRoutes = async (context: BrowserContext, adminUserId: string) => { export const setupBaseMockApiRoutes = async (context: BrowserContext, adminUserId: string) => {
await context.addCookies([ await context.addCookies([
@@ -173,6 +173,7 @@ export const setupBaseMockApiRoutes = async (context: BrowserContext, adminUserI
'.mpeg', '.mpeg',
'.mpg', '.mpg',
'.mts', '.mts',
'.ts',
'.vob', '.vob',
'.webm', '.webm',
'.wmv', '.wmv',
@@ -16,7 +16,6 @@ export const createMockStackAsset = (ownerId: string): AssetResponseDto => {
const now = new Date().toISOString(); const now = new Date().toISOString();
return { return {
id: assetId, id: assetId,
deviceAssetId: `device-${assetId}`,
ownerId, ownerId,
owner: { owner: {
id: ownerId, id: ownerId,
@@ -27,7 +26,6 @@ export const createMockStackAsset = (ownerId: string): AssetResponseDto => {
avatarColor: 'blue' as never, avatarColor: 'blue' as never,
}, },
libraryId: `library-${ownerId}`, libraryId: `library-${ownerId}`,
deviceId: `device-${ownerId}`,
type: AssetTypeEnum.Image, type: AssetTypeEnum.Image,
originalPath: `/original/${assetId}.jpg`, originalPath: `/original/${assetId}.jpg`,
originalFileName: `${assetId}.jpg`, originalFileName: `${assetId}.jpg`,
@@ -42,7 +40,7 @@ export const createMockStackAsset = (ownerId: string): AssetResponseDto => {
isArchived: false, isArchived: false,
isTrashed: false, isTrashed: false,
visibility: AssetVisibility.Timeline, visibility: AssetVisibility.Timeline,
duration: '0:00:00.00000', duration: null,
exifInfo: { exifInfo: {
make: null, make: null,
model: null, model: null,
@@ -69,7 +67,7 @@ export const createMockStackAsset = (ownerId: string): AssetResponseDto => {
tags: [], tags: [],
people: [], people: [],
unassignedFaces: [], unassignedFaces: [],
stack: null, stack: undefined,
isOffline: false, isOffline: false,
hasMetadata: true, hasMetadata: true,
duplicateId: null, duplicateId: null,
+55
View File
@@ -0,0 +1,55 @@
import { faker } from '@faker-js/faker';
import type { AssetOcrResponseDto } from '@immich/sdk';
import { BrowserContext } from '@playwright/test';
export type MockOcrBox = {
text: string;
x1: number;
y1: number;
x2: number;
y2: number;
x3: number;
y3: number;
x4: number;
y4: number;
};
export const createMockOcrData = (assetId: string, boxes: MockOcrBox[]): AssetOcrResponseDto[] => {
return boxes.map((box) => ({
id: faker.string.uuid(),
assetId,
x1: box.x1,
y1: box.y1,
x2: box.x2,
y2: box.y2,
x3: box.x3,
y3: box.y3,
x4: box.x4,
y4: box.y4,
boxScore: 0.95,
textScore: 0.9,
text: box.text,
}));
};
export const setupOcrMockApiRoutes = async (
context: BrowserContext,
ocrDataByAssetId: Map<string, AssetOcrResponseDto[]>,
) => {
await context.route('**/assets/*/ocr', async (route, request) => {
if (request.method() !== 'GET') {
return route.fallback();
}
const url = new URL(request.url());
const segments = url.pathname.split('/');
const assetIdIndex = segments.indexOf('assets') + 1;
const assetId = segments[assetIdIndex];
const ocrData = ocrDataByAssetId.get(assetId) ?? [];
return route.fulfill({
status: 200,
contentType: 'application/json',
json: ocrData,
});
});
};
@@ -0,0 +1,300 @@
import type { AssetOcrResponseDto, AssetResponseDto } from '@immich/sdk';
import { expect, test } from '@playwright/test';
import { toAssetResponseDto } from 'src/ui/generators/timeline';
import {
createMockStack,
createMockStackAsset,
MockStack,
setupBrokenAssetMockApiRoutes,
} from 'src/ui/mock-network/broken-asset-network';
import { createMockOcrData, setupOcrMockApiRoutes } from 'src/ui/mock-network/ocr-network';
import { assetViewerUtils } from '../timeline/utils';
import { setupAssetViewerFixture } from './utils';
test.describe.configure({ mode: 'parallel' });
const PRIMARY_OCR_BOXES = [
{ text: 'Hello World', x1: 0.1, y1: 0.1, x2: 0.4, y2: 0.1, x3: 0.4, y3: 0.15, x4: 0.1, y4: 0.15 },
{ text: 'Immich Photo', x1: 0.2, y1: 0.3, x2: 0.6, y2: 0.3, x3: 0.6, y3: 0.36, x4: 0.2, y4: 0.36 },
];
const SECONDARY_OCR_BOXES = [
{ text: 'Second Asset Text', x1: 0.15, y1: 0.2, x2: 0.55, y2: 0.2, x3: 0.55, y3: 0.26, x4: 0.15, y4: 0.26 },
];
test.describe('OCR bounding boxes', () => {
const fixture = setupAssetViewerFixture(920);
test.beforeEach(async ({ context }) => {
const primaryAssetDto = toAssetResponseDto(fixture.primaryAsset);
const ocrDataByAssetId = new Map<string, AssetOcrResponseDto[]>([
[primaryAssetDto.id, createMockOcrData(primaryAssetDto.id, PRIMARY_OCR_BOXES)],
]);
await setupOcrMockApiRoutes(context, ocrDataByAssetId);
});
test('OCR bounding boxes appear when clicking OCR button', async ({ page }) => {
await page.goto(`/photos/${fixture.primaryAsset.id}`);
await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset);
const ocrButton = page.getByLabel('Text recognition');
await expect(ocrButton).toBeVisible();
await ocrButton.click();
const ocrBoxes = page.locator('[data-viewer-content] [data-testid="ocr-box"]');
await expect(ocrBoxes).toHaveCount(2);
await expect(ocrBoxes.nth(0)).toContainText('Hello World');
await expect(ocrBoxes.nth(1)).toContainText('Immich Photo');
});
test('OCR bounding boxes toggle off on second click', async ({ page }) => {
await page.goto(`/photos/${fixture.primaryAsset.id}`);
await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset);
const ocrButton = page.getByLabel('Text recognition');
await ocrButton.click();
await expect(page.locator('[data-viewer-content] [data-testid="ocr-box"]').first()).toBeVisible();
await ocrButton.click();
await expect(page.locator('[data-viewer-content] [data-testid="ocr-box"]')).toHaveCount(0);
});
});
test.describe('OCR with stacked assets', () => {
const fixture = setupAssetViewerFixture(921);
let mockStack: MockStack;
let primaryAssetDto: AssetResponseDto;
let secondAssetDto: AssetResponseDto;
test.beforeAll(async () => {
primaryAssetDto = toAssetResponseDto(fixture.primaryAsset);
secondAssetDto = createMockStackAsset(fixture.adminUserId);
secondAssetDto.originalFileName = 'second-ocr-asset.jpg';
mockStack = createMockStack(primaryAssetDto, [secondAssetDto], new Set());
});
test.beforeEach(async ({ context }) => {
await setupBrokenAssetMockApiRoutes(context, mockStack);
const ocrDataByAssetId = new Map<string, AssetOcrResponseDto[]>([
[primaryAssetDto.id, createMockOcrData(primaryAssetDto.id, PRIMARY_OCR_BOXES)],
[secondAssetDto.id, createMockOcrData(secondAssetDto.id, SECONDARY_OCR_BOXES)],
]);
await setupOcrMockApiRoutes(context, ocrDataByAssetId);
});
test('different OCR boxes shown for different stacked assets', async ({ page }) => {
await page.goto(`/photos/${fixture.primaryAsset.id}`);
await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset);
const ocrButton = page.getByLabel('Text recognition');
await expect(ocrButton).toBeVisible();
await ocrButton.click();
const ocrBoxes = page.locator('[data-viewer-content] [data-testid="ocr-box"]');
await expect(ocrBoxes).toHaveCount(2);
await expect(ocrBoxes.nth(0)).toContainText('Hello World');
const stackThumbnails = page.locator('#stack-slideshow [data-asset]');
await expect(stackThumbnails).toHaveCount(2);
await stackThumbnails.nth(1).click();
// refreshOcr() clears showOverlay when switching assets, so re-enable it
await expect(ocrBoxes).toHaveCount(0);
await expect(ocrButton).toBeVisible();
await ocrButton.click();
await expect(ocrBoxes).toHaveCount(1);
await expect(ocrBoxes.first()).toContainText('Second Asset Text');
});
});
test.describe('OCR boxes and zoom', () => {
const fixture = setupAssetViewerFixture(922);
test.beforeEach(async ({ context }) => {
const primaryAssetDto = toAssetResponseDto(fixture.primaryAsset);
const ocrDataByAssetId = new Map<string, AssetOcrResponseDto[]>([
[primaryAssetDto.id, createMockOcrData(primaryAssetDto.id, PRIMARY_OCR_BOXES)],
]);
await setupOcrMockApiRoutes(context, ocrDataByAssetId);
});
test('OCR boxes scale with zoom', async ({ page }) => {
await page.goto(`/photos/${fixture.primaryAsset.id}`);
await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset);
const ocrButton = page.getByLabel('Text recognition');
await expect(ocrButton).toBeVisible();
await ocrButton.click();
const ocrBox = page.locator('[data-viewer-content] [data-testid="ocr-box"]').first();
await expect(ocrBox).toBeVisible();
const initialBox = await ocrBox.boundingBox();
expect(initialBox).toBeTruthy();
const { width, height } = page.viewportSize()!;
await page.mouse.move(width / 2, height / 2);
await page.mouse.wheel(0, -3);
await expect(async () => {
const zoomedBox = await ocrBox.boundingBox();
expect(zoomedBox).toBeTruthy();
expect(zoomedBox!.width).toBeGreaterThan(initialBox!.width);
expect(zoomedBox!.height).toBeGreaterThan(initialBox!.height);
}).toPass({ timeout: 2000 });
});
});
test.describe('OCR text interaction', () => {
const fixture = setupAssetViewerFixture(923);
test.beforeEach(async ({ context }) => {
const primaryAssetDto = toAssetResponseDto(fixture.primaryAsset);
const ocrDataByAssetId = new Map<string, AssetOcrResponseDto[]>([
[primaryAssetDto.id, createMockOcrData(primaryAssetDto.id, PRIMARY_OCR_BOXES)],
]);
await setupOcrMockApiRoutes(context, ocrDataByAssetId);
});
test('OCR text box has data-overlay-interactive attribute', async ({ page }) => {
await page.goto(`/photos/${fixture.primaryAsset.id}`);
await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset);
await page.getByLabel('Text recognition').click();
const ocrBox = page.locator('[data-viewer-content] [data-testid="ocr-box"]').first();
await expect(ocrBox).toBeVisible();
await expect(ocrBox).toHaveAttribute('data-overlay-interactive');
});
test('OCR text box receives focus on click', async ({ page }) => {
await page.goto(`/photos/${fixture.primaryAsset.id}`);
await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset);
await page.getByLabel('Text recognition').click();
const ocrBox = page.locator('[data-viewer-content] [data-testid="ocr-box"]').first();
await expect(ocrBox).toBeVisible();
await ocrBox.click();
await expect(ocrBox).toBeFocused();
});
test('dragging on OCR text box does not trigger image pan', async ({ page }) => {
await page.goto(`/photos/${fixture.primaryAsset.id}`);
await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset);
await page.getByLabel('Text recognition').click();
const ocrBox = page.locator('[data-viewer-content] [data-testid="ocr-box"]').first();
await expect(ocrBox).toBeVisible();
const imgLocator = page.locator('[data-viewer-content] img[draggable="false"]');
const initialTransform = await imgLocator.evaluate((element) => {
return getComputedStyle(element.closest('[style*="transform"]') ?? element).transform;
});
const box = await ocrBox.boundingBox();
expect(box).toBeTruthy();
const centerX = box!.x + box!.width / 2;
const centerY = box!.y + box!.height / 2;
await page.mouse.move(centerX, centerY);
await page.mouse.down();
await page.mouse.move(centerX + 50, centerY + 30, { steps: 5 });
await page.mouse.up();
const afterTransform = await imgLocator.evaluate((element) => {
return getComputedStyle(element.closest('[style*="transform"]') ?? element).transform;
});
expect(afterTransform).toBe(initialTransform);
});
test('split touch gesture across zoom container does not trigger zoom', async ({ page }) => {
await page.goto(`/photos/${fixture.primaryAsset.id}`);
await assetViewerUtils.waitForViewerLoad(page, fixture.primaryAsset);
await page.getByLabel('Text recognition').click();
const ocrBox = page.locator('[data-viewer-content] [data-testid="ocr-box"]').first();
await expect(ocrBox).toBeVisible();
const imgLocator = page.locator('[data-viewer-content] img[draggable="false"]');
const initialTransform = await imgLocator.evaluate((element) => {
return getComputedStyle(element.closest('[style*="transform"]') ?? element).transform;
});
const viewerContent = page.locator('[data-viewer-content]');
const viewerBox = await viewerContent.boundingBox();
expect(viewerBox).toBeTruthy();
// Dispatch a synthetic split gesture: one touch inside the viewer, one outside
await page.evaluate(
({ viewerCenterX, viewerCenterY, outsideY }) => {
const viewer = document.querySelector('[data-viewer-content]');
if (!viewer) {
return;
}
const createTouch = (id: number, x: number, y: number) => {
return new Touch({
identifier: id,
target: viewer,
clientX: x,
clientY: y,
});
};
const insideTouch = createTouch(0, viewerCenterX, viewerCenterY);
const outsideTouch = createTouch(1, viewerCenterX, outsideY);
const touchStartEvent = new TouchEvent('touchstart', {
touches: [insideTouch, outsideTouch],
targetTouches: [insideTouch],
changedTouches: [insideTouch, outsideTouch],
bubbles: true,
cancelable: true,
});
const touchMoveEvent = new TouchEvent('touchmove', {
touches: [createTouch(0, viewerCenterX, viewerCenterY - 30), createTouch(1, viewerCenterX, outsideY + 30)],
targetTouches: [createTouch(0, viewerCenterX, viewerCenterY - 30)],
changedTouches: [
createTouch(0, viewerCenterX, viewerCenterY - 30),
createTouch(1, viewerCenterX, outsideY + 30),
],
bubbles: true,
cancelable: true,
});
const touchEndEvent = new TouchEvent('touchend', {
touches: [],
targetTouches: [],
changedTouches: [insideTouch, outsideTouch],
bubbles: true,
cancelable: true,
});
viewer.dispatchEvent(touchStartEvent);
viewer.dispatchEvent(touchMoveEvent);
viewer.dispatchEvent(touchEndEvent);
},
{
viewerCenterX: viewerBox!.x + viewerBox!.width / 2,
viewerCenterY: viewerBox!.y + viewerBox!.height / 2,
outsideY: 10, // near the top of the page, outside the viewer
},
);
const afterTransform = await imgLocator.evaluate((element) => {
return getComputedStyle(element.closest('[style*="transform"]') ?? element).transform;
});
expect(afterTransform).toBe(initialTransform);
});
});
@@ -6,6 +6,7 @@ import {
generateTimelineData, generateTimelineData,
TimelineAssetConfig, TimelineAssetConfig,
TimelineData, TimelineData,
toAssetResponseDto,
} from 'src/ui/generators/timeline'; } from 'src/ui/generators/timeline';
import { setupBaseMockApiRoutes } from 'src/ui/mock-network/base-network'; import { setupBaseMockApiRoutes } from 'src/ui/mock-network/base-network';
import { setupTimelineMockApiRoutes, TimelineTestContext } from 'src/ui/mock-network/timeline-network'; import { setupTimelineMockApiRoutes, TimelineTestContext } from 'src/ui/mock-network/timeline-network';
@@ -30,6 +31,10 @@ test.describe('search gallery-viewer', () => {
}; };
test.beforeAll(async () => { test.beforeAll(async () => {
test.fail(
process.env.PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS !== '1',
'This test requires env var: PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS=1',
);
adminUserId = faker.string.uuid(); adminUserId = faker.string.uuid();
testContext.adminId = adminUserId; testContext.adminId = adminUserId;
timelineRestData = generateTimelineData({ ...createDefaultTimelineConfig(), ownerId: adminUserId }); timelineRestData = generateTimelineData({ ...createDefaultTimelineConfig(), ownerId: adminUserId });
@@ -44,7 +49,10 @@ test.describe('search gallery-viewer', () => {
await context.route('**/api/search/metadata', async (route, request) => { await context.route('**/api/search/metadata', async (route, request) => {
if (request.method() === 'POST') { if (request.method() === 'POST') {
const searchAssets = assets.slice(0, 5).filter((asset) => !changes.assetDeletions.includes(asset.id)); const searchAssets = assets
.slice(0, 5)
.filter((asset) => !changes.assetDeletions.includes(asset.id))
.map((asset) => toAssetResponseDto(asset));
return route.fulfill({ return route.fulfill({
status: 200, status: 200,
contentType: 'application/json', contentType: 'application/json',
+1 -1
View File
@@ -62,7 +62,7 @@ export const thumbnailUtils = {
return page.locator(`[data-thumbnail-focus-container][data-asset="${assetId}"]`); return page.locator(`[data-thumbnail-focus-container][data-asset="${assetId}"]`);
}, },
selectButton(page: Page, assetId: string) { selectButton(page: Page, assetId: string) {
return page.locator(`[data-thumbnail-focus-container][data-asset="${assetId}"] button`); return page.locator(`[data-thumbnail-focus-container][data-asset="${assetId}"] button[role="checkbox"]`);
}, },
selectedAsset(page: Page) { selectedAsset(page: Page) {
return page.locator('[data-thumbnail-focus-container][data-selected]'); return page.locator('[data-thumbnail-focus-container][data-selected]');
-41
View File
@@ -3,7 +3,6 @@ import {
AssetMediaResponseDto, AssetMediaResponseDto,
AssetResponseDto, AssetResponseDto,
AssetVisibility, AssetVisibility,
CheckExistingAssetsDto,
CreateAlbumDto, CreateAlbumDto,
CreateLibraryDto, CreateLibraryDto,
JobCreateDto, JobCreateDto,
@@ -20,7 +19,6 @@ import {
UserAdminCreateDto, UserAdminCreateDto,
UserPreferencesUpdateDto, UserPreferencesUpdateDto,
ValidateLibraryDto, ValidateLibraryDto,
checkExistingAssets,
createAlbum, createAlbum,
createApiKey, createApiKey,
createJob, createJob,
@@ -343,8 +341,6 @@ export const utils = {
}, },
) => { ) => {
const _dto = { const _dto = {
deviceAssetId: 'test-1',
deviceId: 'test',
fileCreatedAt: new Date().toISOString(), fileCreatedAt: new Date().toISOString(),
fileModifiedAt: new Date().toISOString(), fileModifiedAt: new Date().toISOString(),
...dto, ...dto,
@@ -375,40 +371,6 @@ export const utils = {
return body as AssetMediaResponseDto; return body as AssetMediaResponseDto;
}, },
replaceAsset: async (
accessToken: string,
assetId: string,
dto?: Partial<Omit<AssetMediaCreateDto, 'assetData'>> & { assetData?: FileData },
) => {
const _dto = {
deviceAssetId: 'test-1',
deviceId: 'test',
fileCreatedAt: new Date().toISOString(),
fileModifiedAt: new Date().toISOString(),
...dto,
};
const assetData = dto?.assetData?.bytes || makeRandomImage();
const filename = dto?.assetData?.filename || 'example.png';
if (dto?.assetData?.bytes) {
console.log(`Uploading ${filename}`);
}
const builder = request(app)
.put(`/assets/${assetId}/original`)
.attach('assetData', assetData, filename)
.set('Authorization', `Bearer ${accessToken}`);
for (const [key, value] of Object.entries(_dto)) {
void builder.field(key, String(value));
}
const { body } = await builder;
return body as AssetMediaResponseDto;
},
createImageFile: (path: string) => { createImageFile: (path: string) => {
if (!existsSync(dirname(path))) { if (!existsSync(dirname(path))) {
mkdirSync(dirname(path), { recursive: true }); mkdirSync(dirname(path), { recursive: true });
@@ -450,9 +412,6 @@ export const utils = {
getAssetInfo: (accessToken: string, id: string) => getAssetInfo({ id }, { headers: asBearerAuth(accessToken) }), getAssetInfo: (accessToken: string, id: string) => getAssetInfo({ id }, { headers: asBearerAuth(accessToken) }),
checkExistingAssets: (accessToken: string, checkExistingAssetsDto: CheckExistingAssetsDto) =>
checkExistingAssets({ checkExistingAssetsDto }, { headers: asBearerAuth(accessToken) }),
searchAssets: async (accessToken: string, dto: MetadataSearchDto) => { searchAssets: async (accessToken: string, dto: MetadataSearchDto) => {
return searchAssets({ metadataSearchDto: dto }, { headers: asBearerAuth(accessToken) }); return searchAssets({ metadataSearchDto: dto }, { headers: asBearerAuth(accessToken) });
}, },
+3 -1
View File
@@ -14,8 +14,10 @@
"outDir": "./dist", "outDir": "./dist",
"incremental": true, "incremental": true,
"skipLibCheck": true, "skipLibCheck": true,
"paths": {
"src/*": ["./src/*"]
},
"esModuleInterop": true, "esModuleInterop": true,
"baseUrl": "./"
}, },
"include": ["src/**/*.ts", "vitest*.config.ts"], "include": ["src/**/*.ts", "vitest*.config.ts"],
"exclude": ["dist", "node_modules"] "exclude": ["dist", "node_modules"]
+13
View File
@@ -178,6 +178,17 @@
"stop_motion_photo": "Stop bewegingsfoto", "stop_motion_photo": "Stop bewegingsfoto",
"stop_photo_sharing": "Staak die deel van u fotos?", "stop_photo_sharing": "Staak die deel van u fotos?",
"stop_photo_sharing_description": "{partner} sal nie meer toegang tot u fotos hê nie.", "stop_photo_sharing_description": "{partner} sal nie meer toegang tot u fotos hê nie.",
"unnamed_share": "Naamlose deelskakel",
"unsaved_change": "Onbewaarde verandering",
"unselect_all": "Ontkies alles",
"unselect_all_duplicates": "Ontkies alle duplikate",
"unselect_all_in": "Ontkies alles in {group}",
"unstack": "Ontstapel",
"unstack_action_prompt": "{count} ongestapel",
"unstacked_assets_count": "{count, plural, one {# item} other {# items}} ontstapel",
"unsupported_field_type": "Onondersteunde veldtipe",
"unsupported_file_type": "Lêer {file} kan nie opgelaai word nie omdat die lêertipe {type} nie ondersteun word nie.",
"untagged": "Sonder etiket",
"untitled_workflow": "Naamlose werkvloei", "untitled_workflow": "Naamlose werkvloei",
"up_next": "Volgende", "up_next": "Volgende",
"update_location_action_prompt": "Werk die ligging van {count} gekose items by met:", "update_location_action_prompt": "Werk die ligging van {count} gekose items by met:",
@@ -187,6 +198,7 @@
"upload_concurrency": "Aantal gelyktydige oplaaie", "upload_concurrency": "Aantal gelyktydige oplaaie",
"upload_details": "Oplaaidetails", "upload_details": "Oplaaidetails",
"upload_dialog_info": "Wil u n rugsteun maak van die gekose item(s) op die bediener?", "upload_dialog_info": "Wil u n rugsteun maak van die gekose item(s) op die bediener?",
"upload_dialog_title": "Laai item op",
"upload_error_with_count": "Oplaaifout vir {count, plural, one {# item} other {# items}}", "upload_error_with_count": "Oplaaifout vir {count, plural, one {# item} other {# items}}",
"upload_errors": "Oplaai voltooi met {count, plural, one {# fout} other {# foute}}, verfris die blad om die nuwe items te sien.", "upload_errors": "Oplaai voltooi met {count, plural, one {# fout} other {# foute}}, verfris die blad om die nuwe items te sien.",
"upload_finished": "Klaar opgelaai", "upload_finished": "Klaar opgelaai",
@@ -257,6 +269,7 @@
"viewer_remove_from_stack": "Verwyder van stapel", "viewer_remove_from_stack": "Verwyder van stapel",
"viewer_stack_use_as_main_asset": "Gebruik as hoofitem", "viewer_stack_use_as_main_asset": "Gebruik as hoofitem",
"viewer_unstack": "Ontstapel", "viewer_unstack": "Ontstapel",
"visibility": "Sigbaarheid",
"visibility_changed": "Sigbaarheid verander vir {count, plural, one {# mens} other {# mense}}", "visibility_changed": "Sigbaarheid verander vir {count, plural, one {# mens} other {# mense}}",
"visual": "Visueel", "visual": "Visueel",
"visual_builder": "Visuele bouer", "visual_builder": "Visuele bouer",
+22 -15
View File
@@ -3,7 +3,7 @@
"account": "حساب", "account": "حساب",
"account_settings": "إعدادات الحساب", "account_settings": "إعدادات الحساب",
"acknowledge": "أُدرك ذلك", "acknowledge": "أُدرك ذلك",
"action": "عملية", "action": "إجراء",
"action_common_update": "تحديث", "action_common_update": "تحديث",
"action_description": "مجموعة من الفعاليات التي ستنفذ على الأصول التي تم تصفيتها", "action_description": "مجموعة من الفعاليات التي ستنفذ على الأصول التي تم تصفيتها",
"actions": "عمليات", "actions": "عمليات",
@@ -61,8 +61,8 @@
"backup_onboarding_1_description": "نسخة خارج الموقع في موقع آخر.", "backup_onboarding_1_description": "نسخة خارج الموقع في موقع آخر.",
"backup_onboarding_2_description": "نسخ محلية على أجهزة مختلفة. يشمل ذلك الملفات الرئيسية ونسخة احتياطية محلية منها.", "backup_onboarding_2_description": "نسخ محلية على أجهزة مختلفة. يشمل ذلك الملفات الرئيسية ونسخة احتياطية محلية منها.",
"backup_onboarding_3_description": "إجمالي نُسخ بياناتك، بما في ذلك الملفات الأصلية. يشمل ذلك نسخةً واحدةً خارج الموقع ونسختين محليتين.", "backup_onboarding_3_description": "إجمالي نُسخ بياناتك، بما في ذلك الملفات الأصلية. يشمل ذلك نسخةً واحدةً خارج الموقع ونسختين محليتين.",
"backup_onboarding_description": "يُنصح باتباع <backblaze-link>استراتيجية النسخ الاحتياطي 3-2-1</backblaze-link> لحماية بياناتك. احتفظ بنسخ احتياطية من صورك/فيديوهاتك المحمّلة، بالإضافة إلى قاعدة بيانات Immich، لضمان حل نسخ احتياطي شامل.", "backup_onboarding_description": "يُنصح باتباع <backblaze-link>استراتيجية النسخ الاحتياطي 3-2- 1</backblaze-link> لحماية بياناتك. احتفظ بنسخ احتياطية من صورك/فيديوهاتك المحمّلة، بالإضافة إلى قاعدة بيانات Immich، لضمان حل نسخ احتياطي شامل.",
"backup_onboarding_footer": "لمزيد من المعلومات حول النسخ الاحتياطي لـ Immich، يرجى الرجوع إلى <link> التعليمات </link>.", "backup_onboarding_footer": "لمزيد من المعلومات حول النسخ الاحتياطي لـ <link>Immich</link>، يرجى الرجوع إلى <link>الوثائق</link>.",
"backup_onboarding_parts_title": "يتضمن النسخ الاحتياطي 3-2-1 ما يلي:", "backup_onboarding_parts_title": "يتضمن النسخ الاحتياطي 3-2-1 ما يلي:",
"backup_onboarding_title": "النسخ الاحتياطية", "backup_onboarding_title": "النسخ الاحتياطية",
"backup_settings": "إعدادات تفريغ قاعدة البيانات", "backup_settings": "إعدادات تفريغ قاعدة البيانات",
@@ -333,7 +333,7 @@
"storage_template_migration_description": "قم بتطبيق القالب الحالي <link>{template}</link> على المحتويات التي تم رفعها سابقًا", "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_migration_job": "وظيفة تهجير قالب التخزين",
"storage_template_more_details": "لمزيد من التفاصيل حول هذه الميزة، يرجى الرجوع إلى <template-link>Storage Template</template-link> و<implications-link>implications</implications-link>", "storage_template_more_details": "لمزيد من التفاصيل حول هذه الميزة، يرجى الرجوع إلى <template-link>Storage Template</template-link> و <implications-link>implications</implications-link>.",
"storage_template_onboarding_description_v2": "عند التفعيل. هذه الخاصية ستقوم بالترتيب التلقائي للملفات بناء على نموذج معرف من قبل المستخدم. رجاء اطلع على <link>التوثيق</link>.", "storage_template_onboarding_description_v2": "عند التفعيل. هذه الخاصية ستقوم بالترتيب التلقائي للملفات بناء على نموذج معرف من قبل المستخدم. رجاء اطلع على <link>التوثيق</link>.",
"storage_template_path_length": "الحد التقريبي لطول المسار: <b>{length, number}</b>/{limit, number}", "storage_template_path_length": "الحد التقريبي لطول المسار: <b>{length, number}</b>/{limit, number}",
"storage_template_settings": "قالب التخزين", "storage_template_settings": "قالب التخزين",
@@ -372,7 +372,7 @@
"transcoding_audio_codec": "كود الصوت", "transcoding_audio_codec": "كود الصوت",
"transcoding_audio_codec_description": "Opus هو الخيار ذو أعلى جودة، ولكنه يتمتع بتوافق أقل مع الأجهزة أو البرمجيات القديمة.", "transcoding_audio_codec_description": "Opus هو الخيار ذو أعلى جودة، ولكنه يتمتع بتوافق أقل مع الأجهزة أو البرمجيات القديمة.",
"transcoding_bitrate_description": "مقاطع الفيديو التي يتجاوز معدل البت أقصى قيمة أو التي لا تكون في تنسيق مقبول", "transcoding_bitrate_description": "مقاطع الفيديو التي يتجاوز معدل البت أقصى قيمة أو التي لا تكون في تنسيق مقبول",
"transcoding_codecs_learn_more": "لمعرفة المزيد حول المصطلحات المستخدمة هنا، يرجى الرجوع إلى وثائق FFmpeg لل<h264-link>H.264 codec</h264-link>, <hevc-link>HEVC codec</hevc-link> and <vp9-link>VP9 codec</vp9-link>.", "transcoding_codecs_learn_more": "لمعرفة المزيد حول المصطلحات المستخدمة هنا، يرجى الرجوع إلى وثائق FFmpeg لـ <h264-link>H.264 codec</h264-link>، و <hevc-link>HEVC codec</hevc-link> و <vp9-link>VP9 codec</vp9-link>.",
"transcoding_constant_quality_mode": "وضع الجودة الثابتة", "transcoding_constant_quality_mode": "وضع الجودة الثابتة",
"transcoding_constant_quality_mode_description": "ICQ أفضل من CQP، ولكن بعض أجهزة عتاد التسريع لا تدعم هذا الوضع. تعيين هذا الخيار يسجعل الأفضلية للوضع المحدد عند استخدام الترميز بناءً على الجودة. يتم تجاهله بواسطة NVENC لأنه لا يدعم ICQ.", "transcoding_constant_quality_mode_description": "ICQ أفضل من CQP، ولكن بعض أجهزة عتاد التسريع لا تدعم هذا الوضع. تعيين هذا الخيار يسجعل الأفضلية للوضع المحدد عند استخدام الترميز بناءً على الجودة. يتم تجاهله بواسطة NVENC لأنه لا يدعم ICQ.",
"transcoding_constant_rate_factor": "عامل معدل الجودة الثابت (-crf)", "transcoding_constant_rate_factor": "عامل معدل الجودة الثابت (-crf)",
@@ -441,7 +441,7 @@
"user_successfully_removed": "المستخدم {email} تمت ازالته بنجاح.", "user_successfully_removed": "المستخدم {email} تمت ازالته بنجاح.",
"users_page_description": "صفحة ادارة المستخدمين", "users_page_description": "صفحة ادارة المستخدمين",
"version_check_enabled_description": "تفعيل التحقق من الإصدارات الجديدة", "version_check_enabled_description": "تفعيل التحقق من الإصدارات الجديدة",
"version_check_implications": "تعتمد ميزة التحقق من الإصدار على التواصل الدوري مع github.com", "version_check_implications": "تعتمد ميزة التحقق من الإصدار على التواصل الدوري مع {server}",
"version_check_settings": "التحقق من الإصدار", "version_check_settings": "التحقق من الإصدار",
"version_check_settings_description": "تفعيل/تعطيل الإشعار لإصدار جديد", "version_check_settings_description": "تفعيل/تعطيل الإشعار لإصدار جديد",
"video_conversion_job": "تحويل أشرطة الفيديو", "video_conversion_job": "تحويل أشرطة الفيديو",
@@ -849,9 +849,12 @@
"create_link_to_share": "إنشاء رابط للمشاركة", "create_link_to_share": "إنشاء رابط للمشاركة",
"create_link_to_share_description": "السماح لأي شخص لديه الرابط بمشاهدة الصورة (الصور) المحددة", "create_link_to_share_description": "السماح لأي شخص لديه الرابط بمشاهدة الصورة (الصور) المحددة",
"create_new": "انشاء جديد", "create_new": "انشاء جديد",
"create_new_face": "إنشاء وجه جديد",
"create_new_person": "إنشاء شخص جديد", "create_new_person": "إنشاء شخص جديد",
"create_new_person_hint": "تعيين المحتويات المحددة لشخص جديد", "create_new_person_hint": "تعيين المحتويات المحددة لشخص جديد",
"create_new_user": "إنشاء مستخدم جديد", "create_new_user": "إنشاء مستخدم جديد",
"create_person": "إنشاء شخص",
"create_person_subtitle": "أضف اسماً للوجه المحدد لإنشاء الشخص الجديد والإشارة إليه",
"create_shared_album_page_share_add_assets": "إضافة الأصول", "create_shared_album_page_share_add_assets": "إضافة الأصول",
"create_shared_album_page_share_select_photos": "حدد الصور", "create_shared_album_page_share_select_photos": "حدد الصور",
"create_shared_link": "انشاء رابط مشترك", "create_shared_link": "انشاء رابط مشترك",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "تم الاصلاح", "crop_aspect_ratio_fixed": "تم الاصلاح",
"crop_aspect_ratio_free": "حر", "crop_aspect_ratio_free": "حر",
"crop_aspect_ratio_original": "اصلي", "crop_aspect_ratio_original": "اصلي",
"crop_aspect_ratio_square": "مربع",
"curated_object_page_title": "أشياء", "curated_object_page_title": "أشياء",
"current_device": "الجهاز الحالي", "current_device": "الجهاز الحالي",
"current_pin_code": "رمز PIN الحالي", "current_pin_code": "رمز PIN الحالي",
@@ -880,7 +884,7 @@
"daily_title_text_date": "E ، MMM DD", "daily_title_text_date": "E ، MMM DD",
"daily_title_text_date_year": "E ، MMM DD ، yyyy", "daily_title_text_date_year": "E ، MMM DD ، yyyy",
"dark": "معتم", "dark": "معتم",
"dark_theme": "تبديل المظهر الداكن", "dark_theme": "تبديل المظهر إلى الداكن",
"date": "تاريخ", "date": "تاريخ",
"date_after": "التارخ بعد", "date_after": "التارخ بعد",
"date_and_time": "التاريخ و الوقت", "date_and_time": "التاريخ و الوقت",
@@ -891,10 +895,8 @@
"day": "يوم", "day": "يوم",
"days": "ايام", "days": "ايام",
"deduplicate_all": "إلغاء تكرار الكل", "deduplicate_all": "إلغاء تكرار الكل",
"deduplication_criteria_1": "حجم الصورة بوحدات البايت", "default_locale": "الإعدادات المحلية الافتراضية",
"deduplication_criteria_2": "عدد بيانات EXIF", "default_locale_description": "تنسيق التواريخ والأرقام بناءً على الإعدادات المحلية للمتصفح",
"deduplication_info": "معلومات إلغاء البيانات المكررة",
"deduplication_info_description": "لتحديد الأصول مسبقا تلقائيا وإزالة التكرارات بكميات كبيرة، ننظر إلى:",
"delete": "حذف", "delete": "حذف",
"delete_action_confirmation_message": "هل انت متأكد من حذف هذا الملف؟ هذا سؤدي الى نقل الملف الى سلة مهملات الخادم وسيتم اشعارك ان كنت تريد حذفه على الجهاز", "delete_action_confirmation_message": "هل انت متأكد من حذف هذا الملف؟ هذا سؤدي الى نقل الملف الى سلة مهملات الخادم وسيتم اشعارك ان كنت تريد حذفه على الجهاز",
"delete_action_prompt": "تم حذف {count}", "delete_action_prompt": "تم حذف {count}",
@@ -970,7 +972,7 @@
"downloading_media": "تنزيل الوسائط", "downloading_media": "تنزيل الوسائط",
"drop_files_to_upload": "قم بإسقاط الملفات في أي مكان لرفعها", "drop_files_to_upload": "قم بإسقاط الملفات في أي مكان لرفعها",
"duplicates": "التكرارات", "duplicates": "التكرارات",
"duplicates_description": "قم بحل كل مجموعة من خلال الإشارة إلى التكرارات، إن وجدت", "duplicates_description": "قم بحل كل مجموعة من خلال الإشارة إلى التكرارات، إن وجدت.",
"duration": "المدة", "duration": "المدة",
"edit": "تعديل", "edit": "تعديل",
"edit_album": "تعديل الألبوم", "edit_album": "تعديل الألبوم",
@@ -1387,9 +1389,11 @@
"library_page_sort_title": "عنوان الألبوم", "library_page_sort_title": "عنوان الألبوم",
"licenses": "رُخَص", "licenses": "رُخَص",
"light": "المضيئ", "light": "المضيئ",
"light_theme": "التبديل إلى المظهر الفاتح",
"like": "اعجاب", "like": "اعجاب",
"like_deleted": "تم حذف الإعجاب", "like_deleted": "تم حذف الإعجاب",
"link_motion_video": "رابط فيديو الحركة", "link_motion_video": "رابط فيديو الحركة",
"link_to_docs": "لمزيد من المعلومات، يُرجى الرجوع إلى <link>الوثائق</link>.",
"link_to_oauth": "الربط مع OAuth", "link_to_oauth": "الربط مع OAuth",
"linked_oauth_account": "حساب مرتبط بـ OAuth", "linked_oauth_account": "حساب مرتبط بـ OAuth",
"list": "قائمة", "list": "قائمة",
@@ -1651,6 +1655,7 @@
"only_favorites": "المفضلة فقط", "only_favorites": "المفضلة فقط",
"open": "فتح", "open": "فتح",
"open_calendar": "افتح الرزنامة", "open_calendar": "افتح الرزنامة",
"open_in_browser": "فتح في متصفح",
"open_in_map_view": "فتح في عرض الخريطة", "open_in_map_view": "فتح في عرض الخريطة",
"open_in_openstreetmap": "فتح في OpenStreetMap", "open_in_openstreetmap": "فتح في OpenStreetMap",
"open_the_search_filters": "افتح مرشحات البحث", "open_the_search_filters": "افتح مرشحات البحث",
@@ -2212,6 +2217,7 @@
"tag": "العلامة", "tag": "العلامة",
"tag_assets": "أصول العلامة", "tag_assets": "أصول العلامة",
"tag_created": "تم إنشاء العلامة: {tag}", "tag_created": "تم إنشاء العلامة: {tag}",
"tag_face": "علِّم الوجه",
"tag_feature_description": "تصفح الصور ومقاطع الفيديو المجمعة حسب مواضيع العلامات المنطقية", "tag_feature_description": "تصفح الصور ومقاطع الفيديو المجمعة حسب مواضيع العلامات المنطقية",
"tag_not_found_question": "لا يمكن العثور على علامة؟ <link>قم بإنشاء علامة جديدة.</link>", "tag_not_found_question": "لا يمكن العثور على علامة؟ <link>قم بإنشاء علامة جديدة.</link>",
"tag_people": "علِّم الأشخاص", "tag_people": "علِّم الأشخاص",
@@ -2386,13 +2392,14 @@
"view_name": "عرض", "view_name": "عرض",
"view_next_asset": "عرض المحتوى التالي", "view_next_asset": "عرض المحتوى التالي",
"view_previous_asset": "عرض المحتوى السابق", "view_previous_asset": "عرض المحتوى السابق",
"view_qr_code": "­عرض رمز الاستجابة السريعة", "view_qr_code": "عرض رمز الاستجابة السريعة",
"view_similar_photos": "عرض صور مشابهة", "view_similar_photos": "عرض صور مشابهة",
"view_stack": "عرض التكديس", "view_stack": "عرض التكديس",
"view_user": "عرض المستخدم", "view_user": "عرض المستخدم",
"viewer_remove_from_stack": "حذف من الكومه أو المجموعة", "viewer_remove_from_stack": "حذف من الكومه أو المجموعة",
"viewer_stack_use_as_main_asset": "استخدم كأصل رئيسي", "viewer_stack_use_as_main_asset": "استخدم كأصل رئيسي",
"viewer_unstack": "فك الكومه", "viewer_unstack": "فك الكومه",
"visibility": "إمكانية الرؤية",
"visibility_changed": "الرؤية تغيرت لـ {count, plural, one {شخص واحد} other {# عدة أشخاص}}", "visibility_changed": "الرؤية تغيرت لـ {count, plural, one {شخص واحد} other {# عدة أشخاص}}",
"visual": "مرئي", "visual": "مرئي",
"visual_builder": "اداة نشاء مرئية", "visual_builder": "اداة نشاء مرئية",
@@ -2404,14 +2411,14 @@
"welcome_to_immich": "مرحباً بك في Immich", "welcome_to_immich": "مرحباً بك في Immich",
"width": "عُرض", "width": "عُرض",
"wifi_name": "اسم شبكة Wi-Fi", "wifi_name": "اسم شبكة Wi-Fi",
"workflow_delete_prompt": "هل أنت متأكد من حذف سير العمل هذا؟", "workflow_delete_prompt": "متأكد من حذف سير العمل هذا؟",
"workflow_deleted": "تم حذف سير العمل", "workflow_deleted": "تم حذف سير العمل",
"workflow_description": "وصف سير العمل", "workflow_description": "وصف سير العمل",
"workflow_info": "معلومات سير العمل", "workflow_info": "معلومات سير العمل",
"workflow_json": "ملف JSON لسير العمل", "workflow_json": "ملف JSON لسير العمل",
"workflow_json_help": "قم بتعديل إعدادات سير العمل بصيغة JSON. ستتم مزامنة التغييرات مع أداة الإنشاء المرئية.", "workflow_json_help": "قم بتعديل إعدادات سير العمل بصيغة JSON. ستتم مزامنة التغييرات مع أداة الإنشاء المرئية.",
"workflow_name": "اسم سير العمل", "workflow_name": "اسم سير العمل",
"workflow_navigation_prompt": "هل انت متاكد من المغادرة بدون حفظ التغييرات؟", "workflow_navigation_prompt": "متاكد من المغادرة بدون حفظ التغييرات؟",
"workflow_summary": "ملخص سير العمل", "workflow_summary": "ملخص سير العمل",
"workflow_update_success": "تم تحديث سير العمل بنجاح", "workflow_update_success": "تم تحديث سير العمل بنجاح",
"workflow_updated": "تم تحديث سير العمل", "workflow_updated": "تم تحديث سير العمل",
+1 -1
View File
@@ -239,7 +239,7 @@
"user_settings": "Налады карыстальніка", "user_settings": "Налады карыстальніка",
"user_settings_description": "Кіраванне наладамі карыстальніка", "user_settings_description": "Кіраванне наладамі карыстальніка",
"version_check_enabled_description": "Уключыць праверку версіі", "version_check_enabled_description": "Уключыць праверку версіі",
"version_check_implications": "Функцыя праверкі версіі перыядычна звяртаецца да github.com", "version_check_implications": "Функцыя праверкі версіі перыядычна звяртаецца да {server}",
"version_check_settings": "Праверка версіі", "version_check_settings": "Праверка версіі",
"version_check_settings_description": "Уключыць/адключыць апавяшчэнні аб новай версіі" "version_check_settings_description": "Уключыць/адключыць апавяшчэнні аб новай версіі"
}, },
+18 -11
View File
@@ -333,7 +333,7 @@
"storage_template_migration_description": "Прилагане на текущия <link>{template}</link> към предишно качените файлове", "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_migration_job": "Задача за миграция на шаблона за съхранение",
"storage_template_more_details": "За повече подробности относно тази функция се обърнете към шаблона <template-link>Storage Template</template-link> и неговите <implications-link> последствия </implications-link>", "storage_template_more_details": "За повече подробности относно тази функция се обърнете към шаблона <template-link>Storage Template</template-link> и неговите <implications-link>последствия</implications-link>",
"storage_template_onboarding_description_v2": "Когато е разрешена, тази функция ще организира автоматично файловете, според шаблон, дефиниран от потребителя. За допълнителна информация, моля вижте <link>документацията</link>.", "storage_template_onboarding_description_v2": "Когато е разрешена, тази функция ще организира автоматично файловете, според шаблон, дефиниран от потребителя. За допълнителна информация, моля вижте <link>документацията</link>.",
"storage_template_path_length": "Ограничение на дължината на пътя: <b>{length, number}</b>/{limit, number}", "storage_template_path_length": "Ограничение на дължината на пътя: <b>{length, number}</b>/{limit, number}",
"storage_template_settings": "Шаблон за съхранение", "storage_template_settings": "Шаблон за съхранение",
@@ -441,7 +441,7 @@
"user_successfully_removed": "Потребител {email} е успешно премахнат.", "user_successfully_removed": "Потребител {email} е успешно премахнат.",
"users_page_description": "Страница за администриране на потребители", "users_page_description": "Страница за администриране на потребители",
"version_check_enabled_description": "Активирай проверка на версията", "version_check_enabled_description": "Активирай проверка на версията",
"version_check_implications": "Функцията за проверка на версията разчита на периодична комуникация с github.com", "version_check_implications": "Функцията за проверка на версията разчита на периодична комуникация с {server}",
"version_check_settings": "Проверка на версията", "version_check_settings": "Проверка на версията",
"version_check_settings_description": "Активирайте/деактивирайте известието за нова версия", "version_check_settings_description": "Активирайте/деактивирайте известието за нова версия",
"video_conversion_job": "Транскодиране на видеоклиповете", "video_conversion_job": "Транскодиране на видеоклиповете",
@@ -849,9 +849,12 @@
"create_link_to_share": "Създаване на линк за споделяне", "create_link_to_share": "Създаване на линк за споделяне",
"create_link_to_share_description": "Позволете на всеки, който има линк, да види избраната(ите) снимка(и)", "create_link_to_share_description": "Позволете на всеки, който има линк, да види избраната(ите) снимка(и)",
"create_new": "СЪЗДАЙ НОВ", "create_new": "СЪЗДАЙ НОВ",
"create_new_face": "Създай ново лице",
"create_new_person": "Създаване на ново лице", "create_new_person": "Създаване на ново лице",
"create_new_person_hint": "Присвойте избраните файлове на нов човек", "create_new_person_hint": "Присвойте избраните файлове на нов човек",
"create_new_user": "Създаване на нов потребител", "create_new_user": "Създаване на нов потребител",
"create_person": "Създай човек",
"create_person_subtitle": "Добави име към избраното лице за да създадеш и да сложиш етикет на новия човек",
"create_shared_album_page_share_add_assets": "ДОБАВИ ОБЕКТИ", "create_shared_album_page_share_add_assets": "ДОБАВИ ОБЕКТИ",
"create_shared_album_page_share_select_photos": "Избери снимки", "create_shared_album_page_share_select_photos": "Избери снимки",
"create_shared_link": "Създай линк за споделяне", "create_shared_link": "Създай линк за споделяне",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Фиксиран", "crop_aspect_ratio_fixed": "Фиксиран",
"crop_aspect_ratio_free": "Свободен", "crop_aspect_ratio_free": "Свободен",
"crop_aspect_ratio_original": "Оригинален", "crop_aspect_ratio_original": "Оригинален",
"crop_aspect_ratio_square": "Квадрат",
"curated_object_page_title": "Неща", "curated_object_page_title": "Неща",
"current_device": "Текущо устройство", "current_device": "Текущо устройство",
"current_pin_code": "Сегашен PIN код", "current_pin_code": "Сегашен PIN код",
@@ -880,7 +884,7 @@
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM yyyy", "daily_title_text_date_year": "E, dd MMM yyyy",
"dark": "Тъмен", "dark": "Тъмен",
"dark_theme": "Тъмна тема", "dark_theme": "Премини към тъмна тема",
"date": "Дата", "date": "Дата",
"date_after": "Дата след", "date_after": "Дата след",
"date_and_time": "Дата и час", "date_and_time": "Дата и час",
@@ -891,10 +895,8 @@
"day": "Ден", "day": "Ден",
"days": "Дни", "days": "Дни",
"deduplicate_all": "Дедупликиране на всички", "deduplicate_all": "Дедупликиране на всички",
"deduplication_criteria_1": "Размер на снимката в байтове", "default_locale": "Език по подразбиране",
"deduplication_criteria_2": "Брой EXIF данни", "default_locale_description": "Формат на дата и числа според езиковата настройка на браузъра",
"deduplication_info": "Информация за дедупликацията",
"deduplication_info_description": "За автоматично предварително избиране на ресурси и премахване на дубликати на едро, разглеждаме:",
"delete": "Изтрий", "delete": "Изтрий",
"delete_action_confirmation_message": "Сигурни ли сте, че искате да изтриете този обект? Следва преместване на обекта в коша за отпадъци на сървъра и ще получите предложение обекта да бъде изтрит локално", "delete_action_confirmation_message": "Сигурни ли сте, че искате да изтриете този обект? Следва преместване на обекта в коша за отпадъци на сървъра и ще получите предложение обекта да бъде изтрит локално",
"delete_action_prompt": "{count} са изтрити", "delete_action_prompt": "{count} са изтрити",
@@ -970,7 +972,7 @@
"downloading_media": "Изтегляне на медия", "downloading_media": "Изтегляне на медия",
"drop_files_to_upload": "Пуснете файловете, за да ги качите", "drop_files_to_upload": "Пуснете файловете, за да ги качите",
"duplicates": "Дубликати", "duplicates": "Дубликати",
"duplicates_description": "Изберете всяка група, като посочите кои, ако има такива, са дубликати", "duplicates_description": "Изберете всяка група, като посочите кои, ако има такива, са дубликати.",
"duration": "Продължителност", "duration": "Продължителност",
"edit": "Редактиране", "edit": "Редактиране",
"edit_album": "Редактиране на албум", "edit_album": "Редактиране на албум",
@@ -1387,9 +1389,11 @@
"library_page_sort_title": "Заглавие на албума", "library_page_sort_title": "Заглавие на албума",
"licenses": "Лицензи", "licenses": "Лицензи",
"light": "Светло", "light": "Светло",
"light_theme": "Премини към светла тема",
"like": "Харесайте", "like": "Харесайте",
"like_deleted": "Като изтрит", "like_deleted": "Като изтрит",
"link_motion_video": "Линк към видео", "link_motion_video": "Линк към видео",
"link_to_docs": "За повече информация вижте <link>документацията</link>.",
"link_to_oauth": "Линк към OAuth", "link_to_oauth": "Линк към OAuth",
"linked_oauth_account": "Свързан OAuth акаунт", "linked_oauth_account": "Свързан OAuth акаунт",
"list": "Лист", "list": "Лист",
@@ -1651,13 +1655,14 @@
"only_favorites": "Само любими", "only_favorites": "Само любими",
"open": "Отвори", "open": "Отвори",
"open_calendar": "Отвори календар", "open_calendar": "Отвори календар",
"open_in_browser": "Отвори в браузър",
"open_in_map_view": "Отвори изглед на карта", "open_in_map_view": "Отвори изглед на карта",
"open_in_openstreetmap": "Отвори в OpenStreetMap", "open_in_openstreetmap": "Отвори в OpenStreetMap",
"open_the_search_filters": "Отвари филтрите за търсене", "open_the_search_filters": "Отвари филтрите за търсене",
"options": "Настройки", "options": "Настройки",
"or": "или", "or": "или",
"organize_into_albums": "Organitzar per àlbums", "organize_into_albums": "Подредете в албуми",
"organize_into_albums_description": "Posar les fotos existents dins dels àlbums fent servir la configuració de sincronització", "organize_into_albums_description": "Добавете наличните снимки в албуми, като използвате текущите настройки за синхронизиране",
"organize_your_library": "Организиране на вашата библиотека", "organize_your_library": "Организиране на вашата библиотека",
"original": "оригинал", "original": "оригинал",
"other": "Други", "other": "Други",
@@ -1805,7 +1810,7 @@
"purchase_server_description_2": "Статус на поддръжник", "purchase_server_description_2": "Статус на поддръжник",
"purchase_server_title": "Сървър", "purchase_server_title": "Сървър",
"purchase_settings_server_activated": "Продуктовият ключ на сървъра се управлява от администратора", "purchase_settings_server_activated": "Продуктовият ключ на сървъра се управлява от администратора",
"query_asset_id": "Buscar item per ID", "query_asset_id": "Търсене на елемент по ID",
"queue_status": "В опашка {count} от {total}", "queue_status": "В опашка {count} от {total}",
"rate_asset": "Задаване на рейтинг", "rate_asset": "Задаване на рейтинг",
"rating": "Оценка със звезди", "rating": "Оценка със звезди",
@@ -2212,6 +2217,7 @@
"tag": "Таг", "tag": "Таг",
"tag_assets": "Тагни елементи", "tag_assets": "Тагни елементи",
"tag_created": "Създаден етикет: {tag}", "tag_created": "Създаден етикет: {tag}",
"tag_face": "Отбележи лице",
"tag_feature_description": "Разглеждане на снимки и видеоклипове, групирани по теми с логически тагове", "tag_feature_description": "Разглеждане на снимки и видеоклипове, групирани по теми с логически тагове",
"tag_not_found_question": "Не можете да намерите етикет? <link>Създайте нов етикет.</link>", "tag_not_found_question": "Не можете да намерите етикет? <link>Създайте нов етикет.</link>",
"tag_people": "Отбележи Хора", "tag_people": "Отбележи Хора",
@@ -2393,6 +2399,7 @@
"viewer_remove_from_stack": "Премахване от опашката", "viewer_remove_from_stack": "Премахване от опашката",
"viewer_stack_use_as_main_asset": "Използвай като основен", "viewer_stack_use_as_main_asset": "Използвай като основен",
"viewer_unstack": "Премахни от опашката", "viewer_unstack": "Премахни от опашката",
"visibility": "Видимост",
"visibility_changed": "Видимостта е променена за {count, plural, one {# човек} other {# човека}}", "visibility_changed": "Видимостта е променена за {count, plural, one {# човек} other {# човека}}",
"visual": "Визуален", "visual": "Визуален",
"visual_builder": "Визуален конструктор", "visual_builder": "Визуален конструктор",
+304 -1
View File
@@ -231,6 +231,8 @@
"metadata_settings_description": "মেটাডেটা সেটিংস পরিচালনা করুন (Manage metadata settings)", "metadata_settings_description": "মেটাডেটা সেটিংস পরিচালনা করুন (Manage metadata settings)",
"migration_job": "মাইগ্রেশন (Migration)", "migration_job": "মাইগ্রেশন (Migration)",
"migration_job_description": "অ্যাসেট এবং ফেস থাম্বনেইলগুলোকে সর্বশেষ ফোল্ডার স্ট্রাকচারে মাইগ্রেট করুন। (Migrate thumbnails for assets and faces to the latest folder structure)", "migration_job_description": "অ্যাসেট এবং ফেস থাম্বনেইলগুলোকে সর্বশেষ ফোল্ডার স্ট্রাকচারে মাইগ্রেট করুন। (Migrate thumbnails for assets and faces to the latest folder structure)",
"nightly_tasks_cluster_faces_setting_description": "নতুন শনাক্ত হওয়া মুখগুলিতে ফেসিয়াল রিকগনিশন চালান",
"nightly_tasks_cluster_new_faces_setting": "নতুন মুখগুলোর গুচ্ছ",
"nightly_tasks_database_cleanup_setting": "ডেটাবেস ক্লিনআপ টাস্কসমূহ (Database cleanup tasks)", "nightly_tasks_database_cleanup_setting": "ডেটাবেস ক্লিনআপ টাস্কসমূহ (Database cleanup tasks)",
"nightly_tasks_database_cleanup_setting_description": "ডেটাবেস থেকে পুরোনো এবং মেয়াদোত্তীর্ণ ডেটা মুছে ফেলুন", "nightly_tasks_database_cleanup_setting_description": "ডেটাবেস থেকে পুরোনো এবং মেয়াদোত্তীর্ণ ডেটা মুছে ফেলুন",
"nightly_tasks_generate_memories_setting": "মেমোরিজ তৈরি করুন (Generate memories)", "nightly_tasks_generate_memories_setting": "মেমোরিজ তৈরি করুন (Generate memories)",
@@ -257,6 +259,20 @@
"notification_email_secure": "SMTPS (স্মার্ট মেইল ট্রান্সফার প্রোটোকল সিকিউর)", "notification_email_secure": "SMTPS (স্মার্ট মেইল ট্রান্সফার প্রোটোকল সিকিউর)",
"notification_email_secure_description": "SMTPS (SMTP over TLS) ব্যবহার করুন", "notification_email_secure_description": "SMTPS (SMTP over TLS) ব্যবহার করুন",
"notification_email_sent_test_email_button": "টেস্ট ইমেল পাঠান এবং সেভ করুন", "notification_email_sent_test_email_button": "টেস্ট ইমেল পাঠান এবং সেভ করুন",
"notification_email_setting_description": "ইমেল নোটিফিকেশন পাঠানোর সেটিংস",
"notification_email_test_email": "পরীক্ষামূলক ইমেইল পাঠান",
"notification_email_test_email_failed": "পরীক্ষামূলক ইমেল পাঠানো সম্ভব হয়নি, আপনার সেটিংস যাচাই করুন",
"notification_email_test_email_sent": "{email}-এ একটি পরীক্ষামূলক ইমেল পাঠানো হয়েছে। অনুগ্রহ করে আপনার ইনবক্স দেখুন।",
"notification_email_username_description": "ইমেল সার্ভারে ভেরিফিকেসনের জন্য ব্যবহৃত ইউজারনেম",
"notification_enable_email_notifications": "ইমেল নোটিফিকেসন সক্রিয় করুন",
"notification_settings": "নোটিফিকেসন সেটিংস",
"notification_settings_description": "ইমেইল সহ নোটিফিকেশন সেটিংস পরিচালনা করুন",
"oauth_auto_launch": "অটো লঞ্চ",
"oauth_auto_launch_description": "লগইন পেজে প্রবেশ করার সাথে সাথে OAuth লগইন প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে শুরু করুন",
"oauth_auto_register": "সয়ংক্রিয়ভাবে রেজিস্টার করুন",
"oauth_auto_register_description": "OAuth দিয়ে সাইন ইন করার পর নতুন ব্যবহারকারীদের স্বয়ংক্রিয়ভাবে নিবন্ধন করুন",
"oauth_button_text": "বাটন টেক্সট",
"oauth_client_secret_description": "গোপনীয় ক্লায়েন্টের জন্য প্রয়োজন, অথবা যদি পাবলিক ক্লায়েন্টের জন্য PKCE (Proof Key for Code Exchange) সমর্থিত না হয়।",
"oauth_enable_description": "OAuth-এর মাধ্যমে লগইন করুন", "oauth_enable_description": "OAuth-এর মাধ্যমে লগইন করুন",
"oauth_mobile_redirect_uri": "মোবাইল রিডাইরেক্ট ইউআরআই (URI)", "oauth_mobile_redirect_uri": "মোবাইল রিডাইরেক্ট ইউআরআই (URI)",
"oauth_mobile_redirect_uri_override": "মোবাইল রিডাইরেক্ট ইউআরআই (URI) ওভাররাইড", "oauth_mobile_redirect_uri_override": "মোবাইল রিডাইরেক্ট ইউআরআই (URI) ওভাররাইড",
@@ -323,6 +339,20 @@
"storage_template_settings": "স্টোরেজ টেমপ্লেট (Storage Template)", "storage_template_settings": "স্টোরেজ টেমপ্লেট (Storage Template)",
"storage_template_settings_description": "আপলোড করা অ্যাসেটের ফোল্ডার স্ট্রাকচার এবং ফাইল নেম ম্যানেজ করুন", "storage_template_settings_description": "আপলোড করা অ্যাসেটের ফোল্ডার স্ট্রাকচার এবং ফাইল নেম ম্যানেজ করুন",
"storage_template_user_label": "<code>{label}</code> হলো ব্যবহারকারীর স্টোরেজ লেবেল (Storage Label)", "storage_template_user_label": "<code>{label}</code> হলো ব্যবহারকারীর স্টোরেজ লেবেল (Storage Label)",
"system_settings": "সিস্টেম সেটিংস",
"tag_cleanup_job": "ট্যাগ মুছে ফেলা",
"template_email_available_tags": "আপনি আপনার টেমপ্লেটে নিম্নলিখিত ভেরিয়েবলগুলো ব্যবহার করতে পারেন: {tags}",
"template_email_if_empty": "টেমপ্লেটটি খালি থাকলে ডিফল্ট ইমেল ব্যবহার করা হবে।",
"template_email_invite_album": "ইনভাইট অ্যালবাম টেমপ্লেট",
"template_email_preview": "প্রিভিউ",
"template_email_settings": "ইমেইল টেমপ্লেট",
"template_email_update_album": "অ্যালবাম টেমপ্লেট আপডেট করুন",
"template_email_welcome": "স্বাগতম ইমেইল টেমপ্লেট",
"template_settings": "নোটিফিকেশন টেমপ্লেট",
"template_settings_description": "নোটিফিকেশনের জন্য কাস্টম টেমপ্লেট পরিচালনা করুন",
"theme_custom_css_settings": "কাস্টম CSS",
"theme_custom_css_settings_description": "ক্যাসকেডিং স্টাইল শীট ব্যবহার করে Immich এর ডিজাইন কাস্টমাইজ করা যায়।",
"theme_settings": "থীম সেটিংস",
"theme_settings_description": "ইমিচ (Immich) ওয়েব ইন্টারফেসের কাস্টমাইজেশন ম্যানেজ করুন", "theme_settings_description": "ইমিচ (Immich) ওয়েব ইন্টারফেসের কাস্টমাইজেশন ম্যানেজ করুন",
"thumbnail_generation_job": "থাম্বনেইল তৈরি করুন (Generate Thumbnails)", "thumbnail_generation_job": "থাম্বনেইল তৈরি করুন (Generate Thumbnails)",
"thumbnail_generation_job_description": "প্রতিটি অ্যাসেটের জন্য বড়, ছোট এবং ব্লার (অস্পষ্ট) থাম্বনেইল তৈরি করুন, সেই সাথে প্রতিটি ব্যক্তির জন্যও থাম্বনেইল তৈরি করুন।", "thumbnail_generation_job_description": "প্রতিটি অ্যাসেটের জন্য বড়, ছোট এবং ব্লার (অস্পষ্ট) থাম্বনেইল তৈরি করুন, সেই সাথে প্রতিটি ব্যক্তির জন্যও থাম্বনেইল তৈরি করুন।",
@@ -334,8 +364,281 @@
"transcoding_acceleration_vaapi": "VA-API (ভিডিও অ্যাক্সিলারেশন এপিআই)", "transcoding_acceleration_vaapi": "VA-API (ভিডিও অ্যাক্সিলারেশন এপিআই)",
"transcoding_accepted_audio_codecs": "গ্রহণযোগ্য অডিও কোডেকসমূহ (Accepted audio codecs)", "transcoding_accepted_audio_codecs": "গ্রহণযোগ্য অডিও কোডেকসমূহ (Accepted audio codecs)",
"transcoding_accepted_audio_codecs_description": "কোন অডিও কোডেকগুলো ট্রানসকোড করার প্রয়োজন নেই তা নির্বাচন করুন। এটি শুধুমাত্র নির্দিষ্ট ট্রানসকোড পলিসির (transcode policies) জন্য ব্যবহৃত হয়।", "transcoding_accepted_audio_codecs_description": "কোন অডিও কোডেকগুলো ট্রানসকোড করার প্রয়োজন নেই তা নির্বাচন করুন। এটি শুধুমাত্র নির্দিষ্ট ট্রানসকোড পলিসির (transcode policies) জন্য ব্যবহৃত হয়।",
"transcoding_accepted_containers": "গ্রহণযোগ্য কন্টেইনারসমূহ (Accepted containers)" "transcoding_accepted_containers": "গ্রহণযোগ্য কন্টেইনারসমূহ (Accepted containers)",
"transcoding_accepted_containers_description": "কোন কন্টেইনার ফরম্যাটগুলোকে MP4-এ রিমুক্স করার প্রয়োজন নেই তা নির্বাচন করুন। শুধুমাত্র নির্দিষ্ট ট্রান্সকোড পলিসির জন্য ব্যবহৃত হয়।",
"transcoding_accepted_video_codecs": "সমর্থিত ভিডিও কোডেকগুলো",
"transcoding_accepted_video_codecs_description": "কোন ভিডিও কোডেকগুলো ট্রান্সকোড করার প্রয়োজন নেই তা নির্বাচন করুন। শুধুমাত্র নির্দিষ্ট ট্রান্সকোড নীতির জন্য ব্যবহৃত হয়।",
"transcoding_advanced_options_description": "বেশিরভাগ ব্যবহারকারীর পরিবর্তন করার প্রয়োজন নেই এমন অপশনসমূহ",
"transcoding_audio_codec": "অডিও কোডেক",
"transcoding_audio_codec_description": "Opus সর্বোচ্চ মানের অপশন, তবে পুরোনো ডিভাইস বা সফটওয়্যারের সাথে এর সামঞ্জস্য কম।",
"transcoding_bitrate_description": "সর্বোচ্চ বিটরেটের চেয়ে বেশি বা সমর্থিত ফরম্যাটে নয় এমন ভিডিও",
"transcoding_codecs_learn_more": "এখানে ব্যবহৃত পরিভাষা সম্পর্কে আরও জানতে FFmpeg ডকুমেন্টেশন দেখুন, <h264-link>H.264 কোডেক</h264-link>, <hevc-link>HEVC কোডেক</hevc-link> এবং <vp9-link>VP9 কোডেক</vp9-link>।",
"transcoding_constant_quality_mode": "নির্দিষ্ট মান মোড",
"transcoding_constant_quality_mode_description": "ICQ, CQP-এর চেয়ে ভালো মান দেয়, কিন্তু সব হার্ডওয়্যার অ্যাক্সেলারেশন ডিভাইসে কাজ করে না। এই অপশন চালু থাকলে কোয়ালিটি-ভিত্তিক এনকোডিংয়ে এটি প্রাধান্য পাবে। NVENC এটি সমর্থন করে না, তাই এটি উপেক্ষা করা হবে।",
"transcoding_constant_rate_factor": "নির্দিষ্ট রেট ফ্যাক্টর (-crf)",
"transcoding_constant_rate_factor_description": "ভিডিওর গুণমানের স্তর। সাধারণ মানগুলো হলো H.264-এর জন্য ২৩, HEVC-এর জন্য ২৮, VP9-এর জন্য ৩১ এবং AV1-এর জন্য ৩৫। মান যত কম হবে, ভিডিওর গুণমান তত উন্নত হবে, তবে ফাইলের আকার তত বড় হবে।",
"transcoding_disabled_description": "কোনো ভিডিও ট্রান্সকোড করবেন না, এতে কিছু ক্লায়েন্টে প্লেব্যাক নষ্ট হতে পারে",
"transcoding_encoding_options": "এনকোডিং এর অপশনগুলি",
"transcoding_encoding_options_description": "এনকোড করা ভিডিওগুলির জন্য কোডেক, রেজোলিউশন, কোয়ালিটি এবং অন্যান্য অপশন সেট করুন",
"transcoding_hardware_acceleration": "হার্ডওয়্যার এক্সিলারেসন (Acceleration)",
"transcoding_hardware_acceleration_description": "পরীক্ষামূলক: দ্রুততর ট্রান্সকোডিং, কিন্তু একই বিটরেটে গুণমান হ্রাস পেতে পারে",
"transcoding_hardware_decoding": "হার্ডওয়্যার ডিকোডিং",
"transcoding_hardware_decoding_setting_description": "শুধু এনকোডিং অ্যাক্সিলারেশন করার পরিবর্তে এটি এন্ড-টু-এন্ড অ্যাক্সিলারেশন সক্ষম করে। সব ভিডিওতে কাজ নাও করতে পারে।",
"transcoding_max_b_frames": "সর্বোচ্চ বি-ফ্রেম (B-frames)",
"transcoding_max_b_frames_description": "মান যত বেশি হবে, কমপ্রেশন তত ভালো হবে কিন্তু এনকোডিং ধীরে চলবে। পুরোনো ডিভাইসে হার্ডওয়্যার অ্যাক্সেলারেশন কাজ নাও করতে পারে। ০ দিলে B-frames বন্ধ থাকবে, -১ দিলে এটি নিজে থেকেই ঠিক হবে।",
"transcoding_max_bitrate": "সর্বোচ্চ বিটরেট",
"transcoding_max_bitrate_description": "সর্বোচ্চ বিটরেট নির্ধারণ করলে ফাইলের আকার আরও অনুমানযোগ্য হতে পারে, তবে এর ফলে কোয়ালিটির কিছুটা অবনতি ঘটে। 720p-তে, VP9 বা HEVC-এর জন্য সাধারণ মান হলো 2600 kbit/s, অথবা H.264-এর জন্য 4500 kbit/s।এর মান 0 সেট করা হলে এটি বন্ধ থাকে। যখন কোনো একক নির্দিষ্ট করা থাকে না, তখন k (kbit/s-এর জন্য) ধরে নেওয়া হয়; তাই 5000, 5000k, এবং 5M (Mbit/s-এর জন্য) সমতুল্য।",
"transcoding_max_keyframe_interval": "সর্বোচ্চ কীফ্রেম ব্যবধান",
"transcoding_max_keyframe_interval_description": "কীফ্রেমের মধ্যে সর্বোচ্চ ফ্রেম দূরত্ব নির্ধারণ করে। মান কম হলে কমপ্রেশন দক্ষতা কমে, তবে ভিডিওতে খুঁজে বের করা দ্রুত হয় এবং দ্রুত চলমান দৃশ্যে মানও কিছুটা ভালো হতে পারে। ০ দিলে এই মান স্বয়ংক্রিয়ভাবে নির্ধারিত হয়।",
"transcoding_optimal_description": "নির্দিষ্ট রেজোলিউশনের চেয়ে বড় বা সমর্থিত ফরম্যাটে নয় এমন ভিডিও",
"transcoding_policy": "ট্রান্সকোড নীতি",
"transcoding_policy_description": "ভিডিও কখন ট্রান্সকোড করা হবে তা সেট করুন",
"transcoding_preferred_hardware_device": "পছন্দের হার্ডওয়্যার ডিভাইস",
"transcoding_preferred_hardware_device_description": "শুধুমাত্র VAAPI এবং QSV-এর ক্ষেত্রে প্রযোজ্য। হার্ডওয়্যার ট্রান্সকোডিংয়ের জন্য ব্যবহৃত dri নোড নির্ধারণ করে।",
"transcoding_preset_preset": "প্রিসেট (-preset)",
"transcoding_preset_preset_description": "কম্প্রেশন স্পিড। ধীরগতির প্রিসেটগুলো ছোট ফাইল তৈরি করে এবং একটি নির্দিষ্ট বিটরেট লক্ষ্য করার সময় গুণমান বৃদ্ধি করে। VP9 'faster'-এর চেয়ে বেশি গতি উপেক্ষা করে।",
"transcoding_reference_frames": "রেফারেন্স ফ্রেম",
"transcoding_reference_frames_description": "একটি ফ্রেম কম্প্রেস করার সময় কতটি ফ্রেমকে রেফারেন্স হিসেবে নেওয়া হবে। মান যত বেশি হবে, কমপ্রেশন দক্ষতা তত ভালো হবে, তবে এনকোডিং ধীর হবে। ০ দিলে এই মান স্বয়ংক্রিয়ভাবে নির্ধারিত হবে।",
"transcoding_required_description": "শুধুমাত্র অনুমোদিত ফরম্যাটে নেই এমন ভিডিও",
"transcoding_settings": "ভিডিও ট্রান্সকোডিং সেটিংস",
"transcoding_settings_description": "নির্ধারণ করুন কোন ভিডিওগুলোকে ট্রান্সকোড করতে হবে এবং কিভাবে প্রক্রিয়া করতে হবে",
"transcoding_target_resolution": "টার্গেট রেজোলিউশন",
"transcoding_target_resolution_description": "উচ্চ রেজোলিউশন বেশি বিস্তারিত রাখে, কিন্তু এনকোডিং ধীরে হয়, ফাইল বড় হয়, এবং অ্যাপ ধীর প্রতিক্রিয়া করতে পারে।",
"transcoding_temporal_aq": "টেম্পোরাল AQ",
"transcoding_temporal_aq_description": "শুধুমাত্র NVENC-এর ক্ষেত্রে প্রযোজ্য। টেম্পোরাল অ্যাডাপটিভ কোয়ান্টাইজেশন (Adaptive Quantization) উচ্চ-বিস্তারিত ও স্বল্প-গতির দৃশ্যের মান বৃদ্ধি করে। পুরোনো ডিভাইসগুলোর সাথে সামঞ্জস্যপূর্ণ নাও হতে পারে।",
"transcoding_threads": "থ্রেড",
"transcoding_threads_description": "উচ্চ মানে এনকোডিং দ্রুত হয়, কিন্তু সার্ভার কম কাজ করতে পারে। CPU কোরের বেশি মান দেওয়া উচিত নয়। ০ দিলে সর্বাধিক ব্যবহার হবে।",
"transcoding_tone_mapping": "টোন-ম্যাপিং",
"transcoding_tone_mapping_description": "এইচডিআর (HDR) ভিডিওকে এসডিআর (SDR)-এ রূপান্তর করার সময় এর বাহ্যিক রূপ অক্ষুণ্ণ রাখার চেষ্টা করা হয়। প্রতিটি অ্যালগরিদম রঙ, ডিটেইল এবং উজ্জ্বলতার জন্য ভিন্ন ভিন্ন সমন্বয় করে। হেবল ডিটেইল, মোবিয়াস রঙ এবং রাইনহার্ড উজ্জ্বলতা অক্ষুণ্ণ রাখে।",
"transcoding_transcode_policy": "ট্রান্সকোড নীতি",
"transcoding_transcode_policy_description": "কখন একটি ভিডিও ট্রান্সকোড করা হবে তার নীতিমালা। HDR ভিডিও এবং YUV 4:2:0 ব্যতীত অন্য পিক্সেল ফরম্যাটের ভিডিও সর্বদা ট্রান্সকোড করা হবে (যদি না ট্রান্সকোডিং বন্ধ করা থাকে)।",
"transcoding_two_pass_encoding": "টু-পাস এনকোডিং",
"transcoding_two_pass_encoding_setting_description": "আরও উন্নত মানের এনকোডেড ভিডিও তৈরি করতে দুই ধাপে ট্রান্সকোড করুন। যখন সর্বোচ্চ বিটরেট সক্রিয় করা হয় (যা H.264 এবং HEVC-এর সাথে কাজ করার জন্য আবশ্যক), তখন এই মোডটি সর্বোচ্চ বিটরেটের উপর ভিত্তি করে একটি বিটরেট রেঞ্জ ব্যবহার করে এবং CRF উপেক্ষা করে। VP9-এর ক্ষেত্রে, সর্বোচ্চ বিটরেট নিষ্ক্রিয় থাকলেও CRF ব্যবহার করা যেতে পারে।",
"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_settings": "ট্র্যাশ সেটিংস",
"trash_settings_description": "ট্র্যাশ সেটিংস পরিচালনা করুন",
"unlink_all_oauth_accounts": "সকল OAuth অ্যাকাউন্ট আনলিঙ্ক করুন",
"unlink_all_oauth_accounts_description": "নতুন প্রোভাইডারে মাইগ্রেট করার আগে সব OAuth অ্যাকাউন্ট আনলিঙ্ক করুন।",
"unlink_all_oauth_accounts_prompt": "আপনি কি সব OAuth অ্যাকাউন্ট আনলিঙ্ক করতে নিশ্চিত? এটি প্রতিটি ব্যবহারকারীর OAuth আইডি রিসেট করে দেবে এবং এটি আর পূর্বাবস্থায় ফেরানো যাবে না।",
"user_cleanup_job": "ইউজার ক্লিনআপ",
"user_delete_delay": "<b>{user}</b>-এর অ্যাকাউন্ট এবং অ্যাসেট {delay, plural, one {# day} other {# days}} পর স্থায়ীভাবে মুছে ফেলার জন্য নির্ধারিত হবে।",
"user_delete_delay_settings": "মুছে ফেলার সময় বিলম্ব",
"user_delete_delay_settings_description": "অ্যাকাউন্ট এবং অ্যাসেট মুছে ফেলার পর কত দিনের মধ্যে স্থায়ীভাবে মুছে ফেলা হবে। ব্যবহারকারী মুছে ফেলার কাজ মধ্যরাতে চালানো হয় এবং দেখা হয় কোন ব্যবহারকারী স্থায়ীভাবে মুছে ফেলার জন্য প্রস্তুত। এই সেটিং পরিবর্তন করলে পরবর্তী এক্সিকিউশনের সময় তা প্রযোজ্য হবে।",
"user_delete_immediately": "<b>{user}</b>-এর অ্যাকাউন্ট এবং অ্যাসেট স্থায়ীভাবে মুছে ফেলার জন্য <b>immediately</b> কিউতে অন্তর্ভুক্ত করা হবে।",
"user_delete_immediately_checkbox": "ব্যবহারকারী ও অ্যাসেট তৎক্ষণাৎ মুছে ফেলার জন্য কিউ",
"user_details": "ব্যবহারকারী তথ্য",
"user_management": "ব্যবহারকারী ম্যানেজমেন্ট",
"user_password_has_been_reset": "ব্যবহারকারীর পাসওয়ার্ড রিসেট করা হয়েছে:",
"user_password_reset_description": "দয়া করে ব্যবহারকারীর জন্য সাময়িক পাসওয়ার্ড দিন এবং জানিয়ে দিন যে তারা পরবর্তী লগইনে পাসওয়ার্ড পরিবর্তন করবেন।",
"user_restore_description": "<b>{user}</b> এর অ্যাকাউন্ট পুনরুদ্ধার করা হবে।",
"user_restore_scheduled_removal": "ব্যবহারকারী পুনরুদ্ধার করুন - মুছে ফেলার জন্য নির্ধারিত তারিখ:{date, date, long}",
"user_settings": "ব্যবহারকারী সেটিংস",
"user_settings_description": "ব্যবহারকারী সেটিংস ম্যানেজ করুন",
"user_successfully_removed": "সফলভাবে ইউজার {email}-কে সরিয়ে দেওয়া হয়েছে।",
"version_check_enabled_description": "ভার্সন যাচাই চালু করুন",
"version_check_implications": "ভার্সন চেক ফিচারটি github.com-এর সঙ্গে নিয়মিত সংযোগের ওপর নির্ভরশীল",
"version_check_settings": "ভার্সন যাচাই",
"version_check_settings_description": "নতুন ভার্সনের নোটিফিকেশন চালু/বন্ধ করুন",
"video_conversion_job": "ভিডিও ট্রান্সকোড করুন",
"video_conversion_job_description": "ব্রাউজার এবং ডিভাইসে আরও ভালোভাবে চলার জন্য ভিডিও ট্রান্সকোড করুন"
}, },
"admin_email": "অ্যাডমিনের ইমেইল",
"admin_password": "অ্যাডমিনের পাসওয়ার্ড",
"administration": "অ্যাডমিন",
"advanced": "অ্যাডভান্সড",
"age_months": "বয়স {months, plural, one {# month} other {# months}}",
"age_year_months": "বয়স ১ বছর, {months, plural, one {# month} other {# months}}",
"album_added": "অ্যালবাম যুক্ত করা হয়েছে",
"album_added_notification_setting_description": "শেয়ার করা অ্যালবামে যুক্ত হলে ইমেইল নোটিফিকেশন পান",
"album_cover_updated": "অ্যালবামের কভার আপডেট হয়েছে",
"album_delete_confirmation": "আপনি কি সত্যিই অ্যালবাম {album} মুছে ফেলতে চান?",
"album_delete_confirmation_description": "অ্যালবামটি শেয়ার করা থাকলেও অন্য ব্যবহারকারীরা আর এটি অ্যাক্সেস করতে পারবেন না।",
"album_info_updated": "অ্যালবামের তথ্য আপডেট করা হয়েছে",
"album_leave": "অ্যালবাম থেকে বেরিয়ে যেতে চান ?",
"album_leave_confirmation": "আপনি কি নিশ্চিত যে আপনি {album} ছেড়ে যেতে চান?",
"album_name": "অ্যালবামের নাম",
"album_options": "অ্যালবামের অপশনসমূহ",
"album_remove_user": "ব্যবহারকারী সরাতে চান?",
"album_remove_user_confirmation": "আপনি কি নিশ্চিত যে আপনি {user}-কে সরাতে চান?",
"album_share_no_users": "এই অ্যালবামটি সব ব্যবহারকারীর সঙ্গে শেয়ার করা হয়েছে, বা শেয়ার করার জন্য কোনো ব্যবহারকারী নেই।",
"album_updated": "অ্যালবাম আপডেট করা হয়েছে",
"album_updated_setting_description": "নতুন অ্যাসেট যুক্ত হলে শেয়ার করা অ্যালবামের জন্য ইমেইল নোটিফিকেশন পান",
"album_user_left": "বাম {album}",
"album_user_removed": "{user} কে সরানো হয়েছে",
"album_with_link_access": "লিঙ্ক থাকা যে কেউ এই অ্যালবামের ছবি ও মানুষজনকে দেখতে পারবে।",
"albums": "অ্যালবামসমূহ",
"all": "সব",
"all_albums": "সকল অ্যালবামসমূহ",
"all_people": "সব ব্যবহারকারী",
"all_videos": "সব ভিডিও",
"allow_dark_mode": "ডার্ক মোড চালু করুন",
"allow_edits": "এডিটের অনুমতি দিন",
"allow_public_user_to_download": "সাধারণ ব্যবহারকারী ডাউনলোড করতে পারবে",
"allow_public_user_to_upload": "সাধারণ ব্যবহারকারী আপলোড করতে পারবে",
"anti_clockwise": "বিপরীত দিক",
"api_key": "API কী",
"api_key_description": "এই মান একবারই দেখানো হবে। উইন্ডো বন্ধ করার আগে অবশ্যই এটি কপি করুন।",
"api_key_empty": "API কী-এর নাম খালি রাখা যাবে না",
"api_keys": "API কী সমূহ",
"app_settings": "অ্যাপ সেটিংস",
"appears_in": "v1.106.4 থেকে, অ্যাসেট সাইডবারে ব্যবহার হয় ‘[albums]-এ উপস্থিত’ বোঝাতে",
"archive": "আর্কাইভ",
"archive_or_unarchive_photo": "ফটো আর্কাইভ অথবা আনআর্কাইভ করুন",
"archive_size": "আর্কাইভ সাইজ",
"archive_size_description": "ডাউনলোডের আর্কাইভ সাইজ নির্ধারণ করুন (GiB)",
"are_these_the_same_person": "এরা কি একই ব্যক্তি?",
"are_you_sure_to_do_this": "আপনি কি নিশ্চিত যে আপনি এটি করতে চান?",
"asset_added_to_album": "অ্যালবামে যুক্ত করা হয়েছে",
"asset_adding_to_album": "অ্যালবামে যুক্ত করা হচ্ছে…",
"asset_description_updated": "অ্যাসেটের বিবরণ আপডেট করা হয়েছে",
"asset_filename_is_offline": "{filename} অ্যাসেটটি বর্তমানে অফলাইন",
"asset_has_unassigned_faces": "অ্যাসেটটির কিছু মুখ অনির্ধারিত ফেস রয়েছে",
"asset_hashing": "হ্যাশিং চলছে…",
"asset_offline": "অ্যাসেট বর্তমানে অফলাইন",
"asset_offline_description": "এই এক্সটার্নাল অ্যাসেটটি এখন ডিস্কে নেই। সহায়তার জন্য Immich অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন।",
"asset_skipped": "এড়ানো হয়েছে",
"asset_skipped_in_trash": "ট্র্যাশে",
"asset_uploaded": "আপলোড সম্পন্ন",
"asset_uploading": "আপলোড চলছে…",
"assets": "অ্যাসেটসমূহ",
"assets_added_to_album_count": "অ্যালবামে {count, plural, one {# asset} other {# assets}} যুক্ত করা হয়েছে",
"assets_moved_to_trash_count": "{count, plural, one {# asset} other {# assets}} ট্র্যাশে সরানো হয়েছে",
"assets_permanently_deleted_count": "{count, plural, one {# asset} other {# assets}} স্থায়ীভাবে মুছে ফেলা হয়েছে",
"assets_removed_count": "{count, plural, one {# asset} other {# assets}} সরানো হয়েছে",
"assets_restore_confirmation": "আপনি কি সত্যিই আপনার সব ট্র্যাশ করা অ্যাসেট পুনরুদ্ধার করতে চান? এটি পূর্বাবস্থায় ফিরানো যাবে না। তবে অফলাইন অ্যাসেট এইভাবে পুনরুদ্ধার হবে না।",
"assets_restored_count": "{count, plural, one {# asset} other {# assets}} পুনরুদ্ধার করা হয়েছে",
"assets_trashed_count": "{count, plural, one {# asset} other {# assets}} ট্র্যাশে পাঠানো হয়েছে",
"assets_were_part_of_album_count": "{count, plural, one {Asset was} other {Assets were}} আগেই অ্যালবামে যুক্ত ছিল",
"authorized_devices": "অনুমোদিত ডিভাইস",
"back": "ফিরে যান",
"back_close_deselect": "ফিরে যান, বন্ধ করুন বা নির্বাচন বাতিল করুন",
"backward": "পিছনে",
"birthdate_saved": "জন্ম তারিখ সংরক্ষণ সম্পন্ন",
"birthdate_set_description": "একটি ছবির সময়ে ব্যক্তির বয়স গণনার জন্য জন্ম তারিখ ব্যবহার করা হয়।",
"blurred_background": "ব্লারড ব্যাকগ্রাউন্ড",
"bugs_and_feature_requests": "বাগ ও ফিচার রিকোয়েস্ট",
"build": "বিল্ড",
"build_image": "বিল্ড ইমেজ",
"bulk_delete_duplicates_confirmation": "আপনি কি সত্যিই {count, plural, one {# duplicate asset} other {# duplicate assets}} একসাথে মুছে ফেলতে চান? প্রতিটি গ্রুপের সবচেয়ে বড় অ্যাসেট রাখা হবে, বাকিগুলো স্থায়ীভাবে মুছে যাবে। এটি পূর্বাবস্থায় ফিরানো যাবে না!",
"bulk_keep_duplicates_confirmation": "আপনি কি সত্যিই {count, plural, one {# duplicate asset} other {# duplicate assets}} রাখতে চান? সব ডুপ্লিকেট গ্রুপ ঠিক করা হবে, কোনো কিছু মুছে ফেলা হবে না।",
"bulk_trash_duplicates_confirmation": "আপনি কি সত্যিই {count, plural, one {# duplicate asset} other {# duplicate assets}} একসাথে ট্র্যাশ করতে চান? প্রতিটি গ্রুপের সবচেয়ে বড় অ্যাসেট রাখা হবে, বাকিগুলো ট্র্যাশে যাবে।",
"buy": "Immich ক্রয় করুন",
"camera": "ক্যামেরা",
"camera_brand": "ক্যামেরা ব্র্যান্ড",
"camera_model": "ক্যামেরা মডেল",
"cancel": "বাতিল",
"cancel_search": "সার্চ বন্ধ করুন",
"cannot_merge_people": "ব্যক্তিদের একত্র করা সম্ভব নয়",
"cannot_undo_this_action": "এই কাজ পূর্বাবস্থায় ফেরানো যাবে না!",
"cannot_update_the_description": "বিবরণ পরিবর্তন সম্ভব নয়",
"change_date": "তারিখ পরিবর্তন",
"change_expiration_time": "মেয়াদ শেষের সময় পরিবর্তন",
"change_location": "লোকেশন পরিবর্তন",
"change_name": "নাম পরিবর্তন করুন",
"change_name_successfully": "নাম সফলভাবে পরিবর্তন হয়েছে",
"change_password": "পাসওয়ার্ড পরিবর্তন করুন",
"change_password_description": "আপনি হয়তো প্রথমবার লগইন করছেন বা পাসওয়ার্ড পরিবর্তনের অনুরোধ করেছেন। নিচে নতুন পাসওয়ার্ড দিন।",
"change_your_password": "আপনার পাসওয়ার্ড পরিবর্তন করুন",
"changed_visibility_successfully": "ভিসিবিলিটি সফলভাবে পরিবর্তন হয়েছে",
"check_logs": "লগ দেখুন",
"choose_matching_people_to_merge": "একত্র করার জন্য মিল থাকা ব্যক্তিদের নির্বাচন করুন",
"city": "শহর",
"clear": "মুছুন",
"clear_all": "সব মুছুন",
"clear_all_recent_searches": "সাম্প্রতিক সব অনুসন্ধান পরিষ্কার করুন",
"clear_message": "মেসেজ পরিষ্কার করুন",
"clear_value": "ভ্যালু মুছুন",
"clockwise": "ঘড়ির কাঁটার দিকে",
"close": "বন্ধ",
"collapse": "সংকুচিত করুন",
"collapse_all": "সব সংকুচিত",
"color": "রং",
"color_theme": "কালার থিম",
"comment_deleted": "মন্তব্য মুছে ফেলা হয়েছে",
"comment_options": "মন্তব্য অপশন",
"comments_and_likes": "মন্তব্য ও লাইক",
"comments_are_disabled": "মন্তব্য বন্ধ করা হয়েছে",
"confirm": "নিশ্চিত",
"confirm_admin_password": "অ্যাডমিন পাসওয়ার্ড পুনরায় লিখুন",
"confirm_delete_shared_link": "আপনি কি নিশ্চিত যে আপনি এই শেয়ার করা লিঙ্কটি মুছে ফেলতে চান?",
"confirm_keep_this_delete_others": "স্ট্যাকের এই অ্যাসেট ছাড়া সব অন্যান্য অ্যাসেট মুছে যাবে। আপনি কি নিশ্চিত যে আপনি চালিয়ে যেতে চান?",
"confirm_password": "পাসওয়ার্ড পুনরায় লিখুন",
"contain": "মাপমত",
"context": "প্রসঙ্গ",
"continue": "এগিয়ে যান",
"copied_image_to_clipboard": "ছবি ক্লিপবোর্ডে কপি হয়েছে।",
"copied_to_clipboard": "ক্লিপবোর্ডে কপি হয়েছে!",
"copy_error": "Error-টি কপি করুন",
"copy_file_path": "ফাইল পাথ কপি",
"copy_image": "ছবি কপি",
"copy_link": "লিঙ্ক কপি",
"copy_link_to_clipboard": "ক্লিপবোর্ডে লিঙ্ক কপি করুন",
"copy_password": "পাসওয়ার্ড কপি করুন",
"copy_to_clipboard": "ক্লিপবোর্ডে কপি করুন",
"country": "দেশ",
"cover": "সম্পূর্ণভাবে",
"covers": "কভারস",
"create": "তৈরি করুন",
"create_album": "অ্যালবাম তৈরি",
"create_library": "লাইব্রেরি তৈরি",
"create_link": "লিঙ্ক তৈরি",
"create_link_to_share": "শেয়ার লিঙ্ক তৈরি",
"create_link_to_share_description": "লিঙ্কের মাধ্যমে সবাই নির্বাচিত ছবি দেখতে পারবে",
"create_new_person": "নতুন ব্যক্তি যোগ করুন",
"create_new_person_hint": "নির্বাচিত অ্যাসেট নতুন ব্যক্তির সঙ্গে যুক্ত করুন",
"create_new_user": "নতুন ব্যবহারকারী যোগ করুন",
"create_tag": "ট্যাগ তৈরি",
"create_tag_description": "নতুন ট্যাগ তৈরি করুন। নেস্টেড ট্যাগের ক্ষেত্রে সম্পূর্ণ পাথ - ফরওয়ার্ড স্ল্যাশসহ দিন।",
"create_user": "ব্যবহারকারী যোগ করুন",
"created": "যোগ করা হয়েছে",
"current_device": "চলতি ডিভাইস",
"custom_locale": "কাস্টম লোকেল",
"custom_locale_description": "নির্বাচিত ভাষা এবং অঞ্চলের ভিত্তিতে তারিখ, সময় এবং সংখ্যা ফরম্যাট করুন",
"dark": "ডার্ক",
"date_after": "এর পরের তারিখ",
"date_and_time": "তারিখ এবং সময়",
"date_before": "এর আগের তারিখ",
"date_of_birth_saved": "জন্ম তারিখ সফলভাবে সংরক্ষণ করা হয়েছে",
"delete": "মুছুন",
"delete_album": "অ্যালবাম মুছুন",
"delete_api_key_prompt": "আপনি কি সত্যিই এই API key মুছে ফেলতে চান?",
"delete_duplicates_confirmation": "আপনি কি সত্যিই এই ডুপ্লিকেটগুলো স্থায়ীভাবে মুছতে চান?",
"delete_key": "key মুছুন",
"delete_library": "লাইব্রেরি মুছুন",
"delete_link": "লিঙ্ক মুছুন",
"delete_others": "বাকিগুলো মুছুন",
"delete_shared_link": "শেয়ার করা লিঙ্ক মুছুন",
"delete_tag": "ট্যাগ মুছুন",
"delete_tag_confirmation_prompt": "আপনি কি নিশ্চিতভাবে {tagName} ট্যাগটি মুছতে চান?",
"delete_user": "ইউজার মুছুন",
"deleted_shared_link": "শেয়ার করা লিঙ্কটি মুছুন",
"deletes_missing_assets": "ডিস্ক থেকে হারানো অ্যাসেটগুলো মুছে",
"description": "বিবরন",
"details": "বিস্তারিত",
"direction": "দিকনির্দেশনা",
"disabled": "নিষ্ক্রিয়",
"disallow_edits": "সম্পাদনা করার অনুমতি দেবেন না",
"discord": "ডিসকর্ড",
"discover": "ডিসকভার",
"dismiss_all_errors": "সব ত্রুটি বাতিল করুন",
"dismiss_error": "ত্রুটি বাতিল করুন",
"display_options": "ডিসপ্লে অপশন",
"display_order": "ডিসপ্লে অর্ডার",
"display_original_photos": "অরিজিনাল ছবি দেখান",
"display_original_photos_setting_description": "অরিজিনাল অ্যাসেটটি ওয়েব-সামঞ্জস্যপূর্ণ (web-compatible) হলে অ্যাসেট দেখার সময় থাম্বনেইলের পরিবর্তে মূল ফটোটি প্রদর্শন করতে অগ্রাধিকার দিন। এর ফলে ফটো প্রদর্শনের গতি কিছুটা ধীর হতে পারে।",
"do_not_show_again": "এই মেসেজটি আর দেখাবেন না",
"documentation": "সহায়ক নির্দেশিকা",
"done": "সম্পন্ন",
"download": "ডাউনলোড",
"download_include_embedded_motion_videos": "এমবেডেড ভিডিও",
"download_include_embedded_motion_videos_description": "মোশন ফটোর (motion photos) মধ্যে থাকা ভিডিওগুলোকে আলাদা ফাইল হিসেবে অন্তর্ভুক্ত করুন",
"download_settings": "ডাউনলোড",
"download_settings_description": "অ্যাসেট ডাউনলোডের সেটিংস পরিচালনা করুন",
"open_in_browser": "ব্রাউজারে ওপেন করুন",
"user_usage_stats": "অ্যাকাউন্ট ব্যবহারের পরিসংখ্যান", "user_usage_stats": "অ্যাকাউন্ট ব্যবহারের পরিসংখ্যান",
"user_usage_stats_description": "অ্যাকাউন্ট ব্যবহারের পরিসংখ্যান দেখুন", "user_usage_stats_description": "অ্যাকাউন্ট ব্যবহারের পরিসংখ্যান দেখুন",
"yes": "হ্যাঁ", "yes": "হ্যাঁ",
+19 -10
View File
@@ -372,7 +372,7 @@
"transcoding_audio_codec": "Còdec d'àudio", "transcoding_audio_codec": "Còdec d'àudio",
"transcoding_audio_codec_description": "Opus és l'opció de màxima qualitat, però té menor compatibilitat amb dispositius o programari antics.", "transcoding_audio_codec_description": "Opus és l'opció de màxima qualitat, però té menor compatibilitat amb dispositius o programari antics.",
"transcoding_bitrate_description": "Vídeos superiors a la taxa de bits màxima o que no tenen un format acceptat", "transcoding_bitrate_description": "Vídeos superiors a la taxa de bits màxima o que no tenen un format acceptat",
"transcoding_codecs_learn_more": "Per obtenir més informació sobre la terminologia utilitzada, consulteu la documentació de FFmpeg per al <h264-link> còdec H.264</h264-link>, <hevc-link> còdec HEVC</hevc-link> i <vp9-link> còdec VP9</vp9-link>.", "transcoding_codecs_learn_more": "Per obtenir més informació sobre la terminologia utilitzada, consulteu la documentació de FFmpeg per al <h264-link>còdec H.264</h264-link>, <hevc-link>còdec HEVC</hevc-link> i <vp9-link>còdec VP9</vp9-link>.",
"transcoding_constant_quality_mode": "Mode de qualitat constant", "transcoding_constant_quality_mode": "Mode de qualitat constant",
"transcoding_constant_quality_mode_description": "ICQ és millor que CQP, però alguns dispositius d'acceleració de maquinari no admeten aquest mode. Establir aquesta opció preferirà el mode especificat quan utilitzeu la codificació basada en la qualitat. Ignorat per NVENC perquè no és compatible amb ICQ.", "transcoding_constant_quality_mode_description": "ICQ és millor que CQP, però alguns dispositius d'acceleració de maquinari no admeten aquest mode. Establir aquesta opció preferirà el mode especificat quan utilitzeu la codificació basada en la qualitat. Ignorat per NVENC perquè no és compatible amb ICQ.",
"transcoding_constant_rate_factor": "Factor de taxa constant (-crf)", "transcoding_constant_rate_factor": "Factor de taxa constant (-crf)",
@@ -441,7 +441,7 @@
"user_successfully_removed": "L'usuari {email} s'ha eliminat correctament.", "user_successfully_removed": "L'usuari {email} s'ha eliminat correctament.",
"users_page_description": "Pàgina d'usuaris de l'administrador", "users_page_description": "Pàgina d'usuaris de l'administrador",
"version_check_enabled_description": "Activa la comprovació de la versió", "version_check_enabled_description": "Activa la comprovació de la versió",
"version_check_implications": "La funció de comprovació de versions depèn de comunicacions periòdiques amb github.com", "version_check_implications": "La funció de comprovació de versions depèn de comunicacions periòdiques amb {server}",
"version_check_settings": "Comprovació de versió", "version_check_settings": "Comprovació de versió",
"version_check_settings_description": "Activa/desactiva la notificació de nova versió", "version_check_settings_description": "Activa/desactiva la notificació de nova versió",
"video_conversion_job": "Transcodificació de vídeos", "video_conversion_job": "Transcodificació de vídeos",
@@ -849,9 +849,12 @@
"create_link_to_share": "Crear enllaç per compartir", "create_link_to_share": "Crear enllaç per compartir",
"create_link_to_share_description": "Deixa que qualsevol persona amb l'enllaç vegi les fotos seleccionades", "create_link_to_share_description": "Deixa que qualsevol persona amb l'enllaç vegi les fotos seleccionades",
"create_new": "CREAR NOU", "create_new": "CREAR NOU",
"create_new_face": "Crea una nova cara",
"create_new_person": "Crea una nova persona", "create_new_person": "Crea una nova persona",
"create_new_person_hint": "Assigna els elements seleccionats a una persona nova", "create_new_person_hint": "Assigna els elements seleccionats a una persona nova",
"create_new_user": "Crea un usuari nou", "create_new_user": "Crea un usuari nou",
"create_person": "Crea una persona",
"create_person_subtitle": "Afegeix un nom a la cara seleccionada per crear i etiquetar la nova persona",
"create_shared_album_page_share_add_assets": "AFEGEIX ELEMENTS", "create_shared_album_page_share_add_assets": "AFEGEIX ELEMENTS",
"create_shared_album_page_share_select_photos": "Escull fotografies", "create_shared_album_page_share_select_photos": "Escull fotografies",
"create_shared_link": "Crea un enllaç compartit", "create_shared_link": "Crea un enllaç compartit",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Fixat", "crop_aspect_ratio_fixed": "Fixat",
"crop_aspect_ratio_free": "Lliure", "crop_aspect_ratio_free": "Lliure",
"crop_aspect_ratio_original": "Original", "crop_aspect_ratio_original": "Original",
"crop_aspect_ratio_square": "Quadrat",
"curated_object_page_title": "Coses", "curated_object_page_title": "Coses",
"current_device": "Dispositiu actual", "current_device": "Dispositiu actual",
"current_pin_code": "Codi PIN actual", "current_pin_code": "Codi PIN actual",
@@ -880,7 +884,7 @@
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy", "daily_title_text_date_year": "E, dd MMM, yyyy",
"dark": "Fosc", "dark": "Fosc",
"dark_theme": "Canviar a tema fosc", "dark_theme": "Canvia a tema fosc",
"date": "Data", "date": "Data",
"date_after": "Data posterior a", "date_after": "Data posterior a",
"date_and_time": "Data i hora", "date_and_time": "Data i hora",
@@ -891,10 +895,8 @@
"day": "Dia", "day": "Dia",
"days": "Dies", "days": "Dies",
"deduplicate_all": "Desduplica-ho tot", "deduplicate_all": "Desduplica-ho tot",
"deduplication_criteria_1": "Mida d'imatge en bytes", "default_locale": "Configuració regional predeterminada",
"deduplication_criteria_2": "Quantitat de dades EXIF", "default_locale_description": "Format de dades i números en funció de la configuració local",
"deduplication_info": "Informació de deduplicació",
"deduplication_info_description": "Per preseleccionar recursos automàticament i eliminar els duplicats de manera massiva, ens fixem en:",
"delete": "Esborrar", "delete": "Esborrar",
"delete_action_confirmation_message": "Segur que vols eliminar aquest recurs? Aquesta acció el mourà a la paperera del servidor, i et preguntarà si el vols eliminar localment", "delete_action_confirmation_message": "Segur que vols eliminar aquest recurs? Aquesta acció el mourà a la paperera del servidor, i et preguntarà si el vols eliminar localment",
"delete_action_prompt": "{count} eliminats", "delete_action_prompt": "{count} eliminats",
@@ -970,7 +972,7 @@
"downloading_media": "Descàrrega multimèdia", "downloading_media": "Descàrrega multimèdia",
"drop_files_to_upload": "Deixeu els fitxers a qualsevol lloc per pujar-los", "drop_files_to_upload": "Deixeu els fitxers a qualsevol lloc per pujar-los",
"duplicates": "Duplicats", "duplicates": "Duplicats",
"duplicates_description": "Resol cada grup indicant, si n'hi ha, quins són duplicats", "duplicates_description": "Resol cada grup indicant, si n'hi ha, quins són duplicats.",
"duration": "Durada", "duration": "Durada",
"edit": "Editar", "edit": "Editar",
"edit_album": "Edita l'àlbum", "edit_album": "Edita l'àlbum",
@@ -992,7 +994,7 @@
"edit_location_dialog_title": "Ubicació", "edit_location_dialog_title": "Ubicació",
"edit_name": "Edita el nom", "edit_name": "Edita el nom",
"edit_people": "Edita la gent", "edit_people": "Edita la gent",
"edit_tag": "Editar etiqueta", "edit_tag": "Edita etiqueta",
"edit_title": "Edita títol", "edit_title": "Edita títol",
"edit_user": "Edita l'usuari", "edit_user": "Edita l'usuari",
"edit_workflow": "Edita el flux de treball", "edit_workflow": "Edita el flux de treball",
@@ -1007,6 +1009,8 @@
"editor_edits_applied_success": "Les modificacions s'han aplicat correctament", "editor_edits_applied_success": "Les modificacions s'han aplicat correctament",
"editor_flip_horizontal": "Capgira horitzontalment", "editor_flip_horizontal": "Capgira horitzontalment",
"editor_flip_vertical": "Capgira verticalment", "editor_flip_vertical": "Capgira verticalment",
"editor_handle_corner": "{corner, select, top_left {Top-left} top_right {Top-right} bottom_left {Bottom-left} bottom_right {Bottom-right} other {A}} cantó per agafar",
"editor_handle_edge": "{edge, select, top {Top} bottom {Bottom} left {Left} right {Right} other {An}} cantó per agafar",
"editor_orientation": "Orientació", "editor_orientation": "Orientació",
"editor_reset_all_changes": "Reiniciar canvis", "editor_reset_all_changes": "Reiniciar canvis",
"editor_rotate_left": "Rota 90º al contrari de les agulles", "editor_rotate_left": "Rota 90º al contrari de les agulles",
@@ -1168,7 +1172,7 @@
"exif_bottom_sheet_description_error": "No s'ha pogut actualitzar la descripció", "exif_bottom_sheet_description_error": "No s'ha pogut actualitzar la descripció",
"exif_bottom_sheet_details": "DETALLS", "exif_bottom_sheet_details": "DETALLS",
"exif_bottom_sheet_location": "UBICACIÓ", "exif_bottom_sheet_location": "UBICACIÓ",
"exif_bottom_sheet_no_description": "Sense descrioció", "exif_bottom_sheet_no_description": "Sense descripció",
"exif_bottom_sheet_people": "PERSONES", "exif_bottom_sheet_people": "PERSONES",
"exif_bottom_sheet_person_add_person": "Afegir nom", "exif_bottom_sheet_person_add_person": "Afegir nom",
"exit_slideshow": "Surt de la presentació de diapositives", "exit_slideshow": "Surt de la presentació de diapositives",
@@ -1385,9 +1389,11 @@
"library_page_sort_title": "Títol de l'àlbum", "library_page_sort_title": "Títol de l'àlbum",
"licenses": "Llicències", "licenses": "Llicències",
"light": "Llum", "light": "Llum",
"light_theme": "Canviar a tema clar",
"like": "M'agrada", "like": "M'agrada",
"like_deleted": "M'agrada suprimit", "like_deleted": "M'agrada suprimit",
"link_motion_video": "Enllaçar vídeo en moviment", "link_motion_video": "Enllaçar vídeo en moviment",
"link_to_docs": "Per més informació, mirar la <link>documentation</link>.",
"link_to_oauth": "Enllaç a OAuth", "link_to_oauth": "Enllaç a OAuth",
"linked_oauth_account": "Compte OAuth enllaçat", "linked_oauth_account": "Compte OAuth enllaçat",
"list": "Llista", "list": "Llista",
@@ -1649,6 +1655,7 @@
"only_favorites": "Només preferits", "only_favorites": "Només preferits",
"open": "Obrir", "open": "Obrir",
"open_calendar": "Obrir el calendari", "open_calendar": "Obrir el calendari",
"open_in_browser": "Obre al navegador",
"open_in_map_view": "Obrir a la vista del mapa", "open_in_map_view": "Obrir a la vista del mapa",
"open_in_openstreetmap": "Obre a OpenStreetMap", "open_in_openstreetmap": "Obre a OpenStreetMap",
"open_the_search_filters": "Obriu els filtres de cerca", "open_the_search_filters": "Obriu els filtres de cerca",
@@ -2210,6 +2217,7 @@
"tag": "Etiqueta", "tag": "Etiqueta",
"tag_assets": "Etiquetar actius", "tag_assets": "Etiquetar actius",
"tag_created": "Etiqueta creada: {tag}", "tag_created": "Etiqueta creada: {tag}",
"tag_face": "Etiqueta una cara",
"tag_feature_description": "Exploreu fotos i vídeos agrupats per temes d'etiquetes lògiques", "tag_feature_description": "Exploreu fotos i vídeos agrupats per temes d'etiquetes lògiques",
"tag_not_found_question": "No trobeu una etiqueta? <link>Crear una nova etiqueta.</link>", "tag_not_found_question": "No trobeu una etiqueta? <link>Crear una nova etiqueta.</link>",
"tag_people": "Etiquetar personas", "tag_people": "Etiquetar personas",
@@ -2391,6 +2399,7 @@
"viewer_remove_from_stack": "Elimina de la pila", "viewer_remove_from_stack": "Elimina de la pila",
"viewer_stack_use_as_main_asset": "Fes servir com a element principal", "viewer_stack_use_as_main_asset": "Fes servir com a element principal",
"viewer_unstack": "Desapila", "viewer_unstack": "Desapila",
"visibility": "Visibilitat",
"visibility_changed": "La visibilitat ha canviat per {count, plural, one {# persona} other {# persones}}", "visibility_changed": "La visibilitat ha canviat per {count, plural, one {# persona} other {# persones}}",
"visual": "Visual", "visual": "Visual",
"visual_builder": "Constructor visual", "visual_builder": "Constructor visual",
+13 -7
View File
@@ -441,7 +441,7 @@
"user_successfully_removed": "Uživatel {email} byl úspěšně odstraněn.", "user_successfully_removed": "Uživatel {email} byl úspěšně odstraněn.",
"users_page_description": "Stránka správců", "users_page_description": "Stránka správců",
"version_check_enabled_description": "Povolit kontrolu verzí", "version_check_enabled_description": "Povolit kontrolu verzí",
"version_check_implications": "Kontrola verze je založena na pravidelné komunikaci s github.com", "version_check_implications": "Kontrola verze je založena na pravidelné komunikaci s {server}",
"version_check_settings": "Kontrola verze", "version_check_settings": "Kontrola verze",
"version_check_settings_description": "Povolení/zakázání oznámení o nové verzi", "version_check_settings_description": "Povolení/zakázání oznámení o nové verzi",
"video_conversion_job": "Překódování videí", "video_conversion_job": "Překódování videí",
@@ -849,9 +849,12 @@
"create_link_to_share": "Vytvořit odkaz pro sdílení", "create_link_to_share": "Vytvořit odkaz pro sdílení",
"create_link_to_share_description": "Umožnit každému, kdo má odkaz, zobrazit vybrané fotografie", "create_link_to_share_description": "Umožnit každému, kdo má odkaz, zobrazit vybrané fotografie",
"create_new": "VYTVOŘIT NOVÉ", "create_new": "VYTVOŘIT NOVÉ",
"create_new_face": "Vytvořit nový obličej",
"create_new_person": "Vytvořit novou osobu", "create_new_person": "Vytvořit novou osobu",
"create_new_person_hint": "Přiřadit vybrané položky nové osobě", "create_new_person_hint": "Přiřadit vybrané položky nové osobě",
"create_new_user": "Vytvořit nového uživatele", "create_new_user": "Vytvořit nového uživatele",
"create_person": "Vytvořit osobu",
"create_person_subtitle": "Přidejte jméno ke zvolenému obličeji pro vytvoření a označení nové osoby",
"create_shared_album_page_share_add_assets": "PŘIDAT POLOŽKY", "create_shared_album_page_share_add_assets": "PŘIDAT POLOŽKY",
"create_shared_album_page_share_select_photos": "Vybrat fotografie", "create_shared_album_page_share_select_photos": "Vybrat fotografie",
"create_shared_link": "Vytvořit sdílený odkaz", "create_shared_link": "Vytvořit sdílený odkaz",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Pevný", "crop_aspect_ratio_fixed": "Pevný",
"crop_aspect_ratio_free": "Volný", "crop_aspect_ratio_free": "Volný",
"crop_aspect_ratio_original": "Původní", "crop_aspect_ratio_original": "Původní",
"crop_aspect_ratio_square": "Čtverec",
"curated_object_page_title": "Věci", "curated_object_page_title": "Věci",
"current_device": "Současné zařízení", "current_device": "Současné zařízení",
"current_pin_code": "Aktuální PIN kód", "current_pin_code": "Aktuální PIN kód",
@@ -880,7 +884,7 @@
"daily_title_text_date": "EEEE, d. MMMM", "daily_title_text_date": "EEEE, d. MMMM",
"daily_title_text_date_year": "EEEE, d. MMMM y", "daily_title_text_date_year": "EEEE, d. MMMM y",
"dark": "Tmavý", "dark": "Tmavý",
"dark_theme": "Přepnout tmavý motiv", "dark_theme": "Přepnout na tmavý motiv",
"date": "Datum", "date": "Datum",
"date_after": "Datum po", "date_after": "Datum po",
"date_and_time": "Datum a čas", "date_and_time": "Datum a čas",
@@ -891,10 +895,8 @@
"day": "Den", "day": "Den",
"days": "Dnů", "days": "Dnů",
"deduplicate_all": "Odstranit všechny duplicity", "deduplicate_all": "Odstranit všechny duplicity",
"deduplication_criteria_1": "Velikost obrázku v bajtech", "default_locale": "Výchozí národní prostředí",
"deduplication_criteria_2": "Počet EXIF dat", "default_locale_description": "Formátování datumu a čísel podle místního nastavení prohlížeče",
"deduplication_info": "Informace o deduplikaci",
"deduplication_info_description": "Pro automatický předvýběr položek a hromadné odstranění duplicit se zohledňuje:",
"delete": "Smazat", "delete": "Smazat",
"delete_action_confirmation_message": "Opravdu chcete odstranit tuto položku? Tato akce přesune položku do serverového koše a zeptá se vás, zda ji chcete odstranit lokálně", "delete_action_confirmation_message": "Opravdu chcete odstranit tuto položku? Tato akce přesune položku do serverového koše a zeptá se vás, zda ji chcete odstranit lokálně",
"delete_action_prompt": "{count} smazáno", "delete_action_prompt": "{count} smazáno",
@@ -970,7 +972,7 @@
"downloading_media": "Stahování média", "downloading_media": "Stahování média",
"drop_files_to_upload": "Pro nahrání sem přetáhněte soubory", "drop_files_to_upload": "Pro nahrání sem přetáhněte soubory",
"duplicates": "Duplicity", "duplicates": "Duplicity",
"duplicates_description": "Vyřešte každou skupinu tak, že uvedete, které skupiny jsou duplicitní", "duplicates_description": "Vyřešte každou skupinu tak, že uvedete, které skupiny jsou duplicitní.",
"duration": "Doba trvání", "duration": "Doba trvání",
"edit": "Upravit", "edit": "Upravit",
"edit_album": "Upravit album", "edit_album": "Upravit album",
@@ -1387,9 +1389,11 @@
"library_page_sort_title": "Podle názvu alba", "library_page_sort_title": "Podle názvu alba",
"licenses": "Licence", "licenses": "Licence",
"light": "Světlý", "light": "Světlý",
"light_theme": "Přepnout na světlý motiv",
"like": "Líbí se mi", "like": "Líbí se mi",
"like_deleted": "Oblíbení smazáno", "like_deleted": "Oblíbení smazáno",
"link_motion_video": "Připojit pohyblivé video", "link_motion_video": "Připojit pohyblivé video",
"link_to_docs": "Další informace najdete v <link>dokumentaci</link>.",
"link_to_oauth": "Propojit s OAuth", "link_to_oauth": "Propojit s OAuth",
"linked_oauth_account": "Propojený OAuth účet", "linked_oauth_account": "Propojený OAuth účet",
"list": "Seznam", "list": "Seznam",
@@ -2213,6 +2217,7 @@
"tag": "Značka", "tag": "Značka",
"tag_assets": "Přiřadit značku", "tag_assets": "Přiřadit značku",
"tag_created": "Vytvořena značka: {tag}", "tag_created": "Vytvořena značka: {tag}",
"tag_face": "Označit obličej",
"tag_feature_description": "Procházení fotografií a videí seskupených podle témat logických značek", "tag_feature_description": "Procházení fotografií a videí seskupených podle témat logických značek",
"tag_not_found_question": "Nemůžete najít značku? <link>Vytvořte novou.</link>", "tag_not_found_question": "Nemůžete najít značku? <link>Vytvořte novou.</link>",
"tag_people": "Označit lidi", "tag_people": "Označit lidi",
@@ -2394,6 +2399,7 @@
"viewer_remove_from_stack": "Odstranit ze seskupení", "viewer_remove_from_stack": "Odstranit ze seskupení",
"viewer_stack_use_as_main_asset": "Použít jako hlavní položku", "viewer_stack_use_as_main_asset": "Použít jako hlavní položku",
"viewer_unstack": "Zrušit seskupení", "viewer_unstack": "Zrušit seskupení",
"visibility": "Viditelnost",
"visibility_changed": "Viditelnost změněna u {count, plural, one {# osoby} few {# osob} other {# lidí}}", "visibility_changed": "Viditelnost změněna u {count, plural, one {# osoby} few {# osob} other {# lidí}}",
"visual": "Vizuální", "visual": "Vizuální",
"visual_builder": "Vizuální návrhář", "visual_builder": "Vizuální návrhář",
+20 -11
View File
@@ -441,7 +441,7 @@
"user_successfully_removed": "Bruger {email} er blevet fjernet med succes.", "user_successfully_removed": "Bruger {email} er blevet fjernet med succes.",
"users_page_description": "Admin-brugere side", "users_page_description": "Admin-brugere side",
"version_check_enabled_description": "Aktivér versionstjek", "version_check_enabled_description": "Aktivér versionstjek",
"version_check_implications": "Funktionen til versionstjek er afhængig af periodisk kommunikation med github.com", "version_check_implications": "Funktionen til versionstjek er afhængig af periodisk kommunikation med {server}",
"version_check_settings": "Versionstjek", "version_check_settings": "Versionstjek",
"version_check_settings_description": "Aktiver/deaktiverer notifikation for den nye version", "version_check_settings_description": "Aktiver/deaktiverer notifikation for den nye version",
"video_conversion_job": "Transkod videoer", "video_conversion_job": "Transkod videoer",
@@ -849,9 +849,12 @@
"create_link_to_share": "Opret link for at dele", "create_link_to_share": "Opret link for at dele",
"create_link_to_share_description": "Tillad alle med linket at se de(t) valgte billede(r)", "create_link_to_share_description": "Tillad alle med linket at se de(t) valgte billede(r)",
"create_new": "OPRET NY", "create_new": "OPRET NY",
"create_new_face": "Opret nyt ansigt",
"create_new_person": "Opret ny person", "create_new_person": "Opret ny person",
"create_new_person_hint": "Tildel valgte aktiver til en ny person", "create_new_person_hint": "Tildel valgte aktiver til en ny person",
"create_new_user": "Opret ny bruger", "create_new_user": "Opret ny bruger",
"create_person": "Opret person",
"create_person_subtitle": "Tilføj et navn til det valgte ansigt for at oprette og tagge den nye person",
"create_shared_album_page_share_add_assets": "TILFØJ ELEMENT", "create_shared_album_page_share_add_assets": "TILFØJ ELEMENT",
"create_shared_album_page_share_select_photos": "Vælg Billeder", "create_shared_album_page_share_select_photos": "Vælg Billeder",
"create_shared_link": "Opret delt link", "create_shared_link": "Opret delt link",
@@ -863,9 +866,10 @@
"created_at": "Oprettet", "created_at": "Oprettet",
"creating_linked_albums": "Opretter sammenkædede albums...", "creating_linked_albums": "Opretter sammenkædede albums...",
"crop": "Beskær", "crop": "Beskær",
"crop_aspect_ratio_fixed": "Fikset", "crop_aspect_ratio_fixed": "Fast",
"crop_aspect_ratio_free": "Gratis", "crop_aspect_ratio_free": "Fri",
"crop_aspect_ratio_original": "Original", "crop_aspect_ratio_original": "Original",
"crop_aspect_ratio_square": "Kvadrat",
"curated_object_page_title": "Ting", "curated_object_page_title": "Ting",
"current_device": "Nuværende enhed", "current_device": "Nuværende enhed",
"current_pin_code": "Nuværende PIN kode", "current_pin_code": "Nuværende PIN kode",
@@ -890,11 +894,9 @@
"date_range": "Datointerval", "date_range": "Datointerval",
"day": "Dag", "day": "Dag",
"days": "Dage", "days": "Dage",
"deduplicate_all": "Kopier alle", "deduplicate_all": "Dedubliker alle",
"deduplication_criteria_1": "Billedstørrelse i bytes", "default_locale": "Standard sprog",
"deduplication_criteria_2": "Antal EXIF-data", "default_locale_description": "Formatér datoer og tal baseret på din browsers landestandard",
"deduplication_info": "Deduplikerings info",
"deduplication_info_description": "For automatisk at forudvælge emner og fjerne dubletter i bulk ser vi på:",
"delete": "Slet", "delete": "Slet",
"delete_action_confirmation_message": "Er du sikker på, at du vil slette dette objekt? Denne handling vil flytte objektet til serverens papirkurv, og vil spørge dig, om du vil slette den lokalt", "delete_action_confirmation_message": "Er du sikker på, at du vil slette dette objekt? Denne handling vil flytte objektet til serverens papirkurv, og vil spørge dig, om du vil slette den lokalt",
"delete_action_prompt": "{count} slettet", "delete_action_prompt": "{count} slettet",
@@ -970,7 +972,7 @@
"downloading_media": "Download medier", "downloading_media": "Download medier",
"drop_files_to_upload": "Slip filer hvor som helst for at uploade dem", "drop_files_to_upload": "Slip filer hvor som helst for at uploade dem",
"duplicates": "Duplikater", "duplicates": "Duplikater",
"duplicates_description": "Løs hver gruppe ved at angive, hvilke, hvis nogen, er dubletter", "duplicates_description": "Løs hver gruppe ved at angive hvilke, hvis nogen, er dubletter",
"duration": "Varighed", "duration": "Varighed",
"edit": "Rediger", "edit": "Rediger",
"edit_album": "Redigér album", "edit_album": "Redigér album",
@@ -1007,6 +1009,8 @@
"editor_edits_applied_success": "Redigeringer gemt", "editor_edits_applied_success": "Redigeringer gemt",
"editor_flip_horizontal": "Vend horisontalt", "editor_flip_horizontal": "Vend horisontalt",
"editor_flip_vertical": "Flip vertikal", "editor_flip_vertical": "Flip vertikal",
"editor_handle_corner": "{corner, select, top_left {Øverst venstre} top_right {Øverst højre} bottom_left {Nederst venstre} bottom_right {Nederst højre} other {A}} hjørnehåndtag",
"editor_handle_edge": "{edge, select, top {Øverst} bottom {Nederst} left {Venstre} right {Højre} other {Et}} kanthåndtag",
"editor_orientation": "Orientering", "editor_orientation": "Orientering",
"editor_reset_all_changes": "Nulstil ændringer", "editor_reset_all_changes": "Nulstil ændringer",
"editor_rotate_left": "Rotér 90° mod uret", "editor_rotate_left": "Rotér 90° mod uret",
@@ -1017,7 +1021,7 @@
"empty_trash": "Tøm papirkurv", "empty_trash": "Tøm papirkurv",
"empty_trash_confirmation": "Er du sikker på, at du vil tømme papirkurven? Dette vil fjerne alle objekter i papirkurven permanent fra Immich.\nDu kan ikke fortryde denne handling!", "empty_trash_confirmation": "Er du sikker på, at du vil tømme papirkurven? Dette vil fjerne alle objekter i papirkurven permanent fra Immich.\nDu kan ikke fortryde denne handling!",
"enable": "Aktivér", "enable": "Aktivér",
"enable_backup": "Aktiver backup", "enable_backup": "Aktivér backup",
"enable_biometric_auth_description": "Indtast din PIN kode for at slå biometrisk adgangskontrol til", "enable_biometric_auth_description": "Indtast din PIN kode for at slå biometrisk adgangskontrol til",
"enabled": "Aktiveret", "enabled": "Aktiveret",
"end_date": "Slutdato", "end_date": "Slutdato",
@@ -1072,7 +1076,7 @@
"failed_to_update_notification_status": "Kunne ikke uploade notifikations status", "failed_to_update_notification_status": "Kunne ikke uploade notifikations status",
"incorrect_email_or_password": "Forkert email eller kodeord", "incorrect_email_or_password": "Forkert email eller kodeord",
"library_folder_already_exists": "Denne import sti findes allerede.", "library_folder_already_exists": "Denne import sti findes allerede.",
"page_not_found": "Siden blev ikke fundet :/", "page_not_found": "Siden blev ikke fundet",
"paths_validation_failed": "{paths, plural, one {# sti} other {# stier}} slog fejl ved validering", "paths_validation_failed": "{paths, plural, one {# sti} other {# stier}} slog fejl ved validering",
"profile_picture_transparent_pixels": "Profilbilleder kan ikke have gennemsigtige pixels. Zoom venligst ind og/eller flyt billedet.", "profile_picture_transparent_pixels": "Profilbilleder kan ikke have gennemsigtige pixels. Zoom venligst ind og/eller flyt billedet.",
"quota_higher_than_disk_size": "Du har sat en kvote der er større end disken", "quota_higher_than_disk_size": "Du har sat en kvote der er større end disken",
@@ -1385,9 +1389,11 @@
"library_page_sort_title": "Albumtitel", "library_page_sort_title": "Albumtitel",
"licenses": "Licenser", "licenses": "Licenser",
"light": "Lys", "light": "Lys",
"light_theme": "Skift til lyst tema",
"like": "Synes om", "like": "Synes om",
"like_deleted": "Ligesom slettet", "like_deleted": "Ligesom slettet",
"link_motion_video": "Link bevægelsesvideo", "link_motion_video": "Link bevægelsesvideo",
"link_to_docs": "For yderligere information, se <link>dokumentationen</link>.",
"link_to_oauth": "Link til OAuth", "link_to_oauth": "Link til OAuth",
"linked_oauth_account": "Tilsluttet OAuth-konto", "linked_oauth_account": "Tilsluttet OAuth-konto",
"list": "Liste", "list": "Liste",
@@ -1649,6 +1655,7 @@
"only_favorites": "Kun favoritter", "only_favorites": "Kun favoritter",
"open": "Åben", "open": "Åben",
"open_calendar": "Åbn kalender", "open_calendar": "Åbn kalender",
"open_in_browser": "Åbn i browser",
"open_in_map_view": "Åben i kortvisning", "open_in_map_view": "Åben i kortvisning",
"open_in_openstreetmap": "Åben i OpenStreetMap", "open_in_openstreetmap": "Åben i OpenStreetMap",
"open_the_search_filters": "Åbn søgefiltre", "open_the_search_filters": "Åbn søgefiltre",
@@ -2210,6 +2217,7 @@
"tag": "Tag", "tag": "Tag",
"tag_assets": "Tag mediefiler", "tag_assets": "Tag mediefiler",
"tag_created": "Oprettet tag: {tag}", "tag_created": "Oprettet tag: {tag}",
"tag_face": "Tag ansigt",
"tag_feature_description": "Gennemse billeder og videoer grupperet efter logiske tag-emner", "tag_feature_description": "Gennemse billeder og videoer grupperet efter logiske tag-emner",
"tag_not_found_question": "Kan du ikke finde et tag? <link>Opret et nyt tag.</link>", "tag_not_found_question": "Kan du ikke finde et tag? <link>Opret et nyt tag.</link>",
"tag_people": "Tag personer", "tag_people": "Tag personer",
@@ -2391,6 +2399,7 @@
"viewer_remove_from_stack": "Fjern fra stak", "viewer_remove_from_stack": "Fjern fra stak",
"viewer_stack_use_as_main_asset": "Brug som hovedelement", "viewer_stack_use_as_main_asset": "Brug som hovedelement",
"viewer_unstack": "Fjern fra stak", "viewer_unstack": "Fjern fra stak",
"visibility": "Synlighed",
"visibility_changed": "Synlighed ændret for {count, plural, one {# person} other {# personer}}", "visibility_changed": "Synlighed ændret for {count, plural, one {# person} other {# personer}}",
"visual": "Visuel", "visual": "Visuel",
"visual_builder": "Visuel builder", "visual_builder": "Visuel builder",
+48 -42
View File
@@ -1,5 +1,5 @@
{ {
"about": "Über Immich", "about": "Über",
"account": "Konto", "account": "Konto",
"account_settings": "Kontoeinstellungen", "account_settings": "Kontoeinstellungen",
"acknowledge": "Verstanden", "acknowledge": "Verstanden",
@@ -8,7 +8,7 @@
"action_description": "Eine Reihe von Aktionen, die an den gefilterten Assets ausgeführt werden sollen", "action_description": "Eine Reihe von Aktionen, die an den gefilterten Assets ausgeführt werden sollen",
"actions": "Aktionen", "actions": "Aktionen",
"active": "Aktiv", "active": "Aktiv",
"active_count": "Aktive:{count}", "active_count": "Aktive: {count}",
"activity": "Aktivität", "activity": "Aktivität",
"activity_changed": "Aktivität ist {enabled, select, true {aktiviert} other {deaktiviert}}", "activity_changed": "Aktivität ist {enabled, select, true {aktiviert} other {deaktiviert}}",
"add": "Hinzufügen", "add": "Hinzufügen",
@@ -59,7 +59,7 @@
"backup_database_enable_description": "Datenbank regelmäßig sichern", "backup_database_enable_description": "Datenbank regelmäßig sichern",
"backup_keep_last_amount": "Anzahl der aufzubewahrenden früheren Sicherungen", "backup_keep_last_amount": "Anzahl der aufzubewahrenden früheren Sicherungen",
"backup_onboarding_1_description": "Offsite-Kopie in der Cloud oder an einem anderen physischen Ort.", "backup_onboarding_1_description": "Offsite-Kopie in der Cloud oder an einem anderen physischen Ort.",
"backup_onboarding_2_description": "lokale Kopien auf verschiedenen Geräten. Dazu gehören die Hauptdateien und eine lokale Sicherung dieser Dateien.", "backup_onboarding_2_description": "Lokale Kopien auf verschiedenen Geräten. Dazu gehören die Hauptdateien und eine lokale Sicherung dieser Dateien.",
"backup_onboarding_3_description": "Kopien deiner Daten inklusive Originaldateien. Dies umfasst 1 Kopie an einem anderen Ort und 2 lokale Kopien.", "backup_onboarding_3_description": "Kopien deiner Daten inklusive Originaldateien. Dies umfasst 1 Kopie an einem anderen Ort und 2 lokale Kopien.",
"backup_onboarding_description": "Eine <backblaze-link>3-2-1 Sicherungsstrategie</backblaze-link> wird empfohlen, um deine Daten zu schützen. Du solltest sowohl Kopien deiner hochgeladenen Fotos/Videos als auch der Immich-Datenbank aufbewahren, um eine umfassende Sicherungslösung zu haben.", "backup_onboarding_description": "Eine <backblaze-link>3-2-1 Sicherungsstrategie</backblaze-link> wird empfohlen, um deine Daten zu schützen. Du solltest sowohl Kopien deiner hochgeladenen Fotos/Videos als auch der Immich-Datenbank aufbewahren, um eine umfassende Sicherungslösung zu haben.",
"backup_onboarding_footer": "Weitere Informationen zum Sichern von Immich findest du in der <link>Dokumentation</link>.", "backup_onboarding_footer": "Weitere Informationen zum Sichern von Immich findest du in der <link>Dokumentation</link>.",
@@ -309,7 +309,7 @@
"reset_settings_to_recent_saved": "Einstellungen auf die zuletzt gespeicherten Einstellungen zurücksetzen", "reset_settings_to_recent_saved": "Einstellungen auf die zuletzt gespeicherten Einstellungen zurücksetzen",
"scanning_library": "Bibliothek scannen", "scanning_library": "Bibliothek scannen",
"search_jobs": "Suchaufgaben…", "search_jobs": "Suchaufgaben…",
"send_welcome_email": "Begrüssungsmail senden", "send_welcome_email": "Begrüßungsmail senden",
"server_external_domain_settings": "Externe Domain", "server_external_domain_settings": "Externe Domain",
"server_external_domain_settings_description": "Für externe Links verwendete Domäne", "server_external_domain_settings_description": "Für externe Links verwendete Domäne",
"server_public_users": "Öffentliche Benutzer", "server_public_users": "Öffentliche Benutzer",
@@ -441,7 +441,7 @@
"user_successfully_removed": "Der Benutzer {email} wurde erfolgreich entfernt.", "user_successfully_removed": "Der Benutzer {email} wurde erfolgreich entfernt.",
"users_page_description": "Administrator-Benutzerseite", "users_page_description": "Administrator-Benutzerseite",
"version_check_enabled_description": "Versionsprüfung aktivieren", "version_check_enabled_description": "Versionsprüfung aktivieren",
"version_check_implications": "Die Funktion zur Versionsprüfung basiert auf regelmäßiger Kommunikation mit GitHub.com", "version_check_implications": "Die Funktion zur Versionsprüfung basiert auf regelmäßiger Kommunikation mit {server}",
"version_check_settings": "Versionsprüfung", "version_check_settings": "Versionsprüfung",
"version_check_settings_description": "Aktivieren/Deaktivieren der Benachrichtigung über neue Versionen", "version_check_settings_description": "Aktivieren/Deaktivieren der Benachrichtigung über neue Versionen",
"video_conversion_job": "Videos transkodieren", "video_conversion_job": "Videos transkodieren",
@@ -472,7 +472,7 @@
"advanced_settings_troubleshooting_title": "Fehlersuche", "advanced_settings_troubleshooting_title": "Fehlersuche",
"age_months": "Alter {months, plural, one {# Monat} other {# Monate}}", "age_months": "Alter {months, plural, one {# Monat} other {# Monate}}",
"age_year_months": "Alter 1 Jahr, {months, plural, one {# Monat} other {# Monate}}", "age_year_months": "Alter 1 Jahr, {months, plural, one {# Monat} other {# Monate}}",
"age_years": "Alter {years, plural, one {# Jahr} other {# Jahre}}", "age_years": "{years, plural, other {Alter #}}",
"album": "Album", "album": "Album",
"album_added": "Album hinzugefügt", "album_added": "Album hinzugefügt",
"album_added_notification_setting_description": "Erhalte eine E-Mail-Benachrichtigung, wenn du zu einem freigegebenen Album hinzugefügt wurdest", "album_added_notification_setting_description": "Erhalte eine E-Mail-Benachrichtigung, wenn du zu einem freigegebenen Album hinzugefügt wurdest",
@@ -541,7 +541,7 @@
"app_settings": "App-Einstellungen", "app_settings": "App-Einstellungen",
"app_stores": "App Stores", "app_stores": "App Stores",
"app_update_available": "App Update verfügbar", "app_update_available": "App Update verfügbar",
"appears_in": "Erscheint in", "appears_in": "Enthalten in",
"apply_count": "Anwenden ({count, number})", "apply_count": "Anwenden ({count, number})",
"archive": "Archiv", "archive": "Archiv",
"archive_action_prompt": "{count} zum Archiv hinzugefügt", "archive_action_prompt": "{count} zum Archiv hinzugefügt",
@@ -580,7 +580,7 @@
"asset_restored_successfully": "Datei erfolgreich wiederhergestellt", "asset_restored_successfully": "Datei erfolgreich wiederhergestellt",
"asset_skipped": "Übersprungen", "asset_skipped": "Übersprungen",
"asset_skipped_in_trash": "Im Papierkorb", "asset_skipped_in_trash": "Im Papierkorb",
"asset_trashed": "Datei Gelöscht", "asset_trashed": "Datei gelöscht",
"asset_troubleshoot": "Datei Fehlerbehebung", "asset_troubleshoot": "Datei Fehlerbehebung",
"asset_uploaded": "Hochgeladen", "asset_uploaded": "Hochgeladen",
"asset_uploading": "Hochladen…", "asset_uploading": "Hochladen…",
@@ -610,14 +610,14 @@
"assets_were_part_of_album_count": "{count, plural, one {# Datei ist} other {# Dateien sind}} bereits im Album vorhanden", "assets_were_part_of_album_count": "{count, plural, one {# Datei ist} other {# Dateien sind}} bereits im Album vorhanden",
"assets_were_part_of_albums_count": "{count, plural, one {Datei war} other {Dateien waren}} bereits in den Alben", "assets_were_part_of_albums_count": "{count, plural, one {Datei war} other {Dateien waren}} bereits in den Alben",
"authorized_devices": "Verwendete Geräte", "authorized_devices": "Verwendete Geräte",
"automatic_endpoint_switching_subtitle": "Verbinden Sie sich lokal über ein bestimmtes WiFi, wenn es verfügbar ist, und verwenden Sie andere Verbindungsmöglichkeiten", "automatic_endpoint_switching_subtitle": "Verbinden Sie sich lokal über ein bestimmtes WLAN-Netz, wenn es verfügbar ist, und verwenden Sie ansonsten andere Verbindungsmöglichkeiten",
"automatic_endpoint_switching_title": "Automatische URL-Umschaltung", "automatic_endpoint_switching_title": "Automatische URL-Umschaltung",
"autoplay_slideshow": "Automatische Diashow", "autoplay_slideshow": "Automatische Diashow",
"back": "Zurück", "back": "Zurück",
"back_close_deselect": "Zurück, Schließen oder Abwählen", "back_close_deselect": "Zurück, Schließen oder Abwählen",
"background_backup_running_error": "Sicherung läuft im Hintergrund. Manuelle Sicherung kann nicht gestartet werden", "background_backup_running_error": "Sicherung läuft im Hintergrund. Manuelle Sicherung kann nicht gestartet werden",
"background_location_permission": "Hintergrund Standortfreigabe", "background_location_permission": "Hintergrund Standortfreigabe",
"background_location_permission_content": "Um im Hintergrund zwischen den Netzwerken wechseln zu können, muss Immich *immer* Zugriff auf den genauen Standort haben, damit die App den Namen des WiFi-Netzwerks ermitteln kann", "background_location_permission_content": "Um im Hintergrund zwischen den Netzwerken wechseln zu können, muss Immich *immer* Zugriff auf den genauen Standort haben, damit die App den Namen des WLAN-Netzwerks ermitteln kann",
"background_options": "Hintergrund Optionen", "background_options": "Hintergrund Optionen",
"backup": "Sicherung", "backup": "Sicherung",
"backup_album_selection_page_albums_device": "Alben auf dem Gerät ({count})", "backup_album_selection_page_albums_device": "Alben auf dem Gerät ({count})",
@@ -652,7 +652,7 @@
"backup_controller_page_background_is_on": "Automatische Sicherung im Hintergrund ist aktiviert", "backup_controller_page_background_is_on": "Automatische Sicherung im Hintergrund ist aktiviert",
"backup_controller_page_background_turn_off": "Hintergrundservice ausschalten", "backup_controller_page_background_turn_off": "Hintergrundservice ausschalten",
"backup_controller_page_background_turn_on": "Hintergrundservice einschalten", "backup_controller_page_background_turn_on": "Hintergrundservice einschalten",
"backup_controller_page_background_wifi": "Nur im WiFi", "backup_controller_page_background_wifi": "Nur im WLAN",
"backup_controller_page_backup": "Sicherung", "backup_controller_page_backup": "Sicherung",
"backup_controller_page_backup_selected": "Ausgewählt: ", "backup_controller_page_backup_selected": "Ausgewählt: ",
"backup_controller_page_backup_sub": "Gesicherte Fotos und Videos", "backup_controller_page_backup_sub": "Gesicherte Fotos und Videos",
@@ -687,7 +687,7 @@
"backup_options_page_title": "Sicherungsoptionen", "backup_options_page_title": "Sicherungsoptionen",
"backup_setting_subtitle": "Verwaltung der Upload-Einstellungen im Hintergrund und im Vordergrund", "backup_setting_subtitle": "Verwaltung der Upload-Einstellungen im Hintergrund und im Vordergrund",
"backup_settings_subtitle": "Upload-Einstellungen verwalten", "backup_settings_subtitle": "Upload-Einstellungen verwalten",
"backup_upload_details_page_more_details": "Tippen für weitere Details", "backup_upload_details_page_more_details": "Tippe für weitere Details",
"backward": "Rückwärts", "backward": "Rückwärts",
"biometric_auth_enabled": "Biometrische Authentifizierung aktiviert", "biometric_auth_enabled": "Biometrische Authentifizierung aktiviert",
"biometric_locked_out": "Du bist von der biometrischen Authentifizierung ausgeschlossen", "biometric_locked_out": "Du bist von der biometrischen Authentifizierung ausgeschlossen",
@@ -697,8 +697,8 @@
"birthdate_set_description": "Das Geburtsdatum wird verwendet, um das Alter dieser Person zum Zeitpunkt eines Fotos zu berechnen.", "birthdate_set_description": "Das Geburtsdatum wird verwendet, um das Alter dieser Person zum Zeitpunkt eines Fotos zu berechnen.",
"blurred_background": "Unscharfer Hintergrund", "blurred_background": "Unscharfer Hintergrund",
"bugs_and_feature_requests": "Fehler & Verbesserungsvorschläge", "bugs_and_feature_requests": "Fehler & Verbesserungsvorschläge",
"build": "Erstelle", "build": "Build",
"build_image": "Bild erstellen", "build_image": "Abbildversion",
"bulk_delete_duplicates_confirmation": "Bist du sicher, dass du {count, plural, one {# duplizierte Datei} other {# duplizierte Dateien gemeinsam}} löschen möchtest? Dabei wird die größte Datei jeder Gruppe behalten und alle anderen Duplikate endgültig gelöscht. Diese Aktion kann nicht rückgängig gemacht werden!", "bulk_delete_duplicates_confirmation": "Bist du sicher, dass du {count, plural, one {# duplizierte Datei} other {# duplizierte Dateien gemeinsam}} löschen möchtest? Dabei wird die größte Datei jeder Gruppe behalten und alle anderen Duplikate endgültig gelöscht. Diese Aktion kann nicht rückgängig gemacht werden!",
"bulk_keep_duplicates_confirmation": "Bist du sicher, dass du {count, plural, one {# duplizierte Datei} other {# duplizierte Dateien}} behalten möchtest? Dies wird alle Duplikat-Gruppen auflösen ohne etwas zu löschen.", "bulk_keep_duplicates_confirmation": "Bist du sicher, dass du {count, plural, one {# duplizierte Datei} other {# duplizierte Dateien}} behalten möchtest? Dies wird alle Duplikat-Gruppen auflösen ohne etwas zu löschen.",
"bulk_trash_duplicates_confirmation": "Bist du sicher, dass du {count, plural, one {# duplizierte Datei} other {# duplizierte Dateien gemeinsam}} in den Papierkorb verschieben möchtest? Dies wird die größte Datei jeder Gruppe behalten und alle anderen Duplikate in den Papierkorb verschieben.", "bulk_trash_duplicates_confirmation": "Bist du sicher, dass du {count, plural, one {# duplizierte Datei} other {# duplizierte Dateien gemeinsam}} in den Papierkorb verschieben möchtest? Dies wird die größte Datei jeder Gruppe behalten und alle anderen Duplikate in den Papierkorb verschieben.",
@@ -728,7 +728,7 @@
"cannot_undo_this_action": "Diese Aktion kann nicht rückgängig gemacht werden!", "cannot_undo_this_action": "Diese Aktion kann nicht rückgängig gemacht werden!",
"cannot_update_the_description": "Beschreibung kann nicht aktualisiert werden", "cannot_update_the_description": "Beschreibung kann nicht aktualisiert werden",
"cast": "Übertragen", "cast": "Übertragen",
"cast_description": "Konfiguration verfügbarer Ziele", "cast_description": "Verfügbare Cast-Ziele konfigurieren",
"change_date": "Datum ändern", "change_date": "Datum ändern",
"change_description": "Beschreibung anpassen", "change_description": "Beschreibung anpassen",
"change_display_order": "Anzeigereihenfolge ändern", "change_display_order": "Anzeigereihenfolge ändern",
@@ -739,7 +739,7 @@
"change_password": "Passwort ändern", "change_password": "Passwort ändern",
"change_password_description": "Dies ist entweder das erste Mal, dass du dich im System anmeldest, oder es wurde eine Anfrage zur Änderung deines Passworts gestellt. Bitte gib unten dein neues Passwort ein.", "change_password_description": "Dies ist entweder das erste Mal, dass du dich im System anmeldest, oder es wurde eine Anfrage zur Änderung deines Passworts gestellt. Bitte gib unten dein neues Passwort ein.",
"change_password_form_confirm_password": "Passwort bestätigen", "change_password_form_confirm_password": "Passwort bestätigen",
"change_password_form_description": "Hallo {name}\n\nDas ist entweder das erste Mal dass du dich einloggst oder es wurde eine Anfrage zur Änderung deines Passwortes gestellt. Bitte gib das neue Passwort ein.", "change_password_form_description": "Hallo {name}\n\nDas ist entweder das erste Mal, dass du dich einloggst oder es wurde eine Anfrage zur Änderung deines Passwortes gestellt. Bitte gib das neue Passwort ein.",
"change_password_form_log_out": "Von allen Geräte abmelden", "change_password_form_log_out": "Von allen Geräte abmelden",
"change_password_form_log_out_description": "Es wird empfohlen, alle anderen Geräte abzumelden", "change_password_form_log_out_description": "Es wird empfohlen, alle anderen Geräte abzumelden",
"change_password_form_new_password": "Neues Passwort", "change_password_form_new_password": "Neues Passwort",
@@ -754,7 +754,7 @@
"charging_requirement_mobile_backup": "Backup im Hintergrund erfordert Aufladen des Geräts", "charging_requirement_mobile_backup": "Backup im Hintergrund erfordert Aufladen des Geräts",
"check_corrupt_asset_backup": "Auf beschädigte Asset-Backups überprüfen", "check_corrupt_asset_backup": "Auf beschädigte Asset-Backups überprüfen",
"check_corrupt_asset_backup_button": "Überprüfung durchführen", "check_corrupt_asset_backup_button": "Überprüfung durchführen",
"check_corrupt_asset_backup_description": "Führe diese Prüfung nur mit aktivierten WiFi durch, nachdem alle Dateien gesichert worden sind. Dieser Vorgang kann ein paar Minuten dauern.", "check_corrupt_asset_backup_description": "Führe diese Prüfung nur mit aktivierten WLAN durch, nachdem alle Dateien gesichert worden sind. Dieser Vorgang kann ein paar Minuten dauern.",
"check_logs": "Logs prüfen", "check_logs": "Logs prüfen",
"checksum": "Prüfsumme", "checksum": "Prüfsumme",
"choose_matching_people_to_merge": "Wähle passende Personen zum Zusammenführen", "choose_matching_people_to_merge": "Wähle passende Personen zum Zusammenführen",
@@ -807,13 +807,13 @@
"completed": "Abgeschlossen", "completed": "Abgeschlossen",
"confirm": "Bestätigen", "confirm": "Bestätigen",
"confirm_admin_password": "Administrator Passwort bestätigen", "confirm_admin_password": "Administrator Passwort bestätigen",
"confirm_delete_face": "Bist du sicher dass du das Gesicht von {name} aus der Datei entfernen willst?", "confirm_delete_face": "Bist du sicher, dass du das Gesicht von {name} aus der Datei entfernen willst?",
"confirm_delete_shared_link": "Bist du sicher, dass du diesen geteilten Link löschen willst?", "confirm_delete_shared_link": "Bist du sicher, dass du diesen geteilten Link löschen willst?",
"confirm_keep_this_delete_others": "Alle anderen Dateien im Stapel bis auf diese werden gelöscht. Bist du sicher, dass du fortfahren möchten?", "confirm_keep_this_delete_others": "Alle anderen Dateien im Stapel bis auf diese werden gelöscht. Bist du sicher, dass du fortfahren möchten?",
"confirm_new_pin_code": "Neuen PIN-Code bestätigen", "confirm_new_pin_code": "Neuen PIN-Code bestätigen",
"confirm_password": "Passwort bestätigen", "confirm_password": "Passwort bestätigen",
"confirm_tag_face": "Wollen Sie dieses Gesicht mit {name} markieren?", "confirm_tag_face": "Wollen Sie dieses Gesicht mit {name} taggen?",
"confirm_tag_face_unnamed": "Möchten Sie dieses Gesicht markieren?", "confirm_tag_face_unnamed": "Möchten Sie dieses Gesicht taggen?",
"connected_device": "Verbundenes Gerät", "connected_device": "Verbundenes Gerät",
"connected_to": "Verbunden mit", "connected_to": "Verbunden mit",
"contain": "Vollständig", "contain": "Vollständig",
@@ -849,9 +849,12 @@
"create_link_to_share": "Link zum Teilen erstellen", "create_link_to_share": "Link zum Teilen erstellen",
"create_link_to_share_description": "Lass jeden mit dem Link die ausgewählten Fotos sehen", "create_link_to_share_description": "Lass jeden mit dem Link die ausgewählten Fotos sehen",
"create_new": "NEUES ERSTELLEN", "create_new": "NEUES ERSTELLEN",
"create_new_face": "Neues Gesicht erstellen",
"create_new_person": "Neue Person anlegen", "create_new_person": "Neue Person anlegen",
"create_new_person_hint": "Ausgewählte Dateien einer neuen Person zuweisen", "create_new_person_hint": "Ausgewählte Dateien einer neuen Person zuweisen",
"create_new_user": "Neuen Nutzer erstellen", "create_new_user": "Neuen Nutzer erstellen",
"create_person": "Person anlegen",
"create_person_subtitle": "Gib dem gewählten Gesicht einen Namen um die neue Person zu erstellen und zu taggen",
"create_shared_album_page_share_add_assets": "INHALTE HINZUFÜGEN", "create_shared_album_page_share_add_assets": "INHALTE HINZUFÜGEN",
"create_shared_album_page_share_select_photos": "Fotos auswählen", "create_shared_album_page_share_select_photos": "Fotos auswählen",
"create_shared_link": "Geteilten Link erstellen", "create_shared_link": "Geteilten Link erstellen",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Fixiert", "crop_aspect_ratio_fixed": "Fixiert",
"crop_aspect_ratio_free": "Frei", "crop_aspect_ratio_free": "Frei",
"crop_aspect_ratio_original": "Original", "crop_aspect_ratio_original": "Original",
"crop_aspect_ratio_square": "Quadratisch",
"curated_object_page_title": "Dinge", "curated_object_page_title": "Dinge",
"current_device": "Aktuelles Gerät", "current_device": "Aktuelles Gerät",
"current_pin_code": "Aktueller PIN-Code", "current_pin_code": "Aktueller PIN-Code",
@@ -880,7 +884,7 @@
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy", "daily_title_text_date_year": "E, dd MMM, yyyy",
"dark": "Dunkel", "dark": "Dunkel",
"dark_theme": "Dunkle Ansicht umschalten", "dark_theme": "Auf dunkle Ansicht umschalten",
"date": "Datum", "date": "Datum",
"date_after": "Datum nach", "date_after": "Datum nach",
"date_and_time": "Datum und Zeit", "date_and_time": "Datum und Zeit",
@@ -891,10 +895,8 @@
"day": "Tag", "day": "Tag",
"days": "Tage", "days": "Tage",
"deduplicate_all": "Alle Duplikate entfernen", "deduplicate_all": "Alle Duplikate entfernen",
"deduplication_criteria_1": "Bildgröße in Bytes", "default_locale": "Standardgebietsschema",
"deduplication_criteria_2": "Anzahl der EXIF-Daten", "default_locale_description": "Datumsangaben und Zahlen werden entsprechend Ihrer Browsereinstellungen formatiert",
"deduplication_info": "Deduplizierungsinformationen",
"deduplication_info_description": "Für die automatische Datei-Vorauswahl und das Deduplizieren aller Dateien berücksichtigen wir:",
"delete": "Löschen", "delete": "Löschen",
"delete_action_confirmation_message": "Bist du sicher, dass du dieses Objekt löschen willst? Diese Aktion wird das Objekt in den Papierkorb des Servers verschieben und fragen, ob du es lokal löschen willst", "delete_action_confirmation_message": "Bist du sicher, dass du dieses Objekt löschen willst? Diese Aktion wird das Objekt in den Papierkorb des Servers verschieben und fragen, ob du es lokal löschen willst",
"delete_action_prompt": "{count} gelöscht", "delete_action_prompt": "{count} gelöscht",
@@ -970,7 +972,7 @@
"downloading_media": "Medien werden heruntergeladen", "downloading_media": "Medien werden heruntergeladen",
"drop_files_to_upload": "Lade Dateien hoch, indem du sie hierhin ziehst", "drop_files_to_upload": "Lade Dateien hoch, indem du sie hierhin ziehst",
"duplicates": "Duplikate", "duplicates": "Duplikate",
"duplicates_description": "Löse jede Gruppe auf, indem du angibst, welche, wenn überhaupt, Duplikate sind", "duplicates_description": "Löse jede Gruppe auf, indem du angibst, welche, wenn überhaupt, Duplikate sind.",
"duration": "Dauer", "duration": "Dauer",
"edit": "Bearbeiten", "edit": "Bearbeiten",
"edit_album": "Album bearbeiten", "edit_album": "Album bearbeiten",
@@ -1024,7 +1026,7 @@
"enabled": "Aktiviert", "enabled": "Aktiviert",
"end_date": "Enddatum", "end_date": "Enddatum",
"enqueued": "Eingereiht", "enqueued": "Eingereiht",
"enter_wifi_name": "WiFi-Name eingeben", "enter_wifi_name": "WLAN-Name eingeben",
"enter_your_pin_code": "PIN-Code eingeben", "enter_your_pin_code": "PIN-Code eingeben",
"enter_your_pin_code_subtitle": "Gib deinen PIN-Code ein, um auf den gesperrten Ordner zuzugreifen", "enter_your_pin_code_subtitle": "Gib deinen PIN-Code ein, um auf den gesperrten Ordner zuzugreifen",
"error": "Fehler", "error": "Fehler",
@@ -1036,7 +1038,7 @@
"error_loading_partners": "Fehler beim Laden der Partner: {error}", "error_loading_partners": "Fehler beim Laden der Partner: {error}",
"error_retrieving_asset_information": "Fehler beim Abruf der Dateiinformationen", "error_retrieving_asset_information": "Fehler beim Abruf der Dateiinformationen",
"error_saving_image": "Fehler: {error}", "error_saving_image": "Fehler: {error}",
"error_tag_face_bounding_box": "Fehler beim Markieren des Gesichts - Begrenzungen können nicht abgerufen werden", "error_tag_face_bounding_box": "Fehler beim Taggen des Gesichts - Begrenzungen können nicht abgerufen werden",
"error_title": "Fehler - Etwas ist schief gelaufen", "error_title": "Fehler - Etwas ist schief gelaufen",
"error_while_navigating": "Fehler beim Navigieren zur Datei", "error_while_navigating": "Fehler beim Navigieren zur Datei",
"errors": { "errors": {
@@ -1081,9 +1083,9 @@
"something_went_wrong": "Ein Fehler ist eingetreten", "something_went_wrong": "Ein Fehler ist eingetreten",
"unable_to_add_album_users": "Benutzer konnten nicht zum Album hinzugefügt werden", "unable_to_add_album_users": "Benutzer konnten nicht zum Album hinzugefügt werden",
"unable_to_add_assets_to_shared_link": "Datei konnte nicht zum geteilten Link hinzugefügt werden", "unable_to_add_assets_to_shared_link": "Datei konnte nicht zum geteilten Link hinzugefügt werden",
"unable_to_add_comment": "Es kann kein Kommentar hinzufügt werden", "unable_to_add_comment": "Es kann kein Kommentar hinzugefügt werden",
"unable_to_add_exclusion_pattern": "Ausschlussmuster konnte nicht hinzugefügt werden", "unable_to_add_exclusion_pattern": "Ausschlussmuster konnte nicht hinzugefügt werden",
"unable_to_add_partners": "Es können keine Partner hinzufügt werden", "unable_to_add_partners": "Es können keine Partner hinzugefügt werden",
"unable_to_add_remove_archive": "Datei konnte nicht {archived, select, true {aus dem Archiv entfernt} other {zum Archiv hinzugefügt}} werden", "unable_to_add_remove_archive": "Datei konnte nicht {archived, select, true {aus dem Archiv entfernt} other {zum Archiv hinzugefügt}} werden",
"unable_to_add_remove_favorites": "Datei konnte nicht {favorite, select, true {von den Favoriten entfernt} other {zu den Favoriten hinzugefügt}} werden", "unable_to_add_remove_favorites": "Datei konnte nicht {favorite, select, true {von den Favoriten entfernt} other {zu den Favoriten hinzugefügt}} werden",
"unable_to_archive_unarchive": "Konnte nicht {archived, select, true {archivieren} other {entarchivieren}}", "unable_to_archive_unarchive": "Konnte nicht {archived, select, true {archivieren} other {entarchivieren}}",
@@ -1240,7 +1242,7 @@
"geolocation_instruction_location": "Klicke auf eine Datei mit GPS Koordinaten um diesen Standort zu verwenden oder wähle einen Standort direkt auf der Karte", "geolocation_instruction_location": "Klicke auf eine Datei mit GPS Koordinaten um diesen Standort zu verwenden oder wähle einen Standort direkt auf der Karte",
"get_help": "Hilfe erhalten", "get_help": "Hilfe erhalten",
"get_people_error": "Fehler beim Laden der Personen", "get_people_error": "Fehler beim Laden der Personen",
"get_wifiname_error": "WiFi-Name konnte nicht ermittelt werden. Vergewissere dich, dass die erforderlichen Berechtigungen erteilt wurden und du mit einem WiFi-Netzwerk verbunden bist", "get_wifiname_error": "Das WLAN-Netz konnte nicht ermittelt werden. Vergewissere dich, dass die erforderlichen Berechtigungen erteilt wurden und du mit einem WLAN-Netzwerk verbunden bist",
"getting_started": "Erste Schritte", "getting_started": "Erste Schritte",
"go_back": "Zurück", "go_back": "Zurück",
"go_to_folder": "Gehe zu Ordner", "go_to_folder": "Gehe zu Ordner",
@@ -1279,7 +1281,7 @@
"home_page_add_to_album_err_local": "Es können lokale Elemente noch nicht zu Alben hinzugefügt werden, überspringen", "home_page_add_to_album_err_local": "Es können lokale Elemente noch nicht zu Alben hinzugefügt werden, überspringen",
"home_page_add_to_album_success": "{added} Elemente zu {album} hinzugefügt.", "home_page_add_to_album_success": "{added} Elemente zu {album} hinzugefügt.",
"home_page_album_err_partner": "Inhalte von Partnern können derzeit nicht zu Alben hinzugefügt werden", "home_page_album_err_partner": "Inhalte von Partnern können derzeit nicht zu Alben hinzugefügt werden",
"home_page_archive_err_local": "Kann lokale Elemente nicht archvieren, überspringen", "home_page_archive_err_local": "Kann lokale Elemente nicht archivieren, überspringen",
"home_page_archive_err_partner": "Inhalte von Partnern können nicht archiviert werden", "home_page_archive_err_partner": "Inhalte von Partnern können nicht archiviert werden",
"home_page_building_timeline": "Zeitachse wird erstellt", "home_page_building_timeline": "Zeitachse wird erstellt",
"home_page_delete_err_partner": "Inhalte von Partnern können nicht gelöscht werden, überspringe", "home_page_delete_err_partner": "Inhalte von Partnern können nicht gelöscht werden, überspringe",
@@ -1387,9 +1389,11 @@
"library_page_sort_title": "Titel des Albums", "library_page_sort_title": "Titel des Albums",
"licenses": "Lizenzen", "licenses": "Lizenzen",
"light": "Hell", "light": "Hell",
"light_theme": "Auf helle Ansicht umschalten",
"like": "Gefällt mir", "like": "Gefällt mir",
"like_deleted": "Like gelöscht", "like_deleted": "Like gelöscht",
"link_motion_video": "Bewegungsvideo verknüpfen", "link_motion_video": "Bewegungsvideo verknüpfen",
"link_to_docs": "Weitere Informationen finden Sie in der <link>Dokumentation</link>.",
"link_to_oauth": "Mit OAuth verknüpfen", "link_to_oauth": "Mit OAuth verknüpfen",
"linked_oauth_account": "Verknüpftes OAuth-Konto", "linked_oauth_account": "Verknüpftes OAuth-Konto",
"list": "Liste", "list": "Liste",
@@ -1404,7 +1408,7 @@
"local_network_sheet_info": "Die App stellt über diese URL eine Verbindung zum Server her, wenn sie das angegebene WLAN-Netzwerk verwendet", "local_network_sheet_info": "Die App stellt über diese URL eine Verbindung zum Server her, wenn sie das angegebene WLAN-Netzwerk verwendet",
"location": "Standort", "location": "Standort",
"location_permission": "Standort Genehmigung", "location_permission": "Standort Genehmigung",
"location_permission_content": "Um die automatische Umschaltfunktion nutzen zu können, benötigt Immich genaue Standortberechtigung, damit es den Namen des aktuellen WiFi-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_choose_on_map": "Auf der Karte auswählen",
"location_picker_latitude_error": "Gültigen Breitengrad eingeben", "location_picker_latitude_error": "Gültigen Breitengrad eingeben",
"location_picker_latitude_hint": "Breitengrad eingeben", "location_picker_latitude_hint": "Breitengrad eingeben",
@@ -1562,7 +1566,7 @@
"name_or_nickname": "Name oder Nickname", "name_or_nickname": "Name oder Nickname",
"name_required": "Name ist erforderlich", "name_required": "Name ist erforderlich",
"navigate": "Navigation", "navigate": "Navigation",
"navigate_to_time": "Navigiere zu Zeit", "navigate_to_time": "Zu Zeitpunkt navigieren",
"network_requirement_photos_upload": "Mobile Daten verwenden, um Fotos zu sichern", "network_requirement_photos_upload": "Mobile Daten verwenden, um Fotos zu sichern",
"network_requirement_videos_upload": "Mobile Daten verwenden, um Videos zu sichern", "network_requirement_videos_upload": "Mobile Daten verwenden, um Videos zu sichern",
"network_requirements": "Anforderungen ans Netzwerk", "network_requirements": "Anforderungen ans Netzwerk",
@@ -1665,7 +1669,7 @@
"other_devices": "Andere Geräte", "other_devices": "Andere Geräte",
"other_entities": "Andere Entitäten", "other_entities": "Andere Entitäten",
"other_variables": "Sonstige Variablen", "other_variables": "Sonstige Variablen",
"owned": "Eigenes", "owned": "Eigene",
"owner": "Besitzer", "owner": "Besitzer",
"page": "Seite", "page": "Seite",
"partner": "Partner", "partner": "Partner",
@@ -1872,7 +1876,7 @@
"repair": "Reparatur", "repair": "Reparatur",
"repair_no_results_message": "Nicht auffindbare und fehlende Dateien werden hier angezeigt", "repair_no_results_message": "Nicht auffindbare und fehlende Dateien werden hier angezeigt",
"replace_with_upload": "Durch Upload ersetzen", "replace_with_upload": "Durch Upload ersetzen",
"repository": "Repositorium", "repository": "Repository",
"require_password": "Passwort erforderlich", "require_password": "Passwort erforderlich",
"require_user_to_change_password_on_first_login": "Benutzer muss das Passwort beim ersten Login ändern", "require_user_to_change_password_on_first_login": "Benutzer muss das Passwort beim ersten Login ändern",
"rescan": "Erneut scannen", "rescan": "Erneut scannen",
@@ -2011,7 +2015,7 @@
"selected_count": "{count, plural, other {# ausgewählt}}", "selected_count": "{count, plural, other {# ausgewählt}}",
"selected_gps_coordinates": "Ausgewählte GPS-Koordinaten", "selected_gps_coordinates": "Ausgewählte GPS-Koordinaten",
"send_message": "Nachricht senden", "send_message": "Nachricht senden",
"send_welcome_email": "Begrüssungsmail senden", "send_welcome_email": "Begrüßungsmail senden",
"server_endpoint": "Server-Endpunkt", "server_endpoint": "Server-Endpunkt",
"server_info_box_app_version": "App-Version", "server_info_box_app_version": "App-Version",
"server_info_box_server_url": "Server-URL", "server_info_box_server_url": "Server-URL",
@@ -2171,7 +2175,7 @@
"sort_people_by_similarity": "Personen nach Ähnlichkeit sortieren", "sort_people_by_similarity": "Personen nach Ähnlichkeit sortieren",
"sort_recent": "Neuestes Foto", "sort_recent": "Neuestes Foto",
"sort_title": "Titel", "sort_title": "Titel",
"source": "Quellcode", "source": "Quelle",
"stack": "Stapel", "stack": "Stapel",
"stack_action_prompt": "{count} gestapelt", "stack_action_prompt": "{count} gestapelt",
"stack_duplicates": "Duplikate stapeln", "stack_duplicates": "Duplikate stapeln",
@@ -2213,6 +2217,7 @@
"tag": "Tag", "tag": "Tag",
"tag_assets": "Dateien taggen", "tag_assets": "Dateien taggen",
"tag_created": "Tag erstellt: {tag}", "tag_created": "Tag erstellt: {tag}",
"tag_face": "Gesicht taggen",
"tag_feature_description": "Durchsuchen von Fotos und Videos, gruppiert nach logischen Tag-Themen", "tag_feature_description": "Durchsuchen von Fotos und Videos, gruppiert nach logischen Tag-Themen",
"tag_not_found_question": "Kein Tag vorhanden? <link>Erstelle einen neuen Tag.</link>", "tag_not_found_question": "Kein Tag vorhanden? <link>Erstelle einen neuen Tag.</link>",
"tag_people": "Personen taggen", "tag_people": "Personen taggen",
@@ -2316,7 +2321,7 @@
"untagged": "Ohne Tag", "untagged": "Ohne Tag",
"untitled_workflow": "Unbenannter Workflow", "untitled_workflow": "Unbenannter Workflow",
"up_next": "Weiter", "up_next": "Weiter",
"update_location_action_prompt": "Aktualsiere den Ort von {count} ausgewählten Dateien mit:", "update_location_action_prompt": "Aktualisiere den Ort von {count} ausgewählten Dateien mit:",
"updated_at": "Aktualisiert", "updated_at": "Aktualisiert",
"updated_password": "Passwort aktualisiert", "updated_password": "Passwort aktualisiert",
"upload": "Hochladen", "upload": "Hochladen",
@@ -2339,7 +2344,7 @@
"url": "URL", "url": "URL",
"usage": "Verwendung", "usage": "Verwendung",
"use_biometric": "Biometrie verwenden", "use_biometric": "Biometrie verwenden",
"use_browser_locale": "Benutze lokalen Browser", "use_browser_locale": "Gebietsschema des Browsers verwenden",
"use_browser_locale_description": "Datum, Uhrzeit und Zahlen werden entsprechend den Einstellungen Ihres Browsers formatiert", "use_browser_locale_description": "Datum, Uhrzeit und Zahlen werden entsprechend den Einstellungen Ihres Browsers formatiert",
"use_current_connection": "Aktuelle Verbindung verwenden", "use_current_connection": "Aktuelle Verbindung verwenden",
"use_custom_date_range": "Stattdessen einen benutzerdefinierten Datumsbereich verwenden", "use_custom_date_range": "Stattdessen einen benutzerdefinierten Datumsbereich verwenden",
@@ -2394,6 +2399,7 @@
"viewer_remove_from_stack": "Aus Stapel entfernen", "viewer_remove_from_stack": "Aus Stapel entfernen",
"viewer_stack_use_as_main_asset": "An Stapelanfang", "viewer_stack_use_as_main_asset": "An Stapelanfang",
"viewer_unstack": "Stapel aufheben", "viewer_unstack": "Stapel aufheben",
"visibility": "Sichtbarkeit",
"visibility_changed": "Sichtbarkeit für {count, plural, one {# Person} other {# Personen}} geändert", "visibility_changed": "Sichtbarkeit für {count, plural, one {# Person} other {# Personen}} geändert",
"visual": "Visuell", "visual": "Visuell",
"visual_builder": "Visueller Editor", "visual_builder": "Visueller Editor",
@@ -2404,7 +2410,7 @@
"welcome": "Willkommen", "welcome": "Willkommen",
"welcome_to_immich": "Willkommen bei Immich", "welcome_to_immich": "Willkommen bei Immich",
"width": "Breite", "width": "Breite",
"wifi_name": "WiFi-Name", "wifi_name": "WLAN-Netzwerk",
"workflow_delete_prompt": "Bist du sicher, dass du diesen Workflow löschen willst?", "workflow_delete_prompt": "Bist du sicher, dass du diesen Workflow löschen willst?",
"workflow_deleted": "Workflow gelöscht", "workflow_deleted": "Workflow gelöscht",
"workflow_description": "Workflow-Beschreibung", "workflow_description": "Workflow-Beschreibung",
@@ -2423,7 +2429,7 @@
"years_ago": "Vor {years, plural, one {einem Jahr} other {# Jahren}}", "years_ago": "Vor {years, plural, one {einem Jahr} other {# Jahren}}",
"yes": "Ja", "yes": "Ja",
"you_dont_have_any_shared_links": "Du hast keine geteilten Links", "you_dont_have_any_shared_links": "Du hast keine geteilten Links",
"your_wifi_name": "Dein WiFi-Name", "your_wifi_name": "Dein WLAN-Netzwerk",
"zero_to_clear_rating": "drücke 0 um die Dateibewertung zurückzusetzen", "zero_to_clear_rating": "drücke 0 um die Dateibewertung zurückzusetzen",
"zoom_image": "Bild vergrößern", "zoom_image": "Bild vergrößern",
"zoom_to_bounds": "Auf Grenzen zoomen" "zoom_to_bounds": "Auf Grenzen zoomen"
+111 -111
View File
@@ -1,132 +1,132 @@
{ {
"about": "Über", "about": "Über",
"account": "Konto", "account": "Konto",
"account_settings": "Konto Istelligä", "account_settings": "Konto Einstellungen",
"acknowledge": "Bestätige", "acknowledge": "Bestätigä",
"action": "Aktion", "action": "Aktion",
"action_common_update": "Update", "action_common_update": "Update",
"action_description": "Es paar Aktione, wo a de gfilterete Assets usgführt wärde sölled", "action_description": "Aktionä, wo uf de gefilterti Mediä ausgführt werdä solled",
"actions": "Aktione", "actions": "Aktionen",
"active": "Aktiv", "active": "Aktiv",
"active_count": "Aktivi: {count}", "active_count": "Aktiv: {count}",
"activity": "Aktivität", "activity": "Aktivität",
"activity_changed": "Aktivität isch {enabled, select, true {aktiviert} other {deaktiviert}}", "activity_changed": "Aktivität ist {enabled, select, true {aktiviert} other {deaktiviert}}",
"add": "Hinzuefüe", "add": "Hinzuefüge",
"add_a_description": "Beschriibig hinzueege", "add_a_description": "Beschreibung hinzufügen",
"add_a_location": "Standort hinzuefüege", "add_a_location": "Standort hinzuefü",
"add_a_name": "Name hinzuefüege", "add_a_name": "Namä hinzefü",
"add_a_title": "Titel hinzuefüege", "add_a_title": "Titel hinzufeügä",
"add_action": "Aktion hinzuefüege", "add_action": "Aktion hinzuefü",
"add_action_description": "Aklicke um en Aktion dure zfüehre", "add_action_description": "Klick do zum e Aktion hinzuefüge",
"add_assets": "Assets hinzufüege", "add_assets": "Mediä hinzuefüge",
"add_birthday": "Geburtstag hinzuefüege", "add_birthday": "Geburtstag hinzuefüge",
"add_endpoint": "Endpunkt hinzuefüge", "add_endpoint": "Endpunkt hinzuefüge",
"add_exclusion_pattern": "Uuschlussmuster hinzueege", "add_exclusion_pattern": "Ausschlussmuster hinzufügen",
"add_filter": "Filter hinzuefüge", "add_filter": "Filter hinzufügen",
"add_filter_description": "Klicke, um e Filterbedingig hinzuezfüege", "add_filter_description": "Klicke hier um eine Filterbedingung hinzuzufügen",
"add_location": "Standort hinzueege", "add_location": "Standort hinzufügen",
"add_more_users": "Meh Benutzer hinzueege", "add_more_users": "Mehr Benutzer hinzufügen",
"add_partner": "Partner hinzueege", "add_partner": "Partner hinzufügen",
"add_path": "Pfad hinzueege", "add_path": "Pfad hinzufügen",
"add_photos": "Föteli hinzueege", "add_photos": "Fotos hinzufügen",
"add_tag": "Tag hinzueege", "add_tag": "Tag hinzufügen",
"add_to": "Hinzueege zu …", "add_to": "Hinzufügen zu…",
"add_to_album": "Zum Album hinzueege", "add_to_album": "Zu Album hinzufügen",
"add_to_album_bottom_sheet_added": "Zu {album} hinzuegfüegt", "add_to_album_bottom_sheet_added": "Zu {album} hinzugefügt",
"add_to_album_bottom_sheet_already_exists": "Scho in {album}", "add_to_album_bottom_sheet_already_exists": "Bereits in {album}",
"add_to_album_bottom_sheet_some_local_assets": "Es hend es paar lokali Dateie nöd chöne im Album hinzuegfüegt werde", "add_to_album_bottom_sheet_some_local_assets": "Einige lokale Dateien konnten nicht zum Album hinzugefügt werden",
"add_to_album_toggle": "Uuswahl umschalte für {album}", "add_to_album_toggle": "Auswahl umschalten für {album}",
"add_to_albums": "Zu Albe hinzueege", "add_to_albums": "Zu Alben hinzufügen",
"add_to_albums_count": "Zu Albe hinzueege ({count})", "add_to_albums_count": "Zu Alben hinzufügen ({count})",
"add_to_bottom_bar": "Hinzueege zu", "add_to_bottom_bar": "Hinzufügen zu",
"add_to_shared_album": "Zum teilte Album hinzueege", "add_to_shared_album": "Zu geteiltem Album hinzufügen",
"add_upload_to_stack": "Upload zum Stack hinzueege", "add_upload_to_stack": "Upload zum Stapel hinzufügen",
"add_url": "URL hinzueege", "add_url": "URL hinzufügen",
"add_workflow_step": "Workflow-Schritt hinzueege", "add_workflow_step": "Workflow-Schritt hinzufügen",
"added_to_archive": "Is Archiv verschobe", "added_to_archive": "Zum Archiv hinzugefügt",
"added_to_favorites": "Zu dine Favoritä hinzuegfüegt", "added_to_favorites": "Zu Favoriten hinzugefügt",
"added_to_favorites_count": "{count, number} zu Favorite hinzuegfüegt", "added_to_favorites_count": "{count, number} zu Favoriten hinzugefügt",
"admin": { "admin": {
"add_exclusion_pattern_description": "Uusschlussmuster hinzuefüge. Platzhalter, wie *, **, und ? wärded understützt. Zum all Dateie i eim Verzeichnis namens „Raw\" ignoriere, „**/Raw/**“ verwände. Zum all Dateien ignorieren, wo uf „.tif“ änded, „**/*.tif“ verwände. Zum en absolute Pfad ignoriere, „/pfad/zum/ignoriere/**“ verwände.", "add_exclusion_pattern_description": "Ausschlussmuster hinzufügen. Platzhalter, wie *, **, und ? werden unterstützt. Um alle Dateien in einem Verzeichnis namens „Raw“ zu ignorieren, „**/Raw/**“ verwenden. Um alle Dateien zu ignorieren, die auf „.tif“ enden, „**/*.tif“ verwenden. Um einen absoluten Pfad zu ignorieren, „/pfad/zum/ignorieren/**“ verwenden.",
"admin_user": "Admin Benutzer", "admin_user": "Administrator",
"asset_offline_description": "Die Datei vonere externe Bibliothek isch nümme uf de Festplatte und isch in Papierchorb verschobe worde. Falls die Datei innerhalb vo de Bibliothek verschoben worde isch, überprüf dini Ziitleiste uf die neui entsprechendi Datei. Zum die Datei wiederherstelle, stell bitte sicher, dass Immich uf de unde stehendi Dateipfad chan zuegriife und scann d'Bibliothek.", "asset_offline_description": "Diese Datei einer externen Bibliothek befindet sich nicht mehr auf der Festplatte und wurde in den Papierkorb verschoben. Falls die Datei innerhalb der Bibliothek verschoben wurde, überprüfe deine Zeitleiste auf die neue entsprechende Datei. Um diese Datei wiederherzustellen, stelle bitte sicher, dass Immich auf den unten stehenden Dateipfad zugreifen kann und scanne die Bibliothek.",
"authentication_settings": "Authentifizierigs Iistellige", "authentication_settings": "Authentifizierungseinstellungen",
"authentication_settings_description": "Passwort, OAuth und anderi Authentifizierigseinstellige verwalte", "authentication_settings_description": "Passwort-, OAuth- und andere Authentifizierungseinstellungen verwalten",
"authentication_settings_disable_all": "Bisch sicher, dass du alli Login-Methodä wotsch deaktivierä? S Login isch denn komplett deaktiviert.", "authentication_settings_disable_all": "Bist du sicher, dass du alle Loginmethoden deaktivieren willst? Die Anmeldung wird vollständig deaktiviert.",
"authentication_settings_reenable": "Bruuch ein <link>Server-Befehl</link> zum reaktiviere.", "authentication_settings_reenable": "Nutze einen <link>Server-Befehl</link> zur Reaktivierung.",
"background_task_job": "Hintergrund Ufgabä", "background_task_job": "Hintergrundaufgaben",
"backup_database": "Datenbank-Dump aalege", "backup_database": "Datenbanksicherung erstellen",
"backup_database_enable_description": "Datenbank-Dumps aktiviere", "backup_database_enable_description": "Datenbank regelmässig sichern",
"backup_keep_last_amount": "Aazahl vo de vorherige Dumps, wo bhalte werde sölle", "backup_keep_last_amount": "Anzahl der aufzubewahrenden früheren Sicherungen",
"backup_onboarding_1_description": "Offsite-Kopie i dä Cloud oder amene andere physische Standort.", "backup_onboarding_1_description": "Offsite-Kopie in der Cloud oder an einem anderen physischen Ort.",
"backup_onboarding_2_description": "Lokali Kopie uf verschiedene Grät. Das beinhaltet d Hauptdateie und e lokali Sicherig vo dene Dateie.", "backup_onboarding_2_description": "lokale Kopien auf verschiedenen Geräten. Dazu gehören die Hauptdateien und eine lokale Sicherung dieser Dateien.",
"backup_onboarding_3_description": "Total aazahl vo dine Dateikopie, inklusiv d Originaldateie. Das beinhaltet 1 Offsite-Kopie und 2 lokali Kopie.", "backup_onboarding_3_description": "Kopien deiner Daten inklusive Originaldateien. Dies umfasst 1 Kopie an einem anderen Ort und 2 lokale Kopien.",
"backup_onboarding_description": "E <backblaze-link>3-2-1-Backup-Strategie</backblaze-link> wird empfohle, zum dini Dateie z schütze. Du söttsch sowohl Kopie vo dine ufgeladene Fotos/Videos wie au d Immich-Datenbank bhalte, für e rundum sauberi Backup-Lösig.", "backup_onboarding_description": "Eine <backblaze-link>3-2-1 Sicherungsstrategie</backblaze-link> wird empfohlen, um deine Daten zu schützen. Du solltest sowohl Kopien deiner hochgeladenen Fotos/Videos als auch der Immich-Datenbank aufbewahren, um eine umfassende Sicherungslösung zu haben.",
"backup_onboarding_footer": "Für meh Infos zum Backup vo Immich lueg bitte i d <link>Dokumentation</link>.", "backup_onboarding_footer": "Weitere Informationen zum Sichern von Immich findest du in der <link>Dokumentation</link>.",
"backup_onboarding_parts_title": "Es 3-2-1-Backup beinhaltet:", "backup_onboarding_parts_title": "Eine 3-2-1-Sicherung umfasst:",
"backup_onboarding_title": "Backups", "backup_onboarding_title": "Backups",
"backup_settings": "Iistellige für Datenbank-Dumps", "backup_settings": "Einstellungen für Datenbanksicherung",
"backup_settings_description": "Datenbank-Dump-Iistellige verwalte.", "backup_settings_description": "Einstellungen zur regelmässigen Sicherung der Datenbank.",
"cleared_jobs": "Jobs glöscht für: {job}", "cleared_jobs": "Folgende Aufgaben zurückgesetzt: {job}",
"config_set_by_file": "D Konfiguration isch aktuell dur e Konfigurationsdatei gsetzt", "config_set_by_file": "Die Konfiguration ist aktuell durch eine Konfigurationsdatei gsetzt",
"confirm_delete_library": "Bisch sicher, dass du d Bibliothek {library} wotsch lösche?", "confirm_delete_library": "Bist du sicher, dass du die Bibliothek {library} löschen willst?",
"confirm_delete_library_assets": "Bisch sicher, dass du die Bibliothek wotsch lösche? Das löscht {count, plural, one {# enthaltenes Asset} other {alli # enthaltene Assets}} us Immich und chan nöd rückgängig gmacht werde. D Dateie bliibed uf em Dateträger.", "confirm_delete_library_assets": "Bist du sicher, dass du diese Bibliothek löschen willst? Dies löscht {count, plural, one {# enthaltene Datei} other {alle # enthaltenen Dateien}} aus Immich und kann nicht rückgängig gemacht werden. Die Dateien bleiben auf der Festplatte erhalten.",
"confirm_email_below": "Zum bestätige bitte \"{email}\" une iitippe", "confirm_email_below": "Zum Bestätigen, tippe unten \"{email}\" ein",
"confirm_reprocess_all_faces": "Bisch sicher, dass du alli Gsichter neu verarbeite wotsch? Däbii werde au benannti Persone glöscht.", "confirm_reprocess_all_faces": "Bist du sicher, dass du alle Gesichter erneut verarbeiten möchtest? Dies löscht auch alle bereits benannten Personen.",
"confirm_user_password_reset": "Bisch sicher, dass du s Passwort für {user} möchtisch zruggsetze?", "confirm_user_password_reset": "Bist du sicher, dass du das Passwort für {user} zurücksetzen möchtest?",
"confirm_user_pin_code_reset": "Bisch sicher, dass du de PIN-Code vo {user} möchtisch zruggsetze?", "confirm_user_pin_code_reset": "Bist du sicher, dass du den PIN-Code von {user} zurücksetzen möchtest?",
"copy_config_to_clipboard_description": "Kopier die aktuelli Systemkonfiguration als JSON-Objekt i d'Zwüschenablage", "copy_config_to_clipboard_description": "Aktuelle Systemkonfiguration als JSON-Objekt in die Zwischenablage kopieren",
"create_job": "Uufgabe erstelle", "create_job": "Aufgabe erstellen",
"cron_expression": "Cron-Ziitagabe", "cron_expression": "Cron-Ausdruck",
"cron_expression_description": "Setz s Scanintervall im Cron-Format. Hilf mit däm Format bütet z. B. der <link>Crontab Guru</link>", "cron_expression_description": "Setze das Scanintervall im Cron-Format. Für mehr Informationen, siehe z. B. <link>Crontab Guru</link>",
"cron_expression_presets": "Vorlage für Cron-Uusdruck", "cron_expression_presets": "Vorlagen für Cron-Ausdrücke",
"disable_login": "Login deaktiviere", "disable_login": "Login deaktivieren",
"duplicate_detection_job_description": "Die Uufgab füehrt s maschinelle Lärne für jedi Datei us, zum Duplikat finde. Die Uufgabe berueht uf de intelligente Suechi", "duplicate_detection_job_description": "Verwendet maschinelles Lernen auf den Dateien, um Duplikate zu finden. Baut auf der intelligenten Suche auf",
"exclusion_pattern_description": "Mit Uusschlussmuster chönnd Dateie und Ordner bim Scanne vo dinere Bibliothek ignoriert wärde. Das isch nützlich, wenn du Ordner häsch, wo Dateien drin händ, wo d nöd wotsch importiere, wie z. B. RAW-Dateie.", "exclusion_pattern_description": "Mit Ausschlussmustern können Dateien und Ordner beim Scannen deiner Bibliothek ignoriert werden. Dies ist nützlich, wenn du Ordner hast, die Dateien enthalten, die du nicht importieren möchtest, wie z. B. RAW-Dateien.",
"export_config_as_json_description": "Lad die aktuelli Systemkonfiguration als JSON-Datei abe", "export_config_as_json_description": "Aktuelle Systemkonfiguration als JSON-Datei herunterladen",
"external_libraries_page_description": "Externi Bibliothekssiite für Administratore", "external_libraries_page_description": "Externe Bibliotheksseite für Administratoren",
"face_detection": "Gsichtserkennig", "face_detection": "Gesichtserkennung",
"face_detection_description": "Die Uufgab erfasst Gsichter in Dateien dur maschinells Lerne. Bi Video wird nur d'Miniaturasicht brucht. „Aktualisiere“ verarbeitet all Dateie neu. „Zruggsetze“ setzt au no all Gsichter zrugg. „Fehlendistellt nur nöd verarbeiteti Dateie in d'Warteschlange. Erfassti Gsichter wärdet zur Gsichtsidentifizierig in diWarteschlange gstellt, damit sie i bestehendi oder neui Persone z'gruppiere.", "face_detection_description": "Diese Aufgabe erkennt mit maschinellem Lernen Gesichter in Dateien. Bei Videos wird nur das Vorschaubild verwendet. „Aktualisieren“ verarbeitet alle Dateien neu. „Zurücksetzen“ setzt zusätzlich alle Gesichter zurück. „Fehlendefügt nur nicht verarbeitete Dateien in die Warteschlange ein. Erfasste Gesichter werden zur Gesichtsidentifizierung in die Warteschlange eingefügt, um sie in bestehende oder neue Personen zu gruppieren.",
"facial_recognition_job_description": "Die Uufgabe gruppiert im Anschluss an d'Gsichtserfassig die erfasste Gsichter zu Persone. „Zruggsetze“ gruppiert alli Gsichter neu und mit „Fehlendi“ werdet Gsichter ohni Zuordnig i d'Warteschlange gstellt.", "facial_recognition_job_description": "Diese Aufgabe gruppiert im Anschluss an die Gesichtserkennung die erkannten Gesichter zu Personen. „Zurücksetzen“ gruppiert alle Gesichter neu, während „Fehlende“ Gesichter ohne Zuordnung in die Warteschlange stellt.",
"failed_job_command": "Befehl {command} t für d'Uufgabe {job} nöd funktioniert", "failed_job_command": "Befehl {command} ist für Aufgabe {job} fehlgeschlagen",
"force_delete_user_warning": "WARNIG: Die Aktion löscht Benutzer und all sini Dateie. Das chann nöd rückgängig gmacht wärde und d'Dateie chönnd nöd wiederhergstellt wärde.", "force_delete_user_warning": "WARNUNG: Diese Aktion löscht sofort den Benutzer und all seine Dateien. Dies kann nicht rückgängig gemacht werden und die Dateien können nicht wiederhergestellt werden.",
"image_format": "Format", "image_format": "Format",
"image_format_description": "WebP erzeugt chlineri Dateie we JPEG, isch aber es bitz langsamer i de Erstellig.", "image_format_description": "WebP erzeugt kleinere Dateien als JPEG, ist aber etwas langsamer in der Erstellung.",
"image_fullsize_description": "Hochuflösends Bild mit glöschte Metadate, wo bim Zoome brucht wird", "image_fullsize_description": "Hochauflösendes Bild mit entfernten Metadaten, das beim Zoomen verwendet wird",
"image_fullsize_enabled": "Hochuflösendi Vorschaubilder aktiviere", "image_fullsize_enabled": "Hochauflösende Vorschaubilder aktivieren",
"image_fullsize_enabled_description": "Generiere hochauflösende Vorschaubilder in Originalauflösung für nicht web-kompatibel Formate. Wenn \"Eingebettete Vorschau bevorzugen\" aktiviert ist, werden eingebettete Vorschaubilder direkt verwendet. Hat keinen Einfluss auf web-kompatible Formate wie JPEG.", "image_fullsize_enabled_description": "Generiere Vorschaubilder in Originalauflösung für nicht web-kompatible Formate. Wenn \"Eingebettete Vorschau bevorzugen\" aktiviert ist, werden eingebettete Vorschaubilder direkt verwendet. Hat keinen Einfluss auf web-kompatible Formate wie JPEG.",
"image_fullsize_quality_description": "Qualität der hochauflösenden Vorschaubilder von 1-100. Höher ist besser, erzeugt aber grössere Dateien.", "image_fullsize_quality_description": "Qualität der hochauflösenden Vorschaubilder von 1-100. Höher ist besser, erzeugt aber grössere Dateien.",
"image_fullsize_title": "Hochauflösende Vorschaueinstellungen", "image_fullsize_title": "Hochauflösende Vorschaueinstellungen",
"image_prefer_embedded_preview": "Eingebettete Vorschau bevorzugen", "image_prefer_embedded_preview": "Eingebettete Vorschau bevorzugen",
"image_prefer_embedded_preview_setting_description": "Verwende eingebettete Vorschaubilder in RAW-Fotos als Grundlage für die Bildverarbeitung, sofern diese zur Verfügung stehen. Dies kann bei einigen Bildern genauere Farben erzeugen, allerdings ist die Qualität der Vorschau kameraabhängig und das Bild kann mehr Kompressionsartefakte aufweisen.", "image_prefer_embedded_preview_setting_description": "Verwende eingebettete Vorschaubilder in RAW-Fotos als Grundlage für die Bildverarbeitung, sofern diese zur Verfügung stehen. Dies kann bei einigen Bildern genauere Farben erzeugen, allerdings ist die Qualität der Vorschau kameraabhängig und das Bild kann mehr Kompressionsartefakte aufweisen.",
"image_prefer_wide_gamut": "Breites Spektrum bevorzugen", "image_prefer_wide_gamut": "Breites Spektrum bevorzugen",
"image_prefer_wide_gamut_setting_description": "Bruuch Display P3 für Vorschaubildli. Das erhaltet d'Vitalität von Bildli mit grossem Farbruum besser. Uf alte Grät mit alte Browser chann das aber andersch uusgseh. sRGB-Bildli wärdet als sRGB bhalte zum Farbänderige vermiide.", "image_prefer_wide_gamut_setting_description": "Display P3 (DCI-P3) für Vorschaubilder verwenden. Dadurch bleibt die Lebendigkeit von Bildern mit breiten Farbräumen besser erhalten, aber die Bilder können auf älteren Geräten mit einer älteren Browserversion etwas anders aussehen. sRGB-Bilder werden im sRGB-Format belassen, um Farbverschiebungen zu vermeiden.",
"image_preview_description": "Mittelgrossi Bildli ohni Metadate, bruuchts für Einzelaasichte und fürs maschinelle Lärne", "image_preview_description": "Mittelgrosses Bild mit entfernten Metadaten, das bei der Betrachtung einer einzelnen Datei und für maschinelles Lernen verwendet wird",
"image_preview_quality_description": "Vorschauqualität vo 1-100. Höcher isch besser, git aber grösseri Dateie und chan d'App Schwuppdizität reduziere. Z tüffi Wert chönnd s maschinelle Lärne beiträchtige.", "image_preview_quality_description": "Vorschauqualität von 1-100. Ein höherer Wert ist besser, erzeugt dadurch aber grössere Dateien und kann die Reaktionsfähigkeit der App beeinträchtigen. Ein niedriger Wert kann dafür aber die Qualität des maschinellen Lernens beeinträchtigen.",
"image_preview_title": "Vorschauiistellige", "image_preview_title": "Vorschaueinstellungen",
"image_progressive": "Fortlaufend", "image_progressive": "Fortlaufend",
"image_progressive_description": "Codier fortlaufendi JPEG-Bildi: Sie wärdet bim Lade aufbauend aazeiget. Das hät kei Würkig uf WebP-Bildi.", "image_progressive_description": "JPEG-Bilder schrittweise kodieren, um ein stufenweises Laden zu ermöglichen. Dies hat keine Auswirkungen auf WebP-Bilder.",
"image_quality": "Qualität", "image_quality": "Qualität",
"image_resolution": "Uuflösig", "image_resolution": "Auflösung",
"image_resolution_description": "Höcheri Uuflösig erhaltet meh Detail, gaht aber länger zum codiere, macht grösseri Dateie und chan d'App Schuppdizität reduziere.", "image_resolution_description": "Höhere Auflösungen können mehr Details erhalten, benötigen aber mehr Zeit für die Kodierung, haben grössere Dateigrössen und können die Reaktionsfähigkeit der App beeinträchtigen.",
"image_settings": "Bild-Iistellige", "image_settings": "Bildeinstellungen",
"image_settings_description": "Qualität und Uuflösig von erstellte Bildli verwalte", "image_settings_description": "Qualität und Auflösung der generierten Bilder verwalten",
"image_thumbnail_description": "Chlini Vorschaubildli ohni Metadate, bruuchts für Aasichte mit Gruppe vo Föteli wie i de Hauptziitachse", "image_thumbnail_description": "Kleines Vorschaubild mit entfernten Metadaten, die bei der Anzeige von Sammlungen von Fotos wie der Zeitleiste verwendet wird",
"image_thumbnail_quality_description": "Vorschauqualität vo 1-100. Höcher isch besser, git aber grösseri Dateie und chan d'App Schwuppdizität reduziere.", "image_thumbnail_quality_description": "Qualität der Vorschaubilder von 1-100. Höher ist besser, erzeugt aber grössere Dateien und kann die Reaktionsfähigkeit der App beeinträchtigen.",
"image_thumbnail_title": "Iistellige für Vorschaubildli", "image_thumbnail_title": "Einstellungen für Vorschaubilder",
"import_config_from_json_description": "Systemkonfiguration importiere durs Ufelade vonere JSON-Datei", "import_config_from_json_description": "Systemkonfiguration von hochgeladener JSON-Konfigurationsdatei importieren",
"job_concurrency": "{job} Näbeläufigkeit", "job_concurrency": "{job} (Anzahl gleichzeitig laufende Prozesse)",
"job_created": "Uufgab erstellt", "job_created": "Aufgabe erstellt",
"job_not_concurrency_safe": "Die Uufgabe ist nöd für Paralleluusführig gmacht.", "job_not_concurrency_safe": "Diese Aufgabe kann nicht mehrmals parallel laufen gelassen werden.",
"job_settings": "Uufgabe-Iistellige", "job_settings": "Aufgabeneinstellungen",
"job_settings_description": "Uufgabe-Näbeläufigkeit verwalte", "job_settings_description": "Gleichzeitige Ausführung von Aufgaben verwalten",
"jobs_over_time": "Uufgabe in ziitliche Verlauf", "jobs_over_time": "Jobs im Laufe der Zeit",
"library_created": "Bibliothek erstellt: {library}", "library_created": "Bibliothek erstellt: {library}",
"library_deleted": "Bibliothek glöscht", "library_deleted": "Bibliothek gelöscht",
"library_details": "Bibliotheks-Details", "library_details": "Bibliotheksdetails",
"library_folder_description": "Gib en Order zum Importiere a. Dä Order mit sine Underordner wird nach Bildli und Videos durchsucht.", "library_folder_description": "Wähle einen Ordner zum Importieren. Dieser Ordner wird inklusive Unterordnern nach Bildern und Videos durchsucht.",
"library_remove_exclusion_pattern_prompt": "Bisch sicher, dass das Uuschluss-Muster wotsch lösche?", "library_remove_exclusion_pattern_prompt": "Bilst du sicher, dass du dieses Ausschlussmuster entfernen möchtest?",
"library_remove_folder_prompt": "Bisch sicher, dass dä Import-Ordner wotsch lösche?", "library_remove_folder_prompt": "Bist du sicher, dass du diesen Import-Ordner entfernen möchtest?",
"library_scanning": "Regelmässigi Überprüefig" "library_scanning": "Regelmässiges Scannen"
} }
} }
+14 -8
View File
@@ -441,7 +441,7 @@
"user_successfully_removed": "Ο χρήστης {email} αφαιρέθηκε με επιτυχία.", "user_successfully_removed": "Ο χρήστης {email} αφαιρέθηκε με επιτυχία.",
"users_page_description": "Σελίδα χρηστών διαχειριστή", "users_page_description": "Σελίδα χρηστών διαχειριστή",
"version_check_enabled_description": "Ενεργοποίηση ελέγχου έκδοσης", "version_check_enabled_description": "Ενεργοποίηση ελέγχου έκδοσης",
"version_check_implications": "Η λειτουργία ελέγχου έκδοσης, εξαρτάται από την περιοδική επικοινωνία με το github.com", "version_check_implications": "Η λειτουργία ελέγχου έκδοσης, εξαρτάται από την περιοδική επικοινωνία με το {server}",
"version_check_settings": "Έλεγχος εκδοσης", "version_check_settings": "Έλεγχος εκδοσης",
"version_check_settings_description": "Ενεργοποίηση/απενεργοποίηση της ειδοποίησης για νέα έκδοση", "version_check_settings_description": "Ενεργοποίηση/απενεργοποίηση της ειδοποίησης για νέα έκδοση",
"video_conversion_job": "Μετατροπή βίντεο", "video_conversion_job": "Μετατροπή βίντεο",
@@ -849,9 +849,12 @@
"create_link_to_share": "Δημιουργία συνδέσμου για διαμοιρασμό", "create_link_to_share": "Δημιουργία συνδέσμου για διαμοιρασμό",
"create_link_to_share_description": "Επιτρέψτε σε οποιονδήποτε έχει τον σύνδεσμο να δει τη/τις επιλεγμένη/ες φωτογραφία/ες", "create_link_to_share_description": "Επιτρέψτε σε οποιονδήποτε έχει τον σύνδεσμο να δει τη/τις επιλεγμένη/ες φωτογραφία/ες",
"create_new": "ΔΗΜΙΟΥΡΓΙΑ ΝΕΟΥ", "create_new": "ΔΗΜΙΟΥΡΓΙΑ ΝΕΟΥ",
"create_new_person": "Δημιουργία νέου προσώπου", "create_new_face": "Δημιουργία νέου προσώπου",
"create_new_person": "Δημιουργία νέου ατόμου",
"create_new_person_hint": "Αντιστοίχιση των επιλεγμένων αρχείων σε ένα νέο πρόσωπο", "create_new_person_hint": "Αντιστοίχιση των επιλεγμένων αρχείων σε ένα νέο πρόσωπο",
"create_new_user": "Δημιουργία νέου χρήστη", "create_new_user": "Δημιουργία νέου χρήστη",
"create_person": "Δημιουργία ατόμου",
"create_person_subtitle": "Προσθέστε ένα όνομα στο επιλεγμένο πρόσωπο για να δημιουργηθεί και να επισημανθεί το νέο άτομο",
"create_shared_album_page_share_add_assets": "ΠΡΟΣΘΗΚΗ ΣΤΟΙΧΕΙΩΝ", "create_shared_album_page_share_add_assets": "ΠΡΟΣΘΗΚΗ ΣΤΟΙΧΕΙΩΝ",
"create_shared_album_page_share_select_photos": "Επιλέξτε Φωτογραφίες", "create_shared_album_page_share_select_photos": "Επιλέξτε Φωτογραφίες",
"create_shared_link": "Δημιουργία κοινόχρηστου συνδέσμου", "create_shared_link": "Δημιουργία κοινόχρηστου συνδέσμου",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Διορθώθηκε", "crop_aspect_ratio_fixed": "Διορθώθηκε",
"crop_aspect_ratio_free": "Ελεύθερο", "crop_aspect_ratio_free": "Ελεύθερο",
"crop_aspect_ratio_original": "Αυθεντικό", "crop_aspect_ratio_original": "Αυθεντικό",
"crop_aspect_ratio_square": "Τετράγωνο",
"curated_object_page_title": "Πράγματα", "curated_object_page_title": "Πράγματα",
"current_device": "Τρέχουσα συσκευή", "current_device": "Τρέχουσα συσκευή",
"current_pin_code": "Τρέχων κωδικός PIN", "current_pin_code": "Τρέχων κωδικός PIN",
@@ -880,7 +884,7 @@
"daily_title_text_date": "Ε, MMM dd", "daily_title_text_date": "Ε, MMM dd",
"daily_title_text_date_year": "Ε, MMM dd, yyyy", "daily_title_text_date_year": "Ε, MMM dd, yyyy",
"dark": "Σκούρο", "dark": "Σκούρο",
"dark_theme": "Εναλλαγή σκοτεινής εμφάνισης", "dark_theme": "Μετάβαση σε σκοτεινό θέμα",
"date": "Ημερομηνία", "date": "Ημερομηνία",
"date_after": "Ημερομηνία μετά", "date_after": "Ημερομηνία μετά",
"date_and_time": "Ημερομηνία και ώρα", "date_and_time": "Ημερομηνία και ώρα",
@@ -891,10 +895,8 @@
"day": "Ημέρα", "day": "Ημέρα",
"days": "Ημέρες", "days": "Ημέρες",
"deduplicate_all": "Αφαίρεση όλων των διπλότυπων", "deduplicate_all": "Αφαίρεση όλων των διπλότυπων",
"deduplication_criteria_1": "Μέγεθος εικόνας σε byte", "default_locale": "Προεπιλεγμένη γλώσσα",
"deduplication_criteria_2": "Αριθμός δεδομένων EXIF", "default_locale_description": "Μορφοποίηση ημερομηνιών και αριθμών, βάση της γλώσσας του προγράμματος περιήγησης",
"deduplication_info": "Πληροφορίες Αφαίρεσης Διπλοτύπων",
"deduplication_info_description": "Για να προεπιλέξουμε αυτόματα τα αρχεία και να αφαιρέσουμε τα διπλότυπα σε μαζική επεξεργασία, εξετάζουμε σε:",
"delete": "Διαγραφή", "delete": "Διαγραφή",
"delete_action_confirmation_message": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αρχείο; Αυτή η ενέργεια θα το μετακινήσει στον κάδο απορριμμάτων του διακομιστή και θα εμφανιστεί μήνυμα για το αν θέλετε να το διαγράψετε και τοπικά", "delete_action_confirmation_message": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αρχείο; Αυτή η ενέργεια θα το μετακινήσει στον κάδο απορριμμάτων του διακομιστή και θα εμφανιστεί μήνυμα για το αν θέλετε να το διαγράψετε και τοπικά",
"delete_action_prompt": "{count} διαγράφηκαν", "delete_action_prompt": "{count} διαγράφηκαν",
@@ -970,7 +972,7 @@
"downloading_media": "Λήψη πολυμέσων", "downloading_media": "Λήψη πολυμέσων",
"drop_files_to_upload": "Σύρετε αρχεία εδώ για να τα ανεβάσετε", "drop_files_to_upload": "Σύρετε αρχεία εδώ για να τα ανεβάσετε",
"duplicates": "Διπλότυπα", "duplicates": "Διπλότυπα",
"duplicates_description": "Επιλύστε κάθε ομάδα υποδεικνύοντας ποιες είναι διπλότυπες, εάν υπάρχουν", "duplicates_description": "Επιλύστε κάθε ομάδα υποδεικνύοντας ποιες, εάν υπάρχουν, είναι διπλότυπες.",
"duration": "Διάρκεια", "duration": "Διάρκεια",
"edit": "Επεξεργασία", "edit": "Επεξεργασία",
"edit_album": "Επεξεργασία άλμπουμ", "edit_album": "Επεξεργασία άλμπουμ",
@@ -1387,9 +1389,11 @@
"library_page_sort_title": "Τίτλος άλμπουμ", "library_page_sort_title": "Τίτλος άλμπουμ",
"licenses": "Άδειες", "licenses": "Άδειες",
"light": "Φωτεινό", "light": "Φωτεινό",
"light_theme": "Μετάβαση σε φωτεινό θέμα",
"like": "Μου αρέσει", "like": "Μου αρέσει",
"like_deleted": "Το \"μου αρέσει\" διαγράφηκε", "like_deleted": "Το \"μου αρέσει\" διαγράφηκε",
"link_motion_video": "Σύνδεσε βίντεο κίνησης", "link_motion_video": "Σύνδεσε βίντεο κίνησης",
"link_to_docs": "Για περισσότερες πληροφορίες, ανατρέξτε στην <link>τεκμηρίωση</link>.",
"link_to_oauth": "Σύνδεση στον OAuth", "link_to_oauth": "Σύνδεση στον OAuth",
"linked_oauth_account": "Ο OAuth λογαριασμός συνδέθηκε", "linked_oauth_account": "Ο OAuth λογαριασμός συνδέθηκε",
"list": "Λίστα", "list": "Λίστα",
@@ -2213,6 +2217,7 @@
"tag": "Ετικέτα", "tag": "Ετικέτα",
"tag_assets": "Ετικετοποίηση στοιχείων", "tag_assets": "Ετικετοποίηση στοιχείων",
"tag_created": "Δημιουργήθηκε ετικέτα: {tag}", "tag_created": "Δημιουργήθηκε ετικέτα: {tag}",
"tag_face": "Επισήμανση προσώπου",
"tag_feature_description": "Περιήγηση σε φωτογραφίες και βίντεο που είναι οργανωμένα σύμφωνα με λογικά θέματα ετικετών", "tag_feature_description": "Περιήγηση σε φωτογραφίες και βίντεο που είναι οργανωμένα σύμφωνα με λογικά θέματα ετικετών",
"tag_not_found_question": "Δεν μπορείτε να βρείτε μια ετικέτα; <link>Δημιουργήστε μια νέα ετικέτα.</link>", "tag_not_found_question": "Δεν μπορείτε να βρείτε μια ετικέτα; <link>Δημιουργήστε μια νέα ετικέτα.</link>",
"tag_people": "Επισήμανση ατόμων", "tag_people": "Επισήμανση ατόμων",
@@ -2394,6 +2399,7 @@
"viewer_remove_from_stack": "Κατάργηση από τη Στοίβα", "viewer_remove_from_stack": "Κατάργηση από τη Στοίβα",
"viewer_stack_use_as_main_asset": "Χρήση ως Κύριο Στοιχείο", "viewer_stack_use_as_main_asset": "Χρήση ως Κύριο Στοιχείο",
"viewer_unstack": "Αποστοίβαξε", "viewer_unstack": "Αποστοίβαξε",
"visibility": "Ορατότητα",
"visibility_changed": "Η ορατότητα άλλαξε για {count, plural, one {# άτομο} other {# άτομα}}", "visibility_changed": "Η ορατότητα άλλαξε για {count, plural, one {# άτομο} other {# άτομα}}",
"visual": "Οπτικό", "visual": "Οπτικό",
"visual_builder": "Οπτικός δημιουργός", "visual_builder": "Οπτικός δημιουργός",
+16 -1
View File
@@ -267,6 +267,8 @@
"notification_enable_email_notifications": "Enable email notifications", "notification_enable_email_notifications": "Enable email notifications",
"notification_settings": "Notification Settings", "notification_settings": "Notification Settings",
"notification_settings_description": "Manage notification settings, including email", "notification_settings_description": "Manage notification settings, including email",
"oauth_allow_insecure_requests": "Allow insecure requests",
"oauth_allow_insecure_requests_description": "WARNING: This disables TLS certificate validation for OAuth requests and may expose you to MITM attacks.",
"oauth_auto_launch": "Auto launch", "oauth_auto_launch": "Auto launch",
"oauth_auto_launch_description": "Start the OAuth login flow automatically upon navigating to the login page", "oauth_auto_launch_description": "Start the OAuth login flow automatically upon navigating to the login page",
"oauth_auto_register": "Auto register", "oauth_auto_register": "Auto register",
@@ -274,9 +276,11 @@
"oauth_button_text": "Button text", "oauth_button_text": "Button text",
"oauth_client_secret_description": "Required for confidential client, or if PKCE (Proof Key for Code Exchange) is not supported for public client.", "oauth_client_secret_description": "Required for confidential client, or if PKCE (Proof Key for Code Exchange) is not supported for public client.",
"oauth_enable_description": "Login with OAuth", "oauth_enable_description": "Login with OAuth",
"oauth_end_session_url_description": "Redirect the user to this URI when they log out.",
"oauth_mobile_redirect_uri": "Mobile redirect URI", "oauth_mobile_redirect_uri": "Mobile redirect URI",
"oauth_mobile_redirect_uri_override": "Mobile redirect URI override", "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_mobile_redirect_uri_override_description": "Enable when OAuth provider does not allow a mobile URI, like ''{callback}''",
"oauth_prompt_description": "Prompt parameter (e.g. select_account, login, consent)",
"oauth_role_claim": "Role Claim", "oauth_role_claim": "Role Claim",
"oauth_role_claim_description": "Automatically grant admin access based on the presence of this claim. The claim may have either 'user' or 'admin'.", "oauth_role_claim_description": "Automatically grant admin access based on the presence of this claim. The claim may have either 'user' or 'admin'.",
"oauth_settings": "OAuth", "oauth_settings": "OAuth",
@@ -441,7 +445,7 @@
"user_successfully_removed": "User {email} has been successfully removed.", "user_successfully_removed": "User {email} has been successfully removed.",
"users_page_description": "Admin users page", "users_page_description": "Admin users page",
"version_check_enabled_description": "Enable version check", "version_check_enabled_description": "Enable version check",
"version_check_implications": "The version check feature relies on periodic communication with github.com", "version_check_implications": "The version check feature relies on periodic communication with {server}",
"version_check_settings": "Version Check", "version_check_settings": "Version Check",
"version_check_settings_description": "Enable/disable the new version notification", "version_check_settings_description": "Enable/disable the new version notification",
"video_conversion_job": "Transcode videos", "video_conversion_job": "Transcode videos",
@@ -849,9 +853,12 @@
"create_link_to_share": "Create link to share", "create_link_to_share": "Create link to share",
"create_link_to_share_description": "Let anyone with the link see the selected photo(s)", "create_link_to_share_description": "Let anyone with the link see the selected photo(s)",
"create_new": "CREATE NEW", "create_new": "CREATE NEW",
"create_new_face": "Create new face",
"create_new_person": "Create new person", "create_new_person": "Create new person",
"create_new_person_hint": "Assign selected assets to a new person", "create_new_person_hint": "Assign selected assets to a new person",
"create_new_user": "Create new user", "create_new_user": "Create new user",
"create_person": "Create person",
"create_person_subtitle": "Add a name to the selected face to create and tag the new person",
"create_shared_album_page_share_add_assets": "ADD ASSETS", "create_shared_album_page_share_add_assets": "ADD ASSETS",
"create_shared_album_page_share_select_photos": "Select Photos", "create_shared_album_page_share_select_photos": "Select Photos",
"create_shared_link": "Create shared link", "create_shared_link": "Create shared link",
@@ -1389,6 +1396,7 @@
"light_theme": "Switch to light theme", "light_theme": "Switch to light theme",
"like": "Like", "like": "Like",
"like_deleted": "Like deleted", "like_deleted": "Like deleted",
"link": "Link",
"link_motion_video": "Link motion video", "link_motion_video": "Link motion video",
"link_to_docs": "For more information, refer to the <link>documentation</link>.", "link_to_docs": "For more information, refer to the <link>documentation</link>.",
"link_to_oauth": "Link to OAuth", "link_to_oauth": "Link to OAuth",
@@ -1559,6 +1567,8 @@
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping", "multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"mute_memories": "Mute Memories", "mute_memories": "Mute Memories",
"my_albums": "My albums", "my_albums": "My albums",
"my_immich_description": "Copy current page as a My Immich link",
"my_immich_title": "My Immich link",
"name": "Name", "name": "Name",
"name_or_nickname": "Name or nickname", "name_or_nickname": "Name or nickname",
"name_required": "Name is required", "name_required": "Name is required",
@@ -1923,6 +1933,8 @@
"scan_settings": "Scan Settings", "scan_settings": "Scan Settings",
"scanning": "Scanning", "scanning": "Scanning",
"scanning_for_album": "Scanning for album...", "scanning_for_album": "Scanning for album...",
"screencast_mode_description": "Show keyboard and mouse event indicators on the screen",
"screencast_mode_title": "Toggle screencast mode",
"search": "Search", "search": "Search",
"search_albums": "Search albums", "search_albums": "Search albums",
"search_by_context": "Search by context", "search_by_context": "Search by context",
@@ -2211,9 +2223,12 @@
"sync_status": "Sync Status", "sync_status": "Sync Status",
"sync_status_subtitle": "View and manage the sync system", "sync_status_subtitle": "View and manage the sync system",
"sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich", "sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich",
"system_theme": "System theme",
"system_theme_command_description": "Use the system theme ({value})",
"tag": "Tag", "tag": "Tag",
"tag_assets": "Tag assets", "tag_assets": "Tag assets",
"tag_created": "Created tag: {tag}", "tag_created": "Created tag: {tag}",
"tag_face": "Tag face",
"tag_feature_description": "Browsing photos and videos grouped by logical tag topics", "tag_feature_description": "Browsing photos and videos grouped by logical tag topics",
"tag_not_found_question": "Cannot find a tag? <link>Create a new tag.</link>", "tag_not_found_question": "Cannot find a tag? <link>Create a new tag.</link>",
"tag_people": "Tag People", "tag_people": "Tag People",
+491 -29
View File
@@ -59,12 +59,12 @@
"backup_database_enable_description": "Ebligi kreon de kopioj de datumbazo", "backup_database_enable_description": "Ebligi kreon de kopioj de datumbazo",
"backup_keep_last_amount": "Nombro de antaŭaj kopioj konservendaj", "backup_keep_last_amount": "Nombro de antaŭaj kopioj konservendaj",
"backup_onboarding_1_description": "fora kopio, ĉu en nubo ĉu en alia fizika loko.", "backup_onboarding_1_description": "fora kopio, ĉu en nubo ĉu en alia fizika loko.",
"backup_onboarding_2_description": "lokaj kopioj ĉe diversaj aparatoj, inkluzive ĉefajn dosierojn kaj lokan sekurkopion de tiuj dosieroj.", "backup_onboarding_2_description": "lokaj kopioj ĉe diversaj aparatoj, inkluzive ĉefajn dosierojn kaj lokan savkopion de tiuj dosieroj.",
"backup_onboarding_3_description": "suma nombro de kopioj de viaj datumoj, inkluzive la originajn dosierojn, t.e. 1 fora kopio kaj 2 lokaj kopioj.", "backup_onboarding_3_description": "suma nombro de kopioj de viaj datumoj, inkluzive la originajn dosierojn, t.e. 1 fora kopio kaj 2 lokaj kopioj.",
"backup_onboarding_description": "Ni rekomendas <backblaze-link>strategion de 3-2-1</backblaze-link> por protekti viajn datumojn. Vi devus havi sekurkopiojn kaj de viaj fotoj/videoj kaj de la datumbazo de Immich por esti plene sekura.", "backup_onboarding_description": "Ni rekomendas <backblaze-link>strategion de 3-2-1</backblaze-link> por protekti viajn datumojn. Vi devus havi savkopiojn kaj de viaj fotoj/videoj kaj de la datumbazo de Immich por esti plene sekura.",
"backup_onboarding_footer": "Por pli da informoj pri sekurkopioj kun Immich, bonvolu legi la <link>dokumentaron</link>.", "backup_onboarding_footer": "Por pli da informoj pri savkopioj kun Immich, bonvolu legi la <link>dokumentaron</link>.",
"backup_onboarding_parts_title": "Sekur-kopioj laŭ strategio 3-2-1 inkluzivas:", "backup_onboarding_parts_title": "Sekur-kopioj laŭ strategio 3-2-1 inkluzivas:",
"backup_onboarding_title": "Sekurkopioj", "backup_onboarding_title": "Savkopioj",
"backup_settings": "Agordaĵoj de kopiado de datumbazo", "backup_settings": "Agordaĵoj de kopiado de datumbazo",
"backup_settings_description": "Administri agordojn pri datumbazo-nekropsio.", "backup_settings_description": "Administri agordojn pri datumbazo-nekropsio.",
"cleared_jobs": "Taskoj forigitaj por: {job}", "cleared_jobs": "Taskoj forigitaj por: {job}",
@@ -192,19 +192,19 @@
"machine_learning_url_description": "La URL-o de la maŝin-lerna servilo. Se vi donas pli ol unu URL-o, la sistemo provos ĉiun servilon unu post la alia ĝis kiam unu sukcese respondas, de la unua ĝis la lasta. Serviloj, kiuj ne respondas, estos dumtempe ignoritaj.", "machine_learning_url_description": "La URL-o de la maŝin-lerna servilo. Se vi donas pli ol unu URL-o, la sistemo provos ĉiun servilon unu post la alia ĝis kiam unu sukcese respondas, de la unua ĝis la lasta. Serviloj, kiuj ne respondas, estos dumtempe ignoritaj.",
"maintenance_delete_backup": "Forigi savkopion", "maintenance_delete_backup": "Forigi savkopion",
"maintenance_delete_backup_description": "La dosiero estos por ĉiam forigita.", "maintenance_delete_backup_description": "La dosiero estos por ĉiam forigita.",
"maintenance_delete_error": "Malsukcesis forigi sekurkopion.", "maintenance_delete_error": "Malsukcesis forigi savkopion.",
"maintenance_restore_backup": "Restaŭri savkopion", "maintenance_restore_backup": "Restaŭri savkopion",
"maintenance_restore_backup_description": "Immich estos forigita kaj reinstalita de la elektita sekurkopio. Nova sekurkopio estos kreita antaŭe.", "maintenance_restore_backup_description": "Immich estos forigita kaj reinstalita de la elektita savkopio. Nova savkopio estos kreita antaŭe.",
"maintenance_restore_backup_different_version": "Tiu ĉi sekurkopio estis kreita per alia versio de Immich!", "maintenance_restore_backup_different_version": "Tiu ĉi savkopio estis kreita per alia versio de Immich!",
"maintenance_restore_backup_unknown_version": "Ne eblis ektrovi version de la sekurkopio.", "maintenance_restore_backup_unknown_version": "Ne eblis ektrovi version de la savkopio.",
"maintenance_restore_database_backup": "Restaŭri datumbazon el sekurkopio", "maintenance_restore_database_backup": "Restaŭri datumbazon el savkopio",
"maintenance_restore_database_backup_description": "Reveni al antaŭa stato de datumbazo pere de sekurkopio", "maintenance_restore_database_backup_description": "Reveni al antaŭa stato de datumbazo pere de savkopio",
"maintenance_settings": "Funkcitenado", "maintenance_settings": "Funkcitenado",
"maintenance_settings_description": "Ŝalti la funkcitenadan reĝimon de Immich.", "maintenance_settings_description": "Ŝalti la funkcitenadan reĝimon de Immich.",
"maintenance_start": "Ŝanĝi al funkci-tenada reĝimo", "maintenance_start": "Ŝanĝi al funkci-tenada reĝimo",
"maintenance_start_error": "Malsukcesis ŝalti funkci-tenadan reĝimon.", "maintenance_start_error": "Malsukcesis ŝalti funkci-tenadan reĝimon.",
"maintenance_upload_backup": "Alŝuti dosieron de sekurkopio de datumbazo", "maintenance_upload_backup": "Alŝuti dosieron de savkopio de datumbazo",
"maintenance_upload_backup_error": "Malsukcesis alŝuti sekurkopion, ĉu ĝi havas formaton .sql aŭ .sql.gz?", "maintenance_upload_backup_error": "Malsukcesis alŝuti savkopion, ĉu ĝi havas formaton .sql aŭ .sql.gz?",
"manage_concurrency": "Administri samtempajn taskojn", "manage_concurrency": "Administri samtempajn taskojn",
"manage_concurrency_description": "Vizitu la paĝon Taskoj por agordi la nombron de samtempaj taskoj", "manage_concurrency_description": "Vizitu la paĝon Taskoj por agordi la nombron de samtempaj taskoj",
"manage_log_settings": "Administri agordojn pri protokolado", "manage_log_settings": "Administri agordojn pri protokolado",
@@ -259,14 +259,14 @@
"notification_email_secure": "SMTPS", "notification_email_secure": "SMTPS",
"notification_email_secure_description": "Uzi SMTPS (SMTP pere de TLS)", "notification_email_secure_description": "Uzi SMTPS (SMTP pere de TLS)",
"notification_email_sent_test_email_button": "Sendi testmesaĝon kaj konservi", "notification_email_sent_test_email_button": "Sendi testmesaĝon kaj konservi",
"notification_email_setting_description": "Agordoj pri atentigoj per retmesaĝoj", "notification_email_setting_description": "Agordoj pri sciigoj per retmesaĝoj",
"notification_email_test_email": "Sendi testmesaĝon", "notification_email_test_email": "Sendi testmesaĝon",
"notification_email_test_email_failed": "Malsukcesis sendi testmesaĝon, kontrolu la agordaĵojn", "notification_email_test_email_failed": "Malsukcesis sendi testmesaĝon, kontrolu la agordaĵojn",
"notification_email_test_email_sent": "Testmesaĝo estas sendita al {email}. Bonvolu kontroli ĉu ĝi bone alvenis.", "notification_email_test_email_sent": "Testmesaĝo estas sendita al {email}. Bonvolu kontroli ĉu ĝi bone alvenis.",
"notification_email_username_description": "Uzantonomo por uzi kun la retmesaĝa servilo", "notification_email_username_description": "Uzantonomo por uzi kun la retmesaĝa servilo",
"notification_enable_email_notifications": "Ŝalti retmesaĝajn atentigilojn", "notification_enable_email_notifications": "Ŝalti sciigojn per retmesaĝo",
"notification_settings": "Agordoj pri atentigiloj", "notification_settings": "Agordoj pri sciigoj",
"notification_settings_description": "Administri agordojn pri atentigiloj, inkluzive tiujn per retmesaĝoj", "notification_settings_description": "Administri agordojn pri sciigoj, inkluzive tiujn per retmesaĝoj",
"oauth_auto_launch": "Startigi aŭtomate", "oauth_auto_launch": "Startigi aŭtomate",
"oauth_auto_launch_description": "Aŭtomate startigi la OAuth-procezon tuj ĉe la ensaluta paĝo", "oauth_auto_launch_description": "Aŭtomate startigi la OAuth-procezon tuj ĉe la ensaluta paĝo",
"oauth_auto_register": "Registri aŭtomate", "oauth_auto_register": "Registri aŭtomate",
@@ -348,8 +348,8 @@
"template_email_settings": "Ŝablonoj de retmesaĝoj", "template_email_settings": "Ŝablonoj de retmesaĝoj",
"template_email_update_album": "Ŝablono por retmesaĝo por ĝisdatigi albumon", "template_email_update_album": "Ŝablono por retmesaĝo por ĝisdatigi albumon",
"template_email_welcome": "Ŝablono de bonvena retmesaĝo", "template_email_welcome": "Ŝablono de bonvena retmesaĝo",
"template_settings": "Ŝablonoj de atentigiloj", "template_settings": "Ŝablonoj de sciigoj",
"template_settings_description": "Administri tajloritajn skemojn por atentigiloj", "template_settings_description": "Administri tajloritajn skemojn por sciigoj",
"theme_custom_css_settings": "Tajlorita CSS", "theme_custom_css_settings": "Tajlorita CSS",
"theme_custom_css_settings_description": "Vi povas ŝanĝi la vidan aspekton de Immich per CSS.", "theme_custom_css_settings_description": "Vi povas ŝanĝi la vidan aspekton de Immich per CSS.",
"theme_settings": "Agordoj de la etoso", "theme_settings": "Agordoj de la etoso",
@@ -441,9 +441,9 @@
"user_successfully_removed": "La uzanto {email} estas forigita.", "user_successfully_removed": "La uzanto {email} estas forigita.",
"users_page_description": "Paĝo por administri uzantojn", "users_page_description": "Paĝo por administri uzantojn",
"version_check_enabled_description": "Ebligi kontrolon de versio", "version_check_enabled_description": "Ebligi kontrolon de versio",
"version_check_implications": "La funkcio de kontrolado de versio bezonas de temp' al tempan komunikadon kun github.com", "version_check_implications": "La funkcio de kontrolado de versio bezonas de temp' al tempan komunikadon kun {server}",
"version_check_settings": "Kontrolo de versio", "version_check_settings": "Kontrolo de versio",
"version_check_settings_description": "Ŝalti/malŝalti atentigilon pri novaj versioj", "version_check_settings_description": "Ŝalti/malŝalti sciigojn pri novaj versioj",
"video_conversion_job": "Transkodado de videoj", "video_conversion_job": "Transkodado de videoj",
"video_conversion_job_description": "Transkodi videojn por pli vasta kongruo kun retumiloj kaj aparatoj" "video_conversion_job_description": "Transkodi videojn por pli vasta kongruo kun retumiloj kaj aparatoj"
}, },
@@ -451,8 +451,8 @@
"admin_password": "Pasvorto de administranto", "admin_password": "Pasvorto de administranto",
"administration": "Administrado", "administration": "Administrado",
"advanced": "Altnivelaj agordoj", "advanced": "Altnivelaj agordoj",
"advanced_settings_clear_image_cache": "Malplenigi kaŝmemoron de bildoj", "advanced_settings_clear_image_cache": "Forviŝi kaŝmemoron de bildoj",
"advanced_settings_clear_image_cache_error": "Malsukcesis malplenigi kaŝmemoron", "advanced_settings_clear_image_cache_error": "Malsukcesis forviŝi kaŝmemoron",
"advanced_settings_clear_image_cache_success": "Sukcesis liberigi {size}", "advanced_settings_clear_image_cache_success": "Sukcesis liberigi {size}",
"advanced_settings_enable_alternate_media_filter_subtitle": "Uzu tiun ĉi agordon por filtri elementojn dum sinkronigo laŭ alternativaj kriterioj. Uzu tion ĉi nur se vi vidas, ke la apo ne sukcesas trovi ĉiujn albumojn.", "advanced_settings_enable_alternate_media_filter_subtitle": "Uzu tiun ĉi agordon por filtri elementojn dum sinkronigo laŭ alternativaj kriterioj. Uzu tion ĉi nur se vi vidas, ke la apo ne sukcesas trovi ĉiujn albumojn.",
"advanced_settings_enable_alternate_media_filter_title": "[TESTATA] Uzi alternativan filtrilon por sinkronigi albumojn", "advanced_settings_enable_alternate_media_filter_title": "[TESTATA] Uzi alternativan filtrilon por sinkronigi albumojn",
@@ -527,7 +527,7 @@
"alt_text_qr_code": "Bildo de QR-kodo", "alt_text_qr_code": "Bildo de QR-kodo",
"always_keep": "Ĉiam konservi", "always_keep": "Ĉiam konservi",
"always_keep_photos_hint": "La funkcio 'Liberigi spacon' konservos ĉiujn fotojn en tiu ĉi aparato.", "always_keep_photos_hint": "La funkcio 'Liberigi spacon' konservos ĉiujn fotojn en tiu ĉi aparato.",
"always_keep_videos_hint": "La funkcio 'Liberigi spacon\" konservos ĉiujn videojn en tiu ĉi aparato.", "always_keep_videos_hint": "La funkcio 'Liberigi spacon' konservos ĉiujn videojn en tiu ĉi aparato.",
"anti_clockwise": "Kontraŭ-horloĝdirekte", "anti_clockwise": "Kontraŭ-horloĝdirekte",
"api_key": "API-ŝlosilo", "api_key": "API-ŝlosilo",
"api_key_description": "Tio ĉi montriĝos nur unufoje. Certiĝu, ke vi kopiis ĝin antaŭ ol fermi la fenestron.", "api_key_description": "Tio ĉi montriĝos nur unufoje. Certiĝu, ke vi kopiis ĝin antaŭ ol fermi la fenestron.",
@@ -547,7 +547,7 @@
"archive_action_prompt": "{count} aldonita(j) al arĥivo", "archive_action_prompt": "{count} aldonita(j) al arĥivo",
"archive_or_unarchive_photo": "Enarĥivigi aŭ elarĥivigi foton", "archive_or_unarchive_photo": "Enarĥivigi aŭ elarĥivigi foton",
"archive_page_no_archived_assets": "Neniuj elementoj trovitaj en arĥivo", "archive_page_no_archived_assets": "Neniuj elementoj trovitaj en arĥivo",
"archive_page_title": "Arĥivo ({count})", "archive_page_title": "Arĥivigi ({count})",
"archive_size": "Grandeco de arĥivo", "archive_size": "Grandeco de arĥivo",
"archive_size_description": "Agordu la grandecon de arĥivaj dosieroj por elŝuti (en GiB)", "archive_size_description": "Agordu la grandecon de arĥivaj dosieroj por elŝuti (en GiB)",
"archived": "Enarĥivigita(j)", "archived": "Enarĥivigita(j)",
@@ -615,11 +615,11 @@
"autoplay_slideshow": "Aŭtomate vidigi bildserion", "autoplay_slideshow": "Aŭtomate vidigi bildserion",
"back": "Malantaŭen", "back": "Malantaŭen",
"back_close_deselect": "Malantaŭen, fermi, aŭ malelekti", "back_close_deselect": "Malantaŭen, fermi, aŭ malelekti",
"background_backup_running_error": "Sekurkopiado jam estas fone okazanta, do ne eblas nun lanĉi alian sekurkopiadon", "background_backup_running_error": "Savkopiado jam estas fone okazanta, do ne eblas nun lanĉi alian savkopiadon",
"background_location_permission": "Rajtigo fone uzi geografian lokon", "background_location_permission": "Rajtigo fone uzi geografian lokon",
"background_location_permission_content": "Por ŝanĝi retaliron dum fona funkciado, Immich devas *ĉiam* havi atingorajton al lokiga informo, por povi legi nomojn de vifiaj retoj", "background_location_permission_content": "Por ŝanĝi retaliron dum fona funkciado, Immich devas *ĉiam* havi atingorajton al lokiga informo, por povi legi nomojn de vifiaj retoj",
"background_options": "Agordoj pri fonaj funkcioj", "background_options": "Agordoj pri fonaj funkcioj",
"backup": "Sekurkopio", "backup": "Savkopio",
"backup_album_selection_page_albums_device": "Albumoj en la aparato ({count})", "backup_album_selection_page_albums_device": "Albumoj en la aparato ({count})",
"backup_album_selection_page_albums_tap": "Tuŝeti por inkluzivi, duoble tuŝeti por ekskludi", "backup_album_selection_page_albums_tap": "Tuŝeti por inkluzivi, duoble tuŝeti por ekskludi",
"backup_album_selection_page_assets_scatter": "Foje elementoj troviĝas disĵetitaj al pluraj albumoj, do albumoj povas esti inkluzivitaj aŭ ekskluzivitaj de la savkopiado.", "backup_album_selection_page_assets_scatter": "Foje elementoj troviĝas disĵetitaj al pluraj albumoj, do albumoj povas esti inkluzivitaj aŭ ekskluzivitaj de la savkopiado.",
@@ -675,36 +675,476 @@
"backup_controller_page_total_sub": "Ĉiuj unikaj fotoj kaj videoj el elektitaj albumoj", "backup_controller_page_total_sub": "Ĉiuj unikaj fotoj kaj videoj el elektitaj albumoj",
"backup_controller_page_turn_off": "Malŝalti malfonan savkopiadon", "backup_controller_page_turn_off": "Malŝalti malfonan savkopiadon",
"backup_controller_page_turn_on": "Ŝalti malfonan savkopiadon", "backup_controller_page_turn_on": "Ŝalti malfonan savkopiadon",
"backup_controller_page_uploading_file_info": "Alŝutiĝas informoj pri dosiero",
"backup_err_only_album": "Ne eblas forigi la solan albumon",
"backup_error_sync_failed": "Sinkronigo malsukcesis.",
"backup_info_card_assets": "elementoj",
"backup_manual_cancelled": "Nuligita",
"backup_manual_in_progress": "Alŝuto jam progresas. Provu poste",
"backup_manual_success": "Sukceso",
"backup_manual_title": "Statuso de alŝuto",
"backup_options": "Agordoj pri savkopioj",
"backup_options_page_title": "Agordoj pri savkopioj",
"backup_setting_subtitle": "Administri agordojn pri fona kaj malfona alŝutado", "backup_setting_subtitle": "Administri agordojn pri fona kaj malfona alŝutado",
"backup_settings_subtitle": "Administri agordojn pri alŝutado", "backup_settings_subtitle": "Administri agordojn pri alŝutado",
"backup_upload_details_page_more_details": "Tuŝu ĉi tie por pli da detaloj",
"backward": "Malantaŭen",
"biometric_auth_enabled": "Biometria ensaluto ŝaltita",
"biometric_locked_out": "Via biometria ensalutkapablo estas blokita",
"biometric_no_options": "Neniuj biometriaj ebloj estas disponeblaj",
"biometric_not_available": "Tiu ĉi aparato ne havas funkcion por biometria ensaluto",
"birthdate_saved": "Naskiĝdato ŝukcese konservita",
"birthdate_set_description": "La naskiĝdato estas uzita por kalkuli la aĝon de la homo je la momento de iu foto.",
"blurred_background": "Malklarigita fono",
"bugs_and_feature_requests": "Cimoj kaj petoj por novaj funkcioj",
"build": "Versio",
"build_image": "Bildo de la versio",
"bulk_delete_duplicates_confirmation": "Ĉu vi certas, ke vi volas amase forigi {count, plural, one {# duoblaĵon} other {# duoblaĵojn}}? Tiel, vi konservos la plej grandan elementon el ĉiu grupo kaj porĉiame forigos duoblaĵojn. Ne eblas malfari tion!",
"bulk_keep_duplicates_confirmation": "Ĉu vi certas, ke vi volas konservi {count, plural, one {# duoblaĵon} other {# duoblaĵojn}}? Tio solvos ĉiujn duoblajn grupojn sen forigi ion ajn.",
"bulk_trash_duplicates_confirmation": "Ĉu vi certas, ke vi volas amase forigi {count, plural, one {# duoblaĵon} other {# duoblaĵojn}}? Tiel, vi konservos la plej grandan elementon el ĉiu grupo kaj porĉiame forigos duoblaĵojn.",
"buy": "Aĉeti Immich",
"cache_settings_clear_cache_button": "Forviŝi kaŝmemoron",
"cache_settings_clear_cache_button_title": "Forviŝas la kaŝmemoron de la apo. Tio malrapidigos la apon ĝis kiam ĝi finos rekonstrui la kaŝon.",
"cache_settings_duplicated_assets_clear_button": "FORVIŜI",
"cache_settings_duplicated_assets_subtitle": "Fotoj kaj videoj ignoritaj de la apo",
"cache_settings_duplicated_assets_title": "Duoblaĵoj ({count})",
"cache_settings_statistics_album": "Bildetoj de la biblioteko",
"cache_settings_statistics_full": "Plenaj bildoj",
"cache_settings_statistics_shared": "Bildetoj de dividitaj albumoj",
"cache_settings_statistics_thumbnail": "Bildetoj",
"cache_settings_statistics_title": "Uzo de kaŝmemoro",
"cache_settings_subtitle": "Regas la uzadon de kaŝmemoro fare de la apo",
"cache_settings_tile_subtitle": "Regas konduton pri loka stokado",
"cache_settings_tile_title": "Loka stokado",
"cache_settings_title": "Agordoj pri kaŝmemoro",
"camera": "Fotilo",
"camera_brand": "Fabrikanto de fotilo",
"camera_model": "Modelo de fotilo",
"cancel": "Nuligi",
"cancel_search": "Nuligi serĉon",
"canceled": "Nuligita",
"canceling": "Nuligado",
"cannot_merge_people": "Ne eblas kunfandi tiujn homojn",
"cannot_undo_this_action": "Ne eblas malfari tion!",
"cannot_update_the_description": "Ne eblas ĝisdatigi la priskribon",
"cast": "Elsendi",
"cast_description": "Agordi disponeblajn celojn por elsendoj",
"change_date": "Ŝanĝi daton",
"change_description": "Ŝanĝi priskribon",
"change_display_order": "Ŝanĝi vicordon de vidigo",
"change_expiration_time": "Ŝanĝi horon de eksvalidiĝo",
"change_location": "Ŝanĝi lokon",
"change_name": "Ŝanĝi nomon",
"change_name_successfully": "Nomo sukcese ŝanĝita",
"change_password": "Ŝanĝi pasvorton",
"change_password_description": "Aŭ tio ĉi estas via unua ensaluto, aŭ la sistemo ricevis peton ŝanĝigi vian pasvorton. Bonvolu tajpi novan pasvorton ĉi-sube.",
"change_password_form_confirm_password": "Konfirmu pasvorton",
"change_password_form_description": "Saluton {name},\n\nAŭ tio ĉi estas via unua ensaluto, aŭ la sistemo ricevis peton ŝanĝigi vian pasvorton. Bonvolu tajpi novan pasvorton ĉi-sube.",
"change_password_form_log_out": "Elsalutu ĉe ĉiuj aliaj aparatoj",
"change_password_form_log_out_description": "Oni rekomendas elsaluti ĉe ĉiuj aliaj aparatoj",
"change_password_form_new_password": "Nova pasvorto",
"change_password_form_password_mismatch": "Pasvortoj ne kongruas",
"change_password_form_reenter_new_password": "Re-tajpu novan pasvorton",
"change_pin_code": "Ŝanĝi PIN-kodon",
"change_trigger": "Ŝanĝi ekagilon",
"change_trigger_prompt": "Ĉu vi certas, ke vi volas ŝanĝi la ekagilon? Tio forigos ĉiujn ekzistantajn agojn kaj filtrilojn.",
"change_your_password": "Ŝanĝi vian pasvorton",
"changed_visibility_successfully": "Sukcese ŝanĝis videblecon",
"charging": "Ŝargado",
"charging_requirement_mobile_backup": "Por fona savkopiado, vi devas konekti la aparaton al ŝargilo",
"check_corrupt_asset_backup": "Kontroli por koruptitaj savkopioj de elementoj",
"check_corrupt_asset_backup_button": "Kontroli",
"check_corrupt_asset_backup_description": "Fari tiun ĉi kontrolon nur per vifio kaj post kiam ĉiuj elementoj havas savkopion. La kontrolo povas daŭri kelkajn minutojn.",
"check_logs": "Kontroli protokolojn",
"checksum": "Kontrolsumo",
"choose_matching_people_to_merge": "Elekti duobligitajn homojn por kunfandi",
"city": "Urbo",
"cleanup_confirm_description": "Immich trovis savkopion en la servilo de {count} elementoj (kreitajn antaŭ {date}). Ĉu vi volas forigi la kopiojn de el tiu ĉi aparato?",
"cleanup_confirm_prompt_title": "Forigi el tiu ĉi aparato?",
"cleanup_deleted_assets": "Movis {count} elementojn al la rubujo de la aparato",
"cleanup_deleting": "Movado al rubujo...",
"cleanup_found_assets": "Trovis {count} elementojn kun savkopio",
"cleanup_found_assets_with_size": "Trovis {count} elementojn kun savkopio ({size})",
"cleanup_icloud_shared_albums_excluded": "Dividitaj albumoj ĉe iCloud estas ekskluditaj de la analizado", "cleanup_icloud_shared_albums_excluded": "Dividitaj albumoj ĉe iCloud estas ekskluditaj de la analizado",
"cleanup_step3_description": "Serĉi fotojn kaj videojn kun sekurkopio ĉe la servilo, laŭ la elektita limdato kaj filtriloj.", "cleanup_no_assets_found": "Neniuj elementoj trovitaj per la ĉi-supraj kriterioj. La funkcio 'Liberigi spacon' forigas nur elementojn, kiuj havas savkopion ĉe la servilo",
"cleanup_preview_title": "Forigotaj elementoj ({count})",
"cleanup_step3_description": "Serĉi fotojn kaj videojn kun savkopio ĉe la servilo, laŭ la elektita limdato kaj filtriloj.",
"cleanup_step4_summary": "{count} elementoj (kreitaj antaŭ {date}) forigotaj de via aparato. Fotoj restos disponeblaj (pere de la servilo) en la apo Immich.",
"cleanup_trash_hint": "Por povi reuzi la liberigitan spacon, malfermu la 'galeria' apo de via aparato kaj malplenigu la rubujon",
"clear": "Forviŝi",
"clear_all": "Forviŝi ĉiujn kampojn",
"clear_all_recent_searches": "Forviŝi ĉiujn lastatempajn serĉojn",
"clear_file_cache": "Forviŝi dosier-kaŝon",
"clear_message": "Forviŝi mesaĝon",
"clear_value": "Forviŝi valoron",
"client_cert_dialog_msg_confirm": "Bone",
"client_cert_enter_password": "Tajpu pasvorton",
"client_cert_import": "Importi",
"client_cert_import_success_msg": "Atestilo sukcese importita",
"client_cert_invalid_msg": "Nevalida atestilo-dosiero, aŭ malĝusta pasvorto",
"client_cert_password_message": "Tajpu la pasvorton por tiu ĉi atestilo",
"client_cert_password_title": "Pasvorto de atestilo",
"client_cert_remove_msg": "Klient-atestilo forigita",
"client_cert_subtitle": "Nur la formato PKCS12 (.p12, .pfx) estas akceptita. Eblas importi/forigi atestilon nur antaŭ ol ensaluti",
"client_cert_title": "Klient-atestilo SSL [EKSPERIMENTA]",
"clockwise": "Horloĝdirekte",
"close": "Fermi",
"collapse": "Maletendi",
"collapse_all": "Maletendi ĉiujn",
"color": "Koloro",
"color_theme": "Kolor-temo",
"command": "Komando",
"command_palette_prompt": "Rapide trovi paĝojn, agojn aŭ komandojn",
"command_palette_to_close": "por fermi",
"command_palette_to_navigate": "por eniri",
"command_palette_to_select": "por elekti",
"command_palette_to_show_all": "por ĉion montri",
"comment_deleted": "Komento forigita",
"comment_options": "Agoj pri komento",
"comments_and_likes": "Komentoj kaj ŝatoj",
"comments_are_disabled": "Komentoj estas malebligitaj",
"common_create_new_album": "Krei novan albumon",
"completed": "Finfarita",
"confirm": "Konfirmi",
"confirm_admin_password": "Konfirmi administran pasvorton",
"confirm_delete_face": "Ĉu vi certas ke vi volas forigi la vizaĝon de {name} de tiu elemento?",
"confirm_delete_shared_link": "Ĉu vi certas, ke vi volas forigi tiun ligilon?",
"confirm_keep_this_delete_others": "Ĉiuj elementoj en la stako krom tiu ĉi estos forigitaj. Ĉu vi certas, ke vi volas tion?",
"confirm_new_pin_code": "Konfirmi novan PIN-kodon",
"confirm_password": "Konfirmi pasvorton",
"confirm_tag_face": "Ĉu vi volas etikedi tiun ĉi vizaĝon kiel {name}?",
"confirm_tag_face_unnamed": "Ĉu vi volas etikedi tiun ĉi vizaĝon?",
"connected_device": "Konektita aparato",
"connected_to": "Konektita al",
"contain": "Alĝustigi",
"context": "Kunteksto",
"continue": "Daŭrigi",
"control_bottom_app_bar_create_new_album": "Krei novan albumon",
"control_bottom_app_bar_delete_from_immich": "Forigi el Immich",
"control_bottom_app_bar_delete_from_local": "Forigi el aparato",
"control_bottom_app_bar_edit_location": "Redakti lokon",
"control_bottom_app_bar_edit_time": "Redakti daton kaj horon",
"control_bottom_app_bar_share_link": "Dividi ligilon",
"control_bottom_app_bar_share_to": "Dividi al",
"control_bottom_app_bar_trash_from_immich": "Movi al rubujo",
"copied_image_to_clipboard": "Bildo kopiita al tondujo.",
"copied_to_clipboard": "Kopiita al tondujo!",
"copy_error": "Kopii eraron",
"copy_file_path": "Kopii dosiervojon",
"copy_image": "Kopii bildon",
"copy_link": "Kopii ligilon",
"copy_link_to_clipboard": "Kopii ligilon al tondujo",
"copy_password": "Kopii pasvorton",
"copy_to_clipboard": "Kopii al tondujo",
"country": "Lando",
"cover": "Kovri",
"covers": "Kovriloj",
"create": "Krei",
"create_album": "Krei albumon",
"create_album_page_untitled": "Sen titolo",
"create_api_key": "Krei API-ŝlosilon",
"create_first_workflow": "Krei unuan laborfluon",
"create_library": "Krei bibliotekon",
"create_link": "Krei ligilon",
"create_link_to_share": "Krei ligilon por dividi",
"create_link_to_share_description": "Permesi, ke iu ajn kun la ligilo povu vidi la elektita(j)n foto(j)n",
"create_new": "KREI NOVAN",
"create_new_face": "Krei novan vizaĝon",
"create_new_person": "Krei novan homon",
"create_new_person_hint": "Atribui elektitajn elementojn al nova homo",
"create_new_user": "Krei novan uzanton",
"create_person": "Krei homon",
"create_person_subtitle": "Aldoni nomon al la elektita vizaĝo por krei kaj etikedi novan homon",
"create_shared_album_page_share_add_assets": "ALDONI ELEMENTOJN",
"create_shared_album_page_share_select_photos": "Elekti fotojn",
"create_shared_link": "Krei dividitan ligilon",
"create_tag": "Krei etikedon",
"create_tag_description": "Krei novan etikedon. Por ingitaj etikedoj, bonvolu tajpi la plenan vojon de la etikedo, inkluzive suprenstrekoj (\"/\").",
"create_user": "Krei uzanton",
"create_workflow": "Krei laborfluon",
"created": "Kreita",
"created_at": "Kreita",
"creating_linked_albums": "Kreado de ligitaj albumoj...",
"crop": "Stuci",
"crop_aspect_ratio_fixed": "Fiksita",
"crop_aspect_ratio_free": "Libera",
"crop_aspect_ratio_original": "Originala",
"crop_aspect_ratio_square": "Kvadrata",
"curated_object_page_title": "Objektoj",
"current_device": "Aktuala aparato",
"current_pin_code": "Aktuala PIN-kodo",
"current_server_address": "Aktuala adreso de servilo",
"custom_date": "Elekti propran daton",
"custom_locale": "Propra lokaĵaro",
"custom_locale_description": "Prezenti datojn, horojn kaj numerojn laŭ la elektita lingvo kaj regiono",
"custom_url": "Propra URL",
"cutoff_date_description": "Konservi fotojn el la lastaj…",
"cutoff_day": "{count, plural, one {tago} other {tagoj}}",
"cutoff_year": "{count, plural, one {jaro} other {jaroj}}",
"daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy",
"dark": "Malhela",
"dark_theme": "Ŝanĝi al hela reĝimo",
"date": "Dato",
"date_after": "Dato post",
"date_and_time": "Dato kaj horo",
"date_before": "Dato antaŭ",
"date_format": "E, LLL d, y • h:mm a",
"date_of_birth_saved": "Naskiĝdato sukcese registrita",
"date_range": "Dato-intervalo",
"day": "Tago",
"days": "Tagoj",
"deduplicate_all": "Senduoblaĵigi ĉion",
"default_locale": "Defaŭlta lokaĵaro",
"default_locale_description": "Prezenti datojn kaj numerojn laŭ la lokaĵaro de via retumilo",
"delete": "Forigi",
"delete_action_confirmation_message": "Ĉu vi certas, ke vi volas forigi tiun ĉi elementon? Tiu ago movos ĝin al la rubujo ĉe la servilo, kaj demandos ĉu vi volas forigi ĝin de via aparato",
"delete_action_prompt": "{count} forigita(j)",
"delete_album": "Forigi albumon",
"delete_api_key_prompt": "Ĉu vi certas, ke vi volas forigi tiu ĉi API-ŝlosilon?",
"delete_dialog_alert": "Tiuj elementoj estos porĉiame forigitaj de Immich kaj de via aparato",
"delete_dialog_alert_local": "Tiuj ĉi elementoj estos forigitaj de via aparato, sed restos disponeblaj ĉe la servilo de Immich",
"delete_dialog_alert_local_non_backed_up": "Kelkaj el tiuj elementoj ne havas savkopion ĉe Immich kaj estos porĉiame forigitaj de via aparato",
"delete_dialog_alert_remote": "Tiuj elementoj estos porĉiame forigitaj de la Immich-servilo",
"delete_dialog_ok_force": "Forigi ĉiuokaze",
"delete_dialog_title": "Forigi por ĉiam",
"delete_duplicates_confirmation": "Ĉu vi certas, ke vi volas porĉiame forigi tiujn ĉi duoblaĵojn?",
"delete_face": "Forigi vizaĝon",
"delete_key": "Forigi ŝlosilon",
"delete_library": "Forigi bibliotekon",
"delete_link": "Forigi ligilon",
"delete_local_action_prompt": "{count} loke forigita(j)",
"delete_local_dialog_ok_backed_up_only": "Forigi nur elementojn, kiuj havas savkopiojn",
"delete_local_dialog_ok_force": "Forigi ĉiuokaze",
"delete_others": "Forigi la aliajn",
"delete_permanently": "Forigi por ĉiam",
"delete_permanently_action_prompt": "{count} forigita(j) por ĉiam",
"delete_shared_link": "Forigi dividitan ligilon",
"delete_shared_link_dialog_title": "Forigi dividitan ligilon",
"delete_tag": "Forigi etikedon",
"delete_tag_confirmation_prompt": "Ĉu vi certas, ke vi volas forigi la etikedon {tagName}?",
"delete_user": "Forigi uzanton",
"deleted_shared_link": "Dividita ligilo nun forigita",
"deletes_missing_assets": "Forigas elementojn, kiuj mankas ĉe la disko",
"description": "Priskribo",
"description_input_hint_text": "Aldoni priskribon...",
"description_input_submit_error": "Eraro okazis dum ĝisdatigo de priskribo. Kontrolu protokolon por pli da detaloj",
"deselect_all": "Malelekti ĉion",
"details": "Detaloj",
"direction": "Direkto",
"disable": "Malebligi",
"disabled": "Malebligita",
"disallow_edits": "Malpermesi redaktojn",
"discord": "Discord",
"discover": "Malkovri",
"discovered_devices": "Malkovritaj aparatoj",
"dismiss_all_errors": "Ignori ĉiujn erarojn",
"dismiss_error": "Ignori eraron",
"display_options": "Vidigi tiajn elementojn",
"display_order": "Vicordo de vidigo",
"display_original_photos": "Montri originalajn fotojn",
"display_original_photos_setting_description": "Prefere montri originalan foton anstataŭ bildeton se la originalo havas retumil-kongruan formaton. Tio povas malrapidigi vidigon de elementoj.",
"do_not_show_again": "Ne plu montri tiun ĉi mesaĝon",
"documentation": "Dokumentaro",
"done": "Finite",
"download": "Elŝuti",
"download_action_prompt": "Elŝutado de {count} elementoj",
"download_canceled": "Elŝuto nuligita",
"download_complete": "Elŝuto finita",
"download_enqueue": "Elŝuto en atendovico",
"download_error": "Eraro de elŝuto",
"download_failed": "Elŝuto malsukcesis",
"download_finished": "Elŝuto finiĝis",
"download_include_embedded_motion_videos": "Enkorpigitaj videoj",
"download_include_embedded_motion_videos_description": "Inkluzivi videon, enkorpigitan en mov-fotoj, kiel apartan dosieron",
"download_notfound": "Elŝuto ne trovita",
"download_original": "Elŝuti originalon",
"download_paused": "Elŝuto paŭzita",
"download_settings": "Elŝutado",
"download_settings_description": "Administri agordojn pri elŝutado de elementoj", "download_settings_description": "Administri agordojn pri elŝutado de elementoj",
"download_started": "Elŝuto komenciĝis",
"download_sucess": "Elŝuto sukcesis",
"download_sucess_android": "La elemento estas elŝutita al DCIM/Immich",
"download_waiting_to_retry": "Baldaŭ reprovos elŝuton",
"downloading": "Elŝutado",
"downloading_asset_filename": "Elŝutado de elemento {filename}",
"downloading_from_icloud": "Elŝutado el iCloud",
"downloading_media": "Elŝutado de elementoj",
"drop_files_to_upload": "Demetu dosierojn ĉi tien por alŝuti",
"duplicates": "Duoblaĵoj",
"duplicates_description": "Solvu ĉiun grupon indikante tiujn, kiuj estas eventualaj duoblaĵoj.",
"duration": "Daŭro",
"edit": "Redakti",
"edit_album": "Redakti albumon",
"edit_avatar": "Redakti profilbildon",
"edit_birthday": "Redakti naskiĝtagon",
"edit_date": "Redakti daton",
"edit_date_and_time": "Redakti daton kaj horon",
"edit_date_and_time_action_prompt": "{count} datoj kaj horoj redaktitaj",
"edit_date_and_time_by_offset": "Deŝovi daton",
"edit_date_and_time_by_offset_interval": "Nova intervalo: de {from} ĝis {to}",
"edit_description": "Redakti priskribon",
"edit_description_prompt": "Bonvolu elekti novan priskribon:",
"edit_exclusion_pattern": "Redakti skemon de ekskludo", "edit_exclusion_pattern": "Redakti skemon de ekskludo",
"edit_faces": "Redakti vizaĝojn",
"edit_key": "Redakti ŝlosilon",
"edit_link": "Redakti ligilon",
"edit_location": "Redakti lokon",
"edit_location_action_prompt": "{count} loko(j) redaktita(j)",
"edit_location_dialog_title": "Loko",
"edit_name": "Redakti nomon",
"edit_people": "Redakti homojn",
"edit_tag": "Redakti etikedon",
"edit_title": "Redakti titolon",
"edit_user": "Redakti uzanton",
"edit_workflow": "Redakti laborfluon",
"editor": "Redaktilo",
"editor_close_without_save_prompt": "La ŝanĝoj ne konserviĝos",
"editor_close_without_save_title": "Ĉu fermi redaktilon?",
"editor_confirm_reset_all_changes": "Ĉu vi certas, ke vi volas forĵeti ĉiujn ŝanĝojn?",
"editor_discard_edits_confirm": "Forĵeti ŝanĝojn",
"editor_discard_edits_prompt": "Vi havas nekonservitajn ŝanĝojn. Ĉu vi certas, ke vi volas forigi ilin?",
"editor_discard_edits_title": "Forĵeti ŝanĝojn?",
"editor_edits_applied_error": "Malsukcesis apliki redaktojn",
"editor_edits_applied_success": "Redaktoj sukcese aplikiĝis",
"editor_flip_horizontal": "Inversigi horizontale",
"editor_flip_vertical": "Inversigi vertikale",
"editor_handle_corner": "{corner, select, top_left {Supra-maldekstra} top_right {Supra-dekstra} bottom_left {Suba-maldekstra} bottom_right {Suba-dekstra} other {Ajna}} angula tenilo",
"editor_handle_edge": "{edge, select, top {Supra} bottom {Suba} left {Maldekstra} right {Dekstra} other {Ajna}} randa tenilo",
"editor_orientation": "Orientiĝo",
"editor_reset_all_changes": "Forviŝi ŝanĝojn",
"editor_rotate_left": "Turni 90º kontraŭ-horloĝdirekte",
"editor_rotate_right": "Turni 90º horloĝdirekte",
"email": "Retadreso",
"email_notifications": "Sciigoj per retmesaĝo",
"empty_folder": "Tiu ĉi dosierujo estas malplena",
"empty_trash": "Malplenigi rubujon",
"empty_trash_confirmation": "Ĉu vi certas, ke vi volas malplenigi la rubujon? Ĉiuj elementoj en la rubujo estas por ĉiam forigitaj de Immich.\nNe eblas malfari tion!",
"enable": "Ŝalti",
"enable_backup": "Ŝalti savkopiadon",
"enable_biometric_auth_description": "Tajpu vian PIN-kodon por ŝalti biometrian ensalutadon",
"enabled": "Ŝaltita",
"end_date": "Fina dato",
"enqueued": "En atendovico",
"enter_wifi_name": "Tajpu nomon de vifio",
"enter_your_pin_code": "Tajpu vian PIN-kodon",
"enter_your_pin_code_subtitle": "Tajpu vian PIN-kodon por atingi la ŝlositan dosierujon",
"error": "Eraro",
"error_change_sort_album": "Malsukcesis ŝanĝi vicordon de album-elementoj",
"error_delete_face": "Eraro dum forigo de vizaĝo el elemento",
"error_getting_places": "Eraro dum serĉo de lokoj",
"error_loading_albums": "Eraro dum ŝargado de albumoj",
"error_loading_image": "Eraro dum ŝargado de bildo",
"error_loading_partners": "Eraro dum ŝargado de partneroj: {error}",
"error_retrieving_asset_information": "Eraro dum ŝargado de informoj pri elemento",
"error_saving_image": "Eraro: {error}",
"error_tag_face_bounding_box": "Eraro dum etikedado de vizaĝo - ne eblis trovi koordinatojn de kadro",
"error_title": "Eraro - io misis",
"error_while_navigating": "Eraro dum navigado al elemento",
"errors": { "errors": {
"cannot_navigate_next_asset": "Ne eblis navigi al sekva elemento",
"cannot_navigate_previous_asset": "Ne eblas navigi al antaŭa elemento",
"cant_apply_changes": "Ne eblas apliki ŝanĝojn",
"cant_change_activity": "Ne eblas {enabled, select, true {malŝalti} other {ŝalti}} tiun agon",
"cant_change_asset_favorite": "Ne eblas ŝanĝi preferon por tiu elemento",
"cant_change_metadata_assets_count": "Ne eblas ŝanĝi metadatumojn de {count, plural, one {# elemento} other {# elementoj}}",
"cant_get_faces": "Ne eblas trovi vizaĝojn",
"cant_get_number_of_comments": "Ne eblas trovi nombron da komentoj",
"cant_search_people": "Ne eblas serĉi homojn",
"cant_search_places": "Ne eblas serĉi lokojn",
"error_adding_assets_to_album": "Eraro dum ŝargado de elementoj al albumo",
"error_adding_users_to_album": "Eraro dum aldono de uzantoj al albumo",
"error_deleting_shared_user": "Eraro dum forigo de dividita uzanto",
"error_downloading": "Eraro dum elŝuto de {filename}",
"error_hiding_buy_button": "Eraro dum kaŝado de butono 'aĉeti'",
"error_removing_assets_from_album": "Eraro dum forigo de elementoj el albumo; kontrolu konzolon por detaloj",
"error_selecting_all_assets": "Eraro dum elekto de ĉiuj elementoj",
"exclusion_pattern_already_exists": "Tiu ĉi skemo de ekskludo jam ekzistas.", "exclusion_pattern_already_exists": "Tiu ĉi skemo de ekskludo jam ekzistas.",
"failed_to_create_album": "Malsukcesis krei albumon",
"failed_to_create_shared_link": "Malsukcesis krei dividitan ligilon",
"failed_to_edit_shared_link": "Malsukcesis redakti dividitan ligilon",
"failed_to_get_people": "Malsukcesis trovi homojn",
"failed_to_keep_this_delete_others": "Malsukcesis konservi tiun ĉi elementon kaj forigi la aliajn",
"failed_to_load_asset": "Malsukcesis ŝargi elementon",
"failed_to_load_assets": "Malsukcesis ŝargi elementojn",
"failed_to_load_notifications": "Malsukcesis ŝargi sciigojn",
"failed_to_load_people": "Malsukcesis ŝargi homojn",
"failed_to_remove_product_key": "Malsukcesis forigi var-ŝalosilon",
"failed_to_reset_pin_code": "Malsukcesis restarigi PIN-kodon",
"failed_to_stack_assets": "Malsukcesis staki elementojn",
"failed_to_unstack_assets": "Malsukcesis malstaki elementojn",
"failed_to_update_notification_status": "Malsukcesis ĝisdatigi statuson de sciigoj",
"incorrect_email_or_password": "Neĝusta retadreso aŭ pasvorto",
"library_folder_already_exists": "Tiu ĉi import-vojo jam ekzistas.",
"page_not_found": "Paĝo ne trovita",
"paths_validation_failed": "Evidentiĝis, ke {paths, plural, one {# vojo estas nevalida} other {# vojoj estas nevalidaj}}",
"profile_picture_transparent_pixels": "Ne eblas havi travideblaj bilderoj en profilbildo. Bonvolu zomi kaj/aŭ ŝovi la bildon al loko sen tiaj bilderoj.",
"quota_higher_than_disk_size": "Vi donis kvoton pli grandan ol la disko mem",
"something_went_wrong": "Io misis",
"unable_to_add_album_users": "Ne eblas aldoni uzantojn al la albumo",
"unable_to_add_assets_to_shared_link": "Ne eblas aldoni elementojn al la dividita ligilo",
"unable_to_add_comment": "Ne eblas aldoni komenton",
"unable_to_add_exclusion_pattern": "Ne eblas aldoni skemon de ekskludo", "unable_to_add_exclusion_pattern": "Ne eblas aldoni skemon de ekskludo",
"unable_to_add_partners": "Ne eblas aldoni partnerojn",
"unable_to_add_remove_archive": "Ne eblas {archived, select, true {forigi elementon de} other {aldoni elementon al}} la arĥivo",
"unable_to_add_remove_favorites": "Ne eblas {favorite, select, true {aldoni elementon al} other {forigi elementon de}} preferataĵoj",
"unable_to_change_favorite": "Ne eblas ŝanĝi preferon por tiu elemento",
"unable_to_create": "Ne eblis krei laborfluon",
"unable_to_delete_exclusion_pattern": "Ne eblas forigi skemon de ekskludo", "unable_to_delete_exclusion_pattern": "Ne eblas forigi skemon de ekskludo",
"unable_to_delete_workflow": "Ne eblis forigi laborfluon",
"unable_to_edit_exclusion_pattern": "Ne eblas redakti skemon de ekskludo", "unable_to_edit_exclusion_pattern": "Ne eblas redakti skemon de ekskludo",
"unable_to_scan_libraries": "Ne eblas analizi biblitekojn", "unable_to_scan_libraries": "Ne eblas analizi biblitekojn",
"unable_to_scan_library": "Ne eblas analizi biblitekon" "unable_to_scan_library": "Ne eblas analizi biblitekon",
"unable_to_update_workflow": "Ne eblis ĝisdatigi laborfluon"
}, },
"exclusion_pattern": "Skemo de ekskludo", "exclusion_pattern": "Skemo de ekskludo",
"expand": "Etendi",
"expand_all": "Etendi ĉiujn",
"explore": "Esplori", "explore": "Esplori",
"explorer": "Foliumilo", "explorer": "Foliumilo",
"favorite": "Preferataĵo",
"favorite_action_prompt": "{count} aldonita(j) al Preferataĵoj",
"favorite_or_unfavorite_photo": "Aldoni/forigi foton al/de preferataĵoj",
"favorites": "Preferataĵoj",
"favorites_page_no_favorites": "Neniuj preferataj elementoj trovitaj",
"free_up_space": "Liberigi spacon",
"free_up_space_description": "Vi forigos fotojn kaj/aŭ videojn, kiuj havas savkopiojn en la servilo, por liberigi spacon en via aparato. La kopioj en la servilo restos.",
"general": "Ĝeneralaj", "general": "Ĝeneralaj",
"home_page_favorite_err_local": "Ankoraŭ ne eblas aldoni lokajn elementojn al Preferataĵoj; ignorita(j)",
"home_page_favorite_err_partner": "Ankoraŭ ne eblas aldoni elementojn de partnero al Preferataĵoj; ignorita(j)",
"keep_favorites": "Konservi preferataĵojn",
"manage_media_access_settings": "Malfermi agordaĵaron", "manage_media_access_settings": "Malfermi agordaĵaron",
"manage_the_app_settings": "Agordi la apon", "manage_the_app_settings": "Agordi la apon",
"map_settings_only_show_favorites": "Montri nur preferataĵojn",
"missing": "Netraktitaj", "missing": "Netraktitaj",
"networking_subtitle": "Administri agordojn pri finpunktoj de la servilo", "networking_subtitle": "Administri agordojn pri finpunktoj de la servilo",
"no_devices": "Neniuj aprobitaj aparatoj", "no_devices": "Neniuj aprobitaj aparatoj",
"no_explore_results_message": "Alŝutu pli da fotoj por esplori vian kolekton.", "no_explore_results_message": "Alŝutu pli da fotoj por esplori vian kolekton.",
"no_favorites_message": "Aldoni al Preferataĵoj por rapide retrovi viajn plej bonajn bildojn kaj videojn",
"no_notifications": "Neniuj sciigoj",
"no_results_description": "Provu sinonimon aŭ pli ĝeneralan ŝlosilvorton", "no_results_description": "Provu sinonimon aŭ pli ĝeneralan ŝlosilvorton",
"notification_permission_dialog_content": "Por ŝalti sciigojn, iru al Agordoj kaj elektu 'permesi'.",
"notification_permission_list_tile_content": "Donu permeson por ŝalti sciigojn.",
"notification_permission_list_tile_enable_button": "Ŝalti sciigojn",
"notification_permission_list_tile_title": "Permeso pri sciigoj",
"notification_toggle_setting_description": "Ŝalti sciigojn per retmesaĝo",
"notifications": "Sciigoj",
"notifications_setting_description": "Administri sciigojn",
"only_favorites": "Nur preferataĵoj",
"preferences_settings_subtitle": "Administri agordojn pri la apo", "preferences_settings_subtitle": "Administri agordojn pri la apo",
"purchase_settings_server_activated": "La administranto respondecas pri la ŝlosilo de aŭtentikeco por la servilo", "purchase_settings_server_activated": "La administranto respondecas pri la ŝlosilo de aŭtentikeco por la servilo",
"rating_clear": "Forviŝi pritakson",
"refresh": "Denove", "refresh": "Denove",
"remove_from_favorites": "Forigi el preferataĵoj",
"removed_from_favorites": "Forigita(j) el preferataĵoj",
"removed_from_favorites_count": "{count, plural, other {Forigis #}} el Preferataĵoj",
"rescan": "Reanalizi", "rescan": "Reanalizi",
"reset": "Restartigi", "reset": "Restartigi",
"reset_sqlite_clear_app_data": "Forviŝi datumojn",
"reset_sqlite_confirmation": "Ĉu vi certas, ke vi volas forviŝi la datumojn de la apo? Tio forigos ĉiujn agordojn kaj elsalutigos vin.",
"reset_sqlite_confirmation_note": "Noto: vi devos relanĉi la apon por la forviŝo.",
"reset_sqlite_done": "Datumoj de la apo estas forviŝitaj. Bonvolu relanĉi Immich kaj ensalutu denove.",
"scaffold_body_error_unrecoverable": "Neriparebla eraro okazis. Bonvolu sendi al ni la eraron kaj la stakspuron per Discord aŭ per Github por ke ni povu helpi. Vi povas forviŝi la ĉi-subajn datumojn de la apo se vi volas.",
"scan": "Analizi", "scan": "Analizi",
"scan_all_libraries": "Analizi ĉiujn bibliotekojn", "scan_all_libraries": "Analizi ĉiujn bibliotekojn",
"scan_library": "Analizi", "scan_library": "Analizi",
@@ -712,12 +1152,34 @@
"scanning": "Analizado", "scanning": "Analizado",
"scanning_for_album": "Serĉado de albumo...", "scanning_for_album": "Serĉado de albumo...",
"search_suggestion_list_smart_search_hint_1": "Inteligenta serĉado defaŭlte estas ŝaltita. Por serĉi metadatumojn, uzu sintakson tiel ", "search_suggestion_list_smart_search_hint_1": "Inteligenta serĉado defaŭlte estas ŝaltita. Por serĉi metadatumojn, uzu sintakson tiel ",
"setting_notifications_subtitle": "Redakti viajn preferojn pri sciigoj",
"start_date": "Komenca dato",
"start_date_before_end_date": "Komenca dato devas esti antaŭ fina dato",
"to_favorite": "Aldoni al preferataĵoj",
"trigger_description": "Evento, kiu ekfunkciigas la laborfluon",
"unfavorite": "Forigi el preferataĵoj",
"unfavorite_action_prompt": "{count} forigita(j) el Preferataĵoj",
"untitled_workflow": "Sentitola laborfluo",
"upload_concurrency": "Nombro da samtempaj alŝutoj", "upload_concurrency": "Nombro da samtempaj alŝutoj",
"user_pin_code_settings_description": "Administri vian PIN-kodon", "user_pin_code_settings_description": "Administri vian PIN-kodon",
"user_purchase_settings_description": "Administri vian aĉeton", "user_purchase_settings_description": "Administri vian aĉeton",
"view_links": "Vidi ligilojn", "view_links": "Vidi ligilojn",
"week": "Semajno", "week": "Semajno",
"wifi_name": "Nomo de Vifireto", "wifi_name": "Nomo de Vifireto",
"workflow_delete_prompt": "Ĉu vi certas, ke vi volas forigi tiun ĉi laborfluon?",
"workflow_deleted": "Laborfluo forigita",
"workflow_description": "Priskribo de laborfluo",
"workflow_info": "Informoj pri laborfluo",
"workflow_json": "JSON de laborfluo",
"workflow_json_help": "Redakti la agordojn pri la laborfluo per formato JSON. La ŝanĝoj sinkroniĝos al la vidiga konstruilo.",
"workflow_name": "Nomo de laborfluo",
"workflow_navigation_prompt": "Ĉu vi certas, ke vi volas foriri sen konservi viajn ŝanĝojn?",
"workflow_summary": "Resumo de laborfluo",
"workflow_update_success": "Laborfluo sukcese ĝisdatigita",
"workflow_updated": "Laborfluo ĝisdatigita",
"workflows": "Laborfluoj",
"workflows_help_text": "Laborfluo aŭtomatigas agojn pri elementoj, laŭ ekigiloj kaj filtriloj",
"year": "Jaro", "year": "Jaro",
"yes": "Jes" "yes": "Jes",
"zero_to_clear_rating": "tuŝu 0 por forviŝi la pritakson de la elemento"
} }
+19 -13
View File
@@ -17,13 +17,13 @@
"add_a_name": "Añadir un nombre", "add_a_name": "Añadir un nombre",
"add_a_title": "Añadir título", "add_a_title": "Añadir título",
"add_action": "Añadir acción", "add_action": "Añadir acción",
"add_action_description": "Haga clic para añadir una acción a realizar", "add_action_description": "Haz clic para añadir una acción a realizar",
"add_assets": "Añadir recursos", "add_assets": "Añadir recursos",
"add_birthday": "Añadir un cumpleaños", "add_birthday": "Añadir un cumpleaños",
"add_endpoint": "Añadir punto final", "add_endpoint": "Añadir punto final",
"add_exclusion_pattern": "Añadir patrón de exclusión", "add_exclusion_pattern": "Añadir patrón de exclusión",
"add_filter": "Añadir filtro", "add_filter": "Añadir filtro",
"add_filter_description": "Haga clic para añadir una condición de filtro", "add_filter_description": "Haz clic para añadir una condición de filtro",
"add_location": "Añadir ubicación", "add_location": "Añadir ubicación",
"add_more_users": "Añadir más usuarios", "add_more_users": "Añadir más usuarios",
"add_partner": "Añadir miembro", "add_partner": "Añadir miembro",
@@ -372,7 +372,7 @@
"transcoding_audio_codec": "Codec de audio", "transcoding_audio_codec": "Codec de audio",
"transcoding_audio_codec_description": "Opus es la opción de mayor calidad, pero tiene menor compatibilidad con dispositivos o software antiguos.", "transcoding_audio_codec_description": "Opus es la opción de mayor calidad, pero tiene menor compatibilidad con dispositivos o software antiguos.",
"transcoding_bitrate_description": "Vídeos con una tasa de bits superior a la máxima o que no están en un formato aceptado", "transcoding_bitrate_description": "Vídeos con una tasa de bits superior a la máxima o que no están en un formato aceptado",
"transcoding_codecs_learn_more": "Para obtener más información sobre la terminología utilizada aquí, consulte la documentación de FFmpeg sobre <h264-link>el códec H.264</h264-link>, <hevc-link>el códec HEVC</hevc-link> y <vp9-link>el códec VP9</vp9-link>.", "transcoding_codecs_learn_more": "Para obtener más información sobre la terminología utilizada aquí, consulta la documentación de FFmpeg sobre <h264-link>el códec H.264</h264-link>, <hevc-link>el códec HEVC</hevc-link> y <vp9-link>el códec VP9</vp9-link>.",
"transcoding_constant_quality_mode": "Modo de calidad constante", "transcoding_constant_quality_mode": "Modo de calidad constante",
"transcoding_constant_quality_mode_description": "ICQ es mejor que CQP, pero algunos dispositivos de aceleración de hardware no admiten este modo. Al configurar esta opción, se preferirá el modo especificado cuando se utilice codificación basada en calidad. NVENC lo ignora porque no es compatible con ICQ.", "transcoding_constant_quality_mode_description": "ICQ es mejor que CQP, pero algunos dispositivos de aceleración de hardware no admiten este modo. Al configurar esta opción, se preferirá el modo especificado cuando se utilice codificación basada en calidad. NVENC lo ignora porque no es compatible con ICQ.",
"transcoding_constant_rate_factor": "Factor de tasa constante (-crf)", "transcoding_constant_rate_factor": "Factor de tasa constante (-crf)",
@@ -441,7 +441,7 @@
"user_successfully_removed": "El usuario {email} ha sido eliminado con éxito.", "user_successfully_removed": "El usuario {email} ha sido eliminado con éxito.",
"users_page_description": "Página de usuarios administradores", "users_page_description": "Página de usuarios administradores",
"version_check_enabled_description": "Activar la comprobación de la versión", "version_check_enabled_description": "Activar la comprobación de la versión",
"version_check_implications": "La función de comprobación de versiones depende de la comunicación periódica con github.com", "version_check_implications": "La función de comprobación de versiones depende de la comunicación periódica con {server}",
"version_check_settings": "Verificar versión", "version_check_settings": "Verificar versión",
"version_check_settings_description": "Activar/desactivar la notificación de nueva versión", "version_check_settings_description": "Activar/desactivar la notificación de nueva versión",
"video_conversion_job": "Transcodificar vídeos", "video_conversion_job": "Transcodificar vídeos",
@@ -849,9 +849,12 @@
"create_link_to_share": "Crear enlace compartido", "create_link_to_share": "Crear enlace compartido",
"create_link_to_share_description": "Permitir que cualquier persona con el enlace vea la(s) foto(s) seleccionada(s)", "create_link_to_share_description": "Permitir que cualquier persona con el enlace vea la(s) foto(s) seleccionada(s)",
"create_new": "CREAR NUEVO", "create_new": "CREAR NUEVO",
"create_new_face": "Crear nueva cara",
"create_new_person": "Crear nueva persona", "create_new_person": "Crear nueva persona",
"create_new_person_hint": "Asignar los recursos seleccionados a una nueva persona", "create_new_person_hint": "Asignar los recursos seleccionados a una nueva persona",
"create_new_user": "Crear nuevo usuario", "create_new_user": "Crear nuevo usuario",
"create_person": "Crear persona",
"create_person_subtitle": "Añade un nombre a la cara seleccionada para crear y etiquetar a la nueva persona",
"create_shared_album_page_share_add_assets": "AÑADIR RECURSOS", "create_shared_album_page_share_add_assets": "AÑADIR RECURSOS",
"create_shared_album_page_share_select_photos": "Seleccionar fotos", "create_shared_album_page_share_select_photos": "Seleccionar fotos",
"create_shared_link": "Crear un enlace compartido", "create_shared_link": "Crear un enlace compartido",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Fijado", "crop_aspect_ratio_fixed": "Fijado",
"crop_aspect_ratio_free": "Libre", "crop_aspect_ratio_free": "Libre",
"crop_aspect_ratio_original": "Original", "crop_aspect_ratio_original": "Original",
"crop_aspect_ratio_square": "Cuadrado",
"curated_object_page_title": "Objetos", "curated_object_page_title": "Objetos",
"current_device": "Dispositivo actual", "current_device": "Dispositivo actual",
"current_pin_code": "PIN actual", "current_pin_code": "PIN actual",
@@ -880,7 +884,7 @@
"daily_title_text_date": "E dd, MMM", "daily_title_text_date": "E dd, MMM",
"daily_title_text_date_year": "E dd de MMM, yyyy", "daily_title_text_date_year": "E dd de MMM, yyyy",
"dark": "Oscuro", "dark": "Oscuro",
"dark_theme": "Alternar tema oscuro", "dark_theme": "Cambiar a tema oscuro",
"date": "Fecha", "date": "Fecha",
"date_after": "Fecha posterior", "date_after": "Fecha posterior",
"date_and_time": "Fecha y hora", "date_and_time": "Fecha y hora",
@@ -891,10 +895,8 @@
"day": "Día", "day": "Día",
"days": "Días", "days": "Días",
"deduplicate_all": "Deduplicar todo", "deduplicate_all": "Deduplicar todo",
"deduplication_criteria_1": "Tamaño de imagen en bytes", "default_locale": "Configuración regional predeterminada",
"deduplication_criteria_2": "Conteo de datos EXIF", "default_locale_description": "Formatear fechas y números según la configuración regional del navegador",
"deduplication_info": "Información de Deduplicación",
"deduplication_info_description": "Para automáticamente preseleccionar recursos y eliminar duplicados en conjunto, nosotros consideramos lo siguiente:",
"delete": "Eliminar", "delete": "Eliminar",
"delete_action_confirmation_message": "¿Está seguro que desea eliminar este recurso? Esta acción lo moverá a la papelera del servidor y le preguntará si desea eliminarlo localmente", "delete_action_confirmation_message": "¿Está seguro que desea eliminar este recurso? Esta acción lo moverá a la papelera del servidor y le preguntará si desea eliminarlo localmente",
"delete_action_prompt": "{count} eliminados", "delete_action_prompt": "{count} eliminados",
@@ -970,7 +972,7 @@
"downloading_media": "Descargando medios", "downloading_media": "Descargando medios",
"drop_files_to_upload": "Suelta los archivos en cualquier lugar para subirlos", "drop_files_to_upload": "Suelta los archivos en cualquier lugar para subirlos",
"duplicates": "Duplicados", "duplicates": "Duplicados",
"duplicates_description": "Resuelva cada grupo indicando, en cada caso, cuales están duplicados", "duplicates_description": "Resuelve cada grupo indicando cuáles son duplicados, si los hay.",
"duration": "Duración", "duration": "Duración",
"edit": "Editar", "edit": "Editar",
"edit_album": "Editar álbum", "edit_album": "Editar álbum",
@@ -1023,7 +1025,7 @@
"enable_biometric_auth_description": "Introduce tu código PIN para habilitar la autentificación biométrica", "enable_biometric_auth_description": "Introduce tu código PIN para habilitar la autentificación biométrica",
"enabled": "Habilitado", "enabled": "Habilitado",
"end_date": "Fecha final", "end_date": "Fecha final",
"enqueued": "Agregado a la cola", "enqueued": "Añadido a la cola",
"enter_wifi_name": "Introduce el nombre Wi-Fi", "enter_wifi_name": "Introduce el nombre Wi-Fi",
"enter_your_pin_code": "Introduce tu código PIN", "enter_your_pin_code": "Introduce tu código PIN",
"enter_your_pin_code_subtitle": "Introduce tu código PIN para acceder a la carpeta protegida", "enter_your_pin_code_subtitle": "Introduce tu código PIN para acceder a la carpeta protegida",
@@ -1086,7 +1088,7 @@
"unable_to_add_partners": "No se pueden añadir miembros", "unable_to_add_partners": "No se pueden añadir miembros",
"unable_to_add_remove_archive": "No se pudo {archived, select, true {eliminar el recurso del} other {añadir el recurso al}} archivo", "unable_to_add_remove_archive": "No se pudo {archived, select, true {eliminar el recurso del} other {añadir el recurso al}} archivo",
"unable_to_add_remove_favorites": "No se pudo {favorite, select, true {añadir el recuso a} other {eliminar el recurso de}} los favoritos", "unable_to_add_remove_favorites": "No se pudo {favorite, select, true {añadir el recuso a} other {eliminar el recurso de}} los favoritos",
"unable_to_archive_unarchive": "No se pudo {archived, select, true {agregar el elemento al} other {quitar el elemento del}} archivo", "unable_to_archive_unarchive": "No se pudo {archived, select, true {añadir el elemento al} other {quitar el elemento del}} archivo",
"unable_to_change_album_user_role": "No se puede cambiar la función del usuario del álbum", "unable_to_change_album_user_role": "No se puede cambiar la función del usuario del álbum",
"unable_to_change_date": "No se puede cambiar la fecha", "unable_to_change_date": "No se puede cambiar la fecha",
"unable_to_change_description": "Imposible cambiar la descripción", "unable_to_change_description": "Imposible cambiar la descripción",
@@ -1165,7 +1167,7 @@
}, },
"errors_text": "Errores", "errors_text": "Errores",
"exclusion_pattern": "Patrón de exclusión", "exclusion_pattern": "Patrón de exclusión",
"exif": "EXIF", "exif": "Exif",
"exif_bottom_sheet_description": "Añadir descripción…", "exif_bottom_sheet_description": "Añadir descripción…",
"exif_bottom_sheet_description_error": "Error al actualizar la descripción", "exif_bottom_sheet_description_error": "Error al actualizar la descripción",
"exif_bottom_sheet_details": "DETALLES", "exif_bottom_sheet_details": "DETALLES",
@@ -1387,9 +1389,11 @@
"library_page_sort_title": "Título del álbum", "library_page_sort_title": "Título del álbum",
"licenses": "Licencias", "licenses": "Licencias",
"light": "Claro", "light": "Claro",
"light_theme": "Cambiar a tema claro",
"like": "Me gusta", "like": "Me gusta",
"like_deleted": "Me gusta eliminado", "like_deleted": "Me gusta eliminado",
"link_motion_video": "Enlazar vídeo en movimiento", "link_motion_video": "Enlazar vídeo en movimiento",
"link_to_docs": "Para más información, consulta la <link>documentación</link>.",
"link_to_oauth": "Enlace a OAuth", "link_to_oauth": "Enlace a OAuth",
"linked_oauth_account": "Cuenta OAuth vinculada", "linked_oauth_account": "Cuenta OAuth vinculada",
"list": "Lista", "list": "Lista",
@@ -2213,6 +2217,7 @@
"tag": "Etiqueta", "tag": "Etiqueta",
"tag_assets": "Etiquetar recursos", "tag_assets": "Etiquetar recursos",
"tag_created": "Etiqueta creada: {tag}", "tag_created": "Etiqueta creada: {tag}",
"tag_face": "Etiquetar cara",
"tag_feature_description": "Explore fotos y videos agrupados por temas de etiquetas lógicas", "tag_feature_description": "Explore fotos y videos agrupados por temas de etiquetas lógicas",
"tag_not_found_question": "¿No encuentra una etiqueta? <link>Crea una nueva etiqueta.</link>", "tag_not_found_question": "¿No encuentra una etiqueta? <link>Crea una nueva etiqueta.</link>",
"tag_people": "Etiquetar personas", "tag_people": "Etiquetar personas",
@@ -2394,6 +2399,7 @@
"viewer_remove_from_stack": "Quitar de la pila", "viewer_remove_from_stack": "Quitar de la pila",
"viewer_stack_use_as_main_asset": "Usar como recurso principal", "viewer_stack_use_as_main_asset": "Usar como recurso principal",
"viewer_unstack": "Desapilar", "viewer_unstack": "Desapilar",
"visibility": "Visibilidad",
"visibility_changed": "Visibilidad cambiada para {count, plural, one {# persona} other {# personas}}", "visibility_changed": "Visibilidad cambiada para {count, plural, one {# persona} other {# personas}}",
"visual": "Visual", "visual": "Visual",
"visual_builder": "Constructor visual", "visual_builder": "Constructor visual",
+13 -7
View File
@@ -441,7 +441,7 @@
"user_successfully_removed": "Kasutaja {email} edukalt eemaldatud.", "user_successfully_removed": "Kasutaja {email} edukalt eemaldatud.",
"users_page_description": "Kasutajate haldamise leht", "users_page_description": "Kasutajate haldamise leht",
"version_check_enabled_description": "Luba versioonikontroll", "version_check_enabled_description": "Luba versioonikontroll",
"version_check_implications": "Versioonikontroll vajab perioodilist ühendumist github.com-iga", "version_check_implications": "Versioonikontroll vajab perioodilist ühendumist {server}-iga",
"version_check_settings": "Versioonikontroll", "version_check_settings": "Versioonikontroll",
"version_check_settings_description": "Luba/keela uue versiooni teavitus", "version_check_settings_description": "Luba/keela uue versiooni teavitus",
"video_conversion_job": "Videote transkodeerimine", "video_conversion_job": "Videote transkodeerimine",
@@ -849,9 +849,12 @@
"create_link_to_share": "Lisa jagamiseks link", "create_link_to_share": "Lisa jagamiseks link",
"create_link_to_share_description": "Luba kõigil, kellel on link, valitud pilte näha", "create_link_to_share_description": "Luba kõigil, kellel on link, valitud pilte näha",
"create_new": "LISA UUS", "create_new": "LISA UUS",
"create_new_face": "Lisa uus nägu",
"create_new_person": "Lisa uus isik", "create_new_person": "Lisa uus isik",
"create_new_person_hint": "Seosta valitud üksused uue isikuga", "create_new_person_hint": "Seosta valitud üksused uue isikuga",
"create_new_user": "Lisa uus kasutaja", "create_new_user": "Lisa uus kasutaja",
"create_person": "Lisa isik",
"create_person_subtitle": "Lisa valitud näole nimi, et uus isik lisada ja sildistada",
"create_shared_album_page_share_add_assets": "LISA ÜKSUSEID", "create_shared_album_page_share_add_assets": "LISA ÜKSUSEID",
"create_shared_album_page_share_select_photos": "Vali fotod", "create_shared_album_page_share_select_photos": "Vali fotod",
"create_shared_link": "Loo jagatud link", "create_shared_link": "Loo jagatud link",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Fikseeritud", "crop_aspect_ratio_fixed": "Fikseeritud",
"crop_aspect_ratio_free": "Vaba", "crop_aspect_ratio_free": "Vaba",
"crop_aspect_ratio_original": "Originaalne", "crop_aspect_ratio_original": "Originaalne",
"crop_aspect_ratio_square": "Ruut",
"curated_object_page_title": "Asjad", "curated_object_page_title": "Asjad",
"current_device": "Praegune seade", "current_device": "Praegune seade",
"current_pin_code": "Praegune PIN-kood", "current_pin_code": "Praegune PIN-kood",
@@ -880,7 +884,7 @@
"daily_title_text_date": "d. MMMM", "daily_title_text_date": "d. MMMM",
"daily_title_text_date_year": "d. MMMM yyyy", "daily_title_text_date_year": "d. MMMM yyyy",
"dark": "Tume", "dark": "Tume",
"dark_theme": "Lülita tume teema", "dark_theme": "Vali tume teema",
"date": "Kuupäev", "date": "Kuupäev",
"date_after": "Kuupäev pärast", "date_after": "Kuupäev pärast",
"date_and_time": "Kuupäev ja kellaaeg", "date_and_time": "Kuupäev ja kellaaeg",
@@ -891,10 +895,8 @@
"day": "Päev", "day": "Päev",
"days": "Päeva", "days": "Päeva",
"deduplicate_all": "Dedubleeri kõik", "deduplicate_all": "Dedubleeri kõik",
"deduplication_criteria_1": "Pildi suurus baitides", "default_locale": "Vaikimisi lokaat",
"deduplication_criteria_2": "EXIF andmete hulk", "default_locale_description": "Vorminda kuupäevad ja arvud vastavalt brauseri lokaadile",
"deduplication_info": "Dedubleerimise info",
"deduplication_info_description": "Üksuste automaatsel eelvalimisel ja duplikaatide eemaldamisel võetakse arvesse:",
"delete": "Kustuta", "delete": "Kustuta",
"delete_action_confirmation_message": "Kas oled kindel, et soovid selle üksuse kustutada? See toiming liigutab üksuse serveri prügikasti ja küsib, kas soovid selle lokaalselt kustutada", "delete_action_confirmation_message": "Kas oled kindel, et soovid selle üksuse kustutada? See toiming liigutab üksuse serveri prügikasti ja küsib, kas soovid selle lokaalselt kustutada",
"delete_action_prompt": "{count} kustutatud", "delete_action_prompt": "{count} kustutatud",
@@ -970,7 +972,7 @@
"downloading_media": "Üksuste allalaadimine", "downloading_media": "Üksuste allalaadimine",
"drop_files_to_upload": "Failide üleslaadimiseks sikuta need ükskõik kuhu", "drop_files_to_upload": "Failide üleslaadimiseks sikuta need ükskõik kuhu",
"duplicates": "Duplikaadid", "duplicates": "Duplikaadid",
"duplicates_description": "Lahenda iga grupp, valides duplikaadid, kui neid on", "duplicates_description": "Lahenda iga grupp, valides duplikaadid, kui neid on.",
"duration": "Kestus", "duration": "Kestus",
"edit": "Muuda", "edit": "Muuda",
"edit_album": "Muuda albumit", "edit_album": "Muuda albumit",
@@ -1387,9 +1389,11 @@
"library_page_sort_title": "Albumi pealkiri", "library_page_sort_title": "Albumi pealkiri",
"licenses": "Litsentsid", "licenses": "Litsentsid",
"light": "Hele", "light": "Hele",
"light_theme": "Vali hele teema",
"like": "Meeldib", "like": "Meeldib",
"like_deleted": "Meeldimine kustutatud", "like_deleted": "Meeldimine kustutatud",
"link_motion_video": "Lingi liikuv video", "link_motion_video": "Lingi liikuv video",
"link_to_docs": "Rohkema info saamiseks vaata <link>dokumentatsiooni</link>.",
"link_to_oauth": "Ühenda OAuth", "link_to_oauth": "Ühenda OAuth",
"linked_oauth_account": "OAuth konto ühendatud", "linked_oauth_account": "OAuth konto ühendatud",
"list": "Loend", "list": "Loend",
@@ -2213,6 +2217,7 @@
"tag": "Silt", "tag": "Silt",
"tag_assets": "Sildista üksuseid", "tag_assets": "Sildista üksuseid",
"tag_created": "Lisatud silt: {tag}", "tag_created": "Lisatud silt: {tag}",
"tag_face": "Sildista nägu",
"tag_feature_description": "Fotode ja videote lehitsemine siltide kaupa grupeeritult", "tag_feature_description": "Fotode ja videote lehitsemine siltide kaupa grupeeritult",
"tag_not_found_question": "Ei leia silti? <link>Lisa uus silt.</link>", "tag_not_found_question": "Ei leia silti? <link>Lisa uus silt.</link>",
"tag_people": "Sildista inimesi", "tag_people": "Sildista inimesi",
@@ -2394,6 +2399,7 @@
"viewer_remove_from_stack": "Eemalda virnast", "viewer_remove_from_stack": "Eemalda virnast",
"viewer_stack_use_as_main_asset": "Kasuta peamise üksusena", "viewer_stack_use_as_main_asset": "Kasuta peamise üksusena",
"viewer_unstack": "Eralda", "viewer_unstack": "Eralda",
"visibility": "Nähtavus",
"visibility_changed": "{count, plural, one {# isiku} other {# isiku}} nähtavus muudetud", "visibility_changed": "{count, plural, one {# isiku} other {# isiku}} nähtavus muudetud",
"visual": "Visuaalne", "visual": "Visuaalne",
"visual_builder": "Visuaalne koostaja", "visual_builder": "Visuaalne koostaja",
+43 -2
View File
@@ -5,8 +5,10 @@
"acknowledge": "Onartu", "acknowledge": "Onartu",
"action": "Ekintza", "action": "Ekintza",
"action_common_update": "Eguneratu", "action_common_update": "Eguneratu",
"action_description": "Ekintza multzoa iragazitako aktiboetan aplikatzeko",
"actions": "Ekintzak", "actions": "Ekintzak",
"active": "Aktibo", "active": "Aktibo",
"active_count": "Aktibo: {count}",
"activity": "Jarduera", "activity": "Jarduera",
"activity_changed": "Jarduera {enabled, select, true {ezarrita dago} other {ez dago ezarrita}}", "activity_changed": "Jarduera {enabled, select, true {ezarrita dago} other {ez dago ezarrita}}",
"add": "Gehitu", "add": "Gehitu",
@@ -20,6 +22,8 @@
"add_birthday": "Urtebetetzea gehitu", "add_birthday": "Urtebetetzea gehitu",
"add_endpoint": "Endpoint-a gehitu", "add_endpoint": "Endpoint-a gehitu",
"add_exclusion_pattern": "Bazterketa eredua gehitu", "add_exclusion_pattern": "Bazterketa eredua gehitu",
"add_filter": "Gehitu iragazkia",
"add_filter_description": "Klik egin iragazki baldintza bat gehitzeko",
"add_location": "Kokapena gehitu", "add_location": "Kokapena gehitu",
"add_more_users": "Erabiltzaile gehiago gehitu", "add_more_users": "Erabiltzaile gehiago gehitu",
"add_partner": "Kidea gehitu", "add_partner": "Kidea gehitu",
@@ -30,41 +34,78 @@
"add_to_album": "Albumera gehitu", "add_to_album": "Albumera gehitu",
"add_to_album_bottom_sheet_added": "{album} -(e)ra gehitu", "add_to_album_bottom_sheet_added": "{album} -(e)ra gehitu",
"add_to_album_bottom_sheet_already_exists": "Dagoeneko {album} albumenean", "add_to_album_bottom_sheet_already_exists": "Dagoeneko {album} albumenean",
"add_to_album_bottom_sheet_some_local_assets": "Aktibo lokal batzuk ezin izan dira albumera gehitu",
"add_to_album_toggle": "Txandakatu aukeraketa {album}-arentzat",
"add_to_albums": "Albumetara gehitu", "add_to_albums": "Albumetara gehitu",
"add_to_albums_count": "Albumetara gehitu ({count})", "add_to_albums_count": "Albumetara gehitu ({count})",
"add_to_bottom_bar": "Gehitu hona",
"add_to_shared_album": "Gehitu partekatutako albumera", "add_to_shared_album": "Gehitu partekatutako albumera",
"add_upload_to_stack": "Gehitu karga pilara",
"add_url": "URL-a gehitu", "add_url": "URL-a gehitu",
"add_workflow_step": "Gehitu fluxu pausoa",
"added_to_archive": "Artxibategira gehituta", "added_to_archive": "Artxibategira gehituta",
"added_to_favorites": "Faboritoetara gehituta", "added_to_favorites": "Gogokoetara gehituta",
"added_to_favorites_count": "{count, number} faboritoetara gehituta", "added_to_favorites_count": "{count, number} gogokoetara gehituta",
"admin": { "admin": {
"add_exclusion_pattern_description": "Gehitu baztertze patroiak. *, ** eta ? karakterak erabil ditzazkezu (globbing). Adibideak: \"Raw\" izeneko edozein direktorioko fitxategi guztiak baztertzeko, erabili \"**/Raw/**\". \".tif\" amaitzen diren fitxategi guztiak baztertzeko, erabili \"**/*.tif\". Bide absolutu bat baztertzeko, erabili \"/baztertu/beharreko/bidea/**\".", "add_exclusion_pattern_description": "Gehitu baztertze patroiak. *, ** eta ? karakterak erabil ditzazkezu (globbing). Adibideak: \"Raw\" izeneko edozein direktorioko fitxategi guztiak baztertzeko, erabili \"**/Raw/**\". \".tif\" amaitzen diren fitxategi guztiak baztertzeko, erabili \"**/*.tif\". Bide absolutu bat baztertzeko, erabili \"/baztertu/beharreko/bidea/**\".",
"admin_user": "Administradore erabiltzailea", "admin_user": "Administradore erabiltzailea",
"asset_offline_description": "Kanpo-liburutegiko aktibo hau es da diskoan aurkitu eta zaborrontzira mugitu da. Fitxategia liburutegian bertan mugitu bada, bilatu denbora lerroan dagokion aktibo berria. Aktiboa berreskuratzeko, mesedez ziurtatu fitxategiaren helbidea Immich-ek eskuratu dezakela eta eskaneatu liburutegia.",
"authentication_settings": "Segurtasun Ezarpenak", "authentication_settings": "Segurtasun Ezarpenak",
"authentication_settings_description": "Kudeatu pasahitza, OAuth edo beste segurtasun konfigurazio bat", "authentication_settings_description": "Kudeatu pasahitza, OAuth edo beste segurtasun konfigurazio bat",
"authentication_settings_disable_all": "Seguru zaude saioa hasteko modu guztiak desgaitu nahi dituzula? Saioa hastea guztiz desgaitua izango da.", "authentication_settings_disable_all": "Seguru zaude saioa hasteko modu guztiak desgaitu nahi dituzula? Saioa hastea guztiz desgaitua izango da.",
"authentication_settings_reenable": "Berriro gaitzeko, erabili <link>Server Command</link>.", "authentication_settings_reenable": "Berriro gaitzeko, erabili <link>Server Command</link>.",
"background_task_job": "Atzealdeko Lanak", "background_task_job": "Atzealdeko Lanak",
"backup_database": "Sortu datubasearen dump-a",
"backup_database_enable_description": "Gaitu datu base dump-ak",
"backup_keep_last_amount": "Mantendu beharreko dump kopurua",
"backup_onboarding_1_description": "kanpo kopia hodeiean edo beste kokaleku fisiko batean.",
"backup_onboarding_2_description": "kopia lokalak gailu ezberdinetan. Honek fitxategi nagusiak eta fitxategi horien babeskopia lokalak barneratzen ditu.",
"backup_onboarding_3_description": "datuen kopiak guztira, fitxategi originalak barne. Honek kanpo kopia 1 eta 2 kopia lokal barne ditu.",
"backup_onboarding_description": "<backblaze-link>3-2-1 babeskopia estrategia</backblaze-link> gomendatzen da zure datuak babesteko. Babeskopia soluzio osoa lortzeko, kargatutako irudien/bideoen kopiak gorde beharko zenituzke. Immich datu-basearena baita ere.",
"backup_onboarding_footer": "Immich-en babes kopiei buruzko informazio gehiago nahi baduzu, mesedez irakurri <link>dokumentazioa</link>.", "backup_onboarding_footer": "Immich-en babes kopiei buruzko informazio gehiago nahi baduzu, mesedez irakurri <link>dokumentazioa</link>.",
"backup_onboarding_parts_title": "3-2-1 babes-kopia batek barne hartzen du:",
"backup_onboarding_title": "Babes Kopiak", "backup_onboarding_title": "Babes Kopiak",
"backup_settings": "Datu-base Dump-aren Ezarpenak",
"backup_settings_description": "Datu-base dump-aren ezarpenak kudeatu.",
"cleared_jobs": "Garbitutako lanak honentzak: {job}",
"config_set_by_file": "Konfigurazioa konfigurazio-fitxategi baten bidez dago ezarria",
"confirm_delete_library": "Seguru zaude {library} ezabatu nahi duzula?", "confirm_delete_library": "Seguru zaude {library} ezabatu nahi duzula?",
"confirm_email_below": "Konfirmatzeko, idatzi \"{email}\" azpian", "confirm_email_below": "Konfirmatzeko, idatzi \"{email}\" azpian",
"confirm_reprocess_all_faces": "Seguru zaude aurpegi guztiak berriro prozesatu nahi dituzula? Erabakiak jendearen izenak ere borratuko ditu.", "confirm_reprocess_all_faces": "Seguru zaude aurpegi guztiak berriro prozesatu nahi dituzula? Erabakiak jendearen izenak ere borratuko ditu.",
"confirm_user_password_reset": "Seguru zaude {user}-ren pasahitza berrezarri nahi duzula?", "confirm_user_password_reset": "Seguru zaude {user}-ren pasahitza berrezarri nahi duzula?",
"confirm_user_pin_code_reset": "Seguru zaude {user}-ren PIN kodea berrezarri nahi duzula?", "confirm_user_pin_code_reset": "Seguru zaude {user}-ren PIN kodea berrezarri nahi duzula?",
"copy_config_to_clipboard_description": "Kopiatu momentuko sistema-konfigurazioa JSON objetu formatuan arbelean",
"create_job": "Gehitu zeregina", "create_job": "Gehitu zeregina",
"cron_expression": "Cron adierazpena",
"cron_expression_description": "Ezarri eskaneatzeko tartea cron formatua erabiliz. Informazio gehiago lortzeko, jo mesedez <link>Crontab Guru</link> adibidera",
"cron_expression_presets": "Cron adierazpenaren aurrezarpenak",
"disable_login": "Desgaitu saio hastea", "disable_login": "Desgaitu saio hastea",
"duplicate_detection_job_description": "Exekutatu ikasketa automatikoa aktiboetan antzeko irudiak detektatzeko. Bilaketa Adimendunean oinarritzen da",
"export_config_as_json_description": "Deskargatu momentuko sistema konfigurazioa JSON fitxategi moduan",
"external_libraries_page_description": "Administratzailearen kanpo liburutegi orrialdea",
"face_detection": "Aurpegi detekzioa", "face_detection": "Aurpegi detekzioa",
"failed_job_command": "{command} komandoak hutsegin du {job} zereginerako", "failed_job_command": "{command} komandoak hutsegin du {job} zereginerako",
"image_format": "Formatua", "image_format": "Formatua",
"image_format_description": "WebP ereduak JPEG baino fitxategi txikiagoak sortzen ditu, baina motelagoa da kodifikatzen.", "image_format_description": "WebP ereduak JPEG baino fitxategi txikiagoak sortzen ditu, baina motelagoa da kodifikatzen.",
"image_prefer_embedded_preview": "Nahiago aurrebista txertatua",
"image_prefer_wide_gamut": "Nahiago gamut zabala",
"image_preview_title": "Aurreikusiaen Konfigurazioa", "image_preview_title": "Aurreikusiaen Konfigurazioa",
"image_progressive": "Progresiboa",
"image_quality": "Kalitatea", "image_quality": "Kalitatea",
"image_resolution": "Erresoluzioa", "image_resolution": "Erresoluzioa",
"image_settings": "Argazkien Konfigurazioa", "image_settings": "Argazkien Konfigurazioa",
"image_settings_description": "Kudeatu sortutako irudien kalitatea eta erresoluzioa",
"image_thumbnail_title": "Argazki Txikien Konfigurazioa", "image_thumbnail_title": "Argazki Txikien Konfigurazioa",
"import_config_from_json_description": "Inportatu sistema konfigurazioa JSON konfigurazio fitxategia kargatuz",
"job_concurrency": "{job} konkurrentzia",
"job_created": "Zeregina sortuta", "job_created": "Zeregina sortuta",
"job_settings": "Zereginaren konfigurazioa", "job_settings": "Zereginaren konfigurazioa",
"job_settings_description": "Kudeatu lanen konkurrentzia",
"jobs_over_time": "Lanak denboran zehar",
"library_created": "Sortutako liburutegia: {library}",
"library_deleted": "Liburutegia ezabatuta",
"library_details": "Liburutegiaren xehetasunak",
"library_remove_folder_prompt": "Ziur zaude inportazio karpeta hau ezabatu nahi duzula?",
"logging_enable_description": "Gaitu erregistroak", "logging_enable_description": "Gaitu erregistroak",
"logging_level_description": "Erregistroak gaituta daudenean, nolako erregistro maila erabili.", "logging_level_description": "Erregistroak gaituta daudenean, nolako erregistro maila erabili.",
"logging_settings": "Erregistroak", "logging_settings": "Erregistroak",
+21 -1
View File
@@ -5,6 +5,7 @@
"acknowledge": "متوجه شدم", "acknowledge": "متوجه شدم",
"action": "عملکرد", "action": "عملکرد",
"action_common_update": "به‌ روز‌رسانی", "action_common_update": "به‌ روز‌رسانی",
"action_description": "تعدادی عملیات برای انجام روی داده‌های فیلتر شده",
"actions": "عملکرد", "actions": "عملکرد",
"active": "فعال", "active": "فعال",
"active_count": "فعال: {count}", "active_count": "فعال: {count}",
@@ -14,8 +15,14 @@
"add_a_location": "افزودن یک مکان", "add_a_location": "افزودن یک مکان",
"add_a_name": "افزودن نام", "add_a_name": "افزودن نام",
"add_a_title": "افزودن عنوان", "add_a_title": "افزودن عنوان",
"add_action": "افزودن عملیات",
"add_action_description": "برای افزودن و اعمال یک عملیات کلیک کنید",
"add_assets": "افزودن عکس یا فیلم",
"add_birthday": "افزودن تاریخ تولد", "add_birthday": "افزودن تاریخ تولد",
"add_endpoint": "افزودن پایانه",
"add_exclusion_pattern": "افزودن الگوی استثنا", "add_exclusion_pattern": "افزودن الگوی استثنا",
"add_filter": "افزودن فیلتر",
"add_filter_description": "برای افزودن یک شرط فیلتر کلیک کنید",
"add_location": "افزودن مکان", "add_location": "افزودن مکان",
"add_more_users": "افزودن کاربرهای بیشتر", "add_more_users": "افزودن کاربرهای بیشتر",
"add_partner": "افزودن شریک", "add_partner": "افزودن شریک",
@@ -27,25 +34,38 @@
"add_to_album_bottom_sheet_added": "به آلبوم {album} اضافه شد", "add_to_album_bottom_sheet_added": "به آلبوم {album} اضافه شد",
"add_to_album_bottom_sheet_already_exists": "قبلا در آلبوم {album} موجود است", "add_to_album_bottom_sheet_already_exists": "قبلا در آلبوم {album} موجود است",
"add_to_album_bottom_sheet_some_local_assets": "برخی از محتواهای محلی را نشد به آلبوم اضافه کرد", "add_to_album_bottom_sheet_some_local_assets": "برخی از محتواهای محلی را نشد به آلبوم اضافه کرد",
"add_to_album_toggle": "تغییر وضعیت انتخاب برای {album}",
"add_to_albums": "افزودن به آلبوم", "add_to_albums": "افزودن به آلبوم",
"add_to_albums_count": "افزودن به آلبوم ها {count}", "add_to_albums_count": "افزودن به آلبوم ها {count}",
"add_to_bottom_bar": "افزودن به", "add_to_bottom_bar": "افزودن به",
"add_to_shared_album": "افزودن به آلبوم اشتراکی", "add_to_shared_album": "افزودن به آلبوم اشتراکی",
"add_upload_to_stack": "افزودن فایل ارسالی به مجموعه", "add_upload_to_stack": "افزودن فایل ارسالی به مجموعه",
"add_url": "افزودن آدرس URL", "add_url": "افزودن آدرس URL",
"add_workflow_step": "افزودن یک مرحله به روند کار",
"added_to_archive": "به آرشیو اضافه شد", "added_to_archive": "به آرشیو اضافه شد",
"added_to_favorites": "به علاقه مندی ها اضافه شد", "added_to_favorites": "به علاقه مندی ها اضافه شد",
"added_to_favorites_count": "{count, number} تا به علاقه مندی ها اضافه شد", "added_to_favorites_count": "{count, number} تا به علاقه مندی ها اضافه شد",
"admin": { "admin": {
"add_exclusion_pattern_description": "الگوهای استثنا را اضافه کنید. پشتیبانی از گلابینگ با استفاده از *, ** و ? وجود دارد. برای نادیده گرفتن تمام فایل‌ها در هر دایرکتوری با نام \"Raw\"، از \"**/Raw/**\" استفاده کنید. برای نادیده گرفتن تمام فایل‌هایی که با \".tif\" پایان می‌یابند، از \"**/*.tif\" استفاده کنید. برای نادیده گرفتن یک مسیر مطلق، از \"/path/to/ignore/**\" استفاده کنید.", "add_exclusion_pattern_description": "الگوهای استثنا را اضافه کنید. پشتیبانی از گلابینگ با استفاده از *, ** و ? وجود دارد. برای نادیده گرفتن تمام فایل‌ها در هر دایرکتوری با نام \"Raw\"، از \"**/Raw/**\" استفاده کنید. برای نادیده گرفتن تمام فایل‌هایی که با \".tif\" پایان می‌یابند، از \"**/*.tif\" استفاده کنید. برای نادیده گرفتن یک مسیر مطلق، از \"/path/to/ignore/**\" استفاده کنید.",
"admin_user": "ادمین", "admin_user": "ادمین",
"asset_offline_description": "این کتابخانه داده‌ی بیرونی روی محل ذخیره‌سازی پیدا نشد و به سطل آشغل منتقل شد. اگر فایل مورد نظر در داخل کتابخانه جابجاده شده، تایملاین خود را برای داده‌ی جدید چک کنید. برای بازیابی این داده لطفا مطمئن شوید که مسیر فایل زیر توسط Immich قابل دسترس است سپس کتابخانه را اسکن کنید.",
"authentication_settings": "تنظیمات احراز هویت", "authentication_settings": "تنظیمات احراز هویت",
"authentication_settings_description": "مدیریت رمز عبور، OAuth، و سایر تنظیمات احراز هویت", "authentication_settings_description": "مدیریت رمز عبور، OAuth، و سایر تنظیمات احراز هویت",
"authentication_settings_disable_all": "آیا مطمئن هستید که می‌خواهید تمام روش‌های ورود را غیرفعال کنید؟ ورود به طور کامل غیرفعال خواهد شد.", "authentication_settings_disable_all": "آیا مطمئن هستید که می‌خواهید تمام روش‌های ورود را غیرفعال کنید؟ ورود به طور کامل غیرفعال خواهد شد.",
"authentication_settings_reenable": "برای فعال سازی مجدد از <link> دستور سرور </link> استفاده کنید.", "authentication_settings_reenable": "برای فعال سازی مجدد از <link> دستور سرور </link> استفاده کنید.",
"background_task_job": "وظایف پس‌زمینه", "background_task_job": "وظایف پس‌زمینه",
"backup_database": "اضافه کردن یک نسخه کپی از دیتابیس",
"backup_database_enable_description": "فعال کردن کپی از دیتابیس",
"backup_keep_last_amount": "تعداد کپی‌های قبلی برای نگه داشتن",
"backup_onboarding_1_description": "کپی خارجی روی فضای ابری یا یک محل فیزیکی دیگر.",
"backup_onboarding_2_description": "کپی‌های محلی روی دستگاه‌های دیگر. این شامل فایل‌های اصلی و پشتیبان‌های محلی از آن فایل‌ها می‌باشد.",
"backup_onboarding_3_description": "مجموع کپی‌های داده‌های شما، به همراه فایل‌های اصلی. این شامل ۱ کپی خارجی و ۲ کپی محلی می‌باشد.",
"backup_onboarding_description": "برای حفاظت از اطلاعات شما یک <backblaze-link>روش پشتیبانی ۳-۲-۱</backblaze-link> پیشنهاد می‌شود. برای یک پشتیبانی جامع، شما باید کپی‌هایی از عکس‌ها/ویدیوهای آپلود شده خود به همراه دیتابیس Immich نگه دارید.",
"backup_onboarding_footer": "برای اطلاعات بیشتر درباره بک آپ گیری از Immich، لطفا به <link>مستندات</link> مراجعه کنید.", "backup_onboarding_footer": "برای اطلاعات بیشتر درباره بک آپ گیری از Immich، لطفا به <link>مستندات</link> مراجعه کنید.",
"backup_onboarding_parts_title": "روش پشتیبانی ۳-۲-۱ شامل:",
"backup_onboarding_title": "بک آپ ها", "backup_onboarding_title": "بک آپ ها",
"backup_settings": "تنظیمات کپی‌برداری از دیتابیس",
"backup_settings_description": "مدیریت تنظیمات کپی‌برداربی از دیتابیس.",
"cleared_jobs": "وظایف پاک شده برای:{job}", "cleared_jobs": "وظایف پاک شده برای:{job}",
"config_set_by_file": "تنظیم فعلی توسط یک فایل پیکربندی انجام شده است", "config_set_by_file": "تنظیم فعلی توسط یک فایل پیکربندی انجام شده است",
"confirm_delete_library": "آیا مطمئن هستید که می‌خواهید کتابخانه {library} را حذف کنید؟", "confirm_delete_library": "آیا مطمئن هستید که می‌خواهید کتابخانه {library} را حذف کنید؟",
@@ -365,7 +385,7 @@
"user_successfully_removed": "کاربر {email} با موفقیت حذف شد.", "user_successfully_removed": "کاربر {email} با موفقیت حذف شد.",
"users_page_description": "صفحه مدیریت کاربران", "users_page_description": "صفحه مدیریت کاربران",
"version_check_enabled_description": "فعال‌سازی بررسی نسخه", "version_check_enabled_description": "فعال‌سازی بررسی نسخه",
"version_check_implications": "ویژگی بررسی نسخه به ارتباط دوره ای با github.com متکی است", "version_check_implications": "ویژگی بررسی نسخه به ارتباط دوره ای با {server} متکی است",
"version_check_settings": "بررسی نسخه", "version_check_settings": "بررسی نسخه",
"version_check_settings_description": "فعال یا غیرفعال کردن اعلان نسخه جدید", "version_check_settings_description": "فعال یا غیرفعال کردن اعلان نسخه جدید",
"video_conversion_job": "تبدیل (رمزگذاری) ویدیوها", "video_conversion_job": "تبدیل (رمزگذاری) ویدیوها",
+15 -7
View File
@@ -441,7 +441,7 @@
"user_successfully_removed": "Käyttäjä {email} on poistettu onnistuneesti.", "user_successfully_removed": "Käyttäjä {email} on poistettu onnistuneesti.",
"users_page_description": "Ylläpitäjän käyttäjien lista", "users_page_description": "Ylläpitäjän käyttäjien lista",
"version_check_enabled_description": "Ota käyttöön versiotarkastus", "version_check_enabled_description": "Ota käyttöön versiotarkastus",
"version_check_implications": "Versiotarkistus vaatii säännöllisen yhteyden github.comiin", "version_check_implications": "Versiotarkistus vaatii säännöllisen yhteyden {server}iin",
"version_check_settings": "Versiotarkistus", "version_check_settings": "Versiotarkistus",
"version_check_settings_description": "Ota käyttöön ilmoitukset, kun uusi versio on saatavilla", "version_check_settings_description": "Ota käyttöön ilmoitukset, kun uusi versio on saatavilla",
"video_conversion_job": "Transkoodaa videot", "video_conversion_job": "Transkoodaa videot",
@@ -849,9 +849,12 @@
"create_link_to_share": "Luo linkki jaettavaksi", "create_link_to_share": "Luo linkki jaettavaksi",
"create_link_to_share_description": "Salli kaikkien linkin saaneiden nähdä valitut kuvat", "create_link_to_share_description": "Salli kaikkien linkin saaneiden nähdä valitut kuvat",
"create_new": "LUO UUSI", "create_new": "LUO UUSI",
"create_new_face": "Luo uudet kasvot",
"create_new_person": "Luo uusi henkilö", "create_new_person": "Luo uusi henkilö",
"create_new_person_hint": "Määritä valitut mediat uudelle henkilölle", "create_new_person_hint": "Määritä valitut mediat uudelle henkilölle",
"create_new_user": "Luo uusi käyttäjä", "create_new_user": "Luo uusi käyttäjä",
"create_person": "Luo henkilö",
"create_person_subtitle": "Lisää nimi valituille kasvoille luodaksesi uudelle henkilölle tunnisteen",
"create_shared_album_page_share_add_assets": "LISÄÄ KOHTEITA", "create_shared_album_page_share_add_assets": "LISÄÄ KOHTEITA",
"create_shared_album_page_share_select_photos": "Valitse kuvat", "create_shared_album_page_share_select_photos": "Valitse kuvat",
"create_shared_link": "Luo jakolinkki", "create_shared_link": "Luo jakolinkki",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Kiinteä", "crop_aspect_ratio_fixed": "Kiinteä",
"crop_aspect_ratio_free": "Vapaa", "crop_aspect_ratio_free": "Vapaa",
"crop_aspect_ratio_original": "Alkuperäinen", "crop_aspect_ratio_original": "Alkuperäinen",
"crop_aspect_ratio_square": "Neliö",
"curated_object_page_title": "Asiat", "curated_object_page_title": "Asiat",
"current_device": "Nykyinen laite", "current_device": "Nykyinen laite",
"current_pin_code": "Nykyinen PIN-koodi", "current_pin_code": "Nykyinen PIN-koodi",
@@ -880,7 +884,7 @@
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy", "daily_title_text_date_year": "E, dd MMM, yyyy",
"dark": "Tumma", "dark": "Tumma",
"dark_theme": "Vaihda tumma teema", "dark_theme": "Vaihda tummaan teemaan",
"date": "Päivämäärä", "date": "Päivämäärä",
"date_after": "Päivämäärän jälkeen", "date_after": "Päivämäärän jälkeen",
"date_and_time": "Päivämäärä ja aika", "date_and_time": "Päivämäärä ja aika",
@@ -891,10 +895,8 @@
"day": "Päivä", "day": "Päivä",
"days": "Päivää", "days": "Päivää",
"deduplicate_all": "Poista kaikkien kaksoiskappaleet", "deduplicate_all": "Poista kaikkien kaksoiskappaleet",
"deduplication_criteria_1": "Kuvan koko tavuina", "default_locale": "Oletuskieli",
"deduplication_criteria_2": "EXIF-datan määrä", "default_locale_description": "Muotoile päivämäärät ja luvut selaimesi kieliasetusten mukaan",
"deduplication_info": "Deduplikaatiotieto",
"deduplication_info_description": "Jotta voimme automaattisesti esivalita aineistot ja poistaa kaksoiskappaleet suurina erinä, tarkastelemme:",
"delete": "Poista", "delete": "Poista",
"delete_action_confirmation_message": "Haluatko varmasti poistaa tämän aineiston? Tämä toiminto siirtää aineiston palvelimen roskakoriin ja kysyy, haluatko poistaa sen myös paikallisesti", "delete_action_confirmation_message": "Haluatko varmasti poistaa tämän aineiston? Tämä toiminto siirtää aineiston palvelimen roskakoriin ja kysyy, haluatko poistaa sen myös paikallisesti",
"delete_action_prompt": "{count} poistettu", "delete_action_prompt": "{count} poistettu",
@@ -970,7 +972,7 @@
"downloading_media": "Median lataaminen", "downloading_media": "Median lataaminen",
"drop_files_to_upload": "Pudota tiedostot mihin tahansa ladataksesi ne", "drop_files_to_upload": "Pudota tiedostot mihin tahansa ladataksesi ne",
"duplicates": "Kaksoiskappaleet", "duplicates": "Kaksoiskappaleet",
"duplicates_description": "Selvitä jokaisen kohdalla mitkä (jos mitkään) ovat kaksoiskappaleita", "duplicates_description": "Selvitä jokaisen kohdalla mitkä (jos mitkään) ovat kaksoiskappaleita.",
"duration": "Kesto", "duration": "Kesto",
"edit": "Muokkaa", "edit": "Muokkaa",
"edit_album": "Muokkaa albumia", "edit_album": "Muokkaa albumia",
@@ -1007,6 +1009,8 @@
"editor_edits_applied_success": "Muutokset otettu käyttöön", "editor_edits_applied_success": "Muutokset otettu käyttöön",
"editor_flip_horizontal": "Käännä vaakatasossa", "editor_flip_horizontal": "Käännä vaakatasossa",
"editor_flip_vertical": "Käännä pystytasossa", "editor_flip_vertical": "Käännä pystytasossa",
"editor_handle_corner": "{corner, select, top_left {Vasen yläkulma} top_right {Oikea yläkulma} bottom_left {Vasen alakulma} bottom_right {Oikea alakulma} other {A}} kulman kahva",
"editor_handle_edge": "{edge, select, top {Yläreuna} bottom {Alareuna} left {Vasen reuna} right {Oikea reuna} other {En}} reunan kahva",
"editor_orientation": "Suunta", "editor_orientation": "Suunta",
"editor_reset_all_changes": "Nollaa muutokset", "editor_reset_all_changes": "Nollaa muutokset",
"editor_rotate_left": "Kierrä 90° vastapäivään", "editor_rotate_left": "Kierrä 90° vastapäivään",
@@ -1385,9 +1389,11 @@
"library_page_sort_title": "Albumin otsikko", "library_page_sort_title": "Albumin otsikko",
"licenses": "Lisenssit", "licenses": "Lisenssit",
"light": "Vaalea", "light": "Vaalea",
"light_theme": "Vaihda vaaleaan teemaan",
"like": "Tykkää", "like": "Tykkää",
"like_deleted": "Tykkäys poistettu", "like_deleted": "Tykkäys poistettu",
"link_motion_video": "Linkitä liikevideo", "link_motion_video": "Linkitä liikevideo",
"link_to_docs": "Lisätietoja löytyy <link>dokumentaatiosta</link>.",
"link_to_oauth": "Linkki OAuth", "link_to_oauth": "Linkki OAuth",
"linked_oauth_account": "Linkitetty OAuth-tili", "linked_oauth_account": "Linkitetty OAuth-tili",
"list": "Lista", "list": "Lista",
@@ -2211,6 +2217,7 @@
"tag": "Tunniste", "tag": "Tunniste",
"tag_assets": "Lisää tunnisteita", "tag_assets": "Lisää tunnisteita",
"tag_created": "Luotu tunniste: {tag}", "tag_created": "Luotu tunniste: {tag}",
"tag_face": "Merkitse kasvot",
"tag_feature_description": "Selaa valokuvia ja videoita, jotka on ryhmitelty loogisten tunnisteotsikoiden mukaan", "tag_feature_description": "Selaa valokuvia ja videoita, jotka on ryhmitelty loogisten tunnisteotsikoiden mukaan",
"tag_not_found_question": "Etkö löydä tunnistetta? <link>Luo uusi tunniste.</link>", "tag_not_found_question": "Etkö löydä tunnistetta? <link>Luo uusi tunniste.</link>",
"tag_people": "Merkitse henkilö tunnisteella", "tag_people": "Merkitse henkilö tunnisteella",
@@ -2392,6 +2399,7 @@
"viewer_remove_from_stack": "Poista pinosta", "viewer_remove_from_stack": "Poista pinosta",
"viewer_stack_use_as_main_asset": "Käytä pääkohteena", "viewer_stack_use_as_main_asset": "Käytä pääkohteena",
"viewer_unstack": "Pura pino", "viewer_unstack": "Pura pino",
"visibility": "Näkyvyys",
"visibility_changed": "{count, plural, one {# henkilön} other {# henkilöiden}} näkyvyys vaihdettu", "visibility_changed": "{count, plural, one {# henkilön} other {# henkilöiden}} näkyvyys vaihdettu",
"visual": "Visuaalinen", "visual": "Visuaalinen",
"visual_builder": "Visuaalinen koostaja", "visual_builder": "Visuaalinen koostaja",
+13 -7
View File
@@ -441,7 +441,7 @@
"user_successfully_removed": "L'utilisateur {email} a été supprimé avec succès.", "user_successfully_removed": "L'utilisateur {email} a été supprimé avec succès.",
"users_page_description": "Page d'administration des utilisateurs", "users_page_description": "Page d'administration des utilisateurs",
"version_check_enabled_description": "Activer la vérification périodique de nouvelle version", "version_check_enabled_description": "Activer la vérification périodique de nouvelle version",
"version_check_implications": "Le contrôle de version repose sur une communication périodique avec github.com", "version_check_implications": "Le contrôle de version repose sur une communication périodique avec {server}",
"version_check_settings": "Vérification de la version", "version_check_settings": "Vérification de la version",
"version_check_settings_description": "Gérer la vérification de nouvelle version d'Immich", "version_check_settings_description": "Gérer la vérification de nouvelle version d'Immich",
"video_conversion_job": "Transcodage des vidéos", "video_conversion_job": "Transcodage des vidéos",
@@ -849,9 +849,12 @@
"create_link_to_share": "Créer un lien pour partager", "create_link_to_share": "Créer un lien pour partager",
"create_link_to_share_description": "Permettre à n'importe qui ayant le lien de voir la(es) photo(s) sélectionnée(s)", "create_link_to_share_description": "Permettre à n'importe qui ayant le lien de voir la(es) photo(s) sélectionnée(s)",
"create_new": "NOUVEAU", "create_new": "NOUVEAU",
"create_new_face": "Créer un nouveau visage",
"create_new_person": "Créer une nouvelle personne", "create_new_person": "Créer une nouvelle personne",
"create_new_person_hint": "Attribuer les médias sélectionnés à une nouvelle personne", "create_new_person_hint": "Attribuer les médias sélectionnés à une nouvelle personne",
"create_new_user": "Créer un nouvel utilisateur", "create_new_user": "Créer un nouvel utilisateur",
"create_person": "Créer une personne",
"create_person_subtitle": "Ajouter un nom au visage sélectionné pour créer et étiqueter la nouvelle personne",
"create_shared_album_page_share_add_assets": "AJOUTER DES ÉLÉMENTS", "create_shared_album_page_share_add_assets": "AJOUTER DES ÉLÉMENTS",
"create_shared_album_page_share_select_photos": "Sélectionner les photos", "create_shared_album_page_share_select_photos": "Sélectionner les photos",
"create_shared_link": "Créer un lien partagé", "create_shared_link": "Créer un lien partagé",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Figé", "crop_aspect_ratio_fixed": "Figé",
"crop_aspect_ratio_free": "Libre", "crop_aspect_ratio_free": "Libre",
"crop_aspect_ratio_original": "Original", "crop_aspect_ratio_original": "Original",
"crop_aspect_ratio_square": "Carré",
"curated_object_page_title": "Objets", "curated_object_page_title": "Objets",
"current_device": "Appareil actuel", "current_device": "Appareil actuel",
"current_pin_code": "Code PIN actuel", "current_pin_code": "Code PIN actuel",
@@ -880,7 +884,7 @@
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy", "daily_title_text_date_year": "E, dd MMM, yyyy",
"dark": "Sombre", "dark": "Sombre",
"dark_theme": "Activer le thème sombre", "dark_theme": "Basculer sur le thème sombre",
"date": "Date", "date": "Date",
"date_after": "Date après", "date_after": "Date après",
"date_and_time": "Date et heure", "date_and_time": "Date et heure",
@@ -891,10 +895,8 @@
"day": "Jour", "day": "Jour",
"days": "Jours", "days": "Jours",
"deduplicate_all": "Dédupliquer tout", "deduplicate_all": "Dédupliquer tout",
"deduplication_criteria_1": "Taille de l'image en octets", "default_locale": "Langue par défaut",
"deduplication_criteria_2": "Nombre de données EXIF", "default_locale_description": "Mettre en forme les dates et nombres en fonction de la langue de votre navigateur",
"deduplication_info": "Info de déduplication",
"deduplication_info_description": "Pour présélectionner automatiquement les médias et supprimer les doublons en masse, nous examinons :",
"delete": "Supprimer", "delete": "Supprimer",
"delete_action_confirmation_message": "Êtes-vous sûr de vouloir supprimer ce média? Cela déplacera le média dans la poubelle du serveur et vous demandera si vous voulez le supprimer localement", "delete_action_confirmation_message": "Êtes-vous sûr de vouloir supprimer ce média? Cela déplacera le média dans la poubelle du serveur et vous demandera si vous voulez le supprimer localement",
"delete_action_prompt": "{count} supprimé(s)", "delete_action_prompt": "{count} supprimé(s)",
@@ -970,7 +972,7 @@
"downloading_media": "Téléchargement du média", "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 envoyer",
"duplicates": "Doublons", "duplicates": "Doublons",
"duplicates_description": "Examiner chaque groupe et indiquer s'il y a des doublons", "duplicates_description": "Examiner chaque groupe et indiquer s'il y a des doublons.",
"duration": "Durée", "duration": "Durée",
"edit": "Modifier", "edit": "Modifier",
"edit_album": "Modifier l'album", "edit_album": "Modifier l'album",
@@ -1387,9 +1389,11 @@
"library_page_sort_title": "Titre de l'album", "library_page_sort_title": "Titre de l'album",
"licenses": "Licences", "licenses": "Licences",
"light": "Clair", "light": "Clair",
"light_theme": "Basculer sur le thème clair",
"like": "J'aime", "like": "J'aime",
"like_deleted": "Réaction « J'aime » supprimée", "like_deleted": "Réaction « J'aime » supprimée",
"link_motion_video": "Lier la photo animée", "link_motion_video": "Lier la photo animée",
"link_to_docs": "Pour plus d'informations, se référer à la <link>documentation</link>.",
"link_to_oauth": "Lien au service OAuth", "link_to_oauth": "Lien au service OAuth",
"linked_oauth_account": "Compte OAuth rattaché", "linked_oauth_account": "Compte OAuth rattaché",
"list": "Liste", "list": "Liste",
@@ -2213,6 +2217,7 @@
"tag": "Étiquette", "tag": "Étiquette",
"tag_assets": "Étiqueter les médias", "tag_assets": "Étiqueter les médias",
"tag_created": "Étiquette créée: {tag}", "tag_created": "Étiquette créée: {tag}",
"tag_face": "Étiqueter le visage",
"tag_feature_description": "Parcourir les photos et vidéos groupées par thèmes logiques", "tag_feature_description": "Parcourir les photos et vidéos groupées par thèmes logiques",
"tag_not_found_question": "Vous ne trouvez pas une étiquette? <link>Créer une nouvelle étiquette.</link>", "tag_not_found_question": "Vous ne trouvez pas une étiquette? <link>Créer une nouvelle étiquette.</link>",
"tag_people": "Étiqueter les personnes", "tag_people": "Étiqueter les personnes",
@@ -2394,6 +2399,7 @@
"viewer_remove_from_stack": "Retirer de la pile", "viewer_remove_from_stack": "Retirer de la pile",
"viewer_stack_use_as_main_asset": "Utiliser comme élément principal", "viewer_stack_use_as_main_asset": "Utiliser comme élément principal",
"viewer_unstack": "Dépiler", "viewer_unstack": "Dépiler",
"visibility": "Visibilité",
"visibility_changed": "Visibilité changée pour {count, plural, one {# personne} other {# personnes}}", "visibility_changed": "Visibilité changée pour {count, plural, one {# personne} other {# personnes}}",
"visual": "Visuel", "visual": "Visuel",
"visual_builder": "Constructeur visuel", "visual_builder": "Constructeur visuel",
+13 -7
View File
@@ -441,7 +441,7 @@
"user_successfully_removed": "Baineadh an t-úsáideoir {email} go rathúil.", "user_successfully_removed": "Baineadh an t-úsáideoir {email} go rathúil.",
"users_page_description": "Leathanach úsáideoirí riarthóra", "users_page_description": "Leathanach úsáideoirí riarthóra",
"version_check_enabled_description": "Cumasaigh seiceáil leagan", "version_check_enabled_description": "Cumasaigh seiceáil leagan",
"version_check_implications": "Braitheann an ghné seiceála leagan ar chumarsáid thréimhsiúil le github.com", "version_check_implications": "Braitheann an ghné seiceála leagan ar chumarsáid thréimhsiúil le {server}",
"version_check_settings": "Seiceáil Leagan", "version_check_settings": "Seiceáil Leagan",
"version_check_settings_description": "Cumasaigh/díchumasaigh an fógra faoin leagan nua", "version_check_settings_description": "Cumasaigh/díchumasaigh an fógra faoin leagan nua",
"video_conversion_job": "Físeáin Traschódaithe", "video_conversion_job": "Físeáin Traschódaithe",
@@ -849,9 +849,12 @@
"create_link_to_share": "Cruthaigh nasc le roinnt", "create_link_to_share": "Cruthaigh nasc le roinnt",
"create_link_to_share_description": "Lig do dhuine ar bith a bhfuil an nasc aige/aici an/na grianghraf/na grianghraif roghnaithe a fheiceáil", "create_link_to_share_description": "Lig do dhuine ar bith a bhfuil an nasc aige/aici an/na grianghraf/na grianghraif roghnaithe a fheiceáil",
"create_new": "CRUTHAIGH NUA", "create_new": "CRUTHAIGH NUA",
"create_new_face": "Cruthaigh aghaidh nua",
"create_new_person": "Cruthaigh duine nua", "create_new_person": "Cruthaigh duine nua",
"create_new_person_hint": "Sannadh sócmhainní roghnaithe do dhuine nua", "create_new_person_hint": "Sannadh sócmhainní roghnaithe do dhuine nua",
"create_new_user": "Cruthaigh úsáideoir nua", "create_new_user": "Cruthaigh úsáideoir nua",
"create_person": "Cruthaigh duine",
"create_person_subtitle": "Cuir ainm leis an aghaidh roghnaithe chun an duine nua a chruthú agus a chlibeáil",
"create_shared_album_page_share_add_assets": "CUIR SÓCMHAINNÍ LEIS", "create_shared_album_page_share_add_assets": "CUIR SÓCMHAINNÍ LEIS",
"create_shared_album_page_share_select_photos": "Roghnaigh Grianghraif", "create_shared_album_page_share_select_photos": "Roghnaigh Grianghraif",
"create_shared_link": "Cruthaigh nasc comhroinnte", "create_shared_link": "Cruthaigh nasc comhroinnte",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Seasta", "crop_aspect_ratio_fixed": "Seasta",
"crop_aspect_ratio_free": "Saor in aisce", "crop_aspect_ratio_free": "Saor in aisce",
"crop_aspect_ratio_original": "Bunaidh", "crop_aspect_ratio_original": "Bunaidh",
"crop_aspect_ratio_square": "Cearnóg",
"curated_object_page_title": "Rudaí", "curated_object_page_title": "Rudaí",
"current_device": "Gléas reatha", "current_device": "Gléas reatha",
"current_pin_code": "Cód PIN reatha", "current_pin_code": "Cód PIN reatha",
@@ -880,7 +884,7 @@
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy", "daily_title_text_date_year": "E, dd MMM, yyyy",
"dark": "Dorcha", "dark": "Dorcha",
"dark_theme": "Scoránaigh an téama dorcha", "dark_theme": "Athraigh go téama dorcha",
"date": "Dáta", "date": "Dáta",
"date_after": "Dáta i ndiaidh", "date_after": "Dáta i ndiaidh",
"date_and_time": "Dáta agus Am", "date_and_time": "Dáta agus Am",
@@ -891,10 +895,8 @@
"day": "Lá", "day": "Lá",
"days": "Laethanta", "days": "Laethanta",
"deduplicate_all": "Dídhúblaigh Gach Rud", "deduplicate_all": "Dídhúblaigh Gach Rud",
"deduplication_criteria_1": "Méid na híomhá i mbéiteanna", "default_locale": "Logán Réamhshocraithe",
"deduplication_criteria_2": "Líon sonraí EXIF", "default_locale_description": "Formáidigh dátaí agus uimhreacha bunaithe ar shuíomh do bhrabhsálaí",
"deduplication_info": "Eolas Dídhúblála",
"deduplication_info_description": "Chun sócmhainní a réamhroghnú go huathoibríoch agus dúblaigh a bhaint i mórchóir, féachaimid ar:",
"delete": "Scrios", "delete": "Scrios",
"delete_action_confirmation_message": "An bhfuil tú cinnte gur mian leat an tsócmhainn seo a scriosadh? Bogfaidh an gníomh seo an tsócmhainn go dtí bruscar an fhreastalaí agus fiafróidh sé díot an mian leat í a scriosadh go háitiúil", "delete_action_confirmation_message": "An bhfuil tú cinnte gur mian leat an tsócmhainn seo a scriosadh? Bogfaidh an gníomh seo an tsócmhainn go dtí bruscar an fhreastalaí agus fiafróidh sé díot an mian leat í a scriosadh go háitiúil",
"delete_action_prompt": "{count} scriosta", "delete_action_prompt": "{count} scriosta",
@@ -970,7 +972,7 @@
"downloading_media": "Ag íoslódáil na meán", "downloading_media": "Ag íoslódáil na meán",
"drop_files_to_upload": "Scaoil comhaid áit ar bith le huaslódáil", "drop_files_to_upload": "Scaoil comhaid áit ar bith le huaslódáil",
"duplicates": "Dúblaigh", "duplicates": "Dúblaigh",
"duplicates_description": "Réitigh gach grúpa trína léiriú cé acu de na dúblaigh, más ann dóibh", "duplicates_description": "Réitigh gach grúpa trína léiriú cé acu de na dúblaigh, más ann dóibh.",
"duration": "Fad", "duration": "Fad",
"edit": "Cuir in Eagar", "edit": "Cuir in Eagar",
"edit_album": "Cuir albam in eagar", "edit_album": "Cuir albam in eagar",
@@ -1387,9 +1389,11 @@
"library_page_sort_title": "Teideal an albaim", "library_page_sort_title": "Teideal an albaim",
"licenses": "Ceadúnais", "licenses": "Ceadúnais",
"light": "Solas", "light": "Solas",
"light_theme": "Athraigh go téama éadrom",
"like": "Is maith liom", "like": "Is maith liom",
"like_deleted": "Scriosadh an rud is maith liom", "like_deleted": "Scriosadh an rud is maith liom",
"link_motion_video": "Físeán gluaiseachta nasctha", "link_motion_video": "Físeán gluaiseachta nasctha",
"link_to_docs": "Le haghaidh tuilleadh eolais, féach ar an <link>doiciméadú</link>.",
"link_to_oauth": "Nasc le OAuth", "link_to_oauth": "Nasc le OAuth",
"linked_oauth_account": "Cuntas OAuth nasctha", "linked_oauth_account": "Cuntas OAuth nasctha",
"list": "Liosta", "list": "Liosta",
@@ -2213,6 +2217,7 @@
"tag": "Clib", "tag": "Clib",
"tag_assets": "Sócmhainní clibe", "tag_assets": "Sócmhainní clibe",
"tag_created": "Clib cruthaithe: {tag}", "tag_created": "Clib cruthaithe: {tag}",
"tag_face": "Aghaidh clibe",
"tag_feature_description": "Ag brabhsáil grianghraif agus físeáin grúpáilte de réir topaicí clibeanna loighciúla", "tag_feature_description": "Ag brabhsáil grianghraif agus físeáin grúpáilte de réir topaicí clibeanna loighciúla",
"tag_not_found_question": "Ní féidir clib a aimsiú? <link>Cruthaigh clib nua.</link>", "tag_not_found_question": "Ní féidir clib a aimsiú? <link>Cruthaigh clib nua.</link>",
"tag_people": "Daoine a Chlibeáil", "tag_people": "Daoine a Chlibeáil",
@@ -2394,6 +2399,7 @@
"viewer_remove_from_stack": "Bain den Chruach", "viewer_remove_from_stack": "Bain den Chruach",
"viewer_stack_use_as_main_asset": "Úsáid mar Phríomhshócmhainn", "viewer_stack_use_as_main_asset": "Úsáid mar Phríomhshócmhainn",
"viewer_unstack": "Dí-Chruach", "viewer_unstack": "Dí-Chruach",
"visibility": "Infheictheacht",
"visibility_changed": "Athraíodh infheictheacht do {count, plural, one {# duine} other {# daoine}}", "visibility_changed": "Athraíodh infheictheacht do {count, plural, one {# duine} other {# daoine}}",
"visual": "Amhairc", "visual": "Amhairc",
"visual_builder": "Tógálaí amhairc", "visual_builder": "Tógálaí amhairc",
+13 -7
View File
@@ -441,7 +441,7 @@
"user_successfully_removed": "O usuario {email} foi eliminado satisfactoriamente.", "user_successfully_removed": "O usuario {email} foi eliminado satisfactoriamente.",
"users_page_description": "Páxina de usuarios administradores", "users_page_description": "Páxina de usuarios administradores",
"version_check_enabled_description": "Activar comprobación de versión", "version_check_enabled_description": "Activar comprobación de versión",
"version_check_implications": "A función de comprobación de versión depende da comunicación periódica con github.com", "version_check_implications": "A función de comprobación de versión depende da comunicación periódica con {server}",
"version_check_settings": "Comprobación de Versión", "version_check_settings": "Comprobación de Versión",
"version_check_settings_description": "Activar/desactivar a notificación de nova versión", "version_check_settings_description": "Activar/desactivar a notificación de nova versión",
"video_conversion_job": "Transcodificar vídeos", "video_conversion_job": "Transcodificar vídeos",
@@ -849,9 +849,12 @@
"create_link_to_share": "Crear ligazón para compartir", "create_link_to_share": "Crear ligazón para compartir",
"create_link_to_share_description": "Permitir que calquera persoa coa ligazón vexa a(s) foto(s) seleccionada(s)", "create_link_to_share_description": "Permitir que calquera persoa coa ligazón vexa a(s) foto(s) seleccionada(s)",
"create_new": "CREAR NOVO", "create_new": "CREAR NOVO",
"create_new_face": "Crear nova cara",
"create_new_person": "Crear nova persoa", "create_new_person": "Crear nova persoa",
"create_new_person_hint": "Asignar activos seleccionados a unha nova persoa", "create_new_person_hint": "Asignar activos seleccionados a unha nova persoa",
"create_new_user": "Crear novo usuario", "create_new_user": "Crear novo usuario",
"create_person": "Crear persona",
"create_person_subtitle": "Engade un nome á cara seleccionada para crear e etiquetar á nova persona",
"create_shared_album_page_share_add_assets": "ENGADIR ACTIVOS", "create_shared_album_page_share_add_assets": "ENGADIR ACTIVOS",
"create_shared_album_page_share_select_photos": "Seleccionar Fotos", "create_shared_album_page_share_select_photos": "Seleccionar Fotos",
"create_shared_link": "Crear ligazón compartida", "create_shared_link": "Crear ligazón compartida",
@@ -866,6 +869,7 @@
"crop_aspect_ratio_fixed": "Fixado", "crop_aspect_ratio_fixed": "Fixado",
"crop_aspect_ratio_free": "Libre", "crop_aspect_ratio_free": "Libre",
"crop_aspect_ratio_original": "Orixinal", "crop_aspect_ratio_original": "Orixinal",
"crop_aspect_ratio_square": "Cadrado",
"curated_object_page_title": "Cousas", "curated_object_page_title": "Cousas",
"current_device": "Dispositivo actual", "current_device": "Dispositivo actual",
"current_pin_code": "Código PIN actual", "current_pin_code": "Código PIN actual",
@@ -880,7 +884,7 @@
"daily_title_text_date": "E, dd MMM", "daily_title_text_date": "E, dd MMM",
"daily_title_text_date_year": "E, dd MMM, yyyy", "daily_title_text_date_year": "E, dd MMM, yyyy",
"dark": "Escuro", "dark": "Escuro",
"dark_theme": "Alternar tema escuro", "dark_theme": "Alternar a tema escuro",
"date": "Data", "date": "Data",
"date_after": "Data posterior a", "date_after": "Data posterior a",
"date_and_time": "Data e Hora", "date_and_time": "Data e Hora",
@@ -891,10 +895,8 @@
"day": "Día", "day": "Día",
"days": "Días", "days": "Días",
"deduplicate_all": "Eliminar todos os duplicados", "deduplicate_all": "Eliminar todos os duplicados",
"deduplication_criteria_1": "Tamaño da imaxe en bytes", "default_locale": "Configuración rexional predeterminada",
"deduplication_criteria_2": "Reconto de datos EXIF", "default_locale_description": "Formatee as datas e os números según a configuración rexional do seu navegador",
"deduplication_info": "Información de Deduplicación",
"deduplication_info_description": "Para preseleccionar automaticamente activos e eliminar duplicados masivamente, miramos:",
"delete": "Eliminar", "delete": "Eliminar",
"delete_action_confirmation_message": "Está seguro de que quere eliminar este ficheiro? Esta acción moverá o ficheiro ao lixo do servidor e preguntaralle se tamén quere eliminalo localmente", "delete_action_confirmation_message": "Está seguro de que quere eliminar este ficheiro? Esta acción moverá o ficheiro ao lixo do servidor e preguntaralle se tamén quere eliminalo localmente",
"delete_action_prompt": "{count} eliminado(s)", "delete_action_prompt": "{count} eliminado(s)",
@@ -970,7 +972,7 @@
"downloading_media": "Descargando medios", "downloading_media": "Descargando medios",
"drop_files_to_upload": "Solte ficheiros en calquera lugar para cargar", "drop_files_to_upload": "Solte ficheiros en calquera lugar para cargar",
"duplicates": "Duplicados", "duplicates": "Duplicados",
"duplicates_description": "Resolve cada grupo indicando cales, se os houber, son duplicados", "duplicates_description": "Resolve cada grupo indicando cales, se os houber, son duplicados.",
"duration": "Duración", "duration": "Duración",
"edit": "Editar", "edit": "Editar",
"edit_album": "Editar álbum", "edit_album": "Editar álbum",
@@ -1387,9 +1389,11 @@
"library_page_sort_title": "Título do álbum", "library_page_sort_title": "Título do álbum",
"licenses": "Licenzas", "licenses": "Licenzas",
"light": "Claro", "light": "Claro",
"light_theme": "Cambiar a tema claro",
"like": "Gústame", "like": "Gústame",
"like_deleted": "Gústame eliminado", "like_deleted": "Gústame eliminado",
"link_motion_video": "Ligar vídeo en movemento", "link_motion_video": "Ligar vídeo en movemento",
"link_to_docs": "Para máis información, consulte a <link>documentación</link>.",
"link_to_oauth": "Ligar a OAuth", "link_to_oauth": "Ligar a OAuth",
"linked_oauth_account": "Conta OAuth ligada", "linked_oauth_account": "Conta OAuth ligada",
"list": "Lista", "list": "Lista",
@@ -2213,6 +2217,7 @@
"tag": "Etiqueta", "tag": "Etiqueta",
"tag_assets": "Etiquetar activos", "tag_assets": "Etiquetar activos",
"tag_created": "Etiqueta creada: {tag}", "tag_created": "Etiqueta creada: {tag}",
"tag_face": "Etiquetar cara",
"tag_feature_description": "Navegar por fotos e vídeos agrupados por temas de etiquetas lóxicas", "tag_feature_description": "Navegar por fotos e vídeos agrupados por temas de etiquetas lóxicas",
"tag_not_found_question": "Non atopa unha etiqueta? <link>Crear unha nova etiqueta.</link>", "tag_not_found_question": "Non atopa unha etiqueta? <link>Crear unha nova etiqueta.</link>",
"tag_people": "Etiquetar Persoas", "tag_people": "Etiquetar Persoas",
@@ -2394,6 +2399,7 @@
"viewer_remove_from_stack": "Eliminar da Pila", "viewer_remove_from_stack": "Eliminar da Pila",
"viewer_stack_use_as_main_asset": "Usar como Activo Principal", "viewer_stack_use_as_main_asset": "Usar como Activo Principal",
"viewer_unstack": "Desapilar", "viewer_unstack": "Desapilar",
"visibility": "Visibilidade",
"visibility_changed": "Visibilidade cambiada para {count, plural, one {# persoa} other {# persoas}}", "visibility_changed": "Visibilidade cambiada para {count, plural, one {# persoa} other {# persoas}}",
"visual": "Visual", "visual": "Visual",
"visual_builder": "Construtor visual", "visual_builder": "Construtor visual",
+1 -5
View File
@@ -422,7 +422,7 @@
"user_successfully_removed": "Dr Benutzer {email} isch erfolgrich entfernt worde.", "user_successfully_removed": "Dr Benutzer {email} isch erfolgrich entfernt worde.",
"users_page_description": "Administrator-Benutzersiite", "users_page_description": "Administrator-Benutzersiite",
"version_check_enabled_description": "Versionsprüefig akivierä", "version_check_enabled_description": "Versionsprüefig akivierä",
"version_check_implications": "DFunktion zur Versionsprüefig basiert uf regelmässiger Kommunikazion mit GitHub.com", "version_check_implications": "DFunktion zur Versionsprüefig basiert uf regelmässiger Kommunikazion mit {server}",
"version_check_settings": "Versionsprüefig", "version_check_settings": "Versionsprüefig",
"version_check_settings_description": "Aktiviere/Deaktivier dBenochrichtigung über neui Versione", "version_check_settings_description": "Aktiviere/Deaktivier dBenochrichtigung über neui Versione",
"video_conversion_job": "Videos transkodiere", "video_conversion_job": "Videos transkodiere",
@@ -835,10 +835,6 @@
"day": "Tag", "day": "Tag",
"days": "Täg", "days": "Täg",
"deduplicate_all": "Alli Duplikate entfernä", "deduplicate_all": "Alli Duplikate entfernä",
"deduplication_criteria_1": "Bildgrössi in Bytes",
"deduplication_criteria_2": "Anzahl vo de EXIF Date",
"deduplication_info": "Deduplizierungsinformatione",
"deduplication_info_description": "Für dautomatischi Datei-Voruswahl und sDedupliziere vo allne Dateie berücksichtige mir:",
"delete": "Lösche", "delete": "Lösche",
"delete_action_confirmation_message": "Bisch du sicher, dass du dies Objekt lösche wotsch? Die Aktion verschiebt sObjekt i de Papirkorb vom Server und fragt dich, ob dus lokal löösche wotsch", "delete_action_confirmation_message": "Bisch du sicher, dass du dies Objekt lösche wotsch? Die Aktion verschiebt sObjekt i de Papirkorb vom Server und fragt dich, ob dus lokal löösche wotsch",
"delete_action_prompt": "{count} glöscht", "delete_action_prompt": "{count} glöscht",
+21 -16
View File
@@ -20,7 +20,7 @@
"add_action_description": "לחץ כדי להוסיף פעולה לביצוע", "add_action_description": "לחץ כדי להוסיף פעולה לביצוע",
"add_assets": "הוסף תמונות", "add_assets": "הוסף תמונות",
"add_birthday": "הוספת יום הולדת", "add_birthday": "הוספת יום הולדת",
"add_endpoint": "הוסף כתובת URL", "add_endpoint": "הוספת כתובת קצה",
"add_exclusion_pattern": "הוספת דפוס החרגה", "add_exclusion_pattern": "הוספת דפוס החרגה",
"add_filter": "הוסף סינון", "add_filter": "הוסף סינון",
"add_filter_description": "לחץ כדי להוסיף תנאי לסינון", "add_filter_description": "לחץ כדי להוסיף תנאי לסינון",
@@ -53,7 +53,7 @@
"authentication_settings": "הגדרות התחברות", "authentication_settings": "הגדרות התחברות",
"authentication_settings_description": "ניהול סיסמה, OAuth, והגדרות התחברות אחרות", "authentication_settings_description": "ניהול סיסמה, OAuth, והגדרות התחברות אחרות",
"authentication_settings_disable_all": "האם ברצונך להשבית את כל שיטות ההתחברות? כניסה למערכת תהיה מושבתת לחלוטין.", "authentication_settings_disable_all": "האם ברצונך להשבית את כל שיטות ההתחברות? כניסה למערכת תהיה מושבתת לחלוטין.",
"authentication_settings_reenable": "כדי לאפשר מחדש, יש להשתמש ב<link>פקודת שרת</link>.", "authentication_settings_reenable": "כדי לאפשר מחדש, יש להשתמש <link>בפקודת שרת</link>.",
"background_task_job": "משימות רקע", "background_task_job": "משימות רקע",
"backup_database": "גיבוי מסד נתונים", "backup_database": "גיבוי מסד נתונים",
"backup_database_enable_description": "אפשר גיבויי מסד נתונים", "backup_database_enable_description": "אפשר גיבויי מסד נתונים",
@@ -62,7 +62,7 @@
"backup_onboarding_2_description": "העתקים מקומיים במכשירים שונים. זה כולל את הקבצים הראשיים וגיבוי של הקבצים האלה באופן מקומי.", "backup_onboarding_2_description": "העתקים מקומיים במכשירים שונים. זה כולל את הקבצים הראשיים וגיבוי של הקבצים האלה באופן מקומי.",
"backup_onboarding_3_description": "סך כל ההעתקים של הנתונים שלך, כולל הקבצים המקוריים. זה כולל העתק אחד מחוץ למקום השרת ושני העתקים מקומיים.", "backup_onboarding_3_description": "סך כל ההעתקים של הנתונים שלך, כולל הקבצים המקוריים. זה כולל העתק אחד מחוץ למקום השרת ושני העתקים מקומיים.",
"backup_onboarding_description": "<backblaze-link>אסטרטגיית גיבוי 3-2-1</backblaze-link> הינה מומלצת על מנת להגן על הנתונים שלך. עליך להשאיר העתקים של תמונות/סרטונים שהועלו כמו גם את מסד הנתונים של Immich עבור פתרון גיבוי מקיף.", "backup_onboarding_description": "<backblaze-link>אסטרטגיית גיבוי 3-2-1</backblaze-link> הינה מומלצת על מנת להגן על הנתונים שלך. עליך להשאיר העתקים של תמונות/סרטונים שהועלו כמו גם את מסד הנתונים של Immich עבור פתרון גיבוי מקיף.",
"backup_onboarding_footer": "עבור מידע נוסף על גיבוי Immich, נא לפנות אל ה<link>תיעוד</link>.", "backup_onboarding_footer": "עבור מידע נוסף על גיבוי Immich, נא לפנות אל <link>התיעוד</link>.",
"backup_onboarding_parts_title": "גיבוי 3-2-1 כולל:", "backup_onboarding_parts_title": "גיבוי 3-2-1 כולל:",
"backup_onboarding_title": "גיבויים", "backup_onboarding_title": "גיבויים",
"backup_settings": "הגדרות גיבוי", "backup_settings": "הגדרות גיבוי",
@@ -281,7 +281,7 @@
"oauth_role_claim_description": "הענק גישת מנהל באופן אוטומטי אם תביעה זו קיימת. ערך התביעה יכול להיות 'user' או 'admin'.", "oauth_role_claim_description": "הענק גישת מנהל באופן אוטומטי אם תביעה זו קיימת. ערך התביעה יכול להיות 'user' או 'admin'.",
"oauth_settings": "OAuth", "oauth_settings": "OAuth",
"oauth_settings_description": "ניהול הגדרות התחברות עם OAuth", "oauth_settings_description": "ניהול הגדרות התחברות עם OAuth",
"oauth_settings_more_details": "למידע נוסף אודות תכונה זו, בדוק את ה<link>תיעוד</link>.", "oauth_settings_more_details": "למידע נוסף אודות תכונה זו, בדוק את <link>התיעוד</link>.",
"oauth_storage_label_claim": "דרישת תווית אחסון", "oauth_storage_label_claim": "דרישת תווית אחסון",
"oauth_storage_label_claim_description": "הגדר אוטומטית את תווית האחסון של המשתמש לערך של דרישה זו.", "oauth_storage_label_claim_description": "הגדר אוטומטית את תווית האחסון של המשתמש לערך של דרישה זו.",
"oauth_storage_quota_claim": "דרישת מכסת אחסון", "oauth_storage_quota_claim": "דרישת מכסת אחסון",
@@ -330,7 +330,7 @@
"storage_template_hash_verification_enabled": "אימות גיבוב מופעל", "storage_template_hash_verification_enabled": "אימות גיבוב מופעל",
"storage_template_hash_verification_enabled_description": "מאפשר אימות גיבוב, אין להשבית זאת אלא אם יש לך ודאות לגבי ההשלכות", "storage_template_hash_verification_enabled_description": "מאפשר אימות גיבוב, אין להשבית זאת אלא אם יש לך ודאות לגבי ההשלכות",
"storage_template_migration": "העברת תבנית אחסון", "storage_template_migration": "העברת תבנית אחסון",
"storage_template_migration_description": "החל את ה<link>{template}</link> הנוכחית על תמונות שהועלו בעבר", "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_migration_job": "משימת העברת תבנית אחסון",
"storage_template_more_details": "לפרטים נוספים אודות תכונה זו, עיין ב<template-link>תבנית האחסון</template-link> וב<implications-link>השלכותיה</implications-link>", "storage_template_more_details": "לפרטים נוספים אודות תכונה זו, עיין ב<template-link>תבנית האחסון</template-link> וב<implications-link>השלכותיה</implications-link>",
@@ -441,7 +441,7 @@
"user_successfully_removed": "המשתמש {email} הוסר בהצלחה.", "user_successfully_removed": "המשתמש {email} הוסר בהצלחה.",
"users_page_description": "עמוד ניהול משתמשים", "users_page_description": "עמוד ניהול משתמשים",
"version_check_enabled_description": "אפשר בדיקת גרסה", "version_check_enabled_description": "אפשר בדיקת גרסה",
"version_check_implications": "תכונת בדיקת הגרסה מסתמכת על תקשורת תקופתית עם github.com", "version_check_implications": "תכונת בדיקת הגרסה מסתמכת על תקשורת תקופתית עם {server}",
"version_check_settings": "בדיקת גרסה", "version_check_settings": "בדיקת גרסה",
"version_check_settings_description": "הפעל/השבת את ההתראה על גרסה חדשה", "version_check_settings_description": "הפעל/השבת את ההתראה על גרסה חדשה",
"video_conversion_job": "המרת קידוד סרטונים", "video_conversion_job": "המרת קידוד סרטונים",
@@ -866,6 +866,7 @@
"crop_aspect_ratio_fixed": "תוקן", "crop_aspect_ratio_fixed": "תוקן",
"crop_aspect_ratio_free": "חינם", "crop_aspect_ratio_free": "חינם",
"crop_aspect_ratio_original": "מקורי", "crop_aspect_ratio_original": "מקורי",
"crop_aspect_ratio_square": "ריבוע",
"curated_object_page_title": "דברים", "curated_object_page_title": "דברים",
"current_device": "מכשיר נוכחי", "current_device": "מכשיר נוכחי",
"current_pin_code": "קוד PIN הנוכחי", "current_pin_code": "קוד PIN הנוכחי",
@@ -880,7 +881,7 @@
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy", "daily_title_text_date_year": "E, MMM dd, yyyy",
"dark": "כהה", "dark": "כהה",
"dark_theme": "הפעל/כבה מצב כהה", "dark_theme": "מעבר לערכת נושא כהה",
"date": "תאריך", "date": "תאריך",
"date_after": "תאריך אחרי", "date_after": "תאריך אחרי",
"date_and_time": "תאריך ושעה", "date_and_time": "תאריך ושעה",
@@ -891,10 +892,8 @@
"day": "יום", "day": "יום",
"days": "ימים", "days": "ימים",
"deduplicate_all": "ביטול כל הכפילויות", "deduplicate_all": "ביטול כל הכפילויות",
"deduplication_criteria_1": "גודל תמונה בבתים", "default_locale": "אזור שפה ברירת מחדל",
"deduplication_criteria_2": "כמות נתוני EXIF", "default_locale_description": "עיצוב תאריכים ומספרים בהתבסס על אזור השפה של הדפדפן שלך",
"deduplication_info": "מידע על ביטול כפילויות",
"deduplication_info_description": "כדי לבחור מראש תמונות באופן אוטומטי ולהסיר כפילויות בכמות גדולה, אנו מסתכלים על:",
"delete": "מחק", "delete": "מחק",
"delete_action_confirmation_message": "האם אתה בטוח שברצונך למחוק את התמונה הזאת? פעולה זו תעביר אותו לאשפה של השרת, ותשאל אם ברצונך למחוק אותו גם מהמכשיר המקומי", "delete_action_confirmation_message": "האם אתה בטוח שברצונך למחוק את התמונה הזאת? פעולה זו תעביר אותו לאשפה של השרת, ותשאל אם ברצונך למחוק אותו גם מהמכשיר המקומי",
"delete_action_prompt": "{count} נמחקו", "delete_action_prompt": "{count} נמחקו",
@@ -970,7 +969,7 @@
"downloading_media": "מוריד מדיה", "downloading_media": "מוריד מדיה",
"drop_files_to_upload": "שחרר קבצים בכל מקום כדי להעלות", "drop_files_to_upload": "שחרר קבצים בכל מקום כדי להעלות",
"duplicates": "כפילויות", "duplicates": "כפילויות",
"duplicates_description": "הפרד כל קבוצה על ידי ציון אילו, אם בכלל, הן כפילויות", "duplicates_description": "הפרד כל קבוצה על ידי ציון אילו, אם בכלל, הן כפילויות.",
"duration": "משך זמן", "duration": "משך זמן",
"edit": "ערוך", "edit": "ערוך",
"edit_album": "ערוך אלבום", "edit_album": "ערוך אלבום",
@@ -1007,6 +1006,8 @@
"editor_edits_applied_success": "עריכות יושמו בהצלחה", "editor_edits_applied_success": "עריכות יושמו בהצלחה",
"editor_flip_horizontal": "הפוך אופקית", "editor_flip_horizontal": "הפוך אופקית",
"editor_flip_vertical": "הפוך אנכית", "editor_flip_vertical": "הפוך אנכית",
"editor_handle_corner": "ידית הפינה {corner, select, top_left {השמאלית־עליונה} top_right {הימנית־עליונה} bottom_left {השמאלית־תחתונה} bottom_right {הימנית־תחתונה} other {}}",
"editor_handle_edge": "ידית הקצה {edge, select, top {העליון} bottom {התחתון} left {השמאלי} right {הימני} other {}}",
"editor_orientation": "כיוון", "editor_orientation": "כיוון",
"editor_reset_all_changes": "איפוס שינויים", "editor_reset_all_changes": "איפוס שינויים",
"editor_rotate_left": "סיבוב 90° נגד כיוון השעון", "editor_rotate_left": "סיבוב 90° נגד כיוון השעון",
@@ -1072,7 +1073,7 @@
"failed_to_update_notification_status": "שגיאה בעדכון ההתראה", "failed_to_update_notification_status": "שגיאה בעדכון ההתראה",
"incorrect_email_or_password": "דוא\"ל או סיסמה שגויים", "incorrect_email_or_password": "דוא\"ל או סיסמה שגויים",
"library_folder_already_exists": "נתיב הייבוא כבר מוגדר.", "library_folder_already_exists": "נתיב הייבוא כבר מוגדר.",
"page_not_found": "העמוד לא נמצא :/", "page_not_found": "העמוד לא נמצא",
"paths_validation_failed": "{paths, plural, one {נתיב # נכשל} other {# נתיבים נכשלו}} אימות", "paths_validation_failed": "{paths, plural, one {נתיב # נכשל} other {# נתיבים נכשלו}} אימות",
"profile_picture_transparent_pixels": "תמונות פרופיל אינן יכולות לכלול פיקסלים שקופים. נא להגדיל ו/או להזיז את התמונה.", "profile_picture_transparent_pixels": "תמונות פרופיל אינן יכולות לכלול פיקסלים שקופים. נא להגדיל ו/או להזיז את התמונה.",
"quota_higher_than_disk_size": "הגדרת מכסה גבוהה יותר מגודל הדיסק", "quota_higher_than_disk_size": "הגדרת מכסה גבוהה יותר מגודל הדיסק",
@@ -1385,9 +1386,11 @@
"library_page_sort_title": "כותרת אלבום", "library_page_sort_title": "כותרת אלבום",
"licenses": "רישיונות", "licenses": "רישיונות",
"light": "בהיר", "light": "בהיר",
"light_theme": "החלפה לערכת נושא בהירה",
"like": "אהבתי", "like": "אהבתי",
"like_deleted": "לייק נמחק", "like_deleted": "לייק נמחק",
"link_motion_video": "קשר סרטון תנועה", "link_motion_video": "קשר סרטון תנועה",
"link_to_docs": "למידע נוסף, יש לעיין <link>בתיעוד</link>.",
"link_to_oauth": "קישור ל-OAuth", "link_to_oauth": "קישור ל-OAuth",
"linked_oauth_account": "חשבון OAuth מקושר", "linked_oauth_account": "חשבון OAuth מקושר",
"list": "רשימה", "list": "רשימה",
@@ -1566,7 +1569,7 @@
"network_requirements": "דרישות רשת", "network_requirements": "דרישות רשת",
"network_requirements_updated": "דרישות הרשת השתנו, תור הגיבוי אופס", "network_requirements_updated": "דרישות הרשת השתנו, תור הגיבוי אופס",
"networking_settings": "רשת", "networking_settings": "רשת",
"networking_subtitle": "ניהול הגדרות כתובת URL של השרת", "networking_subtitle": "ניהול הגדרות כתובת השרת",
"never": "אף פעם", "never": "אף פעם",
"new_album": "אלבום חדש", "new_album": "אלבום חדש",
"new_api_key": "מפתח API חדש", "new_api_key": "מפתח API חדש",
@@ -1649,6 +1652,7 @@
"only_favorites": "רק מועדפים", "only_favorites": "רק מועדפים",
"open": "פתח", "open": "פתח",
"open_calendar": "פתיחת לוח שנה", "open_calendar": "פתיחת לוח שנה",
"open_in_browser": "פתיחה בדפדפן",
"open_in_map_view": "פתח בתצוגת מפה", "open_in_map_view": "פתח בתצוגת מפה",
"open_in_openstreetmap": "פתח ב-OpenStreetMap", "open_in_openstreetmap": "פתח ב-OpenStreetMap",
"open_the_search_filters": "פתח את מסנני החיפוש", "open_the_search_filters": "פתח את מסנני החיפוש",
@@ -2009,7 +2013,7 @@
"selected_gps_coordinates": "קואורדינטות GPS שנבחרו", "selected_gps_coordinates": "קואורדינטות GPS שנבחרו",
"send_message": "שלח הודעה", "send_message": "שלח הודעה",
"send_welcome_email": "שלח דוא\"ל קבלת פנים", "send_welcome_email": "שלח דוא\"ל קבלת פנים",
"server_endpoint": "כתובת URL של השרת", "server_endpoint": "כתובת השרת",
"server_info_box_app_version": "גרסת יישום", "server_info_box_app_version": "גרסת יישום",
"server_info_box_server_url": "כתובת שרת", "server_info_box_server_url": "כתובת שרת",
"server_offline": "השרת מנותק", "server_offline": "השרת מנותק",
@@ -2211,7 +2215,7 @@
"tag_assets": "תיוג תמונות", "tag_assets": "תיוג תמונות",
"tag_created": "נוצר תג: {tag}", "tag_created": "נוצר תג: {tag}",
"tag_feature_description": "עיון בתמונות וסרטונים שקובצו על ידי נושאי תג לוגיים", "tag_feature_description": "עיון בתמונות וסרטונים שקובצו על ידי נושאי תג לוגיים",
"tag_not_found_question": "לא מצליח למצוא תג? <link>צור תג חדש</link>", "tag_not_found_question": "לא ניתן למצוא תג? <link>יצירת תג חדש.</link>",
"tag_people": "תייג אנשים", "tag_people": "תייג אנשים",
"tag_updated": "תג מעודכן: {tag}", "tag_updated": "תג מעודכן: {tag}",
"tagged_assets": "תויגו {count, plural, one {תמונה #} other {# תמונות}}", "tagged_assets": "תויגו {count, plural, one {תמונה #} other {# תמונות}}",
@@ -2391,6 +2395,7 @@
"viewer_remove_from_stack": "הסר מערימה", "viewer_remove_from_stack": "הסר מערימה",
"viewer_stack_use_as_main_asset": "השתמש כתמונה ראשית", "viewer_stack_use_as_main_asset": "השתמש כתמונה ראשית",
"viewer_unstack": "ביטול ערימה", "viewer_unstack": "ביטול ערימה",
"visibility": "נראות",
"visibility_changed": "הנראות השתנתה עבור {count, plural, one {אדם #} other {# אנשים}}", "visibility_changed": "הנראות השתנתה עבור {count, plural, one {אדם #} other {# אנשים}}",
"visual": "חזותי", "visual": "חזותי",
"visual_builder": "בונה חזותי", "visual_builder": "בונה חזותי",
+1 -5
View File
@@ -441,7 +441,7 @@
"user_successfully_removed": "उपयोगकर्ता {email} को सफलतापूर्वक हटा दिया गया है।", "user_successfully_removed": "उपयोगकर्ता {email} को सफलतापूर्वक हटा दिया गया है।",
"users_page_description": "प्रशासक (Admin) उपयोगकर्ता पेज", "users_page_description": "प्रशासक (Admin) उपयोगकर्ता पेज",
"version_check_enabled_description": "नई रिलीज़ की जाँच के लिए GitHub पर आवधिक अनुरोध सक्षम करें", "version_check_enabled_description": "नई रिलीज़ की जाँच के लिए GitHub पर आवधिक अनुरोध सक्षम करें",
"version_check_implications": "संस्करण जाँच सुविधा github.com के साथ आवधिक संचार पर निर्भर करती है", "version_check_implications": "संस्करण जाँच सुविधा {server} के साथ आवधिक संचार पर निर्भर करती है",
"version_check_settings": "संस्करण चेक", "version_check_settings": "संस्करण चेक",
"version_check_settings_description": "नए संस्करण अधिसूचना को सक्षम/अक्षम करें", "version_check_settings_description": "नए संस्करण अधिसूचना को सक्षम/अक्षम करें",
"video_conversion_job": "ट्रांसकोड वीडियो", "video_conversion_job": "ट्रांसकोड वीडियो",
@@ -891,10 +891,6 @@
"day": "दिन", "day": "दिन",
"days": "दिन", "days": "दिन",
"deduplicate_all": "सभी को डुप्लिकेट करें", "deduplicate_all": "सभी को डुप्लिकेट करें",
"deduplication_criteria_1": "छवि का आकार बाइट्स में",
"deduplication_criteria_2": "EXIF डेटा की संख्या",
"deduplication_info": "डुप्लीकेशन हटाने की जानकारी",
"deduplication_info_description": "परिसंपत्तियों का स्वचालित रूप से पूर्व-चयन करने और डुप्लिकेट को थोक में हटाने के लिए, हम निम्न पर ध्यान देते हैं:",
"delete": "हटाएँ", "delete": "हटाएँ",
"delete_action_confirmation_message": "क्या आप वाकई इस आइटम को हटाना चाहते हैं? यह कार्रवाई आइटम को सर्वर की ट्रैश में ले जाएगी और स्थानीय रूप से हटाने के लिए पुष्टि मांगेगी", "delete_action_confirmation_message": "क्या आप वाकई इस आइटम को हटाना चाहते हैं? यह कार्रवाई आइटम को सर्वर की ट्रैश में ले जाएगी और स्थानीय रूप से हटाने के लिए पुष्टि मांगेगी",
"delete_action_prompt": "{count} हटाए गए", "delete_action_prompt": "{count} हटाए गए",

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