diff --git a/.claude/rules/api-and-config.md b/.claude/rules/api-and-config.md
index 9d3ccfe9b..bf64a8c9e 100644
--- a/.claude/rules/api-and-config.md
+++ b/.claude/rules/api-and-config.md
@@ -38,5 +38,5 @@ When renaming or adding fields:
- Map roles via the shared tables: users through `acl.ParseRole(s)` / `acl.UserRoles[...]`, clients through `acl.ClientRoles[...]`.
- Treat `RoleAliasNone` ("none") and an empty string as `RoleNone`; default unknown client roles to `RoleClient`.
-- Build CLI role help from `Roles.CliUsageString()` (e.g. `acl.ClientRoles.CliUsageString()`) — never hand-maintain role lists.
+- Build CLI role help from the registered role map (never hand-maintained literals) so each edition lists exactly the roles it accepts: `commands.UserRoleUsageFor()` / `Roles.CliUsageString()`, passing CE `acl.UserRoles` or an edition's own static `auth.UserRoles` (reference the edition map directly, not the runtime-reassigned `acl.UserRoles`, to avoid the init-order trap; Portal's map includes `cluster_admin`). For federatable / cluster-instance contexts (LDAP, OIDC group→role, cluster grants) use `acl.ClusterInstanceRolesCliUsageString()` — it excludes `cluster_admin`/`visitor`. `pkg/txt.JoinOr` renders the "a, b, or c" style.
- For JWT/client scope checks, use the shared helpers (`acl.ScopePermits` / `acl.ScopeAttrPermits`).
diff --git a/.claude/rules/frontend-rules.md b/.claude/rules/frontend-rules.md
index f2d339649..328015a1a 100644
--- a/.claude/rules/frontend-rules.md
+++ b/.claude/rules/frontend-rules.md
@@ -39,11 +39,11 @@
## Frontend Test Gotchas
-- Hidden-route UI checks under `/library/hidden` or `/portal/admin/hidden` require both `files.file_error` and `photos.photo_quality = -1`; `file_error` alone will not surface the row.
+- Hidden-route UI checks under `/library/hidden` or `/portal/hidden` require both `files.file_error` and `photos.photo_quality = -1`; `file_error` alone will not surface the row.
## Playwright MCP Usage
-- Endpoint `http://localhost:2342/`; logins at `/library/login` (CE/Plus/Pro) and `/portal/admin/login` (Portal). Use local compose admin credentials; if login fails, inspect the active compose env.
+- Endpoint `http://localhost:2342/`; logins at `/library/login` (CE/Plus/Pro) and `/portal/login` (Portal). Use local compose admin credentials; if login fails, inspect the active compose env.
- Viewports: desktop `1280x900`; mobile uses the mobile Playwright server at `375x667`. Close the browser tab after scripted interactions.
- Prefer waits over sleeps; click only visible/enabled elements; use role/label/text selectors (not XPath).
- Screenshots: small and reproducible — JPEG, visible viewport, deterministic `.local/screenshots//__.jpg` names, no large inline screenshots.
diff --git a/Dockerfile b/Dockerfile
index bc51e892d..ca3d8fdea 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
# Ubuntu 26.04 LTS (Resolute Raccoon)
-FROM photoprism/develop:260610-resolute
+FROM photoprism/develop:260611-resolute
# Harden npm usage by default (applies to npm ci / install in dev container)
ENV NPM_CONFIG_IGNORE_SCRIPTS=true
diff --git a/Makefile b/Makefile
index f830b8b8a..df0a6eade 100644
--- a/Makefile
+++ b/Makefile
@@ -89,21 +89,22 @@ test-commands: run-test-commands
test-photoprism: run-test-photoprism
test-short: run-test-short
test-mariadb: reset-acceptance run-test-mariadb
-acceptance-run-chromium: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth acceptance-auth-sqlite-stop acceptance-sqlite-restart wait-2 acceptance acceptance-sqlite-stop
-acceptance-run-chromium-short: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth-short acceptance-auth-sqlite-stop acceptance-sqlite-restart wait-2 acceptance-short acceptance-sqlite-stop
-acceptance-auth-run-chromium: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth acceptance-auth-sqlite-stop
-acceptance-public-run-chromium: storage/acceptance acceptance-sqlite-restart wait acceptance acceptance-sqlite-stop
+acceptance-run-chromium: storage/acceptance acceptance-sqlite-restart-1 wait-1 acceptance-api acceptance-sqlite-stop-1 acceptance-auth-sqlite-restart wait-2 acceptance-auth acceptance-auth-sqlite-stop acceptance-sqlite-restart-3 wait-3 acceptance acceptance-sqlite-stop-3
+acceptance-run-chromium-short: storage/acceptance acceptance-auth-sqlite-restart wait-1 acceptance-auth-short acceptance-auth-sqlite-stop acceptance-sqlite-restart-2 wait-2 acceptance-short acceptance-sqlite-stop-2
+acceptance-auth-run-chromium: storage/acceptance acceptance-auth-sqlite-restart wait-1 acceptance-auth acceptance-auth-sqlite-stop
+acceptance-public-run-chromium: storage/acceptance acceptance-sqlite-restart-1 wait-1 acceptance acceptance-sqlite-stop-1
+acceptance-api-run-chromium: storage/acceptance acceptance-sqlite-restart-1 wait-1 acceptance-api acceptance-sqlite-stop-1
help: list
list:
@awk '/^[[:alnum:]]+[^[:space:]]+:/ {printf "%s",substr($$1,1,length($$1)-1); if (match($$0,/#/)) {desc=substr($$0,RSTART+1); sub(/^[[:space:]]+/,"",desc); printf " - %s\n",desc} else printf "\n" }' "$(firstword $(MAKEFILE_LIST))"
-wait:
- sleep 20
-wait-2:
+wait-%:
sleep 20
show-rev:
@git rev-parse HEAD
show-build:
@echo "$(BUILD_TAG)"
+tag-release:
+ scripts/tag-release.sh $(EDITION) $(TAG_ARGS)
test-all: test acceptance-run-chromium
fmt: fmt-js fmt-go fmt-swag
format: format-tables fmt-go fmt-swag
@@ -224,7 +225,7 @@ install-onnx:
sudo scripts/dist/install-onnx.sh
install-darktable:
sudo scripts/dist/install-darktable.sh
-acceptance-sqlite-restart: acceptance-sqlite-stop
+acceptance-sqlite-restart-%: acceptance-sqlite-stop-%
cp -f storage/acceptance/backup.db storage/acceptance/index.db
cp -f storage/acceptance/config-sqlite/settingsBackup.yml storage/acceptance/config-sqlite/settings.yml
rm -rf storage/acceptance/sidecar/2020
@@ -235,7 +236,7 @@ acceptance-sqlite-restart: acceptance-sqlite-stop
rm -rf storage/acceptance/originals/2013
rm -rf storage/acceptance/originals/2017
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" start -d
-acceptance-sqlite-stop:
+acceptance-sqlite-stop-%:
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" stop
acceptance-auth-sqlite-restart: acceptance-auth-sqlite-stop
cp -f storage/acceptance/backup.db storage/acceptance/index.db
@@ -436,21 +437,23 @@ build-static:
scripts/build.sh static $(BINARY_NAME)
build-libheif: build-libheif-amd64 build-libheif-arm64 build-libheif-armv7
build-libheif-amd64:
- docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:resolute ./scripts/dist/build-libheif.sh v1.22.2
- docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:questing ./scripts/dist/build-libheif.sh v1.22.2
- docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh v1.22.2
- docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.22.2
- docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.22.2
- docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.22.2
+ docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:resolute ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:questing ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:trixie ./scripts/dist/build-libheif.sh v1.23.0
build-libheif-arm64:
- docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:resolute ./scripts/dist/build-libheif.sh v1.22.2
- docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:questing ./scripts/dist/build-libheif.sh v1.22.2
- docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh v1.22.2
- docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.22.2
- docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.22.2
- docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.22.2
+ docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:resolute ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:questing ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.23.0
+ docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:trixie ./scripts/dist/build-libheif.sh v1.23.0
build-libheif-armv7:
- docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:armv7 ./scripts/dist/build-libheif.sh v1.22.2
+ docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:armv7 ./scripts/dist/build-libheif.sh v1.23.0
build-libheif-latest: build-libheif-amd64-latest build-libheif-arm64-latest build-libheif-armv7-latest
build-libheif-amd64-latest:
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:resolute ./scripts/dist/build-libheif.sh
@@ -468,9 +471,9 @@ build-libheif-armv7-latest:
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:armv7 ./scripts/dist/build-libheif.sh
build-libheif-deb: build-libheif-deb-amd64 build-libheif-deb-arm64
build-libheif-deb-amd64:
- docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:resolute ./scripts/dist/build-libheif-deb.sh v1.22.2
+ docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:resolute ./scripts/dist/build-libheif-deb.sh v1.23.0
build-libheif-deb-arm64:
- docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:resolute ./scripts/dist/build-libheif-deb.sh v1.22.2
+ docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:resolute ./scripts/dist/build-libheif-deb.sh v1.23.0
build-tensorflow: docker-tensorflow-amd64
docker-tensorflow: docker-tensorflow-amd64
docker-tensorflow-amd64:
@@ -496,20 +499,23 @@ test-js:
(cd frontend && npm run test)
acceptance:
$(info Running public-mode tests in Chrome...)
- (cd frontend && find ./tests/acceptance -type f -name "*.js" | xargs -i perl -0777 -ne 'while(/(?:mode: \"auth[^,]*\,)|(Multi-Window\:[A-Za-z 0-9\-_]*)/g){print "$$1\n" if ($$1);}' {} | xargs -I testname bash -c 'npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --experimental-multiple-windows --test-meta mode=public --config-file ./testcaferc.json --test "testname" "tests/acceptance"')
- (cd frontend && npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --test-grep "^(Common|Core)\:*" --test-meta mode=public --config-file ./testcaferc.json "tests/acceptance")
+ (cd frontend && find ./tests/acceptance -type f -name "*.js" | xargs -i perl -0777 -ne 'while(/(?:mode: \"auth[^,]*\,)|(Multi-Window\:[A-Za-z 0-9\-_]*)/g){print "$$1\n" if ($$1);}' {} | xargs -I testname bash -c 'npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --experimental-multiple-windows --test-meta mode=public --config-file ./.testcaferc.cjs --test "testname" "tests/acceptance"')
+ (cd frontend && npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --test-grep "^(Common|Core)\:*" --test-meta mode=public --config-file ./.testcaferc.cjs "tests/acceptance")
acceptance-short:
$(info Running JS acceptance tests in Chrome...)
- (cd frontend && find ./tests/acceptance -type f -name "*.js" | xargs -i perl -0777 -ne 'while(/(?:mode: \"auth[^,]*\,)|(Multi-Window\:[A-Za-z 0-9\-_]*)/g){print "$$1\n" if ($$1);}' {} | xargs -I testname bash -c 'npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --experimental-multiple-windows --test-meta mode=public,type=short --config-file ./testcaferc.json --test "testname" "tests/acceptance"')
- (cd frontend && npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --test-grep "^(Common|Core)\:*" --test-meta mode=public,type=short --config-file ./testcaferc.json "tests/acceptance")
+ (cd frontend && find ./tests/acceptance -type f -name "*.js" | xargs -i perl -0777 -ne 'while(/(?:mode: \"auth[^,]*\,)|(Multi-Window\:[A-Za-z 0-9\-_]*)/g){print "$$1\n" if ($$1);}' {} | xargs -I testname bash -c 'npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --experimental-multiple-windows --test-meta mode=public,type=short --config-file ./.testcaferc.cjs --test "testname" "tests/acceptance"')
+ (cd frontend && npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --test-grep "^(Common|Core)\:*" --test-meta mode=public,type=short --config-file ./.testcaferc.cjs "tests/acceptance")
acceptance-auth:
$(info Running JS acceptance-auth tests in Chrome...)
- (cd frontend && find ./tests/acceptance -type f -name "*.js" | xargs -i perl -0777 -ne 'while(/(?:mode: \"public[^,]*\,)|(Multi-Window\:[A-Za-z 0-9\-_]*)/g){print "$$1\n" if ($$1);}' {} | xargs -I testname bash -c 'npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --experimental-multiple-windows --test-meta mode=auth --config-file ./testcaferc.json --test "testname" "tests/acceptance"')
- (cd frontend && npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --test-grep "^(Common|Core)\:*" --test-meta mode=auth --config-file ./testcaferc.json "tests/acceptance")
+ (cd frontend && find ./tests/acceptance -type f -name "*.js" | xargs -i perl -0777 -ne 'while(/(?:mode: \"public[^,]*\,)|(Multi-Window\:[A-Za-z 0-9\-_]*)/g){print "$$1\n" if ($$1);}' {} | xargs -I testname bash -c 'npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --experimental-multiple-windows --test-meta mode=auth --config-file ./.testcaferc.cjs --test "testname" "tests/acceptance"')
+ (cd frontend && npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --test-grep "^(Common|Core)\:*" --test-meta mode=auth --config-file ./.testcaferc.cjs "tests/acceptance")
acceptance-auth-short:
$(info Running JS acceptance-auth tests in Chrome...)
- (cd frontend && find ./tests/acceptance -type f -name "*.js" | xargs -i perl -0777 -ne 'while(/(?:mode: \"public[^,]*\,)|(Multi-Window\:[A-Za-z 0-9\-_]*)/g){print "$$1\n" if ($$1);}' {} | xargs -I testname bash -c 'npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --experimental-multiple-windows --test-meta mode=auth,type=short --config-file ./testcaferc.json --test "testname" "tests/acceptance"')
- (cd frontend && npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --test-grep "^(Common|Core)\:*" --test-meta mode=auth,type=short --config-file ./testcaferc.json "tests/acceptance")
+ (cd frontend && find ./tests/acceptance -type f -name "*.js" | xargs -i perl -0777 -ne 'while(/(?:mode: \"public[^,]*\,)|(Multi-Window\:[A-Za-z 0-9\-_]*)/g){print "$$1\n" if ($$1);}' {} | xargs -I testname bash -c 'npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --experimental-multiple-windows --test-meta mode=auth,type=short --config-file ./.testcaferc.cjs --test "testname" "tests/acceptance"')
+ (cd frontend && npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --test-grep "^(Common|Core)\:*" --test-meta mode=auth,type=short --config-file ./.testcaferc.cjs "tests/acceptance")
+acceptance-api:
+ $(info Running JS acceptance-api tests in Chrome...)
+ (cd frontend && npm run testcafe -- "chrome --headless=new --use-gl=angle --use-angle=swiftshader --disable-features=LocalNetworkAccessChecks" --test-meta mode=api --config-file ./.testcaferc.cjs "tests/acceptance")
vitest-watch:
$(info Running Vitest unit tests in watch mode...)
(cd frontend && npm run test-watch)
diff --git a/NOTICE b/NOTICE
index f92c5ab9d..ef61c7b0b 100644
--- a/NOTICE
+++ b/NOTICE
@@ -9,7 +9,7 @@ The following 3rd-party software packages may be used by or distributed with
PhotoPrism. Any information relevant to third-party vendors listed below are
collected using common, reasonable means.
-Date generated: 2026-05-28
+Date generated: 2026-06-17
================================================================================
@@ -267,8 +267,8 @@ limitations under the License.
--------------------------------------------------------------------------------
Package: github.com/abema/go-mp4
-Version: v1.6.0
-License: MIT (https://github.com/abema/go-mp4/blob/v1.6.0/LICENSE)
+Version: v1.7.1
+License: MIT (https://github.com/abema/go-mp4/blob/v1.7.1/LICENSE)
MIT License
@@ -294,6 +294,52 @@ SOFTWARE.
--------------------------------------------------------------------------------
+Package: github.com/antchfx/xmlquery
+Version: v1.5.1
+License: MIT (https://github.com/antchfx/xmlquery/blob/v1.5.1/LICENSE)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+Package: github.com/antchfx/xpath
+Version: v1.3.6
+License: MIT (https://github.com/antchfx/xpath/blob/v1.3.6/LICENSE)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+--------------------------------------------------------------------------------
+
Package: github.com/beorn7/perks/quantile
Version: v1.0.1
License: MIT (https://github.com/beorn7/perks/blob/v1.0.1/LICENSE)
@@ -2387,8 +2433,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
--------------------------------------------------------------------------------
Package: github.com/golang/geo
-Version: v0.0.0-20260526120156-e21b7802b0ee
-License: Apache-2.0 (https://github.com/golang/geo/blob/e21b7802b0ee/LICENSE)
+Version: v0.0.0-20260612074446-f1a45663b0f3
+License: Apache-2.0 (https://github.com/golang/geo/blob/f1a45663b0f3/LICENSE)
Apache License
@@ -2595,6 +2641,204 @@ License: Apache-2.0 (https://github.com/golang/geo/blob/e21b7802b0ee/LICENSE)
--------------------------------------------------------------------------------
+Package: github.com/golang/groupcache/lru
+Version: v0.0.0-20210331224755-41bb18bfe9da
+License: Apache-2.0 (https://github.com/golang/groupcache/blob/41bb18bfe9da/LICENSE)
+
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct or
+indirect, to cause the direction or management of such entity, whether by
+contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by combination
+of their Contribution(s) with the Work to which such Contribution(s) was
+submitted. If You institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+Contribution incorporated within the Work constitutes direct or contributory
+patent infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof
+in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that You
+changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source form
+of the Work, excluding those notices that do not pertain to any part of the
+Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any
+Derivative Works that You distribute must include a readable copy of the
+attribution notices contained within such NOTICE file, excluding those notices
+that do not pertain to any part of the Derivative Works, in at least one of the
+following places: within a NOTICE text file distributed as part of the
+Derivative Works; within the Source form or documentation, if provided along
+with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents of
+the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works that
+You distribute, alongside or as an addendum to the NOTICE text from the Work,
+provided that such additional attribution notices cannot be construed as
+modifying the License.
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted
+for inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of
+any separate license agreement you may have executed with Licensor regarding
+such Contributions.
+
+6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the
+Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+including, without limitation, any warranties or conditions of TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
+solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence),
+contract, or otherwise, unless required by applicable law (such as deliberate
+and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License or
+out of the use or inability to use the Work (including but not limited to
+damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has
+been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to
+offer, and charge a fee for, acceptance of support, warranty, indemnity, or
+other liability obligations and/or rights consistent with this License. However,
+in accepting such obligations, You may act only on Your own behalf and on Your
+sole responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your
+accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "[]" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included on
+the same "printed page" as the copyright notice for easier identification within
+third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+--------------------------------------------------------------------------------
+
Package: github.com/google/jsonschema-go/jsonschema
Version: v0.4.3
License: MIT (https://github.com/google/jsonschema-go/blob/v0.4.3/LICENSE)
@@ -9610,97 +9854,93 @@ License: Apache-2.0 (https://github.com/go-yaml/yaml/blob/v2.4.0/LICENSE)
--------------------------------------------------------------------------------
Package License Copyright
--------------------------------------------------------------------------------
-@babel/cli MIT The Babel Team (https://babel.dev/team)
-@babel/core MIT The Babel Team (https://babel.dev/team)
-@babel/plugin-transform-runtime MIT The Babel Team (https://babel.dev/team)
-@babel/preset-env MIT The Babel Team (https://babel.dev/team)
-@babel/register MIT The Babel Team (https://babel.dev/team)
-@babel/runtime MIT The Babel Team (https://babel.dev/team)
-@eslint/eslintrc MIT Nicholas C. Zakas
-@eslint/js MIT n/a
-@mdi/font Apache-2.0 Austin Andrews
-@testing-library/jest-dom MIT Ernesto Garcia (http://gnapse.github.io)
-@vitejs/plugin-vue MIT Evan You
-@vitest/browser MIT n/a
-@vitest/coverage-v8 MIT Anthony Fu
-@vitest/ui MIT n/a
-@vue/compiler-sfc MIT Evan You
-@vue/language-server MIT n/a
-@vue/test-utils MIT Lachlan Miller lachlan.miller.1990@outlook.com
-@vvo/tzdb MIT Vincent Voyer
-axios MIT Matt Zabriskie
-axios-mock-adapter MIT Colin Timmermans
-babel-loader MIT Luis Couto
-babel-plugin-istanbul BSD-3-Clause Thai Pangsakulyanont @dtinth
-babel-plugin-polyfill-corejs3 MIT n/a
-browserslist MIT Andrey Sitnik
-core-js MIT Denis Pushkarev zloirock@zloirock.ru http://zloirock.ru
-cross-env MIT Kent C. Dodds (https://kentcdodds.com)
-css-loader MIT Tobias Koppers @sokra
-cssnano MIT Ben Briggs beneb.info@gmail.com http://beneb.info
-eslint MIT Nicholas C. Zakas
-eslint-config-prettier MIT Simon Lydell
-eslint-formatter-pretty MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
-eslint-plugin-html ISC n/a
-eslint-plugin-import MIT Ben Mosher
-eslint-plugin-node MIT Toru Nagashima
-eslint-plugin-vue MIT Toru Nagashima (https://github.com/mysticatea)
-eslint-plugin-vuetify MIT Kael Watts-Deuchar
-eslint-webpack-plugin MIT Ricardo Gobbo de Souza
-eventsource-polyfill MIT amvtek
-file-loader MIT Tobias Koppers @sokra
-file-saver MIT Eli Grey
-globals MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
-hls.js Apache-2.0 n/a
-i MIT Pavan Kumar Sunkara (pksunkara.github.com)
-jsdom MIT n/a
-luxon MIT Isaac Cambron
-maplibre-gl BSD-3-Clause n/a
-memoize-one MIT Alex Reardon
-mini-css-extract-plugin MIT Tobias Koppers @sokra
-minimist MIT James Halliday mail@substack.net http://substack.net
-node-storage-shim ISC Michael Nahkies
-passive-events-support MIT Ignas Damunskis
-@photo-sphere-viewer/core MIT Damien 'Mistic' Sorel contact@git.strangeplanet.fr
-@photo-sphere-viewer/equirectangular-video-adapter MIT Damien 'Mistic' Sorel contact@git.strangeplanet.fr
-@photo-sphere-viewer/video-plugin MIT Damien 'Mistic' Sorel contact@git.strangeplanet.fr
-photoswipe MIT Dmytro Semenov (https://dimsemenov.com)
-playwright Apache-2.0 Microsoft Corporation
-postcss MIT Andrey Sitnik
-postcss-import MIT Maxime Thirouin
-postcss-loader MIT Andrey Sitnik
-postcss-preset-env MIT-0 n/a
-postcss-reporter MIT David Clark david.dave.clark@gmail.com https://davidtheclark.com
-prettier MIT James Long
-pubsub-js MIT Morgan Roderick morgan@roderick.dk http://roderick.dk
-regenerator-runtime MIT Ben Newman
-resolve-url-loader MIT bholloway
-sanitize-html MIT Apostrophe Technologies, Inc.
-sass MIT Natalie Weizenbaum nweiz@google.com https://github.com/nex3
-sass-loader MIT J. Tangelder
-sockette MIT Luke Edwards luke.edwards05@gmail.com lukeed.com
-style-loader MIT Tobias Koppers @sokra
-svg-url-loader MIT Hovhannes Babayan
-tar BlueOak-1.0.0 Isaac Z. Schlueter
-url-loader MIT Tobias Koppers @sokra
-util MIT Joyent http://www.joyent.com
-vitest MIT Anthony Fu
-vue MIT Evan You
-vue-3-sanitize MIT Vannsl, Vanessa Otto
-vue-loader MIT Evan You
-vue-loader-plugin ISC Ivan liu
-vue-luxon MIT Cas Bloem
-vue-router MIT Eduardo San Martin Morote posva13@gmail.com
-vue-sanitize-directive MIT Leonardo Piccioni de Almeida leopiccionia@gmail.com
-vue-style-loader MIT Evan You
-vue3-gettext MIT Leo Zurbriggen
-vuetify MIT John Leider john@vuetifyjs.com
-webpack MIT Tobias Koppers @sokra
-webpack-bundle-analyzer MIT Yury Grunin
-webpack-cli MIT n/a
-webpack-hot-middleware MIT Glen Mailer
-webpack-manifest-plugin MIT Dane Thurber
-webpack-md5-hash MIT Kirill Ermolov
-webpack-merge MIT Juho Vepsalainen
-webpack-plugin-vuetify MIT Kael Watts-Deuchar
-workbox-webpack-plugin MIT Google's Web DevRel Team and Google's Aurora Team
+@babel/cli MIT The Babel Team (https://babel.dev/team)
+@babel/core MIT The Babel Team (https://babel.dev/team)
+@babel/plugin-transform-runtime MIT The Babel Team (https://babel.dev/team)
+@babel/preset-env MIT The Babel Team (https://babel.dev/team)
+@babel/register MIT The Babel Team (https://babel.dev/team)
+@babel/runtime MIT The Babel Team (https://babel.dev/team)
+@eslint/eslintrc MIT Nicholas C. Zakas
+@eslint/js MIT n/a
+@mdi/font Apache-2.0 Austin Andrews
+@testing-library/jest-dom MIT Ernesto Garcia (http://gnapse.github.io)
+@vitejs/plugin-vue MIT Evan You
+@vitest/coverage-v8 MIT Anthony Fu
+@vue/compiler-sfc MIT Evan You
+@vue/language-server MIT n/a
+@vue/test-utils MIT Lachlan Miller lachlan.miller.1990@outlook.com
+@vvo/tzdb MIT Vincent Voyer
+axios MIT Matt Zabriskie
+axios-mock-adapter MIT Colin Timmermans
+babel-loader MIT Luis Couto
+babel-plugin-istanbul BSD-3-Clause Thai Pangsakulyanont @dtinth
+babel-plugin-polyfill-corejs3 MIT n/a
+browserslist MIT Andrey Sitnik
+core-js MIT Denis Pushkarev zloirock@zloirock.ru http://zloirock.ru
+cross-env MIT Kent C. Dodds (https://kentcdodds.com)
+css-loader MIT Tobias Koppers @sokra
+cssnano MIT Ben Briggs beneb.info@gmail.com http://beneb.info
+eslint MIT Nicholas C. Zakas
+eslint-config-prettier MIT Simon Lydell
+eslint-formatter-pretty MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
+eslint-plugin-html ISC n/a
+eslint-plugin-import MIT Ben Mosher
+eslint-plugin-node MIT Toru Nagashima
+eslint-plugin-vue MIT Toru Nagashima (https://github.com/mysticatea)
+eslint-plugin-vuetify MIT Kael Watts-Deuchar
+eslint-webpack-plugin MIT Ricardo Gobbo de Souza
+eventsource-polyfill MIT amvtek
+file-loader MIT Tobias Koppers @sokra
+file-saver MIT Eli Grey
+globals MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
+hls.js Apache-2.0 n/a
+i MIT Pavan Kumar Sunkara (pksunkara.github.com)
+jsdom MIT n/a
+luxon MIT Isaac Cambron
+maplibre-gl BSD-3-Clause n/a
+memoize-one MIT Alex Reardon
+mini-css-extract-plugin MIT Tobias Koppers @sokra
+minimist MIT James Halliday mail@substack.net http://substack.net
+node-storage-shim ISC Michael Nahkies
+passive-events-support MIT Ignas Damunskis
+photoswipe MIT Dmytro Semenov (https://dimsemenov.com)
+playwright Apache-2.0 Microsoft Corporation
+postcss MIT Andrey Sitnik
+postcss-import MIT Maxime Thirouin
+postcss-loader MIT Andrey Sitnik
+postcss-preset-env MIT-0 n/a
+postcss-reporter MIT David Clark david.dave.clark@gmail.com https://davidtheclark.com
+prettier MIT James Long
+pubsub-js MIT Morgan Roderick morgan@roderick.dk http://roderick.dk
+regenerator-runtime MIT Ben Newman
+resolve-url-loader MIT bholloway
+sanitize-html MIT Apostrophe Technologies, Inc.
+sass MIT Natalie Weizenbaum nweiz@google.com https://github.com/nex3
+sass-loader MIT J. Tangelder
+sockette MIT Luke Edwards luke.edwards05@gmail.com lukeed.com
+style-loader MIT Tobias Koppers @sokra
+svg-url-loader MIT Hovhannes Babayan
+tar BlueOak-1.0.0 Isaac Z. Schlueter
+url-loader MIT Tobias Koppers @sokra
+util MIT Joyent http://www.joyent.com
+vite MIT Evan You
+vitest MIT Anthony Fu
+vue MIT Evan You
+vue-3-sanitize MIT Vannsl, Vanessa Otto
+vue-loader MIT Evan You
+vue-loader-plugin ISC Ivan liu
+vue-luxon MIT Cas Bloem
+vue-router MIT Eduardo San Martin Morote posva13@gmail.com
+vue-sanitize-directive MIT Leonardo Piccioni de Almeida leopiccionia@gmail.com
+vue-style-loader MIT Evan You
+vue3-gettext MIT Leo Zurbriggen
+vuetify MIT John Leider john@vuetifyjs.com
+webpack MIT Tobias Koppers @sokra
+webpack-bundle-analyzer MIT Yury Grunin
+webpack-cli MIT n/a
+webpack-hot-middleware MIT Glen Mailer
+webpack-manifest-plugin MIT Dane Thurber
+webpack-md5-hash MIT Kirill Ermolov
+webpack-merge MIT Juho Vepsalainen
+webpack-plugin-vuetify MIT Kael Watts-Deuchar
+workbox-webpack-plugin MIT Google's Web DevRel Team and Google's Aurora Team
diff --git a/assets/locales/af/default.po b/assets/locales/af/default.po
index 83bb81025..2a09e43f7 100644
--- a/assets/locales/af/default.po
+++ b/assets/locales/af/default.po
@@ -1,413 +1,420 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: af\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Iets het verkeerd geloop, probeer weer"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Kan dit nie doen nie"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Veranderinge kon nie gestoor word nie"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Kan nie verwyder word nie"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s bestaan reeds"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Nie gevind"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Lêer nie gevind nie"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Lêer te groot"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Ongesteun"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Ongesteunde tipe"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Ongesteunde formaat"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Oorspronklike omslag is leeg"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Seleksie nie gevind nie"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entiteit nie gevind nie"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Rekening nie gevind nie"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Verbruiker nie gevind nie"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Merker nie gevind nie"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kamera nie gevind nie"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Lens nie gevind nie"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album nie gevind nie"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Onderwerp nie gevind nie"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Persoon nie gevind nie"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Gesig nie gevind nie"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Nie beskikbaar in publieke modus nie"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Nie beskikbaar in leesalleen modus nie"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Teken asseblief in op jou rekening"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Toegang geweier"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Betaling vereis"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Oplegging mag aanstoot gee"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Oplegging misluk"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Geen items gekies nie"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Kon nie lêer skep nie. Gaan asseblief toestemmings na"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Kon nie vouer skep nie. Gaan asseblief toestemmings na"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Kon nie konnekteer nie, probeer asseblief weer"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Tik verifikasiekode"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Ongeldige verifikasiekode, probeer asseblief weer"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Ongeldige wagwoord, probeer asseblief weer"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Eienskap gedeaktiveer"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Geen merker geselekteer"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Geen albums geselekteer nie"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Geen lêers beskikbaar vir aflaai nie"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Kon nie zip-lêer skep nie"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Ongeldige magtiging"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Ongeldige skakel"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Ongeldige naam"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Besig, probeer asseblief later weer"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Die opwek tydperk is %s, maar moet 1 uur of minder wees"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Jou rekening kon nie gekoppel word nie"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Te veel versoeke"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Onvoldoende berging"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kwota oorskry"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Veranderinge suksesvol gestoor"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album geskep"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album gestoor"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s uitgevee"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Albuminhoud gekloon"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Lêer verwyder uit stapel"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Lêer uitgevee"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Seleksie bygevoeg na %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Een inskrywing bygevoeg na %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d inskrywings by %s gevoeg"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Een inskrywing verwyder uit %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d inskrywings verwyder uit %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Rekening geskep"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Rekening gestoor"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Rekening uitgevee"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Stellings gestoor"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Wagwoord verander"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Invoer voltooi in %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Invoer gekanselleer"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "inhoudsopgawe voltooi in %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indekseer van oorspronklikes …"
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indekseer lêers in %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indeksering gekanselleer"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d lêers en %d foto's verwyder"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Skuif lêers van %s af"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Kopieer lêers van %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Merkers uitgevee"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Merkers gestoor"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Onderwerp gestoor"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Onderwerp uitgevee"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Persoon gestoor"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Persoon uitgevee"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Lêer opgelaai"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d lêers opgelaai in %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Verwerk oplegging..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Oplegging geprosesseer"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Seleksie goedgekeur"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Seleksie geargiveer"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Seleksie herstel"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Seleksie gemerk as privaat"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albums uitgevee"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip geskep in %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Permanent uitgevee"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s geherstel"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Suksesvol geverifieer"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Suksesvol geaktiveer"
diff --git a/assets/locales/ar/default.po b/assets/locales/ar/default.po
index 2af0ed4eb..8ad273089 100644
--- a/assets/locales/ar/default.po
+++ b/assets/locales/ar/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: ar\n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "حدث خطأ ما، حاول مرة أخرى"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "غير قادر على فعل ذلك"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "لا يمكن حفظ التغييرات"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "لا يمكن حذفه"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s موجود بالفعل"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "لم يتم العثور"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "لم يتم العثور على الملف"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "الملف كبير جدًا"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "غير مدعوم"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "نوع غير معتمد"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "صيغة غير مدعومة"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "مجلد النسخ الأصلية فارغ"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "الاختيار غير موجود"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "الكيان غير موجود"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "الحساب غير موجود"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "المستخدم غير موجود"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "التصنيف غير موجود"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "لم يتم العثور على الكاميرا"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "لم يتم العثور على العدسة"
+
+#: messages.go:129
msgid "Album not found"
msgstr "الألبوم غير موجود"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "الموضوع غير موجود"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "لم يتم العثور على الشخص"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "الوجه غير موجود"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "غير متاح في الوضع العام"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "غير متوفر في وضع القراءة فقط"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "يرجى تسجيل الدخول إلى حسابك"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "طلب الاذن مرفوض"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "الدفع مطلوب"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "المحتوى المرفوع قد يكون مسيئا"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "فشل التحميل"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "لم يتم اختيار المحتوى"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "فشل إنشاء الملف ، يرجى التحقق من الصلاحيات"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "لم يتم إنشاء المجلد ، يرجى التحقق من الصلاحيات"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "تعذر الاتصال ، يرجى المحاولة مرة أخرى"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "أدخل رمز التحقق"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "رمز التحقق غير صالح، يرجى المحاولة مرة أخرى"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "كلمة السر غير مطابقة، يرجى المحاولة مرة أخرى"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "الخاصية غير مفعلة"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "لم يتم تحديد المعرفات"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "لم يتم تحديد ألبومات"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "لا توجد ملفات متاحة للتنزيل"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "فشل في إنشاء ملف مضغوط"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "بيانات الاعتماد غير صالحة"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "رابط غير صالح"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "اسم غير صحيح"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "مشغول، يرجى المحاولة مرة أخرى في وقت لاحق"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "فترة التنبيه هي %s ، لكن يجب أن تكون ساعة واحدة أو أقل"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "لا يمكن ربط حسابك"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "طلبات كثيرة جدا"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "مساحة تخزين غير كافية"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "تم تجاوز المساحة المخصصة"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "تم حفظ التغييرات بنجاح"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "تم إنشاء الألبوم"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "تم حفظ الألبوم"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "تم حذف الألبوم %s"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "تم نسخ محتويات الألبوم"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "تمت إزالة الملف من المكدس"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "تم حذف الملف"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "تمت إضافة التحديد إلى %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "تمت إضافة إدخال واحد إلى %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "تمت إضافة %d مدخلات إلى %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "تمت إزالة إدخال واحد من %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "تمت إزالة %d مدخلات من %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "تم إنشاء الحساب"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "تم حفظ الحساب"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "تم حذف الحساب"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "تم حفظ الإعدادات"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "تم تغيير كلمة السر"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "اكتمل الاستيراد في %d ثانية"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "تم إلغاء الاستيراد"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "اكتملت الفهرسة في %d ثانية"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "تتم فهرسة الصور الأصلية ..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "فهرسة الملفات في %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "تم إلغاء الفهرسة"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "تمت إزالة %d ملفات و %d صورة"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "نقل الملفات من %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "نسخ ملفات من %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "تم حذف التصنيفات"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "تم حفظ التصنيف"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "تم حفظ الموضوع"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "تم حذف الموضوع"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "حفظ الشخص"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "تم حذف الشخص"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "تم تحميل الملف"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "تم تحميل %d ملف في %d ثانية"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "جارٍ معالجة التحميل ..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "تمت معالجة التحميل"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "تمت الموافقة على الاختيار"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "تمت أرشفة الاختيار"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "تم استعادة المحتوى المحدد"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "تم تحديد الاختيار على أنه خاص"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "تم حذف الألبومات"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "تم إنشاء الملف المضغوط خلال %d ثوانٍ"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "تم الحذف بشكل نهائي"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "تمت استعادة %s"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "تم التحقق بنجاح"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "تم التفعيل بنجاح"
diff --git a/assets/locales/be/default.po b/assets/locales/be/default.po
index 4d4819a81..2eab04dc0 100644
--- a/assets/locales/be/default.po
+++ b/assets/locales/be/default.po
@@ -1,11 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: be\n"
"MIME-Version: 1.0\n"
@@ -13,402 +12,410 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Нешта пайшло не так, паўтарыце спробу"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Немагчыма зрабіць гэта"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Не ўдалося захаваць змены"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Немагчыма выдаліць"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s ужо існуе"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Не знойдзена"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Файл не знойдзены"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Файл занадта вялікі"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Не падтрымліваецца"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Тып не падтрымліваецца"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Фармат не падтрымліваецца"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Тэчка арыгіналаў пустая"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Выбар не знойдзены"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Аб'ект не знойдзены"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Уліковы запіс не знойдзены"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Карыстальнік не знойдзены"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Тэг не знойдзены"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Камера не знойдзена"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Аб'ектыў не знойдзены"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Альбом не знойдзены"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Тэма не знойдзена"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Чалавек не знойдзены"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Твар не знойдзены"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Недаступна ў публічным рэжыме"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Недаступна ў рэжыме толькі для чытання"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Калі ласка, увайдзіце ў свой уліковы запіс"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "У доступе адмоўлена"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Патрабуецца аплата"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Запампоўка можа быць абразлівай"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Памылка загрузкі"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Элементы не выбраны"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Не ўдалося стварыць файл, праверце дазволы"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Не атрымалася стварыць папку, праверце дазволы"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Немагчыма падключыцца, паспрабуйце яшчэ раз"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Увядзіце праверачны код"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Няправільны код спраўджання, паўтарыце спробу"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Няправільны пароль, паспрабуйце яшчэ раз"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Функцыя адключана"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Меткі не выбраны"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Альбомы не выбраны"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Няма даступных файлаў для спампоўкі"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Не ўдалося стварыць zip-файл"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Няправільныя ўліковыя даныя"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Няправільная спасылка"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Няправільнае імя"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Заняты, паўтарыце спробу пазней"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Інтэрвал абуджэння складае %s, але павінен быць не больш за 1 гадзіну"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Ваш уліковы запіс не можа быць падключаны"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Занадта шмат запытаў"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Недастаткова месца для захоўвання"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Квота перавышана"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Змены паспяхова захаваны"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Альбом створаны"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Альбом захаваны"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Альбом %s выдалены"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Змест альбома кланаваны"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Файл выдалены са стэка"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Файл выдалены"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Выбар дададзены ў %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Адзін запіс дададзены ў %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d запісы дададзены ў %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Адзін запіс выдалены з %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "Запісы %d выдалены з %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Уліковы запіс створаны"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Уліковы запіс захаваны"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Уліковы запіс выдалены"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Налады захаваны"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Пароль зменены"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Імпарт завершаны праз %d с"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Імпарт адменены"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Індэксацыя завершана ў %d с"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Індэксаванне арыгіналаў..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Індэксацыя файлаў у %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Індэксацыя адменена"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Выдалена %d файлаў і %d фота"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Перамяшчэнне файлаў з %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Капіраванне файлаў з %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Меткі выдалены"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Цэтлік захаваны"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Тэма захавана"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Тэма выдалена"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Чалавек выратаваны"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Асоба выдалена"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Файл запампаваны"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d файлы, загружаныя ў %d с"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Апрацоўка запампоўкі..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Загрузка апрацавана"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Выбар ухвалены"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Выбранае заархівавана"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Выбар адноўлены"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Выбар пазначаны як прыватны"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Альбомы выдалены"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip створаны ў %d с"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Выдалены назаўсёды"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s быў адноўлены"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Паспяхова праверана"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Паспяхова актывавана"
diff --git a/assets/locales/bg/default.po b/assets/locales/bg/default.po
index 366a5ceb1..c770d49de 100644
--- a/assets/locales/bg/default.po
+++ b/assets/locales/bg/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: bg\n"
@@ -11,402 +11,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Нещо се е объркало, опитайте отново"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Не можете да го направите"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Промените не могат да бъдат запазени"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Не може да бъде изтрит"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s вече съществува"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Не е намерен"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Файлът не е намерен"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Твърде голям файл"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Не се поддържа"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Неподдържан тип"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Неподдържан формат"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Папката с оригинали е празна"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Изборът не е намерен"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Субектът не е намерен"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Акаунтът не е намерен"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Потребителят не е намерен"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Етикетът не е намерен"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Камерата не е открита"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Обективът не е открит"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Албумът не е намерен"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Темата не е намерена"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Лицето не е намерено"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Лицето не е намерено"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Не е наличен в публичен режим"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Не е наличен в режим само за четене"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Моля, влезте в профила си"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Достъп отказан"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Изисква се плащане"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Качването може да е обидно"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Файловете не успяха да се качат"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Няма избрани елементи"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Неуспешно създаване на файл, моля, проверете разрешенията"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Неуспешно създаване на папка, моля, проверете разрешенията"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Не може да се свърже, опитайте отново"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Въведете код за верификация"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Невалиден код за потвърждение, моля опитайте отново"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Невалидна парола, моля, опитайте отново"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Функцията е деактивирана"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Няма избрани етикети"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Няма избрани албуми"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Няма налични файлове за изтегляне"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Неуспешно създаване на zip файл"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Невалидни креденции"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Невалидна връзка"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Невалидно име"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Заето, моля, опитайте отново по-късно"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Интервалът на събуждане е %s, но трябва да е 1 час или по-малко"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Вашият акаунт не може да бъде свързан"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Твърде много заявки"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Недостатъчно място за съхранение"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Превишаване на квотата"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Промените са успешно записани"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Създаден албум"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Запазен албум"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Албум %s изтрит"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Съдържанието на албума беше клонирано"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Премахване на файла от стека"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Изтрит файл"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Добавяне на селекция към %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Добавяне на един запис към %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d добавени записи към %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Отстранен е един запис от %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d премахнати записи от %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Създаден акаунт"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Акаунтът запазен"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Изтрит акаунт"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Запазени настройки"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Паролата е променена"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Импортът е завършен за %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Вносът е отменен"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Индексирането е завършено за %d сек"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Индексиране на оригинали..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Индексиране на файлове в %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Отменено индексиране"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Премахнати са %d файлове и %d снимки"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Преместване на файлове от %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Копиране на файлове от %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Изтрити етикети"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Запазен етикет"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Тема: запазени"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Изтрит предмет"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Запазено лице"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Изтрито лице"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Качен файл"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d файлове, качени за %d сек"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Обработка на качването..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Качването е обработено"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Одобрена селекция"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Архивирана селекция"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Възстановена селекция"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Селекция, отбелязана като частна"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Изтрити албуми"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip създаден за %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Постоянно изтрити"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s е възстановена"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Успешно потвърдено"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Успешно активиран"
diff --git a/assets/locales/ca/default.po b/assets/locales/ca/default.po
index 34a15fa66..5100805f8 100644
--- a/assets/locales/ca/default.po
+++ b/assets/locales/ca/default.po
@@ -1,413 +1,420 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "S'ha produït un error, torna-ho a provar"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Incapaç de fer-ho"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "No s'han pogut desar els canvis"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "No s'ha pogut suprimir"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s El nom ja existeix"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "No trobat"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "No s'ha trobat el fitxer"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Fitxer massa gran"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Sense suport"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Tipus no compatible"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Format no compatible"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "La carpeta d'originals està buida"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "No s'ha trobat la selecció"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "No s'ha trobat l'entitat"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Compte no trobat"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Usuari no trobat"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "No s'ha trobat l'etiqueta"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "No s'ha trobat la càmera"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Lent no trobada"
+
+#: messages.go:129
msgid "Album not found"
msgstr "No s'ha trobat l'àlbum"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "No s'ha trobat el tema"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Persona no trobada"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "No s'ha trobat la cara"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "No disponible en mode públic"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "No disponible en mode només de lectura"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Si us plau, inicieu sessió al vostre compte"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Permís denegat"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Pagament requerit"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "La càrrega pot ser ofensiva"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "La càrrega ha fallat"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "No s'ha seleccionat cap element"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "No s'ha pogut crear el fitxer, comproveu els permisos"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "No s'ha pogut crear la carpeta, comproveu els permisos"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "No s'ha pogut connectar, torna-ho a provar"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Introduïu el codi de verificació"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Codi de verificació no vàlid, torneu-ho a provar"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "La contrasenya no és vàlida, torneu-ho a provar"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funció desactivada"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "No s'ha seleccionat cap etiqueta"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "No s'ha seleccionat cap àlbum"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "No hi ha fitxers disponibles per a la baixada"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "No s'ha pogut crear el fitxer zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Credencials incorrectes"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Enllaç no vàlid"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nom no vàlid"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Ocupat, torna-ho a provar més tard"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "L'interval d'activació és %s, però ha de ser d'1 h o menys"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "No s'ha pogut connectar el vostre compte"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Massa peticions"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Emmagatzematge insuficient"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "S'ha superat la quota"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Els canvis s'han desat correctament"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Àlbum creat"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Àlbum desat"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "S'ha suprimit l'àlbum %s"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Contingut de l'àlbum clonat"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "S'ha eliminat el fitxer de la pila"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "S'ha suprimit el fitxer"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "S'ha afegit una selecció a %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "S'ha afegit una entrada a %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d entrades afegides a %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "S'ha eliminat una entrada de %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "S'han eliminat %d entrades de %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Compte creat"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Compte desat"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Compte suprimit"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Configuració desada"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "S’ha canviat la contrasenya"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importació completada en %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importació cancel·lada"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexació completada en %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "S'estan indexant els originals..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indexant fitxers a %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "S'ha cancel·lat la indexació"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "S'han eliminat %d fitxers i %d fotos"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "S'estan movent fitxers de %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "S'estan copiant fitxers de %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "S'han suprimit les etiquetes"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "S'ha desat l'etiqueta"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Assumpte desat"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "S'ha suprimit el tema"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Persona salvada"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "S'ha suprimit la persona"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Fitxer penjat"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fitxers penjats en %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "S'està processant la càrrega..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "S'ha processat la càrrega"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Selecció aprovada"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Selecció arxivada"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "S'ha restaurat la selecció"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "La selecció s'ha marcat com a privada"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Àlbums suprimits"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip creat en %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Esborrat permanentment"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s s'ha restaurat"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Verificat correctament"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "S'ha activat correctament"
diff --git a/assets/locales/cs/default.po b/assets/locales/cs/default.po
index 0fc1800ba..0c5c45d7d 100644
--- a/assets/locales/cs/default.po
+++ b/assets/locales/cs/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Czech \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Něco se pokazilo, zkuste to znovu"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Nelze to udělat"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Změny nemohly být uloženy"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Nemohlo být vymazáno"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s již existuje"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Nenalezeno"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Soubor nenalezen"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Příliš velký soubor"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Nepodporováno"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Nepodporovaný typ"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Nepodporovaný formát"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Složka Originály je prázdná"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Výběr nenalezen"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Subjekt nebyl nalezen"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Účet nenalezen"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Uživatel nenalezen"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Štítek nenalezen"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Fotoaparát nebyl nalezen"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objektiv nebyl nalezen"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album nenalezeno"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Předmět nebyl nalezen"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Osoba nebyla nalezena"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Obličej nebyl nalezen"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Není k dispozici ve veřejném módu"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Není k dispozici v režimu pouze pro čtení"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Přihlaste se ke svému účtu"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Přístup zamítnut"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Požadovaná platba"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Nahrané soubory by mohly být urážlivé"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Nahrávání selhalo"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Nebyly vybrány žádné položky"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Vytváření souboru selhalo, zkontrolujte prosím oprávnění"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Vytváření složky selhalo, zkontrolujte prosím oprávnění"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Nemohlo být připojeno, zkuste to prosím znovu"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Vložte ověřovací kód"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Neplatný ověřovací kód, zkuste to prosím znovu"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Neplatné heslo, zkuste to prosím znovu"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funkce deaktivovaná"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Nebyly vybrány žádné štítky"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Nebyla vybrána žádná alba"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Žádné soubory ke stažení k dispozici"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Nebylo možné vytvořit soubor ZIP"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Neplatné údaje"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Neplatný odkaz"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Neplatný jméno"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Zaneprázdněn, zkuste to prosím později"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Interval buzení je %s, ale musí být 1h nebo kratší"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Váš účet se nepodařilo připojit"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Příliš mnoho požadavků"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Nedostatečné skladování"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Překročení kvóty"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Změny byly úspěšně uloženy"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album vytvořeno"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album uloženo"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s vymazáno"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Obsah alba naklonován"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Soubor odstraněn ze stohu"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Soubor vymazán"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Výběr přidán do %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Jeden záznam přidán do %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d záznamů přidáno do %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Jeden záznam odstraněn z %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d záznamů odstraněno z %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Účet vytvořen"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Účet uložen"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Účet vymazán"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Nastavení uloženo"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Heslo změněno"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Import dokončen za %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Import zrušen"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexování dokončeno za %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indexování originálů..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indexování souborů v %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexování zrušeno"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Odstraněno %d souborů a %d fotografií"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Přesouvání souborů z %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Kopírování souborů z %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Štítky vymazány"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Štítek uložen"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Předmět uložen"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Předmět smazán"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Uložená osoba"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Vymazaná osoba"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Soubor odeslán"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d souborů nahráno za %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Zpracování nahrávání..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Nahrávání bylo zpracováno"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Výběr potvrzen"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Výběr archivován"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Výběr obnoven"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Výběr označen jako Soukromý"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Alba vymazána"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "ZIP vytvořen za %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Trvale smazáno"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s bylo obnoveno"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Úspěšně ověřeno"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Úspěšně aktivováno"
diff --git a/assets/locales/da/default.po b/assets/locales/da/default.po
index 6b48e0861..c2d914061 100644
--- a/assets/locales/da/default.po
+++ b/assets/locales/da/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Danish \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Der gik noget galt, prøv igen"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Det kan ikke lade sig gøre"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Ændringer kunne ikke gemmes"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Kunne ikke slettes"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s findes allerede"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Ikke fundet"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Fil ikke fundet"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Filen er for stor"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Ikke understøttet"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Ikke-understøttet type"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Ikke understøttet format"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Mappen Originaler er tom"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Valg ikke fundet"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Enhed ikke fundet"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Konto ikke fundet"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Bruger ikke fundet"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Etiket ikke fundet"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kameraet blev ikke fundet"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objektiv ikke fundet"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album ikke fundet"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Emne ikke fundet"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Person ikke fundet"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Ansigt ikke fundet"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Ikke tilgængelig i offentlig tilstand"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Ikke tilgængelig i skrivebeskyttet tilstand"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Log ind på din konto"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Tilladelse nægtet"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Betaling påkrævet"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Upload kan være stødende"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Upload mislykkedes"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Ingen emner valgt"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Oprettelse af fil mislykkedes, tjek venligst tilladelser"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Oprettelse af mappe mislykkedes, tjek venligst tilladelser"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Kunne ikke oprette forbindelse, prøv venligst igen"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Indtast verifikations kode"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Ugyldig bekræftelseskode. Prøv venligst igen"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Ugyldig adgangskode, prøv venligst igen"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funktion deaktiveret"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Ingen etiketter valgt"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Ingen album valgt"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Ingen filer til rådighed til download"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Det lykkedes ikke at oprette zip-fil"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Ugyldige legitimationsoplysninger"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Ugyldigt link"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Ugyldigt navn"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Optaget, prøv venligst igen senere"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Vækningsintervallet er %s, men skal være 1 time eller mindre"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Der kunne ikke oprettes forbindelse til din konto"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "For mange anmodninger"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Utilstrækkelig opbevaring"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kvote overskredet"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Ændringer gemt med succes"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album oprettet"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album gemt"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s slettet"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Albumindhold klonet"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Fil fjernet fra stakken"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Fil slettet"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Valg tilføjet til %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "En post tilføjet til %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d poster tilføjet til %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "En post fjernet fra %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d poster fjernet fra %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Konto oprettet"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Gemte konto"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Konto slettet"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Indstillinger gemt"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Adgangskode ændret"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Import afsluttet efter %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Import annulleret"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksering afsluttet efter %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indeksering af originaler..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indeksering af filer i %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indeksering annulleret"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Fjernede %d filer og %d fotos"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Flytter filer fra %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Kopierer filer fra %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Etiketter slettet"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Etikette gemt"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Emne gemt"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Emne slettet"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Person gemt"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Person slettet"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Fil uploadet"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d filer uploadet på %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Behandling af upload..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Upload er blevet behandlet"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Udvælgelse godkendt"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Udvælgelse arkiveret"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Udvalgte gendannet"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Udvalgte er markeret som privat"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albums slettet"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip filen blev lavet på %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Permanent slettet"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s er blevet genoprettet"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Verifikation lykkedes"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Aktivering lykkedes"
diff --git a/assets/locales/de/default.po b/assets/locales/de/default.po
index 6a06c236d..9090ed616 100644
--- a/assets/locales/de/default.po
+++ b/assets/locales/de/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: German \n"
@@ -12,403 +12,411 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
"X-Poedit-Basepath: .\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Etwas ist schief gelaufen, versuche es noch einmal"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Dies ist nicht möglich"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Fehler beim Speichern der Daten"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Konnte nicht gelöscht werden"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s existiert bereits"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Nicht gefunden"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Datei konnte nicht gefunden werden"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Datei zu groß"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Wird nicht unterstützt"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Typ wird nicht unterstützt"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Nicht unterstütztes Format"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Originals-Verzeichnis ist leer"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Auswahl nicht gefunden"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Keine Daten gefunden"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Unbekannter Account"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Nutzer nicht gefunden"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Kategorie nicht gefunden"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kamera nicht gefunden"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objektiv nicht gefunden"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album nicht gefunden"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Unbekanntes Motiv"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Unbekannte Person"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Unbekanntes Gesicht"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Im öffentlichen Modus nicht verfügbar"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Im Nur-Lese-Modus nicht verfügbar"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Bitte melde dich an"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Erlaubnis verweigert"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Zahlung erforderlich"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Inhalt könnte anstößig sein und wurde abgelehnt"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Upload fehlgeschlagen"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Nichts ausgewählt"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Datei konnte nicht erstellt werden"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Ordner konnte nicht erstellt werden"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Verbindung fehlgeschlagen"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Verifizierungscode eingeben"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Ungültiger Verifizierungscode, bitte erneut versuchen"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Ungültiges Passwort"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funktion deaktiviert"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Keine Kategorien ausgewählt"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Keine Alben ausgewählt"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Keine Dateien zum Download verfügbar"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Zip-Datei konnte nicht erstellt werden"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Ungültige Zugangsdaten"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Ungültiger Link"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Ungültiger Name"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Beschäftigt, bitte später erneut versuchen"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Worker-Intervall ist %s, muss aber 1h oder weniger betragen"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Das Konto konnte nicht verbunden werden"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Zu viele Anfragen"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Zu wenig Speicherplatz"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Maximale Anzahl erreicht"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Änderungen erfolgreich gespeichert"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album erstellt"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album gespeichert"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s gelöscht"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Album-Einträge kopiert"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Datei aus Stapel entfernt"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Datei gelöscht"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Auswahl zu %s hinzugefügt"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Ein Eintrag zu %s hinzugefügt"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d Einträge zu %s hinzugefügt"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Ein Eintrag aus %s entfernt"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d Einträge aus %s entfernt"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Konto hinzugefügt"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Konto gespeichert"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Konto gelöscht"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Einstellungen gespeichert"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Passwort geändert"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Import in %d s abgeschlossen"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Import abgebrochen"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexierung in %d s abgeschlossen"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indexiere Dateien…"
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indexiere Dateien in %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexierung abgebrochen"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d Dateien und %d Bilder wurden entfernt"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Verschiebe Dateien von %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Kopiere Dateien von %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Kategorien gelöscht"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Kategorie gespeichert"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Motiv gespeichert"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Motiv gelöscht"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Person gespeichert"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Person gelöscht"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Datei hochgeladen"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d Dateien hochgeladen in %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Verarbeitung des Uploads..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Der Upload wurde verarbeitet"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Auswahl übernommen"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Auswahl archiviert"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Auswahl wiederhergestellt"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Auswahl als privat markiert"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Alben gelöscht"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip-Datei erstellt in %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Endgültig gelöscht"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s wurde wiederhergestellt"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Erfolgreich verifiziert"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Erfolgreich aktiviert"
diff --git a/assets/locales/el/default.po b/assets/locales/el/default.po
index 97356b0f2..3c3d2e7f6 100644
--- a/assets/locales/el/default.po
+++ b/assets/locales/el/default.po
@@ -1,412 +1,420 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-11-19 10:23+0000\n"
-"Last-Translator: dtsolakis \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Κάτι πήγε στραβά, δοκιμάστε ξανά"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Αυτό δεν είναι εφικτό"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Οι αλλαγές δεν ήταν δυνατό να αποθηκευτούν"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Δεν ήταν εφικτή η διαγραφή"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s υπάρχει ήδη"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Δεν βρέθηκε"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Το αρχείο δεν βρέθηκε"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Πολύ μεγάλο αρχείο"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Δεν υποστηρίζεται"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Μη υποστηριζόμενος τύπος"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Μη υποστηριζόμενος μορφότυπος"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Ο φάκελος πρωτότυπων είναι άδειος"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Η επιλογή δεν βρέθηκε"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Η οντότητα δεν βρέθηκε"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Ο λογαριασμός δεν βρέθηκε"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Ο χρήστης δεν βρέθηκε"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Η ετικέτα δεν βρέθηκε"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Δεν εντοπίστηκε η κάμερα"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Δεν βρέθηκε ο φακός"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Το άλμπουμ δεν βρέθηκε"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Το θέμα δεν βρέθηκε"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Το άτομο δεν βρέθηκε"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Το πρόσωπο δεν βρέθηκε"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Μη διαθέσιμο κατά τη δημόσια λειτουργία"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Μη διαθέσιμο στην κατάσταση \"μόνο ανάγνωση\""
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Συνδεθείτε στο λογαριασμό σας"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Δέν δόθηκε άδεια"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Απαιτείται πληρωμή"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Το ανέβασμα μπορεί να είναι προσβλητικό"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Αποτυχία ανεβάσματος"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Δεν έχουν επιλεγεί στοιχεία"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Απέτυχε η δημιουργία αρχείου, ελέγξτε τα δικαιώματα"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Απέτυχε η δημιουργία φακέλου, ελέγξτε τα δικαιώματα"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Δεν ήταν δυνατή η σύνδεση, δοκιμάστε ξανά"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Εισάγετε τον κωδικό επαλήθευσης"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Μη έγκυρος κωδικός επαλήθευσης, δοκιμάστε ξανά"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Μη έγκυρος κωδικός πρόσβασης, δοκιμάστε ξανά"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Απενεργοποιημένη λειτουργία"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Δεν έχουν επιλεγεί ετικέτες"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Δεν έχουν επιλεγεί άλμπουμ"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Δεν υπάρχουν διαθέσιμα αρχεία για λήψη"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Απέτυχε η δημιουργία αρχείου zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Μη έγκυρα διαπιστευτήρια"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Μη έγκυρος σύνδεσμος"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Μη έγκυρο όνομα"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Το σύστημα είναι απασχολημένο, προσπαθήστε ξανά αργότερα"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Το διάστημα αφύπνισης είναι %s, αλλά πρέπει να είναι 1 ώρα ή λιγότερο"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Ο λογαριασμός σας δεν ήταν δυνατό να συνδεθεί"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Πάρα πολλά αιτήματα"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Ανεπαρκής χώρος"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Υπέρβαση ορίου"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Οι αλλαγές αποθηκεύτηκαν επιτυχώς"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Το άλμπουμ δημιουργήθηκε"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Το άλμπουμ αποθηκεύθηκε"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Το άλμπουμ %s διαγράφηκε"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Τα περιεχόμενα του άλμπουμ αντιγράφηκαν"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Αφαίρεση αρχείου από τη στοίβα"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Το αρχείο διαγράφηκε"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Η επιλογή προστέθηκε στο %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Μία εγγραφή προστέθηκε στο %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d καταχωρήσεις προστέθηκαν στο %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Μία καταχώρηση αφαιρέθηκε από %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d καταχωρήσεις αφαιρέθηκαν από %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Ο λογαριασμός δημιουργήθηκε"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Ο λογαριασμός αποθηκεύτηκε"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Ο λογαριασμός διαγράφηκε"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Οι ρυθμίσεις αποθηκεύτηκαν"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Ο κωδικός πρόσβασης άλλαξε"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Η εισαγωγή ολοκληρώθηκε σε %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Η εισαγωγή ακυρώθηκε"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Η ευρετηρίαση ολοκληρώθηκε σε %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Δημιουργία ευρετηρίου για τα πρωτότυπα..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Δημιουργία ευρετηρίου αρχείων σε %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Η δημιουργία ευρετηρίου ακυρώθηκε"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Αφαίρεση %d αρχείων και %d φωτογραφιών"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Μετακίνηση αρχείων από %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Αντιγραφή αρχείων από %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Οι ετικέτες διαγράφηκαν"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Η ετικέτα αποθηκεύτηκε"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Το θέμα αποθηκεύθηκε"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Το θέμα διαγράφηκε"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Το άτομο αποθηκεύτηκε"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Το άτομο διαγράφηκε"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Το αρχείο διαγράφηκε"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d αρχεία ανεβάστηκαν σε %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Επεξεργασία ανεβάσματος..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Το ανέβασμα έχει ολοκληρωθεί"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Η επιλογή εγκρίθηκε"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Η επιλογή αρχειοθετήθηκε"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Η επιλογή αποκαταστάθηκε"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Η επιλογή μαρκαρίστηκε ως ιδιωτική"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Διαγραμμένα άλμπουμ"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Το αρχείο zip δημιουργήθηκε σε %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Διαγράφηκε μόνιμα"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s έχει αποκατασταθεί"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Επιτυχής επαλήθευση"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Επιτυχής ενεργοποίηση"
diff --git a/assets/locales/en/default.po b/assets/locales/en/default.po
index 781824619..5fb635d85 100644
--- a/assets/locales/en/default.po
+++ b/assets/locales/en/default.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
"PO-Revision-Date: 2022-10-31 16:44+0100\n"
"Last-Translator: Michael Mayer \n"
"Language-Team: \n"
@@ -13,399 +13,407 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr ""
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr ""
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr ""
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr ""
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr ""
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr ""
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr ""
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr ""
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr ""
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr ""
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr ""
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr ""
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr ""
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr ""
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr ""
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr ""
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr ""
-#: messages.go:121
-msgid "Album not found"
-msgstr ""
-
-#: messages.go:122
-msgid "Subject not found"
-msgstr ""
-
-#: messages.go:123
-msgid "Person not found"
-msgstr ""
-
-#: messages.go:124
-msgid "Face not found"
-msgstr ""
-
-#: messages.go:125
-msgid "Not available in public mode"
-msgstr ""
-
-#: messages.go:126
-msgid "Not available in read-only mode"
-msgstr ""
-
#: messages.go:127
-msgid "Please log in to your account"
+msgid "Camera not found"
msgstr ""
#: messages.go:128
-msgid "Permission denied"
+msgid "Lens not found"
msgstr ""
#: messages.go:129
-msgid "Payment required"
+msgid "Album not found"
msgstr ""
#: messages.go:130
-msgid "Upload might be offensive"
+msgid "Subject not found"
msgstr ""
#: messages.go:131
-msgid "Upload failed"
+msgid "Person not found"
msgstr ""
#: messages.go:132
-msgid "No items selected"
+msgid "Face not found"
msgstr ""
#: messages.go:133
-msgid "Failed creating file, please check permissions"
+msgid "Not available in public mode"
msgstr ""
#: messages.go:134
-msgid "Failed creating folder, please check permissions"
+msgid "Not available in read-only mode"
msgstr ""
#: messages.go:135
-msgid "Could not connect, please try again"
+msgid "Please log in to your account"
msgstr ""
#: messages.go:136
-msgid "Enter verification code"
+msgid "Permission denied"
msgstr ""
#: messages.go:137
-msgid "Invalid verification code, please try again"
+msgid "Payment required"
msgstr ""
#: messages.go:138
-msgid "Invalid password, please try again"
+msgid "Upload might be offensive"
msgstr ""
#: messages.go:139
-msgid "Feature disabled"
+msgid "Upload failed"
msgstr ""
#: messages.go:140
-msgid "No labels selected"
+msgid "No items selected"
msgstr ""
#: messages.go:141
-msgid "No albums selected"
+msgid "Failed creating file, please check permissions"
msgstr ""
#: messages.go:142
-msgid "No files available for download"
+msgid "Failed creating folder, please check permissions"
msgstr ""
#: messages.go:143
-msgid "Failed to create zip file"
+msgid "Could not connect, please try again"
msgstr ""
#: messages.go:144
-msgid "Invalid credentials"
+msgid "Enter verification code"
msgstr ""
#: messages.go:145
-msgid "Invalid link"
+msgid "Invalid verification code, please try again"
msgstr ""
#: messages.go:146
-msgid "Invalid name"
+msgid "Invalid password, please try again"
msgstr ""
#: messages.go:147
-msgid "Busy, please try again later"
+msgid "Feature disabled"
msgstr ""
#: messages.go:148
+msgid "No labels selected"
+msgstr ""
+
+#: messages.go:149
+msgid "No albums selected"
+msgstr ""
+
+#: messages.go:150
+msgid "No files available for download"
+msgstr ""
+
+#: messages.go:151
+msgid "Failed to create zip file"
+msgstr ""
+
+#: messages.go:152
+msgid "Invalid credentials"
+msgstr ""
+
+#: messages.go:153
+msgid "Invalid link"
+msgstr ""
+
+#: messages.go:154
+msgid "Invalid name"
+msgstr ""
+
+#: messages.go:155
+msgid "Busy, please try again later"
+msgstr ""
+
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr ""
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr ""
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr ""
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr ""
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr ""
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr ""
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr ""
-#: messages.go:157
-msgid "Album saved"
-msgstr ""
-
-#: messages.go:158
-#, c-format
-msgid "Album %s deleted"
-msgstr ""
-
-#: messages.go:159
-msgid "Album contents cloned"
-msgstr ""
-
-#: messages.go:160
-msgid "File removed from stack"
-msgstr ""
-
-#: messages.go:161
-msgid "File deleted"
-msgstr ""
-
-#: messages.go:162
-#, c-format
-msgid "Selection added to %s"
-msgstr ""
-
-#: messages.go:163
-#, c-format
-msgid "One entry added to %s"
-msgstr ""
-
-#: messages.go:164
-#, c-format
-msgid "%d entries added to %s"
-msgstr ""
-
#: messages.go:165
-#, c-format
-msgid "One entry removed from %s"
+msgid "Album saved"
msgstr ""
#: messages.go:166
#, c-format
-msgid "%d entries removed from %s"
+msgid "Album %s deleted"
msgstr ""
#: messages.go:167
-msgid "Account created"
+msgid "Album contents cloned"
msgstr ""
#: messages.go:168
-msgid "Account saved"
+msgid "File removed from stack"
msgstr ""
#: messages.go:169
-msgid "Account deleted"
+msgid "File deleted"
msgstr ""
#: messages.go:170
-msgid "Settings saved"
+#, c-format
+msgid "Selection added to %s"
msgstr ""
#: messages.go:171
-msgid "Password changed"
+#, c-format
+msgid "One entry added to %s"
msgstr ""
#: messages.go:172
#, c-format
-msgid "Import completed in %d s"
+msgid "%d entries added to %s"
msgstr ""
#: messages.go:173
-msgid "Import canceled"
+#, c-format
+msgid "One entry removed from %s"
msgstr ""
#: messages.go:174
#, c-format
-msgid "Indexing completed in %d s"
+msgid "%d entries removed from %s"
msgstr ""
#: messages.go:175
-msgid "Indexing originals..."
+msgid "Account created"
msgstr ""
#: messages.go:176
-#, c-format
-msgid "Indexing files in %s"
+msgid "Account saved"
msgstr ""
#: messages.go:177
-msgid "Indexing canceled"
+msgid "Account deleted"
msgstr ""
#: messages.go:178
-#, c-format
-msgid "Removed %d files and %d photos"
+msgid "Settings saved"
msgstr ""
#: messages.go:179
-#, c-format
-msgid "Moving files from %s"
+msgid "Password changed"
msgstr ""
#: messages.go:180
#, c-format
-msgid "Copying files from %s"
+msgid "Import completed in %d s"
msgstr ""
#: messages.go:181
-msgid "Labels deleted"
+msgid "Import canceled"
msgstr ""
#: messages.go:182
-msgid "Label saved"
+#, c-format
+msgid "Indexing completed in %d s"
msgstr ""
#: messages.go:183
-msgid "Subject saved"
+msgid "Indexing originals..."
msgstr ""
#: messages.go:184
-msgid "Subject deleted"
+#, c-format
+msgid "Indexing files in %s"
msgstr ""
#: messages.go:185
-msgid "Person saved"
+msgid "Indexing canceled"
msgstr ""
#: messages.go:186
-msgid "Person deleted"
+#, c-format
+msgid "Removed %d files and %d photos"
msgstr ""
#: messages.go:187
-msgid "File uploaded"
+#, c-format
+msgid "Moving files from %s"
msgstr ""
#: messages.go:188
#, c-format
-msgid "%d files uploaded in %d s"
+msgid "Copying files from %s"
msgstr ""
#: messages.go:189
-msgid "Processing upload..."
+msgid "Labels deleted"
msgstr ""
#: messages.go:190
-msgid "Upload has been processed"
+msgid "Label saved"
msgstr ""
#: messages.go:191
-msgid "Selection approved"
+msgid "Subject saved"
msgstr ""
#: messages.go:192
-msgid "Selection archived"
+msgid "Subject deleted"
msgstr ""
#: messages.go:193
-msgid "Selection restored"
+msgid "Person saved"
msgstr ""
#: messages.go:194
-msgid "Selection marked as private"
+msgid "Person deleted"
msgstr ""
#: messages.go:195
-msgid "Albums deleted"
+msgid "File uploaded"
msgstr ""
#: messages.go:196
#, c-format
-msgid "Zip created in %d s"
+msgid "%d files uploaded in %d s"
msgstr ""
#: messages.go:197
-msgid "Permanently deleted"
+msgid "Processing upload..."
msgstr ""
#: messages.go:198
+msgid "Upload has been processed"
+msgstr ""
+
+#: messages.go:199
+msgid "Selection approved"
+msgstr ""
+
+#: messages.go:200
+msgid "Selection archived"
+msgstr ""
+
+#: messages.go:201
+msgid "Selection restored"
+msgstr ""
+
+#: messages.go:202
+msgid "Selection marked as private"
+msgstr ""
+
+#: messages.go:203
+msgid "Albums deleted"
+msgstr ""
+
+#: messages.go:204
+#, c-format
+msgid "Zip created in %d s"
+msgstr ""
+
+#: messages.go:205
+msgid "Permanently deleted"
+msgstr ""
+
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr ""
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr ""
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr ""
diff --git a/assets/locales/es/default.po b/assets/locales/es/default.po
index b2efd0c1a..93775c34e 100644
--- a/assets/locales/es/default.po
+++ b/assets/locales/es/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Spanish \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Algo ha ido mal, inténtalo de nuevo"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Incapaz de hacerlo"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "No se pudieron guardar los cambios"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "No se pudo borrar"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s ya existe"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "No encontrado"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "No se encuentra el archivo"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Archivo demasiado grande"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "No compatible"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Tipo no admitido"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Formato no admitido"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "La carpeta de originales está vacía"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Selección no encontrada"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entidad no encontrada"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Cuenta no encontrada"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Usuario no encontrado"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Etiqueta no encontrada"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "No se encuentra la cámara"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "No se ha encontrado la lente"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Álbum no encontrado"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Asunto no encontrado"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Persona no encontrada"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Cara no encontrada"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "No disponible en modo público"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "No está disponible en modo de sólo lectura"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Por favor inicie sesión"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Permiso denegado"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Pago requerido"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "El archivo subido puede ser ofensivo"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Carga fallida"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Ningún elemento seleccionado"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Fallo al crear el archivo, por favor, compruebe los permisos"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Fallo al crear la carpeta, por favor, compruebe los permisos"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "No se pudo conectar, por favor vuelva a intentarlo"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Ingrese el código de verificación"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Código de verificación no válido, inténtalo de nuevo"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Contraseña inválida, por favor vuelva a intentarlo"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Característica desactivada"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Ninguna etiqueta seleccionada"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Ningún álbum seleccionado"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Ningún archivo disponible para descargar"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Fallo al crear el archivo zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Credenciales no válidas"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Enlace inválido"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nombre inválido"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Ocupado, por favor vuelva a intentarlo más tarde"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "El intervalo de activación es %s, pero debe ser 1h o menos"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Su cuenta no pudo ser conectada"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Demasiadas peticiones"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Almacenamiento insuficiente"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Cuota superada"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Cambios guardados con éxito"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Álbum creado"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Álbum guardado"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Álbum %s borrado"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Contenidos del álbum clonados"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Archivo eliminado de la pila"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Archivo eliminado"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Selección añadida a %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Una entrada añadida a %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d entradas añadidas a %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Una entrada eliminada de %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entradas eliminadas de %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Cuenta creada"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Cuenta guardada"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Cuenta borrada"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Ajustes guardados"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Contraseña cambiada"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importación completada en %d"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importación cancelada"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexación completada en %d"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indexando originales..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indexando archivos en %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexación cancelada"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Eliminados %d archivos y %d fotos"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Moviendo achivos desde %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Copiando archivos desde %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Etiquetas borradas"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Etiqueta guardada"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Asunto guardado"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Sujeto eliminado"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Persona salvada"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Persona eliminada"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Archivo cargado"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d archivos subidos en %d"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Procesando la carga..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "La carga ha sido procesada"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Selección aprobada"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Selección archivada"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Selección restaurada"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Selección marcada como privada"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Álbumes borrados"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip creado en %d"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Eliminado permanentemente"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s ha sido restaurado"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Verificado con éxito"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Activado exitosamente"
diff --git a/assets/locales/et/default.po b/assets/locales/et/default.po
index ee7e0d32e..fec07245b 100644
--- a/assets/locales/et/default.po
+++ b/assets/locales/et/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: et\n"
@@ -11,402 +11,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Midagi läks valesti, proovige uuesti"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Seda ei ole võimalik teha"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Muudatuste salvestamine ebaõnnestus"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Kustutamine ebaõnnestus"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s on juba olemas"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Ei leitud"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Faili ei leitud"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Fail on liiga suur"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Toetamata"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Toetamata tüüp"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Mittetoetatud formaat"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Originaalide kaust on tühi"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Valikut ei leitud"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Olemit ei leitud"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Kontot ei leitud"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Kasutajat ei leitud"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Silti ei leitud"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kaamerat ei leitud"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objektiivi ei leitud"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Albumit ei leitud"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Teemat ei leitud"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Isikut ei leitud"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Nägu ei leitud"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Pole avalikus režiimis saadaval"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Pole kirjutuskaitstud režiimis saadaval"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Palun logi oma kontole sisse"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Õigused puuduvad"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Nõutav makse"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Fail võib olla solvav"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Üleslaadimine ebaõnnestus"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Midagi pole valitud"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Faili loomine ebaõnnestus, kontrolli õiguseid"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Kausta loomine ebaõnnestus, kontrolli õiguseid"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Ühendumine ebaõnnestus, palun proovi uuesti"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Sisesta kontrollkood"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Vale kinnituskood, proovige uuesti"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Vale parool, palun proovi uuesti"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funktsioon välja lülitatud"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Ühtegi silti pole valitud"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Ühtegi albumit pole valitud"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Ühtegi faili ei ole allalaadimiseks saadaval"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "ZIP-faili loomine ebaõnnestus"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Kehtetud ligipääsuandmed"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Vigane link"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Vigane nimi"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Hõivatud, palun proovi hiljem uuesti"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Ärkamisintervall on %s, kuid peab olema 1 tund või vähem"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Konto ühendamine ebaõnnestus"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Liiga palju taotlusi"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Ebapiisav ladustamine"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kvoot ületatud"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Muudatused edukalt salvestatud"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album lisatud"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album salvestatud"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s kustutatud"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Albumi sisu kloonitud"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Fail virnast eemaldatud"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Fail kustutatud"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Valik lisatud albumisse %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Üks kirje lisatud albumisse %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d kirjet lisatud albumisse %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Üks kirje eemaldatud albumist %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d kirjet eemaldatud albumist %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Konto loodud"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Konto salvestatud"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Konto kustutatud"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Seaded salvestatud"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Parool muudetud"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Import tehtud %d sekundiga"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Import tühistatud"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indekseerimine lõpetatud %d sekundiga"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Originaalide indekseerimine..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Failide indekseerimine: %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indekseerimine tühistatud"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Eemaldatud %d faili ja %d fotot"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Failide liigutamine asukohast %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Failide kopeerimine asukohast %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Sildid kustutatud"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Silt salvestatud"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Teema salvestatud"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Teema kustutatud"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Isik salvestatud"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Isik kustutatud"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "File üles laaditud"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d faili üles laaditud %d sekundiga"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Üleslaaditud faili töötlemine..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Üleslaaditud fail on töödeldud"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Valik heaks kiidetud"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Valik arhiveeritud"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Valik taastatud"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Valik privaatseks märgitud"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albumid kustutatud"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "ZIP-fail loodud %d sekundiga"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Lõplikult kustutatud"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s on taastatud"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Edukalt kinnitatud"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Edukalt aktiveeritud"
diff --git a/assets/locales/eu/default.po b/assets/locales/eu/default.po
index c9b4aadd7..52016df44 100644
--- a/assets/locales/eu/default.po
+++ b/assets/locales/eu/default.po
@@ -1,413 +1,420 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: eu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Arazoren bat izan da. Saiatu berriro"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Hori egin ezinik"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Ezin izan dira aldaketak gorde"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Ezin izan da ezabatu"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s dagoeneko existitzen da"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Ez da aurkitu"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Fitxategia ez da aurkitu"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Fitxategi handiegia"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Onartu gabe"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Onartu gabeko mota"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Onartu gabeko formatua"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Jatorrizkoen karpeta hutsik dago"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Ez da hautapena aurkitu"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Ez da aurkitu entitatea"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Ez da kontua aurkitu"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Ez da erabiltzailea aurkitu"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Ez da etiketa aurkitu"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kamera ez da aurkitu"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Lentila ez da aurkitu"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Ez da aurkitu albuma"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Ez da aurkitu gaia"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Pertsona ez da aurkitu"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Aurpegia ez da aurkitu"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Ez dago eskuragarri modu publikoan"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Ez dago erabilgarri irakurtzeko soilik moduan"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Mesedez, hasi saioa zure kontuan"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Baimena ukatu egin da"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Ordainketa beharrezkoa da"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Kargatzea iraingarria izan daiteke"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Ezin izan da kargatu"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Ez da elementurik hautatu"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Ezin izan da fitxategia sortzean. Egiaztatu baimenak"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Ezin izan da karpeta sortzean. Egiaztatu baimenak"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Ezin izan da konektatu. Saiatu berriro"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Sartu egiaztapen-kodea"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Egiaztapen-kode baliogabea. Saiatu berriro"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Pasahitz baliogabea, saiatu berriro"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Eginbidea desgaituta dago"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Ez da etiketarik hautatu"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Ez dago albumik hautatu"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Ez dago fitxategirik deskargatzeko erabilgarri"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Ezin izan da zip fitxategia sortu"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Kredentzialak baliogabeak"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Esteka baliogabea"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Izen baliogabea"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Lanpetuta, saiatu berriro geroago"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Esnatzeko tartea %s da, baina ordu 1 edo gutxiagokoa izan behar du"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Ezin izan da zure kontua konektatu"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Eskaera gehiegi"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Biltegiratze nahikoa ez"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kuota gainditu da"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Aldaketak ongi gorde dira"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Sortu da albuma"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Albuma gorde da"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "%s albuma ezabatu da"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Albumen edukia klonatu da"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Fitxategia pilatik kendu da"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Fitxategia ezabatu da"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Aukeraketa gehitu da %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Sarrera bat gehitu da %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d sarrerak gehitu dira %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Sarrera bat kendu da %s-tik"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d sarrerak kendu dira %s-tik"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Kontua sortu da"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Kontua gorde da"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Kontua ezabatu da"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Ezarpenak gorde dira"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Pasahitza aldatu da"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Inportazioa %d s-an amaitu da"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Inportazioa bertan behera utzi da"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexatzea %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Jatorrizkoak indexatzen..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Fitxategiak indexatzen %s-n"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexazioa bertan behera utzi da"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d fitxategiak eta %d argazkiak kendu dira"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Fitxategiak mugitzen %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "%s fitxategiak kopiatzen"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Etiketak ezabatu dira"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Etiketa gorde da"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Gaia gorde da"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Gaia ezabatu da"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Pertsona gordeta"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Pertsona ezabatu da"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Kargatu da fitxategia"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fitxategiak %d s-etan kargatu dira"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Kargaketa prozesatzen..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Kargatzea prozesatu da"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Hautaketa onartu da"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Hautaketa artxibatuta dago"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Hautaketa leheneratu da"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Hautapena pribatu gisa markatu da"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albumak ezabatu dira"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip sortu zen %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Betiko ezabatu da"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s leheneratu da"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Behar bezala egiaztatu da"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Behar bezala aktibatu da"
diff --git a/assets/locales/fa/default.po b/assets/locales/fa/default.po
index 20f8e299a..3f0ca1c0a 100644
--- a/assets/locales/fa/default.po
+++ b/assets/locales/fa/default.po
@@ -1,413 +1,420 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: fa\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n==0 || n==1);\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "یه چیزی اشتباه شد دوباره تلاش کن"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "قادر به انجام آن نیست"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "تغییرات را نمی توان ذخیره کرد"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "نمی توان حذف کرد"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s از قبل وجود دارد"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "پیدا نشد"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "فایل پیدا نشد"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "فایل خیلی بزرگ است"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "پشتیبانی نمی شود"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "نوع پشتیبانی نشده"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "قالب پشتیبانی نشده"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "پوشه اصلی خالی است"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "انتخاب پیدا نشد"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "موجودیت پیدا نشد"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "حساب کاربری پیدا نشد"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "کاربر پیدا نشد"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "برچسب پیدا نشد"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "دوربین پیدا نشد"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "لنز یافت نشد"
+
+#: messages.go:129
msgid "Album not found"
msgstr "آلبوم پیدا نشد"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "موضوع پیدا نشد"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "فرد پیدا نشد"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "صورت پیدا نشد"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "در حالت عمومی در دسترس نیست"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "در حالت فقط خواندنی در دسترس نیست"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "لطفا وارد شوید و دوباره امتحان کنید"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "فرد حذف شد"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "پرداخت لازم است"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "آپلود ممکن است توهین آمیز باشد"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "آپلود انجام نشد"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "هیچ موردی انتخاب نشده است"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "فایل ایجاد نشد، لطفا مجوزها را بررسی کنید"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "پوشه ایجاد نشد، لطفا مجوزها را بررسی کنید"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "اتصال برقرار نشد، لطفاً دوباره امتحان کنید"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "کد تایید را وارد کنید"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "کد تأیید نامعتبر است، لطفاً دوباره امتحان کنید"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "رمز عبور نامعتبر است، لطفا دوباره امتحان کنید"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "ویژگی غیرفعال است"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "هیچ برچسبی انتخاب نشده است"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "هیچ آلبومی انتخاب نشده است"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "هیچ فایلی برای دانلود موجود نیست"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "فایل فشرده ایجاد نشد"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "گواهی نامه نامعتبر"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "لینک نامعتبر"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "نام نامعتبر"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "مشغول است، لطفاً بعداً دوباره امتحان کنید"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "فاصله بیداری %s است، اما باید 1 ساعت یا کمتر باشد"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "حساب شما متصل نشد"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "درخواست های خیلی زیاد"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "ذخیره سازی ناکافی"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "از سهمیه فراتر رفت"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "تغییرات با موفقیت ذخیره شد"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "آلبوم ایجاد شد"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "آلبوم ذخیره شد"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "آلبوم %s حذف شد"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "محتویات آلبوم کلون شد"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "فایل از پشته حذف شد"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "فایل حذف شد"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "مورد انتخابی به %s اضافه شد"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "یک مورد به %s اضافه شد"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d مورد به %s اضافه شد"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "یک مورد از %s حذف شد"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d مورد از %s حذف شد"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "حساب کاربری ایجاد شد"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "حساب کاربری ذخیره شد"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "حساب کاربری حذف شد"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "تنظیمات ذخیره شد"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "رمزعبور تغییر کرد"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "وارد کردن در %d ثانیه تکمیل شد"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "وارد کردن لغو شد"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "نمایه سازی در %d ثانیه تکمیل شد"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "نمایه سازی نسخه های اصلی ..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "نمایه سازی فایل ها در %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "نمایه سازی لغو شد"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d فایل و %d عکس حذف شد"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "انتقال فایل ها از %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "کپی کردن فایل ها از %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "برچسب ها حذف شدند"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "برچسب ذخیره شد"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "موضوع ذخیره شد"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "موضوع حذف شد"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "فرد ذخیره شد"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "فرد حذف شد"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "فایل حذف شد"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d فایل در %d ثانیه آپلود شد"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "در حال پردازش آپلود..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "%s بازیابی شده است"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "مورد انتخابی تایید شد"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "مورد انتخابی بایگانی شد"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "مورد انتخابی بازیابی شد"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "مورد انتخابی بهعنوان خصوصی علامتگذاری شد"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "آلبوم حذف شد"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "فایل فشرده در %d ثانیه ایجاد شد"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "برای همیشه حذف شد"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s بازیابی شده است"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "با موفقیت تأیید شد"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "با موفقیت فعال شد"
diff --git a/assets/locales/fi/default.po b/assets/locales/fi/default.po
index e3f4ee7e4..514e601b6 100644
--- a/assets/locales/fi/default.po
+++ b/assets/locales/fi/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: fi\n"
@@ -11,402 +11,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Jokin meni pieleen, yritä uudelleen"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Se ei onnistu"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Muutoksia ei voitu tallentaa"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Ei voitu poistaa"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s on jo olemassa"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Ei löytynyt"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Tiedostoa ei löydy"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Tiedosto liian suuri"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Ei tuettu"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Tyyppiä ei tueta"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Ei tuettu muoto"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Originaalit-kansio on tyhjä"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Valintaa ei löydy"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entiteettiä ei löydy"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Tiliä ei löydy"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Käyttäjää ei löydy"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Tarraa ei löydy"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kameraa ei löydy"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objektiivia ei löydy"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Albumia ei löydy"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Aihetta ei löydy"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Henkilöä ei löydy"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Kasvoja ei löydy"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Ei käytettävissä julkisessa tilassa"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Ei käytettävissä vain luku-tilassa"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Kirjaudu sisään tilillesi"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Lupa evätty"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Vaadittu maksu"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Upload saattaa olla loukkaava"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Lataus epäonnistui"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Kohdetta ei ole valittu"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Tiedoston luominen epäonnistui, tarkista käyttöoikeudet"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Kansion luominen epäonnistui, tarkista käyttöoikeudet"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Yhteyttä ei saatu muodostettua, yritä uudelleen"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "syötä vahvistus koodi"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Virheellinen vahvistuskoodi, yritä uudelleen"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Väärä salasana, yritä uudelleen"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Ominaisuus poistettu käytöstä"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Ei valittuja tarroja"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Ei valittuja albumeita"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Tiedostoja ei ole ladattavissa"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Zip-tiedoston luominen epäonnistui"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Virheelliset valtakirjat"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Virheellinen linkki"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Virheellinen nimi"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Varattu, yritä myöhemmin uudelleen"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Heräämisväli on %s, mutta sen on oltava enintään 1h"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Tiliäsi ei voitu yhdistää"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Liian monta pyyntöä"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Riittämätön varastointi"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kiintiö ylitetty"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Muutokset tallennettu onnistuneesti"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Albumi luotu"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Albumi tallennettu"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Albumi %s poistettu"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Albumin sisältö kloonattu"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Tiedosto poistettu pinosta"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Tiedosto poistettu"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Valinta lisätty %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Yksi merkintä lisätty kohtaan %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d merkintöjä lisätty %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Yksi merkintä poistettu kohdasta %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d merkinnät poistettu %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Tili luotu"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Tallennettu tili"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Tili poistettu"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Asetukset tallennettu"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Salasana vaihdettu"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Tuonti valmis %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Tuonti peruutettu"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksointi valmis %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Alkuperäiskappaleiden indeksointi..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Tiedostojen indeksointi osoitteessa %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indeksointi peruutettu"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Poistettiin %d tiedostoa ja %d valokuvaa"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Tiedostojen siirtäminen %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Tiedostojen kopiointi %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Tunnisteet poistettu"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Tarra tallennettu"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Aihe tallennettu"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Aihe poistettu"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Tallennettu henkilö"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Henkilö poistettu"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Ladattu tiedosto"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d tiedostoa ladattu %d s aikana"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Käsittelen latausta..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Lataus on käsitelty"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Valinta hyväksytty"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Valinta arkistoitu"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Valinta palautettu"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Valinta merkitty yksityiseksi"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albumit poistettu"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip luotu %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Poistettu pysyvästi"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s on palautettu"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Vahvistettu onnistuneesti"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Aktivointi onnistui"
diff --git a/assets/locales/fr/default.po b/assets/locales/fr/default.po
index 12cea6c83..f9c76ca0c 100644
--- a/assets/locales/fr/default.po
+++ b/assets/locales/fr/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: French \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Quelque chose s'est mal passé, réessayez"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Impossible de faire cela"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Les modifications n'ont pas pu être sauvegardées"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "N'a pas pu être supprimé"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s existe déjà"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Non trouvé"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Fichier non trouvé"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Fichier trop volumineux"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Non pris en charge"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Type non pris en charge"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Format non supporté"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Le dossier des originaux est vide"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Sélection non trouvée"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entité non trouvée"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Compte non trouvé"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Utilisateur non trouvé"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Étiquette non trouvée"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Caméra introuvable"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objectif introuvable"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album introuvable"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Sujet non trouvé"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Personne non trouvée"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Visage non trouvé"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Non disponible en mode public"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Non disponible en mode lecture seule"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Veuillez vous connecter avec votre compte"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Permission refusée"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Paiement requis"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Le contenu chargé peut être choquant"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Échec du chargement"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Aucun élément sélectionné"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "La création du fichier a échoué, veuillez vérifier les permissions"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Échec de la création du dossier, veuillez vérifier les permissions"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Échec lors de la connexion, veuillez réessayer"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Entrer le code de vérification"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Code de vérification invalide, veuillez réessayer"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Mot de passe invalide, veuillez réessayer"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Fonctionnalité désactivée"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Aucune étiquette sélectionnée"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Aucun album sélectionné"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Aucun fichier disponible au téléchargement"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Échec de la création du fichier zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Les informations d'identification sont invalides"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Lien invalide"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nom invalide"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Occupé, veuillez réessayer plus tard"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "L'intervalle de réveil est %s, mais doit être inférieur ou égal à 1h"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Votre compte n'a pas pu être connecté"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Trop de demandes"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Espace de stockage insuffisant"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Quota dépassé"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Les modifications ont bien été enregistrées"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album créé"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album sauvegardé"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s supprimé"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Le contenu de l'album a été copié"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Le fichier a été retiré du groupe"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Fichier supprimé"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Sélection ajoutée à %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Une entrée a été ajoutée à %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d entrées ont été ajoutées à %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Une entrée a été supprimée de %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entrées ont été supprimées de %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Compte créé"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Compte sauvegardé"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Compte supprimé"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Paramètres sauvegardés"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Mot de passe modifié"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importation terminée en %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importation annulée"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexation terminée en %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indexage des originaux…"
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indexation des fichiers de %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexation annulée"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Suppression de %d fichiers et %d photos"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Déplacement de fichiers depuis %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Copie de fichiers depuis %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Étiquettes supprimées"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Étiquettes sauvegardées"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Sujet sauvegardé"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Sujet supprimé"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Personne sauvegardée"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Personne supprimée"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Fichier téléchargé"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fichiers chargés en %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Traitement du téléchargement..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Le téléchargement a été traité"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Sélection approuvée"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Sélection archivée"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Sélection restaurée"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Sélection marquée comme privée"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albums supprimés"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Archive zip créée en %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Supprimé définitivement"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s a été restauré"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Vérifié avec succès"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Activation réussie"
diff --git a/assets/locales/ga/default.po b/assets/locales/ga/default.po
index d0f6de88d..2d6bd4c37 100644
--- a/assets/locales/ga/default.po
+++ b/assets/locales/ga/default.po
@@ -6,414 +6,421 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: ga\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :"
-"(n>6 && n<11) ? 3 : 4;\n"
-"X-Generator: Weblate 5.13.3\n"
+"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>"
+"6 && n<11) ? 3 : 4;\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Chuaigh rud éigin mícheart, bain triail eile as"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Ní féidir é sin a dhéanamh"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Níorbh fhéidir na hathruithe a shábháil"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Níorbh fhéidir a scriosadh"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s ann cheana"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Ní bhfuarthas"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Comhad gan aimsiú"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Comhad ró-mhór"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Gan tacaíocht"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Cineál nach dtacaítear leis"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Formáid nach dtacaítear léi"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Tá fillteán bunghnéithe folamh"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Níor aimsíodh an rogha"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Aonán gan aimsiú"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Cuntas gan aimsiú"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Úsáideoir gan aimsiú"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Níor aimsíodh an lipéad"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Níor aimsíodh an ceamara"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Níor aimsíodh an lionsa"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Albam gan aimsiú"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Ní bhfuarthas an t-ábhar"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Ní bhfuarthas an duine"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Aghaidh gan aimsiú"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Níl sé ar fáil i mód poiblí"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Níl sé ar fáil i mód inléite amháin"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Logáil isteach i do chuntas le do thoil"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Cead diúltaithe"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Íocaíocht ag teastáil"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "D'fhéadfadh uaslódáil a bheith maslach"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Theip ar an uaslódáil"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Níl aon mhír roghnaithe"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Theip ar chruthú an chomhaid, seiceáil na ceadanna"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Theip ar chruthú fillteán, seiceáil na ceadanna"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Níorbh fhéidir ceangal a dhéanamh, bain triail eile as"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Cuir isteach cód fíorúcháin"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Cód fíoraithe neamhbhailí, bain triail eile as"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Pasfhocal neamhbhailí, bain triail eile as"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Gné díchumasaithe"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Níor roghnaíodh aon lipéid"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Níor roghnaíodh aon albam"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Níl aon chomhaid ar fáil le híoslódáil"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Theip ar chruthú an chomhaid zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Dintiúir neamhbhailí"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Nasc neamhbhailí"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Ainm neamhbhailí"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Gnóthach, bain triail eile as ar ball"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Is é %s an t-eatramh múscail, ach caithfidh sé a bheith 1h nó níos lú"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Níorbh fhéidir do chuntas a nascadh"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "An iomarca iarratas"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Stóráil neamhleor"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Sáraíodh an cuóta"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Sábháladh na hathruithe"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Albam cruthaithe"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Sábháilte albam"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Albam %s scriosta"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Clónáilte ábhar albam"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Baineadh an comhad den chruach"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Scriosadh an comhad"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Cuireadh an rogha le %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Cuireadh iontráil amháin le %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d iontráil curtha le %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Baineadh iontráil amháin de %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d iontráil bainte de %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Cuntas cruthaithe"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Cuntas sábháilte"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Scriosadh an cuntas"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Socruithe sábháilte"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Athraíodh an pasfhocal"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Iompórtáil críochnaithe i %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Cealaíodh an iompórtáil"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Innéacsú curtha i gcrích in %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Buntéacs á innéacsú..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Comhaid á innéacsú in %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Innéacsú cealaithe"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Baineadh %d comhaid agus %d grianghraif"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Comhaid á mbogadh ó %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Comhaid á gcóipeáil ó %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Scriosadh na lipéid"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Lipéad sábháilte"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Ábhar sábháilte"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Scriosadh an t-ábhar"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Sábháladh an duine"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Scriosadh an duine"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Comhad uaslódáilte"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d comhaid uaslódáilte i %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Uaslódáil á phróiseáil..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Próiseáladh an t-uaslódáil"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Faomhadh an roghnúcháin"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Roghnaithe sa chartlann"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Athchóiríodh an roghnúchán"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Roghnú marcáilte mar phríobháideach"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albaim scriosta"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip cruthaithe i %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Scriosta go buan"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s athchóirithe"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "D'éirigh leis a fhíorú"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Cuireadh i ngníomh go rathúil"
diff --git a/assets/locales/he/default.po b/assets/locales/he/default.po
index 1603d53d7..d03de46f1 100644
--- a/assets/locales/he/default.po
+++ b/assets/locales/he/default.po
@@ -1,11 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: Hebrew \n"
"Language: he\n"
@@ -14,402 +13,410 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
"n % 10 == 0) ? 2 : 3));\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "קרתה תקלה נסה שוב"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "לא מסוגל לעשות את זה"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "לא ניתן לשמור שינויים"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "לא ניתן למחיקה"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s כבר קיים"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "לא נמצא"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "הקובץ לא נמצא"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "קובץ גדול מדי"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "אינו נתמך"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "סוג לא נתמך"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "פורמט לא נתמך"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "תיקיית המקור ריקה"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "הבחירה לא נמצאה"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "הישות לא נמצאה"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "החשבון לא נמצא"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "המשתמש לא נמצא"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "התווית לא נמצאה"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "לא נמצאה מצלמה"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "לא נמצא עדשה"
+
+#: messages.go:129
msgid "Album not found"
msgstr "האלבום לא נמצא"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "הנושא לא נמצא"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "אדם לא נמצא"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "הפנים לא נמצאו"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "לא זמין במצב ציבורי"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "לא זמין במצב קריאה בלבד"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "אנא היכנס לחשבון שלך"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "גישה נדחתה"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "נדרש תשלום"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "ההעלאה עשויה להיות פוגענית"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "העלאה נכשלה"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "לא נבחרו פריטים"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "יצירת הקובץ נכשלה, אנא בדוק את ההרשאות"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "יצירת התיקיה נכשלה, אנא בדוק את ההרשאות"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "לא ניתן היה להתחבר, נסה שוב"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "הכנס קוד אימות"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "קוד אימות לא חוקי, אנא נסה שוב"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "סיסמה לא תקינה, נסה שוב"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "התכונה מושבתת"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "לא נבחרו תוויות"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "לא נבחרו אלבומים"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "אין קבצים זמינים להורדה"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "יצירת קובץ ה-zip נכשלה"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "אישורים לא תקינים"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "קישור לא תקין"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "מספר לא תקף"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "עסוק, אנא נסה שוב מאוחר יותר"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "מרווח ההשכמה הוא %s, אך חייב להיות שעה אחת או פחות"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "לא ניתן היה לחבר את החשבון שלך"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "יותר מדי בקשות"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "אחסון לא מספיק"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "חריגה מהמכסה"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "השינויים נשמרו בהצלחה"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "האלבום נוצר"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "האלבום נשמר"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "האלבום %s נמחק"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "תוכן האלבום שוכפל"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "הקובץ הוסר מהאיחוד"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "הקובץ נמחק"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "הבחירה נוספה ל-%s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "רשומה אחת נוספה ל-%s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d רשומות נוספו ל-%s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "רשומה אחת הוסרה מ-%s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d רשומות הוסרו מ-%s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "החשבון נוצר"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "החשבון נשמר"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "החשבון נמחק"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "ההגדרות נשמרו"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "סיסמא שונתה"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "הייבוא הושלם ב-%d שניות"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "הייבוא בוטל"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "האינדוקס הושלם ב-%d שניות"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "מאנדקס קבצי מקור..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "מאנדקס קבצים תוך %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "יצירת האינדקס בוטלה"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "הוסרו %d קבצים ו-%d תמונות"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "מעביר קבצים מ-%s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "מעתיק קבצים מ-%s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "תוויות נמחקו"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "התווית נשמרה"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "הנושא נשמר"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "הנושא נמחק"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "אדם נשמר"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "אדם נמחק"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "הקובץ הועלה"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d קבצים הועלו תוך %d שניות"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "מעבד העלאה..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "ההעלאה עובדה"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "הבחירה אושרה"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "הבחירה הועברה לארכיון"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "הבחירה שוחזרה"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "הבחירה סומנה כפרטית"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "אלבומים נמחקו"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "ה-ZIP נוצר תוך %d שניות"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "נמחק לצמיתות"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s שוחזר"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "אומת בהצלחה"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "הופעל בהצלחה"
diff --git a/assets/locales/hi/default.po b/assets/locales/hi/default.po
index 0d14ff1bf..20a93a94b 100644
--- a/assets/locales/hi/default.po
+++ b/assets/locales/hi/default.po
@@ -1,11 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: Hindi \n"
"Language: hi\n"
@@ -13,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n==0 || n==1);\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "कुछ गलत हुआ है, दोबारा कोशिश करें"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "ऐसा करने में असमर्थ"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "परिवर्तन सहेजा नहीं जा सका"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "हटाया नहीं जा सका"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s पहले से मौजूद है"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "नहीं मिला"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "फाइल नहीं मिली"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "बहुत बड़ी फाइल"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "असमर्थित"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "असमर्थित प्रकार"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "असमर्थित प्रारूप"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "मूल फ़ोल्डर खाली है"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "चयन नहीं मिला"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "इकाई नहीं मिली"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "खता नहीं मिला"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "उपयोगकर्ता नहीं मिला"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "लेबल नहीं मिला"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "कैमरा नहीं मिला"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "लेंस नहीं मिला"
+
+#: messages.go:129
msgid "Album not found"
msgstr "एल्बम नहीं मिला"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "विषय नहीं मिला"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "व्यक्ति नहीं मिला"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "चेहरा नहीं मिला"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "सार्वजनिक मोड में उपलब्ध नहीं है"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "रीड ओनली मोड में उपलब्ध नहीं है"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "कृपया अपने खाते लॉग इन करें"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "अनुमति नहीं मिली"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "भुगतान आवश्यक"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "अपलोड आपत्तिजनक हो सकता है"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "अपलोड विफल"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "कोई आइटम नहीं चुना गया"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "फ़ाइल बनाने में विफल, कृपया अनुमतियों की जाँच करें"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "फ़ोल्डर बनाने में विफल, कृपया अनुमतियों की जाँच करें"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "कनेक्ट नहीं हो सका, कृपया पुनः प्रयास करें"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "सत्यापन कोड दर्ज करें"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "सत्यापन कोड अमान्य है, कृपया पुनः प्रयास करें"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "अमान्य पासवर्ड, कृपया पुनः प्रयास करें"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "सुविधा अक्षम है"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "कोई लेबल नहीं चुना गया"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "कोई एल्बम नहीं चुना गया"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "डाउनलोड के लिए कोई फाइल उपलब्ध नहीं है"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "ज़िप फ़ाइल बनाने में विफल"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "अवैध प्रत्यय पत्र"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "अमान्य लिंक"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "अमान्य नाम"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "व्यस्त, कृपया बाद में पुन: प्रयास करें"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "वेकअप अंतराल %s है, लेकिन 1h या उससे कम होना चाहिए"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "आपका खाता कनेक्ट नहीं किया जा सका"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "बहुत अधिक अनुरोध"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "अपर्याप्त भंडारण"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "कोटा पूरा हो गया"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "परिवर्तन सफलतापूर्वक सहेजे गए"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "एल्बम बनाया गया"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "एल्बम सहेजा गया"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "एल्बम %s हटाया गया"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "एल्बम सामग्री को क्लोन किया गया"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "स्टैक से फ़ाइल को निकाला गया"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "फ़ाइल हटा दी गई"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "चयन %s में जोड़ा गया"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "एक प्रविष्टि %s में जोड़ी गई"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d प्रविष्टियों को %s में जोड़ा गया"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "%s से एक प्रविष्टि को हटाया गया"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d प्रविष्टियों को %s से हटा दिया गया"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "खाता बन गया"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "खाता सहेजा गया"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "खाता हटाया गया"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "सेटिंग्स को सहेजा गया"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "पासवर्ड बदला गया"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "%d s में आयात पूरा हुआ"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "आयात रद्द कर दिया गया"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "%d s में अनुक्रमण पूरा हुआ"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "अनुक्रमण मूल ..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "%s में फाइलों को अनुक्रमित करना"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "अनुक्रमण रद्द किया गया"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d फ़ाइलों और %d फ़ोटो को हटा दिया गया"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "%s से फाइल चल रही है"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "%s से फाइल कॉपी कर रहा है"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "लेबल हटा दिए गए"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "लेबल सहेजा गया"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "विषय सहेजा गया"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "विषय हटा दिया गया"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "व्यक्ति बचाया"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "व्यक्ति हटाया गया"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "फ़ाइल अपलोड की गई"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d फाइलों को %d में अपलोड किया गया"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "अपलोड संसाधित किया जा रहा है..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "अपलोड संसाधित हो गया है"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "चयन को संग्रहीत किया गया"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "चयन को संग्रहीत किया गया"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "चयन बहाल"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "चयन निजी के रूप में चिह्नित"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "एल्बम हटाए गए"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "%d s में बनाया गया ज़िप"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "स्थायी रूप से हटा दिया गया"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s बहाल कर दिया गया है"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "सफलतापूर्वक सत्यापित"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "सफलतापूर्वक सक्रिय किया गया"
diff --git a/assets/locales/hr/default.po b/assets/locales/hr/default.po
index affbd8984..95c42cd1d 100644
--- a/assets/locales/hr/default.po
+++ b/assets/locales/hr/default.po
@@ -1,11 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
@@ -13,402 +12,410 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Nešto nije u redu, pokušajte ponovno"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Nesposoban to učiniti"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Promjene se nisu mogle spremiti"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Nije moguće izbrisati"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s već postoji"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Nije pronađeno"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Datoteka nije pronađena"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Datoteka je prevelika"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Nepodržano"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Nepodržana vrsta"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Nepodržani format"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Originalna mapa je prazna"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Odabir nije pronađen"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entitet nije pronađen"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "račun nije pronađen"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Korisnik nije pronađen"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Oznaka nije pronađena"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kamera nije pronađena"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Leća nije pronađena"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album nije pronađen"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Predmet nije pronađen"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Osoba nije pronađena"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Lice nije pronađeno"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Nije dostupno u javnom načinu"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "nije dostupno u načinu samo za čitanje"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Molimo prijavite se i pokušajte ponovno"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Osoba je izbrisana"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Potrebno je plaćanje"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Prijenos bi mogao biti uvredljiv"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Prijenos nije uspio"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Nema odabranih stavki"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Izrada datoteke nije uspjela, provjerite dopuštenja"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Izrada mape nije uspjela, provjerite dopuštenja"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Povezivanje nije uspjelo, pokušajte ponovno"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Unesite kontrolni kod"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Nevažeći kontrolni kod, pokušajte ponovno"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Nevažeća lozinka, pokušajte ponovo"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Značajka je onemogućena"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Nije odabrana nijedna oznaka"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Nije odabran nijedan album"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Nema dostupnih datoteka za preuzimanje"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Izrada zip datoteke nije uspjela"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Nevažeće vjerodajnice"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Nevažeća veza"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nevažeći naziv"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Zauzeto, pokušajte ponovo kasnije"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Interval buđenja je %s, ali mora biti 1 sat ili manje"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Vaš račun nije bilo moguće povezati"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Previše zahtjeva"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Nedovoljno prostora za pohranu"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kvota premašena"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Promjene su uspješno spremljene"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album stvoren"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album je spremljen"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s je izbrisan"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Sadržaj albuma je kloniran"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Datoteka je uklonjena iz hrpe"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Datoteka je izbrisana"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Odabir je dodan u %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Jedan unos dodan u %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d unosi dodani u %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Jedan unos uklonjen iz %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d unosi uklonjeni iz %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Račun kreiran"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Račun spremljen"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Račun je izbrisan"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Postavke spremljene"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Lozinka je promijenjena"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Uvoz dovršen za %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Uvoz je otkazan"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksiranje dovršeno za %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indeksiranje originala..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indeksiranje datoteka u %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indeksiranje je otkazano"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Uklonjene %d datoteke i %d fotografije"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Premještanje datoteka iz %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Kopiranje datoteka s %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Oznake su izbrisane"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Oznaka je spremljena"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Predmet je spremljen"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Predmet je izbrisan"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Osoba je spremljena"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Osoba je izbrisana"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Datoteka je izbrisana"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d datoteke prenesene u %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Obrada prijenosa..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Prijenos bi mogao biti uvredljiv"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Odabir odobren"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Odabir je arhiviran"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Odabir je vraćen"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Odabir je označen kao privatan"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albumi su izbrisani"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip stvoren u %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Trajno izbrisano"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "Odabir je vraćen"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Uspješno potvrđeno"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Uspješno aktiviran"
diff --git a/assets/locales/hu/default.po b/assets/locales/hu/default.po
index 3e64ef7e4..164cd1c9d 100644
--- a/assets/locales/hu/default.po
+++ b/assets/locales/hu/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Hungarian \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Valami rosszul ment, próbálja újra"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Erre képtelen"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Módosításokat nem sikerült menteni"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Nem sikerült törölni"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s már létezik"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Nem található"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Fájl nem található"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Túl nagy fájl"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Nem támogatott"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Nem támogatott típus"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Nem támogatott formátum"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Az Originals mappa üres"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Kiválasztás nem található"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entitás nem található"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Fiók nem található"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Felhasználó nem található"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Címke nem található"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "A kamera nem található"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "A lencse nem található"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album nem található"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Tárgy nem található"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Személy nem található"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Arc nem található"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Nyilvános módban nem elérhető"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Nem elérhető olvasói módban"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Kérjük, jelentkezzen be fiókjába"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Engedély megtagadva"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Fizetés szükséges"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "A feltöltött fájl sértő lehet"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Feltöltés sikertelen"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Nincsenek kiválasztva elemek"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Sikertelen fájl létrehozás. Kérjük, ellenőrizze a jogosultságokat"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Sikertelen mappa létrehozás. Kérjük, ellenőrizze a jogosultságokat"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Nem sikerült csatlakozni, próbálja újra"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Adja meg a megerősítő kódot"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Érvénytelen ellenőrző kód. Kérjük, próbálja újra"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Érvénytelen jelszó, próbálkozzon újra"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funkció letiltva"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Nincsenek kiválasztva címkék"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Nincsenek kiválasztott albumok"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Nincsenek letölthető fájlok"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Nem sikerült létrehozni a zip fájlt"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Érvénytelen belépési adatok"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Érvénytelen hivatkozás"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Érvénytelen név"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Túl magas terhelés, próbálkozzon újra később"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Az ébresztési intervallum a %s, de legfeljebb 1 óra lehet."
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "A fiókját nem lehetett csatlakoztatni"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Túl sok kérés"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Elégtelen tárolás"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "A kvóta túllépése"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Módosítások sikeresen mentve"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album létrehozva"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album mentve"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "%s album törölve"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Album tartalma klónozva"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Fájl eltávolítva a halomból"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Fájl törölve"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Választék hozzáadva a következőhöz: %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Egy bejegyzés hozzáadva a következőhöz: %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d bejegyzés hozzáadva a következőhöz: %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Egy bejegyzés eltávolítva innen: %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d bejegyzés eltávolítva innen: %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Fiók létrehozva"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Fiók mentve"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Fiók törölve"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Beállítások elmentve"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Jelszó megváltoztatva"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importálás %d másodperc alatt befejeződött"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importálás megszakítva"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexelés %d másodperc alatt befejeződött"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Eredeti dokumentumok indexelése..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Fájlok indexelése itt: %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexelés megszakítva"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d fájl és %d fénykép eltávolítva"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Fájlok áthelyezése innen: %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Fájlok másolása innen: %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Címkék törölve"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Címkék mentve"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Tárgy mentve"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Tárgy törölve"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Személy mentve"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Személy törölve"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Fájl feltöltve"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fájl feltöltve %d másodperc alatt"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Feltöltött fájlok feldolgozása..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Feltöltött fájlok feldolgozva"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "A kijelölés jóváhagyva"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "A kijelölés archiválva"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "A kijelölés visszaállítva"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "A kijelölés privátként megjelölve"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albumok törölve"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "A tömörített fájl létrejött %d másodperc alatt"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Véglegesen törölve"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s visszaállítva"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Sikeresen ellenőrizve"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Sikeres aktiválás"
diff --git a/assets/locales/id/default.po b/assets/locales/id/default.po
index c2c67e9a8..c64ed0a87 100644
--- a/assets/locales/id/default.po
+++ b/assets/locales/id/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Indonesian \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Ada yang salah, coba lagi"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Tidak dapat melakukan itu"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Perubahan tidak dapat disimpan"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Tidak dapat dihapus"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s sudah ada"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Tidak ditemukan"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Berkas tidak ditemukan"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Berkas terlalu besar"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Tidak didukung"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Jenis tidak didukung"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Format yang tidak didukung"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Folder asli kosong"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Pilihan tidak ditemukan"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entitas tidak ditemukan"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Akun tidak ditemukan"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Pengguna tidak ditemukan"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Label tidak ditemukan"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kamera tidak ditemukan"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Lensa tidak ditemukan"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album tidak ditemukan"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Subjek tidak ditemukan"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Orang tidak ditemukan"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Wajah tidak ditemukan"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Tidak tersedia dalam mode publik"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Tidak tersedia dalam mode hanya-baca"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Silakan masuk ke akun Anda"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Izin ditolak"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Diperlukan pembayaran"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Unggahan mungkin menyinggung"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Unggahan gagal"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Tidak ada item yang dipilih"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Gagal membuat file, silakan periksa izin"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Gagal membuat folder, harap periksa izin"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Tidak dapat terhubung, silakan coba lagi"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Masukkan kode verifikasi"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Kode verifikasi tidak valid, silakan coba lagi"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Kata sandi salah, silakan coba lagi"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Fitur dinonaktifkan"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Tidak ada label yang dipilih"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Tidak ada album yang dipilih"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Tidak ada file yang tersedia untuk diunduh"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Gagal membuat file zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Kredensial tidak valid"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Tautan tidak valid"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nama tidak valid"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Sibuk, silakan coba lagi nanti"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Interval wakeup adalah %s, tetapi harus 1 jam atau kurang"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Akun Anda tidak dapat terhubung"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Terlalu banyak permintaan"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Penyimpanan yang tidak memadai"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kuota terlampaui"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Perubahan berhasil disimpan"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album dibuat"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album disimpan"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s dihapus"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Konten album dikloning"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "File dihapus dari tumpukan"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Berkas dihapus"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Pilihan ditambahkan ke %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Satu entri ditambahkan ke %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d entri ditambahkan ke %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Satu entri dihapus dari %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entri dihapus dari %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Akun dibuat"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Akun disimpan"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Akun dihapus"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Pengaturan disimpan"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Kata sandi diubah"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Impor selesai dalam %d detik"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Impor dibatalkan"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Pengindeksan selesai dalam %d detik"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Mengindeks dokumen asli..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Mengindeks file dalam %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Pengindeksan dibatalkan"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Menghapus %d file dan %d foto"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Memindahkan file dari %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Menyalin file dari %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Label dihapus"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Label disimpan"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Subjek disimpan"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Subjek dihapus"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Orang disimpan"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Orang dihapus"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "File diunggah"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d file diupload di %d detik"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Memproses unggahan..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Unggahan telah diproses"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Pilihan disetujui"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Pilihan diarsipkan"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Pilihan dipulihkan"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Pilihan ditandai sebagai pribadi"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Koleksi album dihapus"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip dibuat dalam %d detik"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Dihapus permanen"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s telah dipulihkan"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Berhasil diverifikasi"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Berhasil diaktifkan"
diff --git a/assets/locales/it/default.po b/assets/locales/it/default.po
index 2830904c1..02ac91aba 100644
--- a/assets/locales/it/default.po
+++ b/assets/locales/it/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Italian \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Qualcosa è andato storto, riprova"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Impossibile farlo"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Le modifiche non possono essere salvate"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Impossibile eliminare"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s esiste già"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Non trovato"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "File non trovato"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "File troppo grande"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Non supportato"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Formato non supportato"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Formato non supportato"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "La cartella degli originali è vuota"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Selezione non trovata"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entità non trovata"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Account non trovato"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Utente non trovato"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Etichetta non trovata"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Fotocamera non trovata"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Obiettivo non trovato"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album non trovato"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Soggetto non trovato"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Persona non trovata"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Faccia non trovata"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Non disponibile in modalità pubblica"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Non disponibile in modalità di sola lettura"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Accedere al proprio account"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Permesso negato"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Pagamento obbligatorio"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "L'upload potrebbe essere offensivo"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Upload fallito"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Nessun elemento selezionato"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Impossibile creare il file, si prega di controllare i permessi"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Impossibile creare la cartella, si prega di controllare i permessi"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Impossibile connettersi, si prega di riprovare"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Inserisci codice di verifca"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Codice di verifica errato, prova di nuovo"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Password non valida, si prega di riprovare"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funzionalità disabilitata"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Nessuna etichetta selezionata"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Nessun album selezionato"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Nessun file è disponibile per il download"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Impossibile creare il file zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Credenziali non valide"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Link non valido"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nome non valido"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Occupato, si prega di riprovare più tardi"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "L'intervallo di risveglio è %s, ma deve essere pari o inferiore a 1h"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Non è stato possibile collegare l'account"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Troppe richieste"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Stoccaggio insufficiente"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Quota superata"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Modifiche salvate con successo"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album creato"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album salvato"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s eliminato"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "I contenuti dell'album sono stati duplicati"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "File rimosso dallo stack"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "File eliminato"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Selezione aggiunta a %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Un elemento aggiunto a %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d elementi aggiunti a %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Un elemento rimosso da %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d elementi rimossi da %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Account creato"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Account salvato"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Account eliminato"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Impostazioni salvate"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Password cambiata"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importazione completata in %d secondi"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importazione cancellata"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indicizzazione completata in %d secondi"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indicizzando gli originali..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indicizzazione dei file in %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indicizzazione cancellata"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Rimossi %d file e %d foto"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Spostamento dei file da %s in corso"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Copia dei file da %s in corso"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Etichette eliminate"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Etichetta salvata"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Soggetto salvato"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Soggetto cancellato"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Persona salvata"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Persona cancellata"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "File caricato"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d file caricati in %d secondi"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Elaborazione del caricamento..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Il caricamento è stato elaborato"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Selezione approvata"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Selezione archiviata"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Selezione ripristinata"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Selezione impostata come privata"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Album eliminati"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip creato in %d secondi"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Eliminato permanentemente"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s è stato ripristinato"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Verifica avvenuta con successo"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Attivazione avvenuta con successo"
diff --git a/assets/locales/ja/default.po b/assets/locales/ja/default.po
index a0705c223..7c57240a7 100644
--- a/assets/locales/ja/default.po
+++ b/assets/locales/ja/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Japanese \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "何かが間違っています。もう一度やり直してください"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "その操作はできません"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "変更を保存できませんでした"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "削除できませんでした"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s は既に存在します"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "見つかりませんでした"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "ファイルが見つかりませんでした"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "ファイルが大きすぎます"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "サポートされていません"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "サポートされていない形式です"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "非対応のフォーマットです"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Originals フォルダーは空です"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "選択した項目は存在しません"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "エンティティが見つかりません"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "アカウントが存在しません"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "ユーザーが存在しません"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "ラベルが存在しません"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "カメラが見つかりません"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "レンズが見つからない"
+
+#: messages.go:129
msgid "Album not found"
msgstr "アルバムが存在しません"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "件名が見つかりません"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "人が見つかりません"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "顔を検出できませんでした"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "公開モードでは利用できません"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "読み込み専用モードでは利用できません"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "アカウントにログインしてください"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "アクセスが拒否されました"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "要支払い"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "アップロードされた項目に過激なものが含まれている可能性があります"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "アップロードに失敗しました"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "項目が選択されていません"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "ファイルの作成に失敗しました。権限を確認してください"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "フォルダの作成に失敗しました。権限を確認してください"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "接続できませんでした。もう一度お試しください"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "認証コードを入力してください"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "認証コードが無効です。もう一度お試しください"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "不正なパスワードです。もう一度お試しください"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "機能が無効になりました"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "ラベルが選択されていません"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "アルバムが選択されていません"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "ダウンロードできるファイルはありません"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "zip ファイルの作成に失敗しました"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "正しくない認証情報です"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "正しくないリンクです"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "無効な名前です"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "他の処理中です。後で再試行してください"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "ウェイクアップ間隔は %s ですが、1時間以内で指定する必要があります"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "アカウントに接続できませんでした"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "リクエストが多すぎます"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "ストレージが不足しています"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "ノルマ超過"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "変更が正常に保存されました"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "アルバムが作成されました"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "アルバムが保存されました"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "アルバム %s が削除されました"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "アルバムの内容が複製されました"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "スタックからファイルが削除されました"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "ファイルが削除されました"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "選択した項目が %s に追加されました"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "1 件の項目が %s に追加されました"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d 件の項目が %s に追加されました"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "1 件の項目が %s から削除されました"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d 件の項目が %s から削除されました"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "アカウントが作成されました"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "アカウントが保存されました"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "アカウントが削除されました"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "設定が保存されました"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "パスワードが変更されました"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "インポートが %d 秒で完了しました"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "インポートが取り消されました"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "インデックスが %d 秒で完了しました"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "originals をインデックスしています..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "%s 内のファイルをインデックスしています"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "インデックスが取り消されました"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d 件のファイルと %d 件の写真が削除されました"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "%s からファイルを移動しています"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "%s からファイルをコピーしています"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "ラベルが削除されました"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "ラベルが保存されました"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "保存対象"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "件名を削除しました"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "保存された人"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "人を削除しました"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "ファイルがアップロードされました"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d 件のファイルを %d 秒でアップロードしました"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "アップロードの処理..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "アップロードが完了しました"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "選択した項目が承認されました"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "選択した項目がアーカイブされました"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "選択した項目が復元されました"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "選択した項目がプライベートに設定されました"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "アルバムが削除されました"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "%d 秒で zip ファイルを作成しました"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "完全に削除されました"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s が復元されました"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "検証に成功しました"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "正常に有効化されました"
diff --git a/assets/locales/ko/default.po b/assets/locales/ko/default.po
index d9549d987..0c2e3a145 100644
--- a/assets/locales/ko/default.po
+++ b/assets/locales/ko/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Korean \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "문제가 발생했습니다. 다시 시도하세요."
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "그렇게 할 수 없습니다."
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "변경 사항을 저장할 수 없음"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "삭제할 수 없음"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s가 이미 존재함"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "찾을 수 없음"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "파일을 찾을 수 없음"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "파일이 너무 큽니다"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "지원되지 않음"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "지원되지 않는 유형"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "지원되지 않는 형식"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "원본 폴더가 비어 있습니다"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "선택 항목을 찾을 수 없음"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "항목을 찾을 수 없음"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "계정을 찾을 수 없음"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "사용자를 찾을 수 없음"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "라벨을 찾을 수 없음"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "카메라를 찾을 수 없습니다"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "렌즈를 찾을 수 없습니다"
+
+#: messages.go:129
msgid "Album not found"
msgstr "앨범을 찾을 수 없음"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "제목을 찾을 수 없음"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "사람을 찾을 수 없음"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "얼굴을 찾을 수 없음"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "공개 모드에서는 사용할 수 없음"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "읽기 전용 모드에서는 사용할 수 없음"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "귀하의 계정에 로그인하십시오"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "권한이 없음"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "결제 필요"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "업로드가 불쾌할 수 있습니다"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "업로드 실패"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "선택된 항목이 없습니다"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "파일 생성에 실패했습니다. 권한을 확인하세요"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "폴더를 만들지 못했습니다. 권한을 확인하세요"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "연결할 수 없습니다. 다시 시도해 주세요"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "인증코드를 입력하세요"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "잘못된 인증 코드입니다. 다시 시도해 주세요."
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "비밀번호가 잘못되었습니다. 다시 시도해 주세요"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "기능 비활성화됨"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "선택한 라벨이 없습니다"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "앨범이 선택되지 않았습니다"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "다운로드할 수 있는 파일이 없습니다"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "zip 파일 생성 실패"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "잘못된 자격 증명"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "유효하지 않은 링크입니다"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "잘못된 이름"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "바쁘니 나중에 다시 시도해 주세요"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "깨우기 간격은 %s이지만 1시간 이하여야 합니다"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "계정을 연결할 수 없습니다"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "너무 많은 요청"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "저장 공간 부족"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "할당량 초과"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "변경사항이 성공적으로 저장되었습니다"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "앨범 생성됨"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "앨범 저장됨"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "앨범 %s이(가) 삭제됨"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "복제된 앨범 콘텐츠"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "스택에서 제거된 파일"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "파일이 삭제됨"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "선택 항목이 %s에 추가됨"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "%s에 항목 1개 추가됨"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d 항목이 %s에 추가됨"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "%s에서 항목 1개 삭제됨"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d 항목이 %s에서 제거됨"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "계정 생성됨"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "계정이 저장됨"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "계정 삭제됨"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "설정 저장됨"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "비밀번호 변경됨"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "%d초 후에 가져오기 완료"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "가져오기 취소됨"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "%d초 후에 인덱싱 완료"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "원본 색인 생성 중..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "%s에서 파일 색인 생성"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "인덱싱 취소됨"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "파일 %d개와 사진 %d개를 삭제했습니다"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "%s에서 파일 이동"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "%s에서 파일 복사"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "라벨 삭제됨"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "라벨이 저장되었습니다"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "주제가 저장됨"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "제목 삭제됨"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "사람이 저장됨"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "삭제된 사람"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "업로드된 파일 1개"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d개의 파일이 %d초에 업로드됨"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "업로드 처리 중..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "업로드가 처리되었습니다"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "선택 항목 승인됨"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "선택 항목 보관됨"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "선택 항목 복원됨"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "비공개로 표시된 선택"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "앨범 삭제됨"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "%d초에 생성된 우편번호"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "영구 삭제됨"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s이(가) 복원되었습니다"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "성공적으로 확인되었습니다"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "성공적으로 활성화되었습니다"
diff --git a/assets/locales/ku/default.po b/assets/locales/ku/default.po
index afc08ba47..5a7d4534a 100644
--- a/assets/locales/ku/default.po
+++ b/assets/locales/ku/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: Google Cloud Translation Basic \n"
"Language-Team: Kurdish \n"
"Language-Team: none\n"
"Language: lt\n"
@@ -13,402 +13,410 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > "
"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? "
"1 : 2);\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Kažkas nepavyko, bandykite dar kartą"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Nepavyksta to padaryti"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Pakeitimų nepavyko išsaugoti"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Negalima ištrinti"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s jau egzistuoja"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Nerasta"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Failo rasti nepavyko"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Per didelis failas"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Nepalaikoma"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Nepalaikomas tipas"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Nepalaikomas formatas"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Originalų aplankas tuščias"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Pasirinkimas nerastas"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Subjektas nerastas"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Paskyra nerasta"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Vartotojas nerastas"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Etiketė nerasta"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kameros nerasta"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objektyvas nerastas"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Albumas nerastas"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Tema nerasta"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Asmuo nerastas"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Veidas nerastas"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Negalima naudoti viešuoju režimu"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Negalima naudoti tik skaitymo režimu"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Prisijunkite prie savo paskyros"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Priėjimas neimanomas"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Reikalingas mokėjimas"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Įkėlimas gali būti įžeidžiantis"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Įkelti nepavyko"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Nėra pasirinktų elementų"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Nepavyko sukurti failo, patikrinkite leidimus"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Nepavyko sukurti aplanko, patikrinkite leidimus"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Nepavyko prisijungti, bandykite dar kartą"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Įveskite patvirtinimo kodą"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Neteisingas patvirtinimo kodas, bandykite dar kartą"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Netinkamas slaptažodis, bandykite dar kartą"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funkcija išjungta"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Nėra pasirinktų etikečių"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Nėra pasirinktų albumų"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Nėra parsisiunčiamų failų"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Nepavyko sukurti zip failo"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Neteisingi įgaliojimai"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Netinkama nuoroda"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Netinkamas pavadinimas"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Užimta, bandykite vėliau"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Budinimo intervalas yra %s, bet turi būti ne ilgesnis kaip 1 val"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Nepavyko prisijungti prie jūsų paskyros"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Per daug prašymų"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Nepakankama saugykla"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Viršyta kvota"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Pakeitimai sėkmingai išsaugoti"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Sukurtas albumas"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Išsaugotas albumas"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Albumas %s pašalintas"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Klonuotas albumo turinys"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Failas pašalintas iš kamino"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Ištrintas failas"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Pasirinkimas pridėtas prie %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Vienas įrašas pridėtas prie %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d įrašai, įtraukti į %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Vienas įrašas pašalintas iš %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d įrašai pašalinti iš %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Sukurta paskyra"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Išsaugota paskyra"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Ištrinta paskyra"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Nustatymai išsaugoti"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Slaptažodis pakeistas"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importas baigtas per %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importas atšauktas"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksavimas baigtas per %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Originalų indeksavimas..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Failų indeksavimas %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indeksavimas atšauktas"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Pašalinti %d failai ir %d nuotraukos"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Failų perkėlimas iš %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Failų kopijavimas iš %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Ištrintos etiketės"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Išsaugota etiketė"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Tema - išsaugotas"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Išbrauktas objektas"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Išsaugotas asmuo"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Išbrauktas asmuo"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Įkeltas failas"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d failai įkelti per %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Įkėlimo apdorojimas..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Įkėlimas apdorotas"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Patvirtinta atranka"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Atranka archyvuota"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Atkurta atranka"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Atranka pažymėta kaip privati"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Ištrinti albumai"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip sukurta %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Visam laikui ištrintas"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s buvo atkurta"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Sėkmingai patvirtinta"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Sėkmingai suaktyvinta"
diff --git a/assets/locales/lv/default.po b/assets/locales/lv/default.po
index d629e9d32..99d8eec14 100644
--- a/assets/locales/lv/default.po
+++ b/assets/locales/lv/default.po
@@ -6,10 +6,10 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2026-01-15 09:02+0000\n"
-"Last-Translator: Janis Eglitis \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: lv\n"
"MIME-Version: 1.0\n"
@@ -17,401 +17,409 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= "
"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n"
-"X-Generator: Weblate 5.15.1\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Kaut kas nogāja greizi, mēģiniet vēlreiz"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "To nevar izdarīt"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Izmaiņas nevarēja saglabāt"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Nevarēja izdzēst"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s jau pastāv"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Nav atrasts"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Fails nav atrasts"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Fails ir pārāk liels"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Neatbalstīts"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Neatbalstīts tips"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Neatbalstīts formāts"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Oriģinālu mape ir tukša"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Izvēle nav atrasta"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Vienība nav atrasta"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Konts nav atrasts"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Lietotājs nav atrasts"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Birka nav atrasta"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kamera nav atrasta"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objektīvs nav atrasts"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Albums nav atrasts"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Tēma nav atrasta"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Persona nav atrasta"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Seja nav atrasta"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Nav pieejams publiskajā režīmā"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Nav pieejams lasīšanas režīmā"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Lūdzu, piesakieties savā kontā"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Atļauja liegta"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Nepieciešams maksājums"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Augšupielāde varētu būt aizskaroša"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Augšupielāde neizdevās"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Nav izvēlēts neviens ieraksts"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Neizdevās izveidot failu, lūdzu, pārbaudiet atļaujas"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Neizdevās izveidot mapi, lūdzu, pārbaudiet atļaujas"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Nevarēja izveidot savienojumu, lūdzu, mēģiniet vēlreiz"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Ievadiet verifikācijas kodu"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Nederīgs verifikācijas kods, lūdzu, mēģiniet vēlreiz"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Nederīga parole, lūdzu, mēģiniet vēlreiz"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funkcionalitāte ir izslēgta"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Nav atlasītas nevienas birkas"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Nav atlasīts neviens albums"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Nav lejupielādei pieejamu failu"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Neizdevās izveidot zip failu"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Nederīgs lietotājvārds vai parole"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Nederīga saite"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nederīgs nosaukums"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Aizņemts, lūdzu, mēģiniet vēlreiz vēlāk"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Pamošanās intervāls ir %s, bet tam jābūt 1 h vai mazākam"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Jūsu kontu nevarēja savienot"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Pārāk daudz pieprasījumu"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Nepietiek brīvas vietas"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kvota pārsniegta"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Izmaiņas veiksmīgi saglabātas"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Albums izveidots"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Albums saglabāts"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Albums %s ir dzēsts"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Albuma saturs ir dublēts"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Fails izņemts no saraksta"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Fails izdzēsts"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Atlasījums pievienots %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Viens ieraksts pievienots %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d ieraksti pievienoti %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Viens ieraksts noņemts no %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d ieraksti noņemti no %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Konts izveidots"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Konts saglabāts"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Konts ir dzēsts"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Iestatījumi saglabāti"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Parole nomainīta"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importēšana pabeigta %d s laikā"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importēšana atcelta"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksēšana pabeigta %d s laikā"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Notiek oriģinālu indeksēšana..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Notiek failu indeksēšana %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indeksēšana atcelta"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Noņemti %d faili un %d fotoattēli"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Failu pārvietošana no %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Failu kopēšana no %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Birkas ir dzēstas"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Birka saglabāta"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Tēma saglabāta"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Tēma dzēsta"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Persona saglabāta"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Persona dzēsta"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Fails augšupielādēts"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d faili augšupielādēti %d sekundēs"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Notiek augšupielādes apstrāde..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Augšupielāde ir apstrādāta"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Atlase apstiprināta"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Atlase arhivēta"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Atlase atjaunota"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Izvēle atzīmēta kā privāta"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albumi ir dzēsti"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "ZIP fails izveidots %d sekundēs"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Neatgriezeniski dzēsts"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s ir atjaunots"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Veiksmīgi verificēts"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Veiksmīgi aktivizēts"
diff --git a/assets/locales/messages.pot b/assets/locales/messages.pot
index e5b61e355..ac4009ad6 100644
--- a/assets/locales/messages.pot
+++ b/assets/locales/messages.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -17,399 +17,407 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr ""
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr ""
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr ""
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr ""
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr ""
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr ""
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr ""
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr ""
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr ""
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr ""
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr ""
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr ""
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr ""
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr ""
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr ""
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr ""
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr ""
-#: messages.go:121
-msgid "Album not found"
-msgstr ""
-
-#: messages.go:122
-msgid "Subject not found"
-msgstr ""
-
-#: messages.go:123
-msgid "Person not found"
-msgstr ""
-
-#: messages.go:124
-msgid "Face not found"
-msgstr ""
-
-#: messages.go:125
-msgid "Not available in public mode"
-msgstr ""
-
-#: messages.go:126
-msgid "Not available in read-only mode"
-msgstr ""
-
#: messages.go:127
-msgid "Please log in to your account"
+msgid "Camera not found"
msgstr ""
#: messages.go:128
-msgid "Permission denied"
+msgid "Lens not found"
msgstr ""
#: messages.go:129
-msgid "Payment required"
+msgid "Album not found"
msgstr ""
#: messages.go:130
-msgid "Upload might be offensive"
+msgid "Subject not found"
msgstr ""
#: messages.go:131
-msgid "Upload failed"
+msgid "Person not found"
msgstr ""
#: messages.go:132
-msgid "No items selected"
+msgid "Face not found"
msgstr ""
#: messages.go:133
-msgid "Failed creating file, please check permissions"
+msgid "Not available in public mode"
msgstr ""
#: messages.go:134
-msgid "Failed creating folder, please check permissions"
+msgid "Not available in read-only mode"
msgstr ""
#: messages.go:135
-msgid "Could not connect, please try again"
+msgid "Please log in to your account"
msgstr ""
#: messages.go:136
-msgid "Enter verification code"
+msgid "Permission denied"
msgstr ""
#: messages.go:137
-msgid "Invalid verification code, please try again"
+msgid "Payment required"
msgstr ""
#: messages.go:138
-msgid "Invalid password, please try again"
+msgid "Upload might be offensive"
msgstr ""
#: messages.go:139
-msgid "Feature disabled"
+msgid "Upload failed"
msgstr ""
#: messages.go:140
-msgid "No labels selected"
+msgid "No items selected"
msgstr ""
#: messages.go:141
-msgid "No albums selected"
+msgid "Failed creating file, please check permissions"
msgstr ""
#: messages.go:142
-msgid "No files available for download"
+msgid "Failed creating folder, please check permissions"
msgstr ""
#: messages.go:143
-msgid "Failed to create zip file"
+msgid "Could not connect, please try again"
msgstr ""
#: messages.go:144
-msgid "Invalid credentials"
+msgid "Enter verification code"
msgstr ""
#: messages.go:145
-msgid "Invalid link"
+msgid "Invalid verification code, please try again"
msgstr ""
#: messages.go:146
-msgid "Invalid name"
+msgid "Invalid password, please try again"
msgstr ""
#: messages.go:147
-msgid "Busy, please try again later"
+msgid "Feature disabled"
msgstr ""
#: messages.go:148
+msgid "No labels selected"
+msgstr ""
+
+#: messages.go:149
+msgid "No albums selected"
+msgstr ""
+
+#: messages.go:150
+msgid "No files available for download"
+msgstr ""
+
+#: messages.go:151
+msgid "Failed to create zip file"
+msgstr ""
+
+#: messages.go:152
+msgid "Invalid credentials"
+msgstr ""
+
+#: messages.go:153
+msgid "Invalid link"
+msgstr ""
+
+#: messages.go:154
+msgid "Invalid name"
+msgstr ""
+
+#: messages.go:155
+msgid "Busy, please try again later"
+msgstr ""
+
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr ""
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr ""
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr ""
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr ""
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr ""
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr ""
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr ""
-#: messages.go:157
-msgid "Album saved"
-msgstr ""
-
-#: messages.go:158
-#, c-format
-msgid "Album %s deleted"
-msgstr ""
-
-#: messages.go:159
-msgid "Album contents cloned"
-msgstr ""
-
-#: messages.go:160
-msgid "File removed from stack"
-msgstr ""
-
-#: messages.go:161
-msgid "File deleted"
-msgstr ""
-
-#: messages.go:162
-#, c-format
-msgid "Selection added to %s"
-msgstr ""
-
-#: messages.go:163
-#, c-format
-msgid "One entry added to %s"
-msgstr ""
-
-#: messages.go:164
-#, c-format
-msgid "%d entries added to %s"
-msgstr ""
-
#: messages.go:165
-#, c-format
-msgid "One entry removed from %s"
+msgid "Album saved"
msgstr ""
#: messages.go:166
#, c-format
-msgid "%d entries removed from %s"
+msgid "Album %s deleted"
msgstr ""
#: messages.go:167
-msgid "Account created"
+msgid "Album contents cloned"
msgstr ""
#: messages.go:168
-msgid "Account saved"
+msgid "File removed from stack"
msgstr ""
#: messages.go:169
-msgid "Account deleted"
+msgid "File deleted"
msgstr ""
#: messages.go:170
-msgid "Settings saved"
+#, c-format
+msgid "Selection added to %s"
msgstr ""
#: messages.go:171
-msgid "Password changed"
+#, c-format
+msgid "One entry added to %s"
msgstr ""
#: messages.go:172
#, c-format
-msgid "Import completed in %d s"
+msgid "%d entries added to %s"
msgstr ""
#: messages.go:173
-msgid "Import canceled"
+#, c-format
+msgid "One entry removed from %s"
msgstr ""
#: messages.go:174
#, c-format
-msgid "Indexing completed in %d s"
+msgid "%d entries removed from %s"
msgstr ""
#: messages.go:175
-msgid "Indexing originals..."
+msgid "Account created"
msgstr ""
#: messages.go:176
-#, c-format
-msgid "Indexing files in %s"
+msgid "Account saved"
msgstr ""
#: messages.go:177
-msgid "Indexing canceled"
+msgid "Account deleted"
msgstr ""
#: messages.go:178
-#, c-format
-msgid "Removed %d files and %d photos"
+msgid "Settings saved"
msgstr ""
#: messages.go:179
-#, c-format
-msgid "Moving files from %s"
+msgid "Password changed"
msgstr ""
#: messages.go:180
#, c-format
-msgid "Copying files from %s"
+msgid "Import completed in %d s"
msgstr ""
#: messages.go:181
-msgid "Labels deleted"
+msgid "Import canceled"
msgstr ""
#: messages.go:182
-msgid "Label saved"
+#, c-format
+msgid "Indexing completed in %d s"
msgstr ""
#: messages.go:183
-msgid "Subject saved"
+msgid "Indexing originals..."
msgstr ""
#: messages.go:184
-msgid "Subject deleted"
+#, c-format
+msgid "Indexing files in %s"
msgstr ""
#: messages.go:185
-msgid "Person saved"
+msgid "Indexing canceled"
msgstr ""
#: messages.go:186
-msgid "Person deleted"
+#, c-format
+msgid "Removed %d files and %d photos"
msgstr ""
#: messages.go:187
-msgid "File uploaded"
+#, c-format
+msgid "Moving files from %s"
msgstr ""
#: messages.go:188
#, c-format
-msgid "%d files uploaded in %d s"
+msgid "Copying files from %s"
msgstr ""
#: messages.go:189
-msgid "Processing upload..."
+msgid "Labels deleted"
msgstr ""
#: messages.go:190
-msgid "Upload has been processed"
+msgid "Label saved"
msgstr ""
#: messages.go:191
-msgid "Selection approved"
+msgid "Subject saved"
msgstr ""
#: messages.go:192
-msgid "Selection archived"
+msgid "Subject deleted"
msgstr ""
#: messages.go:193
-msgid "Selection restored"
+msgid "Person saved"
msgstr ""
#: messages.go:194
-msgid "Selection marked as private"
+msgid "Person deleted"
msgstr ""
#: messages.go:195
-msgid "Albums deleted"
+msgid "File uploaded"
msgstr ""
#: messages.go:196
#, c-format
-msgid "Zip created in %d s"
+msgid "%d files uploaded in %d s"
msgstr ""
#: messages.go:197
-msgid "Permanently deleted"
+msgid "Processing upload..."
msgstr ""
#: messages.go:198
+msgid "Upload has been processed"
+msgstr ""
+
+#: messages.go:199
+msgid "Selection approved"
+msgstr ""
+
+#: messages.go:200
+msgid "Selection archived"
+msgstr ""
+
+#: messages.go:201
+msgid "Selection restored"
+msgstr ""
+
+#: messages.go:202
+msgid "Selection marked as private"
+msgstr ""
+
+#: messages.go:203
+msgid "Albums deleted"
+msgstr ""
+
+#: messages.go:204
+#, c-format
+msgid "Zip created in %d s"
+msgstr ""
+
+#: messages.go:205
+msgid "Permanently deleted"
+msgstr ""
+
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr ""
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr ""
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr ""
diff --git a/assets/locales/ms/default.po b/assets/locales/ms/default.po
index 3ce9fa2cb..89c1acda3 100644
--- a/assets/locales/ms/default.po
+++ b/assets/locales/ms/default.po
@@ -1,413 +1,420 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: ms\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Kesilapan telah berlaku, cuba lagi"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Tidak mampu berbuat demikian"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Perubahan tidak dapat disimpan"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Tidak dapat dipadamkan"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s sudah wujud"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Tidak ditemui"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Fail tidak dijumpai"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Fail terlalu besar"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Tidak disokong"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Jenis tidak disokong"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Format yang tidak disokong"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Folder asal kosong"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Pilihan tidak ditemui"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entiti tidak ditemui"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "akaun tidak dijumpai"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Pengguna tidak dijumpai"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Label tidak ditemui"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kamera tidak ditemui"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Lensa tidak ditemui"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album tidak ditemui"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Subjek tidak ditemui"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Orang tidak ditemui"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Wajah tidak ditemui"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Tidak tersedia dalam mod awam"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Tidak tersedia dalam mod baca sahaja"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Sila log masuk ke akaun anda"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Kebenaran ditolak"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Bayaran diperlukan"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Muat naik mungkin menyinggung perasaan"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Muat naik gagal"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Tiada item dipilih"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Gagal membuat fail, sila semak kebenaran"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Gagal membuat folder, sila semak kebenaran"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Tidak dapat menyambung, sila cuba lagi"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Masukkan kod pengesahan"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Kod pengesahan tidak sah, sila cuba lagi"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Kata laluan tidak sah, sila cuba lagi"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Ciri dilumpuhkan"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Tiada label dipilih"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Tiada album dipilih"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Tiada fail tersedia untuk dimuat turun"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Gagal membuat fail zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Bukti kelayakan tidak sah"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Pautan tidak sah"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nama tidak sah"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Sibuk, sila cuba lagi nanti"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Selang bangun ialah %s, tetapi mestilah 1j atau kurang"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Akaun anda tidak dapat disambungkan"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Terlalu banyak permintaan"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Storan tidak mencukupi"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kuota melebihi"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Perubahan berjaya disimpan"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album dibuat"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album disimpan"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s dipadamkan"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Kandungan album diklon"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Fail dialih keluar daripada timbunan"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Fail dipadamkan"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Pilihan ditambahkan pada %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Satu entri ditambahkan pada %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "Entri %d ditambahkan pada %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Satu entri dialih keluar daripada %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entri dialih keluar daripada %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Akaun dibuat"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Akaun disimpan"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Akaun dipadamkan"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Tetapan Disimpan"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Kata laluan ditukar"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Import selesai dalam %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Import dibatalkan"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Pengindeksan selesai dalam %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Mengindeks asal..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Mengindeks fail dalam %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Pengindeksan dibatalkan"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Mengalih keluar fail %d dan foto %d."
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Memindahkan fail dari %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Menyalin fail daripada %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Label dipadamkan"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Label disimpan"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Subjek disimpan"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Subjek dipadamkan"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Orang yang diselamatkan"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Orang dipadamkan"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Fail dimuat naik"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "Fail %d dimuat naik dalam %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Memproses muat naik..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Muat naik telah diproses"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Pemilihan diluluskan"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Pemilihan diarkibkan"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Pemilihan dipulihkan"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Pilihan ditandakan sebagai peribadi"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Album dipadamkan"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip dibuat dalam %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Dipadamkan secara kekal"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s telah dipulihkan"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Berjaya disahkan"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Berjaya diaktifkan"
diff --git a/assets/locales/nb/default.po b/assets/locales/nb/default.po
index 4163f3e9d..90d6531df 100644
--- a/assets/locales/nb/default.po
+++ b/assets/locales/nb/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Norwegian Bokmål \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Noe gikk galt, prøv igjen"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Ikke i stand til å gjøre det"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Kan ikke lagre endringer"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Kan ikke slettes"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s eksisterer allerede"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Ikke funnet"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Fil ikke funnet"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Filen er for stor"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Ustøttet"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Ikke støttet type"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Ikke støttet format"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Originaler-mappen er tom"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Finner ikke utvalg"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Enheten ble ikke funnet"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Konto ikke funnet"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Bruker ikke funnet"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Merkelapp ikke funnet"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kameraet ble ikke funnet"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objektivet ble ikke funnet"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album ikke funnet"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Emnet ble ikke funnet"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Person ikke funnet"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Ansikt ikke funnet"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Ikke tilgjengelig i offentlig modus"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "ikke tilgjengelig i skrivebeskyttet modus"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Logg inn på kontoen din"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Ingen tilgang"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Betaling kreves"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Opplastingen kan være støtende"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Opplasting mislyktes"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Ingen elementer valgt"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Kunne ikke opprette fil, vennligst sjekk tillatelser"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Kunne ikke opprette mappe, vennligst sjekk tillatelser"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Kunne ikke koble til, vennligst prøv igjen"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Angi verifikasjonskode"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Ugyldig bekreftelseskode. Prøv igjen"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Ugyldig passord, vennligst prøv igjen"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Tjeneste deaktivert"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Ingen merkelapper valgt"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Ingen albumer valgt"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Ingen filer tilgjengelig for nedlasting"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Kunne ikke opprette zip-arkiv"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Ugyldige innloggingsdetaljer"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Ugyldig lenke"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Ugyldig navn"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Opptatt. Prøv igjen senere"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Oppvåkningsintervallet er %s, men må være 1 time eller mindre"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Kontoen din kunne ikke kobles til"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "For mange forespørsler"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Utilstrekkelig lagringsplass"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kvote overskredet"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Endringene ble lagret"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album opprettet"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album lagret"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s slettet"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Albuminnhold duplisert"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Fil fjernet fra samling"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Fil slettet"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Utvalg lagt til %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "En oppføring lagt til %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d oppføringer lagt til %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "En oppføring fjernet fra %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d oppføringer fjernet fra %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Konto opprettet"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Konto lagret"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Konto slettet"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Innstillinger lagret"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Passord endret"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Import fullført på %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Import avbrutt"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksering fullført på %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indekserer originaler…"
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indekserer filer i %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indeksering avbrutt"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Fjernet %d filer og %d foto"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Flytter filer fra %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Kopierer filer fra %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Merkelapper slettet"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Merkelapper lagret"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Emnet er lagret"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Emnet er slettet"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Person reddet"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Person slettet"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Fil lastet opp"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d filer lastet opp på %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Behandler opplasting..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Opplastingen er behandlet"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Utvalg godkjent"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Utvalg arkivert"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Utvalg gjenopprettet"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Utvalg markert som privat"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Album slettet"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip opprettet på %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Permanent slettet"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s har blitt gjenopprettet"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Vellykket verifisert"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Vellykket aktivert"
diff --git a/assets/locales/nl/default.po b/assets/locales/nl/default.po
index 505e5b8ca..c01dc07c5 100644
--- a/assets/locales/nl/default.po
+++ b/assets/locales/nl/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Dutch \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Er ging iets mis, probeer het opnieuw"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Dat kan niet"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Wijzigingen kunnen niet worden opgeslagen"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Kan niet verwijderd worden"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s bestaat al"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Niet gevonden"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Bestand niet gevonden"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Bestand te groot"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Niet ondersteund"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Niet-ondersteund type"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Niet ondersteund formaat"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "De map Originelen is leeg"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Selectie niet gevonden"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entiteit niet gevonden"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Account niet gevonden"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Gebruiker niet gevonden"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Label niet gevonden"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Camera niet gevonden"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Lens niet gevonden"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album niet gevonden"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Onderwerp niet gevonden"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Persoon niet gevonden"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Gezicht niet gevonden"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Niet beschikbaar in publieke modus"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Niet beschikbaar in alleen-lezen modus"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Log in op je account"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Toegang geweigerd"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Betaling vereist"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Upload kan aanstootgevend zijn"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Uploaden mislukt"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Geen items geselecteerd"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Bestand aanmaken mislukt, controleer alstublieft de rechten"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Folder aanmaken mislukt, controleer alstublieft de rechten"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Kan niet verbinden, probeer alstublieft opnieuw"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Verificatiecode invoeren"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Ongeldige verificatiecode. Probeer het opnieuw"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Fout wachtwoord, probeer alstublieft opnieuw"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Functie uitgeschakeld"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Geen labels geselecteerd"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Geen albums geselecteerd"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Geen bestanden beschikbaar om te downloaden"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Maken van zip-bestand is mislukt"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Ongeldige inloggegevens"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Ongeldige link"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Ongeldige mapnaam"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Bezet, probeer het later nog eens"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Het wekinterval is %s, maar moet 1 uur of minder zijn"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Uw account kon niet worden aangesloten"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Te veel verzoeken"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Onvoldoende opslag"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Quota overschreden"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Wijzigingen succesvol opgeslagen"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album aangemaakt"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album opgeslagen"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s verwijderd"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Albuminhoud gekopieerd"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Bestand uit stapel verwijderd"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Bestand verwijderd"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Selectie toegevoegd aan %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Eén item toegevoegd aan %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d items toegevoegd aan %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Eén item verwijderd uit %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d items verwijderd uit %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Account aangemaakt"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Account opgeslagen"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Account verwijderd"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Instellingen opgeslagen"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Wachtwoord gewijzigd"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importeren voltooid in %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importeren geannuleerd"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexeren voltooid in %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Originelen indexeren…"
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Bestanden indexeren in %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexeren geannuleerd"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d bestanden en %d foto’s verwijderd"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Bestanden verplaatsen uit %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Bestanden kopiëren uit %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Labels verwijderd"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Labels opgeslagen"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Onderwerp opgeslagen"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Onderwerp verwijderd"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Persoon gered"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Persoon verwijderd"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Bestand geüpload"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d bestanden geüpload in %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Verwerking upload..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Upload is verwerkt"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Selectie goedgekeurd"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Selectie gearchiveerd"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Selectie hersteld"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Selectie gemarkeerd als privé"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albums verwijderd"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip gemaakt in %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Permanent verwijderd"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s is hersteld"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Met succes geverifieerd"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Met succes geactiveerd"
diff --git a/assets/locales/pl/default.po b/assets/locales/pl/default.po
index 8df2c89ee..a916351d7 100644
--- a/assets/locales/pl/default.po
+++ b/assets/locales/pl/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Polish \n"
@@ -13,404 +13,412 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Coś poszło nie tak, spróbuj jeszcze raz"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Nie da się tego zrobić"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Nie można zapisać zmian"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Nie można usunąć"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s już istnieje"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Nie znaleziono"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Plik nie został znaleziony"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Plik jest zbyt duży"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Nieobsługiwane"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Nieobsługiwany typ"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Nieobsługiwany format"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Folder oryginałów jest pusty"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Nie znaleziono wyboru"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Nie znaleziono podmiotu"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Konto nie znalezione"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Użytkownik nie znaleziony"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Etykieta nie została odnaleziona"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Nie znaleziono kamery"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Nie znaleziono obiektywu"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album nie został znaleziony"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Temat nie został znaleziony"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Osoba nie została znaleziona"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Twarz nie została znaleziona"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Niedostępne w trybie publicznym"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Niedostępne w trybie tylko do odczytu"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Proszę zalogować się na swoje konto"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Brak uprawnień"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Wymagana płatność"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Przesyłane dane mogą być obraźliwe"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Przesyłanie nie powiodło się"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Nie wybrano żadnych elementów"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Nie można utworzyć pliku, sprawdź uprawnienia"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Nie można utworzyć folderu, sprawdź uprawnienia"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Nie można się połączyć, spróbuj ponownie"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Wprowadź kod weryfikacyjny"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Nieprawidłowy kod weryfikacyjny. Spróbuj ponownie"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Nieprawidłowe hasło, spróbuj ponownie"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funkcja wyłączona"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Nie wybrano etykiet"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Nie wybrano albumów"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Brak plików do pobrania"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Nie udało się utworzyć pliku zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Nieprawidłowe dane logowania"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Nieprawidłowy link"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nieprawidłowa nazwa"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Zajęty, spróbuj ponownie później"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr ""
"Interwał wybudzenia %s jest nieprawidłowy, powinien być równy lub mniejszy "
"niż 1 godzina"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Twoje konto nie może być podłączone"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Zbyt wiele żądań"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Niewystarczająca pamięć"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Przekroczony limit"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Zmiany zostały pomyślnie zapisane"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album został utworzony"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album został zapisany"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s został usunięty"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Album został sklonowany"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Plik został rozgrupowany"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Plik został usunięty"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Wybór dodany do %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Dodano jeden wpis do %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d wpisy dodane do %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Usunięto jeden wpis z %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d wpisy usunięte z %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Konto utworzone"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Konto zapisane"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Konto usunięte"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Ustawienia zapisane"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Hasło zostało zmienione"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Import zakończony w %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Import został anulowany"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksowanie zakończone w %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indeksowanie oryginałów…"
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indeksowanie plików w %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indeksowanie anulowane"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Usunięto %d plików i %d zdjęć"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Przenoszenie plików z %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Kopiowanie plików z %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Usunięto etykiety"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Etykieta zapisana"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Przedmiot zapisany"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Przedmiot usunięty"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Osoba zapisana"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Osoba usunięta"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Przesłany plik"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d plików przesłano w %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Przetwarzanie uploadu..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Przesyłanie zostało przetworzone"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Wybór zatwierdzony"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Wybór zarchiwizowany"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Wybór został przywrócony"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Wybór oznaczony jako prywatny"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albumy zostały usunięte"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip utworzony w %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Trwale usunięty"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s zostało przywrócone"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Pomyślnie zweryfikowano"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Pomyślnie aktywowano"
diff --git a/assets/locales/pt/default.po b/assets/locales/pt/default.po
index cfaf6f910..aea4a2668 100644
--- a/assets/locales/pt/default.po
+++ b/assets/locales/pt/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Portuguese \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Algo correu mal, tente novamente"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Incapaz de fazer isso"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "As mudanças não foram salvas"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Não foi possível excluir"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s já existe"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Não encontrado"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Arquivo não encontrado"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Arquivo muito grande"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Não compatível"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Tipo não suportado"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Formato sem suporte"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "A pasta dos originais está vazia"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Seleção não encontrada"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entidade não encontrada"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Conta não encontrada"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Usuário não encontrado"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Etiqueta não encontrada"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Não foi encontrada nenhuma câmara"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Lente não encontrada"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Álbum não encontrado"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Assunto não encontrado"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Pessoa não encontrada"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Rosto não encontrado"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Indisponível em modo público"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Não disponível no modo somente leitura"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Faça o login em sua conta"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Permissão negada"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Pagamento obrigatório"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Envio pode ser ofensivo"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Envio falhou"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Sem itens selecionados"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Falha ao criar arquivo, por favor cheque as permissões"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Falha ao criar pasta, por favor cheque as permissões"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Não foi possível conectar, por favor tente novamente"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Digite o código de verificação"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Código de verificação inválido, tente novamente"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Senha inválida, por favor tente novamente"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Recurso Desativado"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Sem etiquetas selecionadas"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Sem álbuns selecionados"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Sem arquivos disponíveis para baixar"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Falha ao criar arquivo zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Credenciais inválidas"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Link inválido"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nome inválido"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Em uso, por favor tente novamente mais tarde"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "O intervalo de despertar é %s, mas deve ser de 1h ou menos"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Sua conta não pôde ser conectada"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Demasiados pedidos"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Armazenamento insuficiente"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Quota excedida"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "As mudanças foram salvas com sucesso"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Álbum criado"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Álbum salvo"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Álbum %s excluído"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Conteúdo do álbum copiado"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Arquivo removido da pilha"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Arquivo excluído"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Seleção adicionada a %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Uma entrada adicionada a %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d entradas adicionadas a %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Uma entrada removida de %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entradas removidas de %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Conta criada"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Conta salva"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Conta excluída"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Configurações salvas"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Senha alterada"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importação completa em %d"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importação cancelada"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexação completa em %d"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indexando originais..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indexando arquivos em %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexação cancelada"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Removidos %d arquivos e %d fotos"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Movendo arquivos de %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Copiando arquivos de %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Etiquetas excluídas"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Etiqueta salva"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Assunto salvo"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Assunto eliminado"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Pessoa salva"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Pessoa apagada"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Arquivo carregado"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d arquivos enviados em %d"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "A processar carregamento..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "O Upload foi processado"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Seleção aprovada"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Seleção arquivada"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Seleção restaurada"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Seleção marcada como privada"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Álbuns excluídos"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip criado em %d"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Permanentemente excluídas"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s foi restaurado"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Verificado com sucesso"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Ativado com sucesso"
diff --git a/assets/locales/pt_BR/default.po b/assets/locales/pt_BR/default.po
index 5138e6ae0..426a97658 100644
--- a/assets/locales/pt_BR/default.po
+++ b/assets/locales/pt_BR/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Portuguese (Brazil) \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Algo deu errado, tente novamente"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Incapaz de fazer isso"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "As mudanças não foram salvas"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Não foi possível excluir"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s já existe"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Não encontrado"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Arquivo não encontrado"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Arquivo muito grande"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Não compatível"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Tipo não suportado"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Formato sem suporte"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "A pasta dos originais está vazia"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Seleção não encontrada"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entidade não encontrada"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Conta não encontrada"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Usuário não encontrado"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Etiqueta não encontrada"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Câmera não encontrada"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Lente não encontrada"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Álbum não encontrado"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Assunto não encontrado"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Pessoa não encontrada"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Rosto não encontrado"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Indisponível em modo público"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Não disponível no modo somente leitura"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Faça o login em sua conta"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Permissão negada"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Pagamento obrigatório"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Envio pode ser ofensivo"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Envio falhou"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Sem itens selecionados"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Falha ao criar arquivo, por favor cheque as permissões"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Falha ao criar pasta, por favor cheque as permissões"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Não foi possível conectar, por favor tente novamente"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Digite o código de verificação"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Código de verificação inválido, tente novamente"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Senha inválida, por favor tente novamente"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Recurso Desativado"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Sem etiquetas selecionadas"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Sem álbuns selecionados"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Sem arquivos disponíveis para baixar"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Falha ao criar arquivo zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Credenciais inválidas"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Link inválido"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nome inválido"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Ocupado, por favor tente mais tarde"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "O intervalo de despertar é %s, mas deve ser de 1h ou menos"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Sua conta não pôde ser conectada"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Muitas solicitações"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Armazenamento insuficiente"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Cota excedida"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "As mudanças foram salvas com sucesso"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Álbum criado"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Álbum salvo"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Álbum %s excluído"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Conteúdo do álbum copiado"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Arquivo removido da pilha"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Arquivo excluído"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Seleção adicionada a %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Uma entrada adicionada a %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d entradas adicionadas a %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Uma entrada removida de %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entradas removidas de %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Conta criada"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Conta salva"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Conta excluída"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Configurações salvas"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Senha alterada"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importação completa em %d"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importação cancelada"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexação completa em %d"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indexando originais..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indexando arquivos em %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexação cancelada"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Removidos %d arquivos e %d fotos"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Movendo arquivos de %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Copiando arquivos de %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Etiquetas excluídas"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Etiqueta salva"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Assunto salvo"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Assunto eliminado"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Pessoa salva"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Pessoa apagada"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Arquivo carregado"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d arquivos enviados em %d"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Processamento de upload..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "O Upload foi processado"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Seleção aprovada"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Seleção arquivada"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Seleção restaurada"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Seleção marcada como privada"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Álbuns excluídos"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip criado em %d"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Permanentemente excluídas"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s foi restaurado"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Verificado com sucesso"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Ativado com sucesso"
diff --git a/assets/locales/ro/default.po b/assets/locales/ro/default.po
index 2ede4f6fd..c150d0f43 100644
--- a/assets/locales/ro/default.po
+++ b/assets/locales/ro/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Romanian \n"
@@ -13,402 +13,410 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Ceva nu a mers bine, încercați din nou"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Nu se poate face asta"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Modificările nu au putut fi salvate"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Nu a putut fi șters"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s deja există"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Nu a fost găsit"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Fișier nedescoperit"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Fișier prea mare"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Neacceptat"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Tip neacceptat"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Format neacceptat"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Dosarul Originals este gol"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Selecția nu a fost găsită"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entitatea nu a fost găsită"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Contul nu a fost găsit"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Utilizatorul nu a fost găsit"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Eticheta nu a fost găsită"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Nu s-a găsit camera"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Obiectivul nu a fost găsit"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album nedescoperit"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Subiectul nu a fost găsit"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Persoana nu a fost găsită"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Fața nu a fost găsită"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Nu este disponibil în modul public"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Nu este disponibil în modul doar pentru citire"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Vă rugăm să vă conectați la contul dvs"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Permisiune refuzată"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Plata necesară"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Încărcarea poate fi ofensatoare"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Încărcarea a eșuat"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Niciun element selectat"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Nu a reușit să creeze fișierul, vă rugăm să verificați permisiunile"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Nu s-a reușit crearea dosarului, vă rugăm să verificați permisiunile"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Nu s-a putut conecta, vă rugăm să încercați din nou"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Introduceți codul de verificare"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Cod de verificare nevalid, încercați din nou"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Parolă invalidă, vă rugăm să încercați din nou"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Caracteristică dezactivată"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Nu sunt selectate etichete"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Nu sunt selectate albume"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Nu există fișiere disponibile pentru descărcare"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Nu a reușit să creeze fișierul zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Acreditări nevalabile"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Legătură invalidă"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Nume invalid"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Ocupat, vă rugăm să încercați din nou mai târziu"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Intervalul de trezire este %s, dar trebuie să fie de 1h sau mai puțin"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Contul dvs. nu a putut fi conectat"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Prea multe cereri"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Depozitare insuficientă"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Cota depășită"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Modificări salvate cu succes"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album creat"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album salvat"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s șters"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Conținutul albumului a fost clonat"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Fișier eliminat din stivă"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Fișier șters"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Selecție adăugată la %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "O intrare adăugată la %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d intrări adăugate la %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "O intrare eliminată din %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d intrări eliminate din %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Cont creat"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Cont salvat"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Cont șters"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Setări salvate"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Parola a fost schimbată"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Import finalizat în %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importul a fost anulat"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexare finalizată în %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indexarea originalelor..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indexarea fișierelor în %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexare anulată"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Sau eliminat %d fișiere și %d fotografii"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Mutarea fișierelor din %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Copierea fișierelor din %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Etichete șterse"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Etichetă salvată"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Subiect salvat"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Subiect eliminat"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Persoană salvată"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Persoană eliminată"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Fișier încărcat"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fișiere încărcate în %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Procesarea încărcării..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Încărcarea a fost procesată"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Selecție aprobată"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Selecție arhivată"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Selecție restabilită"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Selecție marcată ca fiind privată"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albume șterse"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Fișierul Zip creat în %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Șterse definitiv"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s a fost restaurat"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Verificat cu succes"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Activat cu succes"
diff --git a/assets/locales/ru/default.po b/assets/locales/ru/default.po
index 41d933175..f97646491 100644
--- a/assets/locales/ru/default.po
+++ b/assets/locales/ru/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Russian \n"
@@ -13,402 +13,410 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Что-то пошло не так, попробуйте еще раз"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Невозможно сделать это"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Изменения не будут сохранены"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Не будет удалено"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s уже существует"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Не найдено"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Файл не найден"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Слишком большой файл"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Не поддерживается"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Неподдерживаемый тип"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Неподдерживаемый формат"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Папка оригиналов пуста"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Выделение не найдено"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Сущность не найдена"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Учетная запись не найдена"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Пользователь не найден"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Метка не найдена"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Камера не найдена"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Объектив не найден"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Альбом не найден"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Объект не найден"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Человек не найден"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Лицо не найдено"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Не доступно в публичном режиме"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Недоступно в режиме только для чтения"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Пожалуйста, войдите в свой аккаунт"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Доступ запрещен"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Требуется оплата"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Загрузка может быть оскорбительной"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Загрузка не удалась"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Нет выделенных элементов"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Не удалось создать файл, проверьте права доступа"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Не удалось создать папку, проверьте права доступа"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Нет соединения, попробуйте еще раз"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "введите код подтверждения"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Неверный код подтверждения. Повторите попытку."
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Неверный пароль, пожалуйста попробуйте еще раз"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Данная возможность отключена"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Нет выделенных меток"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Нет выделенных альбомов"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Нет файлов, доступных для скачивания"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Не удалось создать zip-файл"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Неверные учетные данные"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Неверная ссылка"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Неприемлемое имя"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Занят, повторите попытку позже"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Интервал пробуждения составляет %s, но должен быть 1 час или меньше"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Ваш аккаунт не удалось подключить"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Слишком много запросов"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Недостаточно места для хранения"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Квота превышена"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Изменения сохранены"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Альбом создан"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "\\альбом сохранен"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Альбом %s удален"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Содержимое альбома скоприровано"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Файл удален из очереди"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Файл удалён"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Выделение добавлено к %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Один элемент добавлен к %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d элементов добавлено к %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Один элемент удален из %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d элементов удалено из %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Учетная запись создана"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Учетная запись сохранена"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Учетная запись удалена"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Настройки сохранены"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Пароль изменен"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Импортирование завершено за %d c"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Импортирование отменено"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Индексирование завершено за %d с"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Индексирование Оригиналов..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Индексирование файлов в %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Индексирование отменено"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Удаление %d файлов и %d фотографий"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Перемещение файлов из %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Копирование файлов из %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Метки удалены"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Метки сохранены"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Тема сохранена"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Тема удалена"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Человек спасен"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Лицо удалено"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Файл загружен"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d файлов загружено за %d с"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Обработка загрузки..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Загрузка была обработана"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Утвержденный выбор"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Выбранное помещено в архив"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Выбранное восстановлено"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Выбранное помечено как приватное"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Альбом удален"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip архив создан за %d с"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Постоянно удаляется"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s был восстановлен"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Успешно проверено"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Успешно активировано"
diff --git a/assets/locales/sk/default.po b/assets/locales/sk/default.po
index 5a5246fd2..3b1db0e3a 100644
--- a/assets/locales/sk/default.po
+++ b/assets/locales/sk/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Slovak \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Niečo sa pokazilo, skúste to znova"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Nemožno to urobiť"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Zmeny sa neuložili"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Nepodarilo sa odstrániť"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s už existuje"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Nenájdené"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Súbor nenájdený"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Príliš veľký súbor"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Nepodporované"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Nepodporovaný typ"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Nepodporovaný formát"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Priečinok Originály je prázdny"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Výber nenájdený"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Subjekt nenájdený"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Účet nenájdený"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Užívateľ nenájdený"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Štítok nenájdený"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Fotoaparát nebol nájdený"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objektív nebol nájdený"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album nenájdený"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Predmet nenájdený"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Osoba nenájdená"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Tvár nenájdená"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Nedostupné vo verejnom móde"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "nedostupné v móde len pre čítanie"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Prosím prihláste sa a skúste znova"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Osoba odstránená"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Požadovaná platba"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Nahrané súbory môžu byť urážlivé"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Odovzdávanie zlyhalo"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Neboli vybraté žiadne položky"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Vytváranie súboru zlyhalo, prosím skontrolujte oprávnenia"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Vytváranie zložky zlyhalo, prosím skontrolujte oprávnenia"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Nebolo možné sa pripojiť, skúste to znova"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Zadajte overovací kód"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Neplatný overovací kód, skúste to znova"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Nesprávne heslo, skúste to znova"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funkcia vypnutá"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Neboli vybraté žiadne štítky"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Neboli vybraté žiadne albumy"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Žiadne súbory na stiahnutie k dispozícií"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Nebolo možné vytvoriť súbor ZIP"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Neplatné údaje"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Neplatný odkaz"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Neplatné meno"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Systém zaneprázdnený, prosím skúste znovu neskôr"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Interval prebúdzania je %s, ale musí byť najviac 1 h"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Vaše konto sa nepodarilo pripojiť"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Príliš veľa požiadaviek"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Nedostatočné skladovanie"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Prekročenie kvóty"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Zmeny úspešne uložené"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album vytvorený"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album uložený"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s vymazaný"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Obsah albumu prekopírovaný"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Súbor odstránený zo stohu"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Súbor odstránený"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Výber pridaný do %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Jeden záznam pridaný do %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d záznamov pridaných do %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Jeden záznam odstránený z %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d záznamov odstránených z %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Účet vytvorený"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Účet uložený"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Účet odstránený"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Nastavenia uložené"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Heslo zmenené"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Import hotový za %d sekúnd"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Import zrušený"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexovanie hotové za %d sekúnd"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indexovanie originálov..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indexovanie súborov v %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexovanie zrušené"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Bolo odstránených %d súborov a %d fotiek"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Presúvanie súborov z %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Kopírovanie súborov z %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Štítky odstránené"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Štítok uložený"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Predmet uložený"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Predmet odstránený"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Osoba uložená"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Osoba odstránená"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Súbor odstránený"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d súborov nahraných za %d sekúnd"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Spracovanie nahrávania..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Nahrané súbory môžu byť urážlivé"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Označenie schválené"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Označenie archivované"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Označenie obnovené"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Označenie označené ako súkromné"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albumy odstránené"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Súbor ZIP vytvorený za %d sekúnd"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Trvalo odstránené"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s bolo obnovené"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Úspešne overené"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Úspešne aktivované"
diff --git a/assets/locales/sl/default.po b/assets/locales/sl/default.po
index f333eec41..eaeda743b 100644
--- a/assets/locales/sl/default.po
+++ b/assets/locales/sl/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: sl\n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
"n%100==4 ? 2 : 3;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Nekaj je šlo narobe, poskusite znova"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Tega ni mogoče storiti"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Sprememb ni bilo mogoče shraniti"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Ni bilo mogoče izbrisati"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s že obstaja"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Ga ni mogoče najti"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Datoteka ni najdena"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Prevelika datoteka"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Nepodprto"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Nepodprta vrsta"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Nepodprt format"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Mapa Originali je prazna"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Izbor ni najden"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entiteta ni bila najdena"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Račun ni najden"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Uporabnik ne obstaja"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Oznaka ni bila najdena"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kamera ni bila najdena"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Objektiv ni bil najden"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Album ni najden"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Zadeva ni bila najdena"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Oseba ni bila najdena"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Obraza ni mogoče najti"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Ni na voljo v javnem načinu"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Ni na voljo v načinu samo za branje"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Prijavite se v svoj račun"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Dovoljenje Zavrnjeno"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Zahtevano plačilo"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Nalaganje je lahko žaljivo"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Nalaganje neuspešno"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Ni izbranih elementov"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Neuspešno ustvarjanje datoteke, preverite dovoljenja"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Neuspešno ustvarjanje mape, preverite dovoljenja"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Ne morem vzpostaviti povezave, poskusite znova"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "vnesi potrditveno kodo"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Neveljavna koda za preverjanje, poskusite znova"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Nepravilno geslo, poskusite znova"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funkcija je onemogočena"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Ni izbranih nalepk"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Ni izbranih albumov"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Za prenos ni na voljo nobenih datotek"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Ni uspelo ustvariti datoteke zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Neveljavne poverilnice"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Neveljavna povezava"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Neveljavno ime"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Zaseden, poskusite znova pozneje"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Interval prebujanja je %s, vendar mora biti 1h ali manj"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Vašega računa ni bilo mogoče povezati"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Preveč zahtev"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Nezadostno skladiščenje"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kvota je presežena"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Spremembe so bile uspešno shranjene"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Ustvarjen album"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Shranjen album"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s izbrisano"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Vsebina albuma klonirana"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Datoteka odstranjena iz sklada"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Izbrisana datoteka"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Izbor dodan v %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "En vnos dodan v %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d vnosi dodani v %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "En vnos odstranjen iz %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d vnosi odstranjeni iz %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Ustvarjen račun"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Shranjen račun"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Račun je izbrisan"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Nastavitve shranjene"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Geslo spremenjeno"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Uvoz se zaključi v %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Uvoz preklican"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksiranje je končano v %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indeksiranje izvirnikov..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indeksiranje datotek v %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indeksiranje preklicano"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Odstranjene %d datoteke in %d fotografije"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Premikanje datotek iz %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Kopiranje datotek iz %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Etikete izbrisane"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Shranjena nalepka"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Zadeva je shranjena"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Predmet izbrisanih"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Rešena oseba"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Izbrisana oseba"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Prenesena datoteka"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d datoteke, naložene v %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Obdelava nalaganja..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Prenos je bil obdelan"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Odobren izbor"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Arhiviran izbor"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Obnovljen izbor"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Izbor označen kot zasebni"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Izbrisani albumi"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip, ustvarjen v %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Trajno izbrisano"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s je bil obnovljen"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Uspešno preverjeno"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Uspešno aktiviran"
diff --git a/assets/locales/sv/default.po b/assets/locales/sv/default.po
index 4073cf2d9..b298e5812 100644
--- a/assets/locales/sv/default.po
+++ b/assets/locales/sv/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: DeepL \n"
"Language-Team: Swedish \n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Något gick fel, försök igen"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Det går inte att göra"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Ändringarna kunde inte sparas"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Kunde inte raderas"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s finns redan"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Hittades inte"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Filen kunde inte hittas"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Filen är för stor"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Stöds ej"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Denna typ stöds ej"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Format som inte stöds"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Mappen med originalen är tom"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Urvalet kunde inte hittas"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Entitet kunde inte hittas"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Kontot kunde inte hittas"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Användaren kunde inte hittas"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Etikett saknas"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kameran hittades inte"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Linsen hittades inte"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Albumet finns inte"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Ämnet finns inte"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Personen kunde inte hittas"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Ansiktet kunde inte hittas"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Inte tillgängligt i offentligt läge"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Inte tillgänglig i skrivskyddsläge"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Logga in på ditt konto"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Åtkomst nekades"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Betalning krävs"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Uppladdning kan vara stötande"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Uppladdning misslyckades"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Inga objekt har valts"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Det gick inte att skapa en fil, kontrollera behörigheter"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Det gick inte att skapa en mapp, kontrollera behörigheter"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Kunde inte ansluta, försök igen"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Ange verifieringskod"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Ogiltig verifieringskod, försök igen"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Felaktigt lösenord, försök igen"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Funktionen är inaktiverad"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Inga etiketter har valts"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Inga album har valts"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Inga filer finns tillgängliga för nedladdning"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Misslyckades med att skapa en zip-fil"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Ogiltiga autentiseringsuppgifter"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Ogiltig länk"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Felaktigt namn"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Upptagen, försök igen senare"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Uppvakningsintervallet är %s, men måste vara 1 timme eller mindre"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Ditt konto kunde inte anslutas"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "För många förfrågningar"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Otillräcklig lagring"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kvoten överskriden"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Ändringarna har sparats"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Album skapat"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Album sparat"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s raderat"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Innehållet i albumet kopieras"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Filen tas bort från stapeln"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Fil raderad"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Urval tillagt i %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "En post tillagd i %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d poster tillagda till %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "En post borttagen från %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d poster raderade från %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Kontot har skapats"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Kontot sparat"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Kontot raderat"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Inställningarna har sparats"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Lösenordet har ändrats"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Importen slutfördes på %d s"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Importen avbruten"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexering slutförd på %d s"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Indexering av original..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Indexering av filer i %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Indexering avbruten"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Tog bort %d filer och %d bilder"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Flyttar filer från %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Kopierar filer från %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Etiketter raderade"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Etikett sparad"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Ämne sparat"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Ämne raderat"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Person sparad"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Person raderad"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Uppladdad fil"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d filer uppladdade på %d s"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Behandling av uppladdning..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Uppladdningen har behandlats"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Urvalet är godkänt"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Urval arkiverat"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Urvalet har återställts"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Urval markerat som privat"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Album raderade"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip skapad på %d s"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Permanent borttagen"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s har återställts"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Verifierad"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Lyckades aktiverad"
diff --git a/assets/locales/th/default.po b/assets/locales/th/default.po
index 93d744fbe..c921a121e 100644
--- a/assets/locales/th/default.po
+++ b/assets/locales/th/default.po
@@ -1,413 +1,420 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: Google Cloud Translation Basic \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: DeepL \n"
"Language-Team: none\n"
"Language: th\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "เกิดข้อผิดพลาด โปรดลองอีกครั้ง"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "ไม่สามารถทำเช่นนั้นได้"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "ไม่สามารถบันทึกการเปลี่ยนแปลง"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "ไม่สามารถลบได้"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s มีอยู่แล้ว"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "ไม่พบ"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "ไม่พบไฟล์"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "ไฟล์ใหญ่เกินไป"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "ไม่รองรับ"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "ประเภทที่ไม่รองรับ"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "รูปแบบที่ไม่สนับสนุน"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "โฟลเดอร์ต้นฉบับว่างเปล่า"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "ไม่พบสิ่งที่เลือก"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "ไม่พบเอนทิตี"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "ไม่พบบัญชี"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "ไม่พบผู้ใช้"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "ไม่พบป้ายกำกับ"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "ไม่พบกล้อง"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "ไม่พบเลนส์"
+
+#: messages.go:129
msgid "Album not found"
msgstr "ไม่พบอัลบั้ม"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "ไม่พบหัวเรื่อง"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "ไม่พบบุคคล"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "ไม่พบใบหน้า"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "ไม่พร้อมใช้งานในโหมดสาธารณะ"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "ไม่พร้อมใช้งานในโหมดอ่านอย่างเดียว"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "กรุณาเข้าสู่ระบบบัญชีของคุณ"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "ปฏิเสธการอนุญาต"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "ต้องชำระเงิน"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "การอัปโหลดอาจไม่เหมาะสม"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "การอัพโหลดล้มเหลว"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "ไม่มีรายการที่เลือก"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "สร้างไฟล์ไม่สำเร็จ โปรดตรวจสอบสิทธิ์"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "สร้างโฟลเดอร์ไม่สำเร็จ โปรดตรวจสอบสิทธิ์"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "ไม่สามารถเชื่อมต่อได้ โปรดลองอีกครั้ง"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "ระบุรหัสยืนยืน"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "รหัสยืนยันไม่ถูกต้อง โปรดลองอีกครั้ง"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "คุณลักษณะถูกปิดใช้งาน"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "ไม่ได้เลือกป้ายกำกับ"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "ไม่ได้เลือกอัลบั้ม"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "ไม่มีไฟล์สำหรับดาวน์โหลด"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "สร้างไฟล์ zip ไม่สำเร็จ"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "ข้อมูลประจำตัวที่ไม่ถูกต้อง"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "ลิงก์ไม่ถูกต้อง"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "ชื่อไม่ถูกต้อง"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "ไม่ว่าง โปรดลองอีกครั้งในภายหลัง"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "ช่วงเวลาปลุกคือ %s แต่ต้องเป็น 1 ชั่วโมงหรือน้อยกว่า"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "ไม่สามารถเชื่อมต่อบัญชีของคุณได้"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "คำขอมากเกินไป"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "พื้นที่เก็บข้อมูลไม่เพียงพอ"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "เกินโควตา"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "บันทึกการเปลี่ยนแปลงเรียบร้อยแล้ว"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "สร้างอัลบั้มแล้ว"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "บันทึกอัลบั้มแล้ว"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "ลบอัลบั้ม %s แล้ว"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "โคลนเนื้อหาในอัลบั้ม"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "ไฟล์ถูกลบออกจากสแต็ค"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "ลบไฟล์แล้ว"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "เพิ่มการเลือกใน %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "เพิ่มหนึ่งรายการใน %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d รายการที่เพิ่มใน %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "ลบหนึ่งรายการจาก %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "รายการ %d ถูกลบออกจาก %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "สร้างบัญชีแล้ว"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "บันทึกบัญชีแล้ว"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "ลบบัญชีแล้ว"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "การตั้งค่าที่บันทึกไว้"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "เปลี่ยนรหัสผ่านแล้ว"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "การนำเข้าเสร็จสมบูรณ์ใน %d วินาที"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "ยกเลิกการนำเข้าแล้ว"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "การสร้างดัชนีเสร็จสิ้นใน %d วินาที"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "กำลังจัดทำดัชนีต้นฉบับ..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "การทำดัชนีไฟล์ใน %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "ยกเลิกการทำดัชนีแล้ว"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "ลบไฟล์ %d และภาพถ่าย %d"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "การย้ายไฟล์จาก %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "การคัดลอกไฟล์จาก %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "ลบป้ายกำกับแล้ว"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "บันทึกป้ายกำกับแล้ว"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "บันทึกหัวเรื่องแล้ว"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "ลบหัวเรื่องแล้ว"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "บุคคลที่บันทึกไว้"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "ลบบุคคลแล้ว"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "อัปโหลดไฟล์แล้ว"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "ไฟล์ %d ที่อัปโหลดใน %d วินาที"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "กำลังประมวลผลการอัปโหลด..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "อัปโหลดได้รับการดำเนินการ"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "การเลือกได้รับการอนุมัติ"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "เก็บถาวรการเลือกแล้ว"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "คืนค่าการเลือกแล้ว"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "การเลือกถูกทำเครื่องหมายเป็นส่วนตัว"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "ลบอัลบั้มแล้ว"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip สร้างใน %d วินาที"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "ลบอย่างถาวร"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s ได้รับการกู้คืนแล้ว"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "ตรวจสอบเรียบร้อยแล้ว"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "เปิดใช้งานสำเร็จแล้ว"
diff --git a/assets/locales/tr/default.po b/assets/locales/tr/default.po
index 47f4aa57e..05c281815 100644
--- a/assets/locales/tr/default.po
+++ b/assets/locales/tr/default.po
@@ -1,412 +1,421 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: DeepL \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: Google Cloud Translation Basic \n"
"Language-Team: none\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Bir şeyler ters gitti, tekrar deneyin"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Bunu yapmak mümkün değil"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Değişiklikler kaydedilemedi"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Silinemedi"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s zaten var"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Bulunamadı"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Dosya bulunamadı"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Dosya çok büyük"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Desteklenmiyor"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Desteklenmeyen tür"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Desteklenmeyen format"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Orijinaller klasörü boş"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Seçim bulunamadı"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Varlık bulunamadı"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Hesap bulunamadı"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Kullanıcı bulunamadı"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Etiket bulunamadı"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Kamera bulunamadı."
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Lens bulunamadı."
+
+#: messages.go:129
msgid "Album not found"
msgstr "Albüm bulunamadı"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Özne bulunamadı"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Kişi bulunamadı"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Yüz bulunamadı"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Genel modda mevcut değil"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Salt okunur modda kullanılamaz"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Lütfen hesabınıza giriş yapın"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "İzin reddedildi"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Ödeme gerekli"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Yükleme rahatsız edici olabilir"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Yükleme başarısız"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Seçili öğe yok"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Dosya oluşturulamadı, lütfen izinleri kontrol edin"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Klasör oluşturulamadı, lütfen izinleri kontrol edin"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Bağlanılamadı, lütfen tekrar deneyin"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Doğrulama kodunu giriniz"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Geçersiz doğrulama kodu, lütfen tekrar deneyin"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Geçersiz şifre, lütfen tekrar deneyin"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Özellik devre dışı"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Seçili etiket yok"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Seçili albüm yok"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "İndirilebilecek dosya yok"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Zip dosyası oluşturulamadı"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Geçersiz kimlik bilgileri"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Geçersiz link"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Geçersiz isim"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Meşgul, lütfen daha sonra tekrar deneyin"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Uyandırma aralığı %s'dır, ancak 1 saat veya daha az olmalıdır"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Hesabınız bağlanamadı"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Çok fazla talep var"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Yetersiz depolama"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Kota aşıldı"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Değişiklikler başarıyla kaydedildi"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Albüm oluşturuldu"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Albüm kaydedildi"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Albüm %s silindi"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Albüm içeriği klonlandı"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Dosya yığından kaldırıldı"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Silinmiş dosya"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Seçim %s'a eklendi"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Bir giriş %s'a eklendi"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d girişleri %s'e eklendi"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Bir giriş %s'dan kaldırıldı"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d girişleri %s'den kaldırıldı"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Hesap eklendi"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Hesap kaydedildi"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Hesap silindi"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Ayarlar kaydedildi"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Şifre Değiştirildi"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "İçe aktarma %d s içinde tamamlandı"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "İçe aktarma iptal edildi"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "İndeksleme %d s içinde tamamlandı"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Orijinalleri dizinliyor..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "%s dosya yüklendi"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "İndeksleme iptal edildi"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d dosya ve %d fotoğraf kaldırıldı"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Dosyaları %s'dan taşıma"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Dosyaları %s'dan kopyalama"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Etiketler silindi"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Etiket kaydedildi"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Konu kaydedildi"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Konu silindi"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Kurtarılan kişi"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Kişi silindi"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Dosya yüklendi"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d dosyalar %d s içinde yüklendi"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Yükleme işlemi..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Yükleme işlemi tamamlandı"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Seçim onaylandı"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Seçim arşivlendi"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Seçim geri yüklendi"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Özel olarak işaretlenmiş seçim"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Albümler silindi"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip %d s içinde oluşturuldu"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Kalıcı olarak silindi"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s geri yüklendi"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Başarıyla doğrulandı"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Başarıyla etkinleştirildi"
diff --git a/assets/locales/uk/default.po b/assets/locales/uk/default.po
index 71a75c2bf..ba986926e 100644
--- a/assets/locales/uk/default.po
+++ b/assets/locales/uk/default.po
@@ -1,10 +1,11 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: DeepL \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: Google Cloud Translation Basic \n"
"Language-Team: none\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
@@ -12,403 +13,411 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Щось пішло не так, спробуйте ще раз"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Неможливо це зробити"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Зміни не можливо зберегти"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Не можливо видалити"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s вже існує"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Не знайдено"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Файл не знайдено"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Файл занадто великий"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Не підтримується"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Непідтримуваний тип"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Непідтримуваний формат"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Папка з оригіналами порожня"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Вибір не знайдено"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Об'єкт не знайдено"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Обліковий запис не знайдено"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Користувача не знайдено"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Мітку не знайдено"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Камеру не знайдено"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Об'єктив не знайдено"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Альбом не знайдено"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Тема не знайдена"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Особистість не знайдена"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Обличчя не знайдено"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Недоступно в публічному режимі"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "не доступно в режимі \"тільки читання\""
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Будь ласка, увійдіть до свого облікового запису"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "В доступі відмовлено"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Потрібна оплата"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Завантаження може бути образливим"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Помилка вивантаження"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Нічого не вибрано"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Помилка створення файла, перевірте дозволи"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Не вдалося створити папку, перевірте права доступу"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Не можливо підключитися, спробуйте знову"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Введіть код верифікації"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Невірний код верифікації, спробуйте знову"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "Невірний пароль, спробуйте знову"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Функцію вимкнено"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Мітки не вибрано"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Альбоми не вибрано"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Немає доступних файлів для завантаження"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Не вдалося створити zip-файл"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Недійсні облікові дані"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Невірне посилання"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Невірне ім'я"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Зайнято, спробуйте пізніше"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr ""
"Інтервал пробудження становить %s, але має становити 1 годину або менше"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Ваш обліковий запис не вдалося підключити"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "Занадто багато запитів"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Недостатнє зберігання"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Перевищено квоту"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Зміни успішно збережено"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Альбом створено"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Альбом збережено"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Альбом %s видалено"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Вміст альбому клоновано"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Файл видалено з стеку"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Файл видалено"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Вибір додано до %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Один запис додано до %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d записів додано до %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Один запис видалено з %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d записів видалено з %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Обліковий запис створено"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Обліковий запис збережено"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Обліковий запис видалено"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Налаштування збережено"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "Пароль змінено"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Імпортування тривало %d с"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Імпортування скасовано"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Індексування тривало %d с"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Індексуємо оригінали..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Індексуємо файли в %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Індексування скасовано"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Видалено %d файлів та %d фотографій"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Переносимо файли з %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Копіюємо файли з %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Мітки видалено"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Мітку збережено"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Тема збережена"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Тема видалена"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Людина збережена"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Людина видалена"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "Файл завантажено"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d файлів вивантажено за %d с"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Обробка завантаження..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Завантаження оброблено"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Вибір затверджено"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Вибране заархівовано"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Вибране відновлено"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Вибіране позначено як приватне"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Альбом видалено"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip створено за %d с"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Остаточно видалено"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s було відновлено"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Верифікація успішна"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Активація успішна"
diff --git a/assets/locales/vi/default.po b/assets/locales/vi/default.po
index fed039aa6..d659698de 100644
--- a/assets/locales/vi/default.po
+++ b/assets/locales/vi/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: Google Cloud Translation Basic \n"
"Language-Team: none\n"
@@ -12,402 +12,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "Đã xảy ra lỗi, hãy thử lại"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "Không thể làm điều đó"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "Không thể lưu các thay đổi"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "Không thể xóa được"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s đã tồn tại"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "Không tìm thấy"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "Không tìm thấy tập tin"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "Tệp quá lớn"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "Không được hỗ trợ"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "Loại không được hỗ trợ"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "Định dạng không được hỗ trợ"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "Thư mục gốc trống"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "Không tìm thấy lựa chọn"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "Không tìm thấy thực thể"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "Tài khoản không được tìm thấy"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "Không tìm thấy người dùng"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "Không tìm thấy nhãn"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "Không tìm thấy máy ảnh"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "Không tìm thấy ống kính"
+
+#: messages.go:129
msgid "Album not found"
msgstr "Không tìm thấy album"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "Không tìm thấy chủ đề"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "Không tìm thấy người"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "Không tìm thấy khuôn mặt"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "Không khả dụng ở chế độ công khai"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "Không khả dụng ở chế độ chỉ đọc"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "Xin hãy đăng nhập vào tài khoản của bạn"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "Quyền bị từ chối"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "Yêu cầu thanh toán"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "Tải lên có thể gây khó chịu"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "Tải lên không thành công"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "Không có mục nào được chọn"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "Không tạo được tệp, vui lòng kiểm tra quyền"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "Không tạo được thư mục, vui lòng kiểm tra quyền"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "Không thể kết nối, vui lòng thử lại"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "Nhập mã xác nhận"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "Mã xác minh không hợp lệ, vui lòng thử lại"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "mật mã không hợp lệ, vui lòng thử lại"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "Tính năng bị tắt"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "Không có nhãn nào được chọn"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "Không có album nào được chọn"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "Không có tập tin nào để tải xuống"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "Không tạo được tệp zip"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "Thông tin không hợp lệ"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "Liên kết không hợp lệ"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "Tên không hợp lệ"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "Đang bận, vui lòng thử lại sau"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Khoảng thời gian đánh thức là %s nhưng phải từ 1 giờ trở xuống"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "Tài khoản của bạn không thể kết nối được"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "quá nhiều yêu cầu"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "Không đủ dung lượng lưu trữ"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "Vượt quá hạn ngạch"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "Đã lưu thay đổi thành công"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "Đã tạo album"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "Đã lưu album"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "Album %s đã bị xóa"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "Nội dung album được sao chép"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "Đã xóa tệp khỏi ngăn xếp"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "Đã xóa tệp"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "Đã thêm lựa chọn vào %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "Đã thêm một mục vào %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "Các mục %d được thêm vào %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "Đã xóa một mục khỏi %s"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "Các mục %d đã bị xóa khỏi %s"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "Tài khoản đã được tạo"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "Đã lưu tài khoản"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "Tài khoản đã bị xóa"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "Đã lưu cài đặt"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "mật khẩu đã được thay đổi"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "Quá trình nhập hoàn tất sau %d giây"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "Đã hủy nhập"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "Việc lập chỉ mục hoàn tất sau %d giây"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "Lập chỉ mục bản gốc..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "Lập chỉ mục các tệp trong %s"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "Đã hủy lập chỉ mục"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Đã xóa tệp %d và ảnh %d"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "Di chuyển tệp từ %s"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "Sao chép tập tin từ %s"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "Đã xóa nhãn"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "Đã lưu nhãn"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "Đã lưu chủ đề"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "Chủ đề đã bị xóa"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "Người đã được cứu"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "Người đã bị xóa"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "File đã được tải lên"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "Các tệp %d được tải lên trong %d giây"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "Đang xử lý tải lên..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "Tải lên đã được xử lý"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "Lựa chọn đã được phê duyệt"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "Đã lưu trữ lựa chọn"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "Đã khôi phục lựa chọn"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "Lựa chọn được đánh dấu là riêng tư"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "Album đã bị xóa"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip được tạo trong %d giây"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "Đã xóa vĩnh viễn"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s đã được khôi phục"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "Đã xác minh thành công"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "Đã kích hoạt thành công"
diff --git a/assets/locales/zh/default.po b/assets/locales/zh/default.po
index 9a90cece8..0b077c555 100644
--- a/assets/locales/zh/default.po
+++ b/assets/locales/zh/default.po
@@ -1,10 +1,11 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
-"Last-Translator: DeepL \n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
+"Last-Translator: Google Cloud Translation Basic \n"
"Language-Team: Chinese (Simplified) \n"
"Language: zh\n"
@@ -12,402 +13,410 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.13.3\n"
+"X-Generator: Weblate 5.17.1\n"
-#: messages.go:104
+#: messages.go:110
msgid "Something went wrong, try again"
msgstr "出错了,再试一次"
-#: messages.go:105
+#: messages.go:111
msgid "Unable to do that"
msgstr "无法做到这一点"
-#: messages.go:106
+#: messages.go:112
msgid "Changes could not be saved"
msgstr "无法保存变更"
-#: messages.go:107
+#: messages.go:113
msgid "Could not be deleted"
msgstr "无法删除"
-#: messages.go:108
+#: messages.go:114
#, c-format
msgid "%s already exists"
msgstr "%s 已存在"
-#: messages.go:109
+#: messages.go:115
msgid "Not found"
msgstr "未找到"
-#: messages.go:110
+#: messages.go:116
msgid "File not found"
msgstr "未找到文件"
-#: messages.go:111
+#: messages.go:117
msgid "File too large"
msgstr "文件过大"
-#: messages.go:112
+#: messages.go:118
msgid "Unsupported"
msgstr "不支持"
-#: messages.go:113
+#: messages.go:119
msgid "Unsupported type"
msgstr "不支持的类型"
-#: messages.go:114
+#: messages.go:120
msgid "Unsupported format"
msgstr "不支持的格式"
-#: messages.go:115
+#: messages.go:121
msgid "Originals folder is empty"
msgstr "原件文件夹是空的"
-#: messages.go:116
+#: messages.go:122
msgid "Selection not found"
msgstr "未找到所选内容"
-#: messages.go:117
+#: messages.go:123
msgid "Entity not found"
msgstr "未找到实体"
-#: messages.go:118
+#: messages.go:124
msgid "Account not found"
msgstr "未找到账户"
-#: messages.go:119
+#: messages.go:125
msgid "User not found"
msgstr "未找到用户"
-#: messages.go:120
+#: messages.go:126
msgid "Label not found"
msgstr "未找到标签"
-#: messages.go:121
+#: messages.go:127
+msgid "Camera not found"
+msgstr "未找到摄像头"
+
+#: messages.go:128
+msgid "Lens not found"
+msgstr "未找到镜头"
+
+#: messages.go:129
msgid "Album not found"
msgstr "未找到相册"
-#: messages.go:122
+#: messages.go:130
msgid "Subject not found"
msgstr "未找到主题"
-#: messages.go:123
+#: messages.go:131
msgid "Person not found"
msgstr "未找到人物"
-#: messages.go:124
+#: messages.go:132
msgid "Face not found"
msgstr "未找到面孔"
-#: messages.go:125
+#: messages.go:133
msgid "Not available in public mode"
msgstr "在公开模式下不可用"
-#: messages.go:126
+#: messages.go:134
msgid "Not available in read-only mode"
msgstr "在只读模式下不可用"
-#: messages.go:127
+#: messages.go:135
msgid "Please log in to your account"
msgstr "请登录你的账户"
-#: messages.go:128
+#: messages.go:136
msgid "Permission denied"
msgstr "没有权限"
-#: messages.go:129
+#: messages.go:137
msgid "Payment required"
msgstr "需要付款"
-#: messages.go:130
+#: messages.go:138
msgid "Upload might be offensive"
msgstr "上传内容可能具有冒犯性"
-#: messages.go:131
+#: messages.go:139
msgid "Upload failed"
msgstr "上传失败"
-#: messages.go:132
+#: messages.go:140
msgid "No items selected"
msgstr "未选择任何项目"
-#: messages.go:133
+#: messages.go:141
msgid "Failed creating file, please check permissions"
msgstr "创建文件失败,请检查权限"
-#: messages.go:134
+#: messages.go:142
msgid "Failed creating folder, please check permissions"
msgstr "创建目录失败,请检查权限"
-#: messages.go:135
+#: messages.go:143
msgid "Could not connect, please try again"
msgstr "无法连接,请重试"
-#: messages.go:136
+#: messages.go:144
msgid "Enter verification code"
msgstr "输入验证码"
-#: messages.go:137
+#: messages.go:145
msgid "Invalid verification code, please try again"
msgstr "验证码无效,请重试"
-#: messages.go:138
+#: messages.go:146
msgid "Invalid password, please try again"
msgstr "无效密码,请重试"
-#: messages.go:139
+#: messages.go:147
msgid "Feature disabled"
msgstr "功能已禁用"
-#: messages.go:140
+#: messages.go:148
msgid "No labels selected"
msgstr "未选择标签"
-#: messages.go:141
+#: messages.go:149
msgid "No albums selected"
msgstr "未选择相册"
-#: messages.go:142
+#: messages.go:150
msgid "No files available for download"
msgstr "没有可供下载的文件"
-#: messages.go:143
+#: messages.go:151
msgid "Failed to create zip file"
msgstr "创建压缩文件失败"
-#: messages.go:144
+#: messages.go:152
msgid "Invalid credentials"
msgstr "无效凭证"
-#: messages.go:145
+#: messages.go:153
msgid "Invalid link"
msgstr "无效链接"
-#: messages.go:146
+#: messages.go:154
msgid "Invalid name"
msgstr "无效名称"
-#: messages.go:147
+#: messages.go:155
msgid "Busy, please try again later"
msgstr "忙碌中,请稍后重试"
-#: messages.go:148
+#: messages.go:156
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "唤醒间隔为 %s,但必须小于等于 1 小时"
-#: messages.go:149
+#: messages.go:157
msgid "Your account could not be connected"
msgstr "你的账户无法连接"
-#: messages.go:150
+#: messages.go:158
msgid "Too many requests"
msgstr "请求太多"
-#: messages.go:151
+#: messages.go:159
msgid "Insufficient storage"
msgstr "存储不足"
-#: messages.go:152
+#: messages.go:160
msgid "Quota exceeded"
msgstr "超出配额"
-#: messages.go:155
+#: messages.go:163
msgid "Changes successfully saved"
msgstr "更改成功保存"
-#: messages.go:156
+#: messages.go:164
msgid "Album created"
msgstr "相册已创建"
-#: messages.go:157
+#: messages.go:165
msgid "Album saved"
msgstr "相册已保存"
-#: messages.go:158
+#: messages.go:166
#, c-format
msgid "Album %s deleted"
msgstr "相册 %s 已删除"
-#: messages.go:159
+#: messages.go:167
msgid "Album contents cloned"
msgstr "相册内容已复制"
-#: messages.go:160
+#: messages.go:168
msgid "File removed from stack"
msgstr "文件已从堆中移除"
-#: messages.go:161
+#: messages.go:169
msgid "File deleted"
msgstr "文件已删除"
-#: messages.go:162
+#: messages.go:170
#, c-format
msgid "Selection added to %s"
msgstr "所选项目已加入 %s"
-#: messages.go:163
+#: messages.go:171
#, c-format
msgid "One entry added to %s"
msgstr "条目已添加到 %s"
-#: messages.go:164
+#: messages.go:172
#, c-format
msgid "%d entries added to %s"
msgstr "%d 个条目已添加到 %s"
-#: messages.go:165
+#: messages.go:173
#, c-format
msgid "One entry removed from %s"
msgstr "条目已从 %s 移除"
-#: messages.go:166
+#: messages.go:174
#, c-format
msgid "%d entries removed from %s"
msgstr "%d 个条目已从 %s 移除"
-#: messages.go:167
+#: messages.go:175
msgid "Account created"
msgstr "账户已创建"
-#: messages.go:168
+#: messages.go:176
msgid "Account saved"
msgstr "账户已保存"
-#: messages.go:169
+#: messages.go:177
msgid "Account deleted"
msgstr "账户已删除"
-#: messages.go:170
+#: messages.go:178
msgid "Settings saved"
msgstr "设置已保存"
-#: messages.go:171
+#: messages.go:179
msgid "Password changed"
msgstr "密码已更改"
-#: messages.go:172
+#: messages.go:180
#, c-format
msgid "Import completed in %d s"
msgstr "导入成功,耗时 %d 秒"
-#: messages.go:173
+#: messages.go:181
msgid "Import canceled"
msgstr "导入已取消"
-#: messages.go:174
+#: messages.go:182
#, c-format
msgid "Indexing completed in %d s"
msgstr "索引成功,耗时 %d 秒"
-#: messages.go:175
+#: messages.go:183
msgid "Indexing originals..."
msgstr "索引源文件..."
-#: messages.go:176
+#: messages.go:184
#, c-format
msgid "Indexing files in %s"
msgstr "索引 %s 中的文件"
-#: messages.go:177
+#: messages.go:185
msgid "Indexing canceled"
msgstr "索引已取消"
-#: messages.go:178
+#: messages.go:186
#, c-format
msgid "Removed %d files and %d photos"
msgstr "移除了 %d 个文件和 %d 张照片"
-#: messages.go:179
+#: messages.go:187
#, c-format
msgid "Moving files from %s"
msgstr "正在从 %s 中移动文件"
-#: messages.go:180
+#: messages.go:188
#, c-format
msgid "Copying files from %s"
msgstr "正在从 %s 中复制文件"
-#: messages.go:181
+#: messages.go:189
msgid "Labels deleted"
msgstr "标签已移除"
-#: messages.go:182
+#: messages.go:190
msgid "Label saved"
msgstr "标签已保存"
-#: messages.go:183
+#: messages.go:191
msgid "Subject saved"
msgstr "主题已保存"
-#: messages.go:184
+#: messages.go:192
msgid "Subject deleted"
msgstr "主题已删除"
-#: messages.go:185
+#: messages.go:193
msgid "Person saved"
msgstr "人物已保存"
-#: messages.go:186
+#: messages.go:194
msgid "Person deleted"
msgstr "人物已删除"
-#: messages.go:187
+#: messages.go:195
msgid "File uploaded"
msgstr "已上传文件"
-#: messages.go:188
+#: messages.go:196
#, c-format
msgid "%d files uploaded in %d s"
msgstr "已上传 %d 个文件,耗时 %d 秒"
-#: messages.go:189
+#: messages.go:197
msgid "Processing upload..."
msgstr "处理上传..."
-#: messages.go:190
+#: messages.go:198
msgid "Upload has been processed"
msgstr "上传已被处理"
-#: messages.go:191
+#: messages.go:199
msgid "Selection approved"
msgstr "所选项已批准"
-#: messages.go:192
+#: messages.go:200
msgid "Selection archived"
msgstr "所选项已归档"
-#: messages.go:193
+#: messages.go:201
msgid "Selection restored"
msgstr "所选项已恢复"
-#: messages.go:194
+#: messages.go:202
msgid "Selection marked as private"
msgstr "所选项已设为私有"
-#: messages.go:195
+#: messages.go:203
msgid "Albums deleted"
msgstr "相册已删除"
-#: messages.go:196
+#: messages.go:204
#, c-format
msgid "Zip created in %d s"
msgstr "Zip 文件创建成功,耗时 %d 秒"
-#: messages.go:197
+#: messages.go:205
msgid "Permanently deleted"
msgstr "已永久删除"
-#: messages.go:198
+#: messages.go:206
#, c-format
msgid "%s has been restored"
msgstr "%s 已恢复"
-#: messages.go:199
+#: messages.go:207
msgid "Successfully verified"
msgstr "验证成功"
-#: messages.go:200
+#: messages.go:208
msgid "Successfully activated"
msgstr "已成功激活"
diff --git a/assets/locales/zh_TW/default.po b/assets/locales/zh_TW/default.po
index 41c199f89..56e76ba89 100644
--- a/assets/locales/zh_TW/default.po
+++ b/assets/locales/zh_TW/default.po
@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-10-17 17:32+0000\n"
-"PO-Revision-Date: 2025-10-22 08:25+0000\n"
+"Report-Msgid-Bugs-To: ci@photoprism.app\n"
+"POT-Creation-Date: 2026-06-15 09:18+0000\n"
+"PO-Revision-Date: 2026-06-15 09:28+0000\n"
"Last-Translator: Google Cloud Translation Basic \n"
"Language-Team: Chinese (Traditional)
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/static/icons/bloom.svg b/assets/static/icons/bloom.svg
new file mode 100644
index 000000000..aad1ded16
--- /dev/null
+++ b/assets/static/icons/bloom.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/static/icons/bloom/100.png b/assets/static/icons/bloom/100.png
new file mode 100644
index 000000000..af72bebf3
Binary files /dev/null and b/assets/static/icons/bloom/100.png differ
diff --git a/assets/static/icons/bloom/1024.png b/assets/static/icons/bloom/1024.png
new file mode 100644
index 000000000..272d536d7
Binary files /dev/null and b/assets/static/icons/bloom/1024.png differ
diff --git a/assets/static/icons/bloom/114.png b/assets/static/icons/bloom/114.png
new file mode 100644
index 000000000..cb723ecec
Binary files /dev/null and b/assets/static/icons/bloom/114.png differ
diff --git a/assets/static/icons/bloom/120.png b/assets/static/icons/bloom/120.png
new file mode 100644
index 000000000..aa88c900d
Binary files /dev/null and b/assets/static/icons/bloom/120.png differ
diff --git a/assets/static/icons/bloom/128.png b/assets/static/icons/bloom/128.png
new file mode 100644
index 000000000..f1111e059
Binary files /dev/null and b/assets/static/icons/bloom/128.png differ
diff --git a/assets/static/icons/bloom/144.png b/assets/static/icons/bloom/144.png
new file mode 100644
index 000000000..0705fccdc
Binary files /dev/null and b/assets/static/icons/bloom/144.png differ
diff --git a/assets/static/icons/bloom/152.png b/assets/static/icons/bloom/152.png
new file mode 100644
index 000000000..258a09ce5
Binary files /dev/null and b/assets/static/icons/bloom/152.png differ
diff --git a/assets/static/icons/bloom/16.png b/assets/static/icons/bloom/16.png
new file mode 100644
index 000000000..4e219a818
Binary files /dev/null and b/assets/static/icons/bloom/16.png differ
diff --git a/assets/static/icons/bloom/160.png b/assets/static/icons/bloom/160.png
new file mode 100644
index 000000000..8215c8aab
Binary files /dev/null and b/assets/static/icons/bloom/160.png differ
diff --git a/assets/static/icons/bloom/167.png b/assets/static/icons/bloom/167.png
new file mode 100644
index 000000000..2a3177487
Binary files /dev/null and b/assets/static/icons/bloom/167.png differ
diff --git a/assets/static/icons/bloom/172.png b/assets/static/icons/bloom/172.png
new file mode 100644
index 000000000..b7a0c2708
Binary files /dev/null and b/assets/static/icons/bloom/172.png differ
diff --git a/assets/static/icons/bloom/175.png b/assets/static/icons/bloom/175.png
new file mode 100644
index 000000000..26a67ed44
Binary files /dev/null and b/assets/static/icons/bloom/175.png differ
diff --git a/assets/static/icons/bloom/180.png b/assets/static/icons/bloom/180.png
new file mode 100644
index 000000000..d4b4dc5fe
Binary files /dev/null and b/assets/static/icons/bloom/180.png differ
diff --git a/assets/static/icons/bloom/192.png b/assets/static/icons/bloom/192.png
new file mode 100644
index 000000000..a4bc107d2
Binary files /dev/null and b/assets/static/icons/bloom/192.png differ
diff --git a/assets/static/icons/bloom/196.png b/assets/static/icons/bloom/196.png
new file mode 100644
index 000000000..8b7e58e2f
Binary files /dev/null and b/assets/static/icons/bloom/196.png differ
diff --git a/assets/static/icons/bloom/20.png b/assets/static/icons/bloom/20.png
new file mode 100644
index 000000000..ff33168b2
Binary files /dev/null and b/assets/static/icons/bloom/20.png differ
diff --git a/assets/static/icons/bloom/200.png b/assets/static/icons/bloom/200.png
new file mode 100644
index 000000000..cd8ae1cc6
Binary files /dev/null and b/assets/static/icons/bloom/200.png differ
diff --git a/assets/static/icons/bloom/216.png b/assets/static/icons/bloom/216.png
new file mode 100644
index 000000000..2be67e9bb
Binary files /dev/null and b/assets/static/icons/bloom/216.png differ
diff --git a/assets/static/icons/bloom/256.png b/assets/static/icons/bloom/256.png
new file mode 100644
index 000000000..227045b03
Binary files /dev/null and b/assets/static/icons/bloom/256.png differ
diff --git a/assets/static/icons/bloom/267.png b/assets/static/icons/bloom/267.png
new file mode 100644
index 000000000..14e9cb5bb
Binary files /dev/null and b/assets/static/icons/bloom/267.png differ
diff --git a/assets/static/icons/bloom/29.png b/assets/static/icons/bloom/29.png
new file mode 100644
index 000000000..27fb80774
Binary files /dev/null and b/assets/static/icons/bloom/29.png differ
diff --git a/assets/static/icons/bloom/32.png b/assets/static/icons/bloom/32.png
new file mode 100644
index 000000000..f5d139074
Binary files /dev/null and b/assets/static/icons/bloom/32.png differ
diff --git a/assets/static/icons/bloom/40.png b/assets/static/icons/bloom/40.png
new file mode 100644
index 000000000..6f184869c
Binary files /dev/null and b/assets/static/icons/bloom/40.png differ
diff --git a/assets/static/icons/bloom/400.png b/assets/static/icons/bloom/400.png
new file mode 100644
index 000000000..8c2c9eb2e
Binary files /dev/null and b/assets/static/icons/bloom/400.png differ
diff --git a/assets/static/icons/bloom/48.png b/assets/static/icons/bloom/48.png
new file mode 100644
index 000000000..f912b1bd5
Binary files /dev/null and b/assets/static/icons/bloom/48.png differ
diff --git a/assets/static/icons/bloom/50.png b/assets/static/icons/bloom/50.png
new file mode 100644
index 000000000..fb7588e63
Binary files /dev/null and b/assets/static/icons/bloom/50.png differ
diff --git a/assets/static/icons/bloom/512.png b/assets/static/icons/bloom/512.png
new file mode 100644
index 000000000..34ed75302
Binary files /dev/null and b/assets/static/icons/bloom/512.png differ
diff --git a/assets/static/icons/bloom/55.png b/assets/static/icons/bloom/55.png
new file mode 100644
index 000000000..e2f39e3c5
Binary files /dev/null and b/assets/static/icons/bloom/55.png differ
diff --git a/assets/static/icons/bloom/56.png b/assets/static/icons/bloom/56.png
new file mode 100644
index 000000000..2795dae4b
Binary files /dev/null and b/assets/static/icons/bloom/56.png differ
diff --git a/assets/static/icons/bloom/60.png b/assets/static/icons/bloom/60.png
new file mode 100644
index 000000000..0a5c97ee3
Binary files /dev/null and b/assets/static/icons/bloom/60.png differ
diff --git a/assets/static/icons/bloom/64.png b/assets/static/icons/bloom/64.png
new file mode 100644
index 000000000..e5ac223f6
Binary files /dev/null and b/assets/static/icons/bloom/64.png differ
diff --git a/assets/static/icons/bloom/72.png b/assets/static/icons/bloom/72.png
new file mode 100644
index 000000000..55597e914
Binary files /dev/null and b/assets/static/icons/bloom/72.png differ
diff --git a/assets/static/icons/bloom/76.png b/assets/static/icons/bloom/76.png
new file mode 100644
index 000000000..40f5646b6
Binary files /dev/null and b/assets/static/icons/bloom/76.png differ
diff --git a/assets/static/icons/bloom/80.png b/assets/static/icons/bloom/80.png
new file mode 100644
index 000000000..8748add36
Binary files /dev/null and b/assets/static/icons/bloom/80.png differ
diff --git a/assets/static/icons/bold.svg b/assets/static/icons/bold.svg
index 2c60c5021..f7ebb83d0 100644
--- a/assets/static/icons/bold.svg
+++ b/assets/static/icons/bold.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/static/icons/crisp.svg b/assets/static/icons/crisp.svg
index 24d1adbe8..9d7133a1e 100644
--- a/assets/static/icons/crisp.svg
+++ b/assets/static/icons/crisp.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/static/icons/flower.svg b/assets/static/icons/flower.svg
new file mode 100644
index 000000000..e53141dec
--- /dev/null
+++ b/assets/static/icons/flower.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/static/icons/flower/100.png b/assets/static/icons/flower/100.png
new file mode 100644
index 000000000..334921d48
Binary files /dev/null and b/assets/static/icons/flower/100.png differ
diff --git a/assets/static/icons/flower/1024.png b/assets/static/icons/flower/1024.png
new file mode 100644
index 000000000..9858808e5
Binary files /dev/null and b/assets/static/icons/flower/1024.png differ
diff --git a/assets/static/icons/flower/114.png b/assets/static/icons/flower/114.png
new file mode 100644
index 000000000..f17df1f7c
Binary files /dev/null and b/assets/static/icons/flower/114.png differ
diff --git a/assets/static/icons/flower/120.png b/assets/static/icons/flower/120.png
new file mode 100644
index 000000000..429ffd4c8
Binary files /dev/null and b/assets/static/icons/flower/120.png differ
diff --git a/assets/static/icons/flower/128.png b/assets/static/icons/flower/128.png
new file mode 100644
index 000000000..39538a066
Binary files /dev/null and b/assets/static/icons/flower/128.png differ
diff --git a/assets/static/icons/flower/144.png b/assets/static/icons/flower/144.png
new file mode 100644
index 000000000..774d41524
Binary files /dev/null and b/assets/static/icons/flower/144.png differ
diff --git a/assets/static/icons/flower/152.png b/assets/static/icons/flower/152.png
new file mode 100644
index 000000000..bb87d5fbd
Binary files /dev/null and b/assets/static/icons/flower/152.png differ
diff --git a/assets/static/icons/flower/16.png b/assets/static/icons/flower/16.png
new file mode 100644
index 000000000..6a7f6fb3d
Binary files /dev/null and b/assets/static/icons/flower/16.png differ
diff --git a/assets/static/icons/flower/160.png b/assets/static/icons/flower/160.png
new file mode 100644
index 000000000..aef462487
Binary files /dev/null and b/assets/static/icons/flower/160.png differ
diff --git a/assets/static/icons/flower/167.png b/assets/static/icons/flower/167.png
new file mode 100644
index 000000000..f9fd23acb
Binary files /dev/null and b/assets/static/icons/flower/167.png differ
diff --git a/assets/static/icons/flower/172.png b/assets/static/icons/flower/172.png
new file mode 100644
index 000000000..a59f3e98c
Binary files /dev/null and b/assets/static/icons/flower/172.png differ
diff --git a/assets/static/icons/flower/175.png b/assets/static/icons/flower/175.png
new file mode 100644
index 000000000..88128ebf8
Binary files /dev/null and b/assets/static/icons/flower/175.png differ
diff --git a/assets/static/icons/flower/180.png b/assets/static/icons/flower/180.png
new file mode 100644
index 000000000..133baa657
Binary files /dev/null and b/assets/static/icons/flower/180.png differ
diff --git a/assets/static/icons/flower/192.png b/assets/static/icons/flower/192.png
new file mode 100644
index 000000000..1b1a001bc
Binary files /dev/null and b/assets/static/icons/flower/192.png differ
diff --git a/assets/static/icons/flower/196.png b/assets/static/icons/flower/196.png
new file mode 100644
index 000000000..c07d27f5c
Binary files /dev/null and b/assets/static/icons/flower/196.png differ
diff --git a/assets/static/icons/flower/20.png b/assets/static/icons/flower/20.png
new file mode 100644
index 000000000..9869b8623
Binary files /dev/null and b/assets/static/icons/flower/20.png differ
diff --git a/assets/static/icons/flower/200.png b/assets/static/icons/flower/200.png
new file mode 100644
index 000000000..393749059
Binary files /dev/null and b/assets/static/icons/flower/200.png differ
diff --git a/assets/static/icons/flower/216.png b/assets/static/icons/flower/216.png
new file mode 100644
index 000000000..795318931
Binary files /dev/null and b/assets/static/icons/flower/216.png differ
diff --git a/assets/static/icons/flower/256.png b/assets/static/icons/flower/256.png
new file mode 100644
index 000000000..7955f3eb0
Binary files /dev/null and b/assets/static/icons/flower/256.png differ
diff --git a/assets/static/icons/flower/267.png b/assets/static/icons/flower/267.png
new file mode 100644
index 000000000..4a52ef9ca
Binary files /dev/null and b/assets/static/icons/flower/267.png differ
diff --git a/assets/static/icons/flower/29.png b/assets/static/icons/flower/29.png
new file mode 100644
index 000000000..6cea5049f
Binary files /dev/null and b/assets/static/icons/flower/29.png differ
diff --git a/assets/static/icons/flower/32.png b/assets/static/icons/flower/32.png
new file mode 100644
index 000000000..4890afe5a
Binary files /dev/null and b/assets/static/icons/flower/32.png differ
diff --git a/assets/static/icons/flower/40.png b/assets/static/icons/flower/40.png
new file mode 100644
index 000000000..04a1c9d3f
Binary files /dev/null and b/assets/static/icons/flower/40.png differ
diff --git a/assets/static/icons/flower/400.png b/assets/static/icons/flower/400.png
new file mode 100644
index 000000000..23fc2ed79
Binary files /dev/null and b/assets/static/icons/flower/400.png differ
diff --git a/assets/static/icons/flower/48.png b/assets/static/icons/flower/48.png
new file mode 100644
index 000000000..b09bfa248
Binary files /dev/null and b/assets/static/icons/flower/48.png differ
diff --git a/assets/static/icons/flower/50.png b/assets/static/icons/flower/50.png
new file mode 100644
index 000000000..f96163474
Binary files /dev/null and b/assets/static/icons/flower/50.png differ
diff --git a/assets/static/icons/flower/512.png b/assets/static/icons/flower/512.png
new file mode 100644
index 000000000..2b42c07ca
Binary files /dev/null and b/assets/static/icons/flower/512.png differ
diff --git a/assets/static/icons/flower/55.png b/assets/static/icons/flower/55.png
new file mode 100644
index 000000000..e72cc0ae1
Binary files /dev/null and b/assets/static/icons/flower/55.png differ
diff --git a/assets/static/icons/flower/56.png b/assets/static/icons/flower/56.png
new file mode 100644
index 000000000..ac4433d45
Binary files /dev/null and b/assets/static/icons/flower/56.png differ
diff --git a/assets/static/icons/flower/60.png b/assets/static/icons/flower/60.png
new file mode 100644
index 000000000..66033b7cd
Binary files /dev/null and b/assets/static/icons/flower/60.png differ
diff --git a/assets/static/icons/flower/64.png b/assets/static/icons/flower/64.png
new file mode 100644
index 000000000..b5276b945
Binary files /dev/null and b/assets/static/icons/flower/64.png differ
diff --git a/assets/static/icons/flower/72.png b/assets/static/icons/flower/72.png
new file mode 100644
index 000000000..7a8c1ea59
Binary files /dev/null and b/assets/static/icons/flower/72.png differ
diff --git a/assets/static/icons/flower/76.png b/assets/static/icons/flower/76.png
new file mode 100644
index 000000000..3342ea360
Binary files /dev/null and b/assets/static/icons/flower/76.png differ
diff --git a/assets/static/icons/flower/80.png b/assets/static/icons/flower/80.png
new file mode 100644
index 000000000..c742673ae
Binary files /dev/null and b/assets/static/icons/flower/80.png differ
diff --git a/assets/static/icons/logo.svg b/assets/static/icons/logo.svg
index eefa5cde4..9b77f9817 100644
--- a/assets/static/icons/logo.svg
+++ b/assets/static/icons/logo.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/static/icons/mint.svg b/assets/static/icons/mint.svg
index f02e9a793..e78e94af0 100644
--- a/assets/static/icons/mint.svg
+++ b/assets/static/icons/mint.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/static/icons/ring.svg b/assets/static/icons/ring.svg
new file mode 100644
index 000000000..37a1ba85b
--- /dev/null
+++ b/assets/static/icons/ring.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/static/icons/ring/100.png b/assets/static/icons/ring/100.png
new file mode 100644
index 000000000..d02e206f4
Binary files /dev/null and b/assets/static/icons/ring/100.png differ
diff --git a/assets/static/icons/ring/1024.png b/assets/static/icons/ring/1024.png
new file mode 100644
index 000000000..7f504ed9a
Binary files /dev/null and b/assets/static/icons/ring/1024.png differ
diff --git a/assets/static/icons/ring/114.png b/assets/static/icons/ring/114.png
new file mode 100644
index 000000000..c46bb17fa
Binary files /dev/null and b/assets/static/icons/ring/114.png differ
diff --git a/assets/static/icons/ring/120.png b/assets/static/icons/ring/120.png
new file mode 100644
index 000000000..2e0805eca
Binary files /dev/null and b/assets/static/icons/ring/120.png differ
diff --git a/assets/static/icons/ring/128.png b/assets/static/icons/ring/128.png
new file mode 100644
index 000000000..46cebce21
Binary files /dev/null and b/assets/static/icons/ring/128.png differ
diff --git a/assets/static/icons/ring/144.png b/assets/static/icons/ring/144.png
new file mode 100644
index 000000000..06093c0ac
Binary files /dev/null and b/assets/static/icons/ring/144.png differ
diff --git a/assets/static/icons/ring/152.png b/assets/static/icons/ring/152.png
new file mode 100644
index 000000000..88402d14d
Binary files /dev/null and b/assets/static/icons/ring/152.png differ
diff --git a/assets/static/icons/ring/16.png b/assets/static/icons/ring/16.png
new file mode 100644
index 000000000..2aa8543e4
Binary files /dev/null and b/assets/static/icons/ring/16.png differ
diff --git a/assets/static/icons/ring/160.png b/assets/static/icons/ring/160.png
new file mode 100644
index 000000000..3f008c239
Binary files /dev/null and b/assets/static/icons/ring/160.png differ
diff --git a/assets/static/icons/ring/167.png b/assets/static/icons/ring/167.png
new file mode 100644
index 000000000..9373edc7d
Binary files /dev/null and b/assets/static/icons/ring/167.png differ
diff --git a/assets/static/icons/ring/172.png b/assets/static/icons/ring/172.png
new file mode 100644
index 000000000..2d3b54e90
Binary files /dev/null and b/assets/static/icons/ring/172.png differ
diff --git a/assets/static/icons/ring/175.png b/assets/static/icons/ring/175.png
new file mode 100644
index 000000000..8206d3f71
Binary files /dev/null and b/assets/static/icons/ring/175.png differ
diff --git a/assets/static/icons/ring/180.png b/assets/static/icons/ring/180.png
new file mode 100644
index 000000000..c5c5f9873
Binary files /dev/null and b/assets/static/icons/ring/180.png differ
diff --git a/assets/static/icons/ring/192.png b/assets/static/icons/ring/192.png
new file mode 100644
index 000000000..e12f8ab7c
Binary files /dev/null and b/assets/static/icons/ring/192.png differ
diff --git a/assets/static/icons/ring/196.png b/assets/static/icons/ring/196.png
new file mode 100644
index 000000000..2fd4f1024
Binary files /dev/null and b/assets/static/icons/ring/196.png differ
diff --git a/assets/static/icons/ring/20.png b/assets/static/icons/ring/20.png
new file mode 100644
index 000000000..38642f28e
Binary files /dev/null and b/assets/static/icons/ring/20.png differ
diff --git a/assets/static/icons/ring/200.png b/assets/static/icons/ring/200.png
new file mode 100644
index 000000000..aaaadd912
Binary files /dev/null and b/assets/static/icons/ring/200.png differ
diff --git a/assets/static/icons/ring/216.png b/assets/static/icons/ring/216.png
new file mode 100644
index 000000000..f21875a4d
Binary files /dev/null and b/assets/static/icons/ring/216.png differ
diff --git a/assets/static/icons/ring/256.png b/assets/static/icons/ring/256.png
new file mode 100644
index 000000000..b43ca2f39
Binary files /dev/null and b/assets/static/icons/ring/256.png differ
diff --git a/assets/static/icons/ring/267.png b/assets/static/icons/ring/267.png
new file mode 100644
index 000000000..080e281d9
Binary files /dev/null and b/assets/static/icons/ring/267.png differ
diff --git a/assets/static/icons/ring/29.png b/assets/static/icons/ring/29.png
new file mode 100644
index 000000000..6e2f03246
Binary files /dev/null and b/assets/static/icons/ring/29.png differ
diff --git a/assets/static/icons/ring/32.png b/assets/static/icons/ring/32.png
new file mode 100644
index 000000000..b333a7554
Binary files /dev/null and b/assets/static/icons/ring/32.png differ
diff --git a/assets/static/icons/ring/40.png b/assets/static/icons/ring/40.png
new file mode 100644
index 000000000..d0eaad87e
Binary files /dev/null and b/assets/static/icons/ring/40.png differ
diff --git a/assets/static/icons/ring/400.png b/assets/static/icons/ring/400.png
new file mode 100644
index 000000000..0323a8d5a
Binary files /dev/null and b/assets/static/icons/ring/400.png differ
diff --git a/assets/static/icons/ring/48.png b/assets/static/icons/ring/48.png
new file mode 100644
index 000000000..ba311055c
Binary files /dev/null and b/assets/static/icons/ring/48.png differ
diff --git a/assets/static/icons/ring/50.png b/assets/static/icons/ring/50.png
new file mode 100644
index 000000000..57844b771
Binary files /dev/null and b/assets/static/icons/ring/50.png differ
diff --git a/assets/static/icons/ring/512.png b/assets/static/icons/ring/512.png
new file mode 100644
index 000000000..a7d689856
Binary files /dev/null and b/assets/static/icons/ring/512.png differ
diff --git a/assets/static/icons/ring/55.png b/assets/static/icons/ring/55.png
new file mode 100644
index 000000000..f5a940af6
Binary files /dev/null and b/assets/static/icons/ring/55.png differ
diff --git a/assets/static/icons/ring/56.png b/assets/static/icons/ring/56.png
new file mode 100644
index 000000000..0f3f3ffae
Binary files /dev/null and b/assets/static/icons/ring/56.png differ
diff --git a/assets/static/icons/ring/60.png b/assets/static/icons/ring/60.png
new file mode 100644
index 000000000..527ef571d
Binary files /dev/null and b/assets/static/icons/ring/60.png differ
diff --git a/assets/static/icons/ring/64.png b/assets/static/icons/ring/64.png
new file mode 100644
index 000000000..6f9fbe250
Binary files /dev/null and b/assets/static/icons/ring/64.png differ
diff --git a/assets/static/icons/ring/72.png b/assets/static/icons/ring/72.png
new file mode 100644
index 000000000..714421c8a
Binary files /dev/null and b/assets/static/icons/ring/72.png differ
diff --git a/assets/static/icons/ring/76.png b/assets/static/icons/ring/76.png
new file mode 100644
index 000000000..79c76f225
Binary files /dev/null and b/assets/static/icons/ring/76.png differ
diff --git a/assets/static/icons/ring/80.png b/assets/static/icons/ring/80.png
new file mode 100644
index 000000000..62a611ffd
Binary files /dev/null and b/assets/static/icons/ring/80.png differ
diff --git a/assets/static/icons/shutter.svg b/assets/static/icons/shutter.svg
new file mode 100644
index 000000000..df7d44caa
--- /dev/null
+++ b/assets/static/icons/shutter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/static/icons/shutter/100.png b/assets/static/icons/shutter/100.png
new file mode 100644
index 000000000..d21876a1a
Binary files /dev/null and b/assets/static/icons/shutter/100.png differ
diff --git a/assets/static/icons/shutter/1024.png b/assets/static/icons/shutter/1024.png
new file mode 100644
index 000000000..05d142a51
Binary files /dev/null and b/assets/static/icons/shutter/1024.png differ
diff --git a/assets/static/icons/shutter/114.png b/assets/static/icons/shutter/114.png
new file mode 100644
index 000000000..bf01fc249
Binary files /dev/null and b/assets/static/icons/shutter/114.png differ
diff --git a/assets/static/icons/shutter/120.png b/assets/static/icons/shutter/120.png
new file mode 100644
index 000000000..b4345b1ab
Binary files /dev/null and b/assets/static/icons/shutter/120.png differ
diff --git a/assets/static/icons/shutter/128.png b/assets/static/icons/shutter/128.png
new file mode 100644
index 000000000..6117279d8
Binary files /dev/null and b/assets/static/icons/shutter/128.png differ
diff --git a/assets/static/icons/shutter/144.png b/assets/static/icons/shutter/144.png
new file mode 100644
index 000000000..7e94dc3c7
Binary files /dev/null and b/assets/static/icons/shutter/144.png differ
diff --git a/assets/static/icons/shutter/152.png b/assets/static/icons/shutter/152.png
new file mode 100644
index 000000000..722ea6a58
Binary files /dev/null and b/assets/static/icons/shutter/152.png differ
diff --git a/assets/static/icons/shutter/16.png b/assets/static/icons/shutter/16.png
new file mode 100644
index 000000000..7857de97c
Binary files /dev/null and b/assets/static/icons/shutter/16.png differ
diff --git a/assets/static/icons/shutter/160.png b/assets/static/icons/shutter/160.png
new file mode 100644
index 000000000..6fa8a66ed
Binary files /dev/null and b/assets/static/icons/shutter/160.png differ
diff --git a/assets/static/icons/shutter/167.png b/assets/static/icons/shutter/167.png
new file mode 100644
index 000000000..3863b6048
Binary files /dev/null and b/assets/static/icons/shutter/167.png differ
diff --git a/assets/static/icons/shutter/172.png b/assets/static/icons/shutter/172.png
new file mode 100644
index 000000000..e0cd512cb
Binary files /dev/null and b/assets/static/icons/shutter/172.png differ
diff --git a/assets/static/icons/shutter/175.png b/assets/static/icons/shutter/175.png
new file mode 100644
index 000000000..f7e12716d
Binary files /dev/null and b/assets/static/icons/shutter/175.png differ
diff --git a/assets/static/icons/shutter/180.png b/assets/static/icons/shutter/180.png
new file mode 100644
index 000000000..ff6962023
Binary files /dev/null and b/assets/static/icons/shutter/180.png differ
diff --git a/assets/static/icons/shutter/192.png b/assets/static/icons/shutter/192.png
new file mode 100644
index 000000000..e6f3067ad
Binary files /dev/null and b/assets/static/icons/shutter/192.png differ
diff --git a/assets/static/icons/shutter/196.png b/assets/static/icons/shutter/196.png
new file mode 100644
index 000000000..51792e7dc
Binary files /dev/null and b/assets/static/icons/shutter/196.png differ
diff --git a/assets/static/icons/shutter/20.png b/assets/static/icons/shutter/20.png
new file mode 100644
index 000000000..e91dc2276
Binary files /dev/null and b/assets/static/icons/shutter/20.png differ
diff --git a/assets/static/icons/shutter/200.png b/assets/static/icons/shutter/200.png
new file mode 100644
index 000000000..0eef32efa
Binary files /dev/null and b/assets/static/icons/shutter/200.png differ
diff --git a/assets/static/icons/shutter/216.png b/assets/static/icons/shutter/216.png
new file mode 100644
index 000000000..a2e182eaa
Binary files /dev/null and b/assets/static/icons/shutter/216.png differ
diff --git a/assets/static/icons/shutter/256.png b/assets/static/icons/shutter/256.png
new file mode 100644
index 000000000..afbc9805d
Binary files /dev/null and b/assets/static/icons/shutter/256.png differ
diff --git a/assets/static/icons/shutter/267.png b/assets/static/icons/shutter/267.png
new file mode 100644
index 000000000..de8f45bfe
Binary files /dev/null and b/assets/static/icons/shutter/267.png differ
diff --git a/assets/static/icons/shutter/29.png b/assets/static/icons/shutter/29.png
new file mode 100644
index 000000000..4b9a4e465
Binary files /dev/null and b/assets/static/icons/shutter/29.png differ
diff --git a/assets/static/icons/shutter/32.png b/assets/static/icons/shutter/32.png
new file mode 100644
index 000000000..91ed96306
Binary files /dev/null and b/assets/static/icons/shutter/32.png differ
diff --git a/assets/static/icons/shutter/40.png b/assets/static/icons/shutter/40.png
new file mode 100644
index 000000000..a89499e15
Binary files /dev/null and b/assets/static/icons/shutter/40.png differ
diff --git a/assets/static/icons/shutter/400.png b/assets/static/icons/shutter/400.png
new file mode 100644
index 000000000..52b4fe19b
Binary files /dev/null and b/assets/static/icons/shutter/400.png differ
diff --git a/assets/static/icons/shutter/48.png b/assets/static/icons/shutter/48.png
new file mode 100644
index 000000000..403d4b8cc
Binary files /dev/null and b/assets/static/icons/shutter/48.png differ
diff --git a/assets/static/icons/shutter/50.png b/assets/static/icons/shutter/50.png
new file mode 100644
index 000000000..b6b4d3f87
Binary files /dev/null and b/assets/static/icons/shutter/50.png differ
diff --git a/assets/static/icons/shutter/512.png b/assets/static/icons/shutter/512.png
new file mode 100644
index 000000000..5524decbb
Binary files /dev/null and b/assets/static/icons/shutter/512.png differ
diff --git a/assets/static/icons/shutter/55.png b/assets/static/icons/shutter/55.png
new file mode 100644
index 000000000..3df91b060
Binary files /dev/null and b/assets/static/icons/shutter/55.png differ
diff --git a/assets/static/icons/shutter/56.png b/assets/static/icons/shutter/56.png
new file mode 100644
index 000000000..7224951ba
Binary files /dev/null and b/assets/static/icons/shutter/56.png differ
diff --git a/assets/static/icons/shutter/60.png b/assets/static/icons/shutter/60.png
new file mode 100644
index 000000000..f34694e1e
Binary files /dev/null and b/assets/static/icons/shutter/60.png differ
diff --git a/assets/static/icons/shutter/64.png b/assets/static/icons/shutter/64.png
new file mode 100644
index 000000000..e7002ec3d
Binary files /dev/null and b/assets/static/icons/shutter/64.png differ
diff --git a/assets/static/icons/shutter/72.png b/assets/static/icons/shutter/72.png
new file mode 100644
index 000000000..0b9b09e74
Binary files /dev/null and b/assets/static/icons/shutter/72.png differ
diff --git a/assets/static/icons/shutter/76.png b/assets/static/icons/shutter/76.png
new file mode 100644
index 000000000..8fbe973f5
Binary files /dev/null and b/assets/static/icons/shutter/76.png differ
diff --git a/assets/static/icons/shutter/80.png b/assets/static/icons/shutter/80.png
new file mode 100644
index 000000000..083f18d8a
Binary files /dev/null and b/assets/static/icons/shutter/80.png differ
diff --git a/assets/static/icons/square.svg b/assets/static/icons/square.svg
index 31c513e43..885a9fc63 100644
--- a/assets/static/icons/square.svg
+++ b/assets/static/icons/square.svg
@@ -1,13 +1 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/frontend/.testcaferc.cjs b/frontend/.testcaferc.cjs
new file mode 100644
index 000000000..73796641a
--- /dev/null
+++ b/frontend/.testcaferc.cjs
@@ -0,0 +1,34 @@
+// Taken from https://testcafe.io/documentation/404388/guides/advanced-guides/modify-reporter-output
+// And updated to show h m s ms time format.
+function onBeforeWriteHook(writeInfo) { // This function will fire every time the reporter calls the "write" method.
+ if (writeInfo.initiator === 'reportTestDone') { // The "initiator" property contains the name of the reporter event that triggered the hook.
+ const {
+ name,
+ testRunInfo,
+ meta
+ } = writeInfo.data || {}; // If you attached this hook to a compatible reporter (such as "spec" or "list"), the hook can process data related to the event.
+ const testDuration = new Date(testRunInfo.durationMs).toISOString().slice(11, -1); // Save the duration of the test.
+ writeInfo.formattedText = writeInfo.formattedText + ' (' + testDuration + ')'; // Add test duration to the reporter output.
+ };
+}
+
+
+module.exports = { // Attach the hook
+ hooks: {
+ reporter: {
+ onBeforeWrite: {
+ 'spec': onBeforeWriteHook, // This hook will fire when you use the default "spec" reporter.
+ },
+ },
+ },
+ skipJsErrors: true,
+ quarantineMode: false,
+ selectorTimeout: 3500,
+ assertionTimeout: 3500,
+ hostname: "localhost",
+ retryTestPages: true,
+ screenshots: {
+ path: "tests/acceptance/screenshots/",
+ takeOnFails: true
+ },
+};
\ No newline at end of file
diff --git a/frontend/NOTICE b/frontend/NOTICE
index 3781846ba..39a4786bf 100644
--- a/frontend/NOTICE
+++ b/frontend/NOTICE
@@ -1,96 +1,92 @@
-Package License Copyright
-------- ------- ---------
-@babel/cli MIT The Babel Team (https://babel.dev/team)
-@babel/core MIT The Babel Team (https://babel.dev/team)
-@babel/plugin-transform-runtime MIT The Babel Team (https://babel.dev/team)
-@babel/preset-env MIT The Babel Team (https://babel.dev/team)
-@babel/register MIT The Babel Team (https://babel.dev/team)
-@babel/runtime MIT The Babel Team (https://babel.dev/team)
-@eslint/eslintrc MIT Nicholas C. Zakas
-@eslint/js MIT n/a
-@mdi/font Apache-2.0 Austin Andrews
-@testing-library/jest-dom MIT Ernesto Garcia (http://gnapse.github.io)
-@vitejs/plugin-vue MIT Evan You
-@vitest/browser MIT n/a
-@vitest/coverage-v8 MIT Anthony Fu
-@vitest/ui MIT n/a
-@vue/compiler-sfc MIT Evan You
-@vue/language-server MIT n/a
-@vue/test-utils MIT Lachlan Miller lachlan.miller.1990@outlook.com
-@vvo/tzdb MIT Vincent Voyer
-axios MIT Matt Zabriskie
-axios-mock-adapter MIT Colin Timmermans
-babel-loader MIT Luis Couto
-babel-plugin-istanbul BSD-3-Clause Thai Pangsakulyanont @dtinth
-babel-plugin-polyfill-corejs3 MIT n/a
-browserslist MIT Andrey Sitnik
-core-js MIT Denis Pushkarev zloirock@zloirock.ru http://zloirock.ru
-cross-env MIT Kent C. Dodds (https://kentcdodds.com)
-css-loader MIT Tobias Koppers @sokra
-cssnano MIT Ben Briggs beneb.info@gmail.com http://beneb.info
-eslint MIT Nicholas C. Zakas
-eslint-config-prettier MIT Simon Lydell
-eslint-formatter-pretty MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
-eslint-plugin-html ISC n/a
-eslint-plugin-import MIT Ben Mosher
-eslint-plugin-node MIT Toru Nagashima
-eslint-plugin-vue MIT Toru Nagashima (https://github.com/mysticatea)
-eslint-plugin-vuetify MIT Kael Watts-Deuchar
-eslint-webpack-plugin MIT Ricardo Gobbo de Souza
-eventsource-polyfill MIT amvtek
-file-loader MIT Tobias Koppers @sokra
-file-saver MIT Eli Grey
-globals MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
-hls.js Apache-2.0 n/a
-i MIT Pavan Kumar Sunkara (pksunkara.github.com)
-jsdom MIT n/a
-luxon MIT Isaac Cambron
-maplibre-gl BSD-3-Clause n/a
-memoize-one MIT Alex Reardon
-mini-css-extract-plugin MIT Tobias Koppers @sokra
-minimist MIT James Halliday mail@substack.net http://substack.net
-node-storage-shim ISC Michael Nahkies
-passive-events-support MIT Ignas Damunskis
-@photo-sphere-viewer/core MIT Damien 'Mistic' Sorel contact@git.strangeplanet.fr
-@photo-sphere-viewer/equirectangular-video-adapter MIT Damien 'Mistic' Sorel contact@git.strangeplanet.fr
-@photo-sphere-viewer/video-plugin MIT Damien 'Mistic' Sorel contact@git.strangeplanet.fr
-photoswipe MIT Dmytro Semenov (https://dimsemenov.com)
-playwright Apache-2.0 Microsoft Corporation
-postcss MIT Andrey Sitnik
-postcss-import MIT Maxime Thirouin
-postcss-loader MIT Andrey Sitnik
-postcss-preset-env MIT-0 n/a
-postcss-reporter MIT David Clark david.dave.clark@gmail.com https://davidtheclark.com
-prettier MIT James Long
-pubsub-js MIT Morgan Roderick morgan@roderick.dk http://roderick.dk
-regenerator-runtime MIT Ben Newman
-resolve-url-loader MIT bholloway
-sanitize-html MIT Apostrophe Technologies, Inc.
-sass MIT Natalie Weizenbaum nweiz@google.com https://github.com/nex3
-sass-loader MIT J. Tangelder
-sockette MIT Luke Edwards luke.edwards05@gmail.com lukeed.com
-style-loader MIT Tobias Koppers @sokra
-svg-url-loader MIT Hovhannes Babayan
-tar BlueOak-1.0.0 Isaac Z. Schlueter
-url-loader MIT Tobias Koppers @sokra
-util MIT Joyent http://www.joyent.com
-vitest MIT Anthony Fu
-vue MIT Evan You
-vue-3-sanitize MIT Vannsl, Vanessa Otto
-vue-loader MIT Evan You
-vue-loader-plugin ISC Ivan liu
-vue-luxon MIT Cas Bloem
-vue-router MIT Eduardo San Martin Morote posva13@gmail.com
-vue-sanitize-directive MIT Leonardo Piccioni de Almeida leopiccionia@gmail.com
-vue-style-loader MIT Evan You
-vue3-gettext MIT Leo Zurbriggen
-vuetify MIT John Leider john@vuetifyjs.com
-webpack MIT Tobias Koppers @sokra
-webpack-bundle-analyzer MIT Yury Grunin
-webpack-cli MIT n/a
-webpack-hot-middleware MIT Glen Mailer
-webpack-manifest-plugin MIT Dane Thurber
-webpack-md5-hash MIT Kirill Ermolov
-webpack-merge MIT Juho Vepsalainen
-webpack-plugin-vuetify MIT Kael Watts-Deuchar
-workbox-webpack-plugin MIT Google's Web DevRel Team and Google's Aurora Team
+Package License Copyright
+------- ------- ---------
+@babel/cli MIT The Babel Team (https://babel.dev/team)
+@babel/core MIT The Babel Team (https://babel.dev/team)
+@babel/plugin-transform-runtime MIT The Babel Team (https://babel.dev/team)
+@babel/preset-env MIT The Babel Team (https://babel.dev/team)
+@babel/register MIT The Babel Team (https://babel.dev/team)
+@babel/runtime MIT The Babel Team (https://babel.dev/team)
+@eslint/eslintrc MIT Nicholas C. Zakas
+@eslint/js MIT n/a
+@mdi/font Apache-2.0 Austin Andrews
+@testing-library/jest-dom MIT Ernesto Garcia (http://gnapse.github.io)
+@vitejs/plugin-vue MIT Evan You
+@vitest/coverage-v8 MIT Anthony Fu
+@vue/compiler-sfc MIT Evan You
+@vue/language-server MIT n/a
+@vue/test-utils MIT Lachlan Miller lachlan.miller.1990@outlook.com
+@vvo/tzdb MIT Vincent Voyer
+axios MIT Matt Zabriskie
+axios-mock-adapter MIT Colin Timmermans
+babel-loader MIT Luis Couto
+babel-plugin-istanbul BSD-3-Clause Thai Pangsakulyanont @dtinth
+babel-plugin-polyfill-corejs3 MIT n/a
+browserslist MIT Andrey Sitnik
+core-js MIT Denis Pushkarev zloirock@zloirock.ru http://zloirock.ru
+cross-env MIT Kent C. Dodds (https://kentcdodds.com)
+css-loader MIT Tobias Koppers @sokra
+cssnano MIT Ben Briggs beneb.info@gmail.com http://beneb.info
+eslint MIT Nicholas C. Zakas
+eslint-config-prettier MIT Simon Lydell
+eslint-formatter-pretty MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
+eslint-plugin-html ISC n/a
+eslint-plugin-import MIT Ben Mosher
+eslint-plugin-node MIT Toru Nagashima
+eslint-plugin-vue MIT Toru Nagashima (https://github.com/mysticatea)
+eslint-plugin-vuetify MIT Kael Watts-Deuchar
+eslint-webpack-plugin MIT Ricardo Gobbo de Souza
+eventsource-polyfill MIT amvtek
+file-loader MIT Tobias Koppers @sokra
+file-saver MIT Eli Grey
+globals MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
+hls.js Apache-2.0 n/a
+i MIT Pavan Kumar Sunkara (pksunkara.github.com)
+jsdom MIT n/a
+luxon MIT Isaac Cambron
+maplibre-gl BSD-3-Clause n/a
+memoize-one MIT Alex Reardon
+mini-css-extract-plugin MIT Tobias Koppers @sokra
+minimist MIT James Halliday mail@substack.net http://substack.net
+node-storage-shim ISC Michael Nahkies
+passive-events-support MIT Ignas Damunskis
+photoswipe MIT Dmytro Semenov (https://dimsemenov.com)
+playwright Apache-2.0 Microsoft Corporation
+postcss MIT Andrey Sitnik
+postcss-import MIT Maxime Thirouin
+postcss-loader MIT Andrey Sitnik
+postcss-preset-env MIT-0 n/a
+postcss-reporter MIT David Clark david.dave.clark@gmail.com https://davidtheclark.com
+prettier MIT James Long
+pubsub-js MIT Morgan Roderick morgan@roderick.dk http://roderick.dk
+regenerator-runtime MIT Ben Newman
+resolve-url-loader MIT bholloway
+sanitize-html MIT Apostrophe Technologies, Inc.
+sass MIT Natalie Weizenbaum nweiz@google.com https://github.com/nex3
+sass-loader MIT J. Tangelder
+sockette MIT Luke Edwards luke.edwards05@gmail.com lukeed.com
+style-loader MIT Tobias Koppers @sokra
+svg-url-loader MIT Hovhannes Babayan
+tar BlueOak-1.0.0 Isaac Z. Schlueter
+url-loader MIT Tobias Koppers @sokra
+util MIT Joyent http://www.joyent.com
+vite MIT Evan You
+vitest MIT Anthony Fu
+vue MIT Evan You
+vue-3-sanitize MIT Vannsl, Vanessa Otto
+vue-loader MIT Evan You
+vue-loader-plugin ISC Ivan liu
+vue-luxon MIT Cas Bloem
+vue-router MIT Eduardo San Martin Morote posva13@gmail.com
+vue-sanitize-directive MIT Leonardo Piccioni de Almeida leopiccionia@gmail.com
+vue-style-loader MIT Evan You
+vue3-gettext MIT Leo Zurbriggen
+vuetify MIT John Leider john@vuetifyjs.com
+webpack MIT Tobias Koppers @sokra
+webpack-bundle-analyzer MIT Yury Grunin
+webpack-cli MIT n/a
+webpack-hot-middleware MIT Glen Mailer
+webpack-manifest-plugin MIT Dane Thurber
+webpack-md5-hash MIT Kirill Ermolov
+webpack-merge MIT Juho Vepsalainen
+webpack-plugin-vuetify MIT Kael Watts-Deuchar
+workbox-webpack-plugin MIT Google's Web DevRel Team and Google's Aurora Team
diff --git a/frontend/README.md b/frontend/README.md
index 2ca58f6fe..51f9ae5ad 100644
--- a/frontend/README.md
+++ b/frontend/README.md
@@ -27,14 +27,14 @@ Other frontend documentation lives next to this file:
## Dependency Pinning Policy
-**Pins are intentional.** When a version is locked without a caret (e.g., `"axios": "1.17.0"`), it is intentional. Before adjusting any pin, check the table below, the inline `//` comments at the top of `package.json`, and the git log (`git log -p -- frontend/package.json | grep -B2 -A4 ""`).
+**Pins are intentional.** When a version is locked without a caret (e.g., `"axios": "1.18.0"`), it is intentional. Before adjusting any pin, check the table below, the inline `//` comments at the top of `package.json`, and the git log (`git log -p -- frontend/package.json | grep -B2 -A4 ""`).
### Currently Pinned Packages
-| Package | Pin | Reason |
-|-----------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `vuetify` | `3.12.2` | 3.12.3+ added an `onFocusout` handler to `VAutocomplete`/`VSelect`/`VCombobox` that closes long autocomplete/select dropdowns on open (#5538). Still unfixed in 3.12.5; upstream development moved to v4. See the long `//vuetify` comment in `package.json` and `frontend/CODEMAP.md` for retest steps. |
-| `axios` | `1.17.0` | High-risk package. Originally pinned to `1.14.0` after the March 2026 supply-chain compromise (malicious `1.14.1`/`0.30.4` from a hijacked maintainer account). Quarantine was unwound on 2026-04-27 once OSV-Scanner came back clean; bumped to `1.17.0` on 2026-06-10 (security-hardening + bug-fix minor, OSV-Scanner clean). Keep an exact pin (no caret) per industry guidance for high-risk packages. |
+| Package | Pin | Reason |
+|-----------|----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `vuetify` | `3.12.2` | 3.12.3+ added an `onFocusout` handler to `VAutocomplete`/`VSelect`/`VCombobox` that closes long autocomplete/select dropdowns on open (#5538). Still unfixed in 3.12.5; upstream development moved to v4. See the long `//vuetify` comment in `package.json` and `frontend/CODEMAP.md` for retest steps. |
+| `axios` | `1.18.0` | High-risk package. Originally pinned to `1.14.0` after the March 2026 supply-chain compromise (malicious `1.14.1`/`0.30.4` from a hijacked maintainer account). Quarantine was unwound on 2026-04-27 once OSV-Scanner came back clean; bumped to `1.17.0` on 2026-06-10, then to `1.18.0` on 2026-06-15 (security-hardening minor: strips caller-supplied sensitive headers on cross-origin redirects, rejects malformed http/https URLs, tightens prototype-pollution defenses; no breaking changes; OSV-Scanner clean). Keep an exact pin (no caret) per industry guidance for high-risk packages. |
### Override Layer (Transitive Pins)
diff --git a/frontend/package.json b/frontend/package.json
index 0f67f4527..bab6ec1b0 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -49,14 +49,12 @@
"@mdi/font": "^7.4.47",
"@testing-library/jest-dom": "^6.9.1",
"@vitejs/plugin-vue": "^6.0.7",
- "@vitest/browser": "^3.2.4",
- "@vitest/coverage-v8": "^3.2.6",
- "@vitest/ui": "^3.2.4",
- "@vue/compiler-sfc": "^3.5.35",
- "@vue/language-server": "^3.3.4",
+ "@vitest/coverage-v8": "^4.1.9",
+ "@vue/compiler-sfc": "^3.5.38",
+ "@vue/language-server": "^3.3.5",
"@vue/test-utils": "^2.4.11",
"@vvo/tzdb": "^6.198.0",
- "axios": "1.17.0",
+ "axios": "1.18.0",
"axios-mock-adapter": "^2.1.0",
"babel-loader": "^10.1.1",
"babel-plugin-istanbul": "^7.0.1",
@@ -93,7 +91,7 @@
"@photo-sphere-viewer/equirectangular-video-adapter": "^5.14.1",
"@photo-sphere-viewer/video-plugin": "^5.14.1",
"photoswipe": "^5.4.4",
- "playwright": "^1.60.0",
+ "playwright": "^1.61.0",
"postcss": "^8.5.15",
"postcss-import": "^16.1.1",
"postcss-loader": "^8.2.1",
@@ -103,17 +101,18 @@
"pubsub-js": "^1.9.5",
"regenerator-runtime": "^0.14.1",
"resolve-url-loader": "^5.0.0",
- "sanitize-html": "^2.17.4",
- "sass": "^1.100.0",
+ "sanitize-html": "^2.17.5",
+ "sass": "^1.101.0",
"sass-loader": "^16.0.8",
"sockette": "^2.0.6",
"style-loader": "^4.0.0",
- "svg-url-loader": "^8.0.0",
+ "svg-url-loader": "^8.1.0",
"tar": "^7.5.16",
"url-loader": "^4.1.1",
"util": "^0.12.5",
- "vitest": "^3.2.4",
- "vue": "^3.5.35",
+ "vite": "^8.0.16",
+ "vitest": "^4.1.9",
+ "vue": "^3.5.38",
"vue-3-sanitize": "^0.1.4",
"vue-loader": "^17.4.2",
"vue-loader-plugin": "^1.3.0",
diff --git a/frontend/src/app/routes.js b/frontend/src/app/routes.js
index 8c85efd4a..0ede89fe3 100644
--- a/frontend/src/app/routes.js
+++ b/frontend/src/app/routes.js
@@ -174,13 +174,17 @@ export default [
path: "/logout",
meta: { title: siteTitle, requiresAuth: false, hideNav: true },
beforeEnter: (to, from, next) => {
- // Resolve the landing before sign-out clears the provider: a cluster-OIDC user
- // returns to the Portal login (re-auth via OIDC), everyone else to the local form.
+ // Resolve the session kind and landing before sign-out clears the provider:
+ // a cluster-OIDC user returns to the Portal login (or the local form when the
+ // Portal login URL is unknown), everyone else to the local form. The cluster
+ // decision must not depend on the redirect target, or a node without a
+ // persisted Portal login URL would silently skip the cluster-wide sign-out.
+ const isClusterSession = $session.isClusterSession();
const redirectUri = $session.logoutRedirectUri();
- if (redirectUri && redirectUri !== $config.loginUri) {
+ if (isClusterSession) {
// Cluster-OIDC: await the cluster-wide sign-out (which clears the Portal OP
- // cookie) BEFORE bouncing to the OIDC login, so the Portal shows its login form
- // instead of silently re-issuing a session from a still-valid OP cookie.
+ // cookie) BEFORE redirecting, so the Portal shows its login form instead of
+ // silently re-issuing a session from a still-valid OP cookie.
next(false);
$session.logoutEverywhere(true).finally(() => $session.followRedirect(redirectUri));
} else {
diff --git a/frontend/src/common/config.js b/frontend/src/common/config.js
index b4184ac79..7b922074d 100644
--- a/frontend/src/common/config.js
+++ b/frontend/src/common/config.js
@@ -24,12 +24,13 @@ Additional information can be found in our Developer Guide:
*/
import $api from "common/api";
-import $event, { ACTION_CREATED, ACTION_UPDATED, ACTION_DELETED } from "common/event";
+import $event from "common/event";
import * as themes from "options/themes";
import * as options from "options/options";
import { Photo } from "model/photo";
import { onInit, onSetTheme } from "common/hooks";
import { ref, reactive } from "vue";
+import memoizeOne from "memoize-one";
onInit();
@@ -47,6 +48,9 @@ const frontendLoginUri = (frontendUri) => {
return `${frontendUri.replace(/\/+$/, "")}/login`;
};
+// schemeUriRegExp matches a leading URI scheme ("https:", "data:") so absolute references are left untouched.
+const schemeUriRegExp = /^[a-z][a-z0-9+.-]*:/i;
+
export default class Config {
/**
* @param {Storage} storage
@@ -139,7 +143,6 @@ export default class Config {
$event.subscribe("config.updated", (ev, data) => this.setValues(data.config));
$event.subscribe("config.tokens", (ev, data) => this.setTokens(data));
$event.subscribe("count", (ev, data) => this.onCount(ev, data));
- $event.subscribe("people", (ev, data) => this.onPeople(ev, data));
if (this.has("settings")) {
this.setTheme(this.get("settings").ui.theme);
@@ -230,72 +233,6 @@ export default class Config {
}
}
- onPeople(ev, data) {
- const type = ev.split(".")[1];
-
- if (this.debug) {
- console.log(ev, data);
- }
-
- if (!this.values.people) {
- this.values.people = [];
- }
-
- if (!data || !data.entities || !Array.isArray(data.entities)) {
- return;
- }
-
- switch (type) {
- case ACTION_CREATED:
- this.values.people.unshift(...data.entities);
- break;
- case ACTION_UPDATED:
- for (let i = 0; i < data.entities.length; i++) {
- const values = data.entities[i];
-
- this.values.people
- .filter((m) => m.UID === values.UID)
- .forEach((m) => {
- for (let key in values) {
- if (key !== "UID" && values.hasOwnProperty(key) && values[key] != null && typeof values[key] !== "object") {
- m[key] = values[key];
- }
- }
- });
- }
- break;
- case ACTION_DELETED:
- for (let i = 0; i < data.entities.length; i++) {
- const index = this.values.people.findIndex((m) => m.UID === data.entities[i]);
-
- if (index >= 0) {
- this.values.people.splice(index, 1);
- }
- }
- break;
- }
- }
-
- // getPerson returns the details of a person by name
- // (case-insensitive), or null if it does not exist.
- getPerson(name) {
- name = name.toLowerCase();
-
- const result = this.values.people.filter((m) => m.Name.toLowerCase() === name);
- const l = result ? result.length : 0;
-
- if (l === 0) {
- return null;
- } else if (l === 1) {
- return result[0];
- } else {
- if (this.debug) {
- console.warn("more than one person having the same name", result);
- }
- return result[0];
- }
- }
-
// onCount updates the media type, location, people and other
// counters used e.g. in the expanded sidebar navigation.
onCount(ev, data) {
@@ -874,11 +811,26 @@ export default class Config {
return !!this.values?.ext?.oidc?.cluster;
}
+ // oidcEnabled returns true when OIDC single sign-on is configured.
+ oidcEnabled() {
+ return !!this.values?.ext?.oidc?.enabled;
+ }
+
+ // ldapEnabled returns true when LDAP/AD directory authentication is configured.
+ ldapEnabled() {
+ return !!this.values?.ext?.ldap?.enabled;
+ }
+
// oidcLoginUri returns the OIDC login endpoint that starts the provider roundtrip, or "" when off.
oidcLoginUri() {
return this.values?.ext?.oidc?.loginUri || "";
}
+ // portalLoginUri returns the cluster Portal's browser-facing login page, or "" when unknown.
+ portalLoginUri() {
+ return this.values?.ext?.oidc?.portalLoginUri || "";
+ }
+
// isPro returns true if this is team version.
isPro() {
return !!this.values?.ext["pro"];
@@ -958,19 +910,22 @@ export default class Config {
return s;
}
- // themeAssetUri resolves a theme-relative asset path (e.g. "/_theme/logo.svg")
- // against the configured base URI so it loads on path-prefixed deployments;
- // absolute URLs, protocol-relative and data/blob URIs, and already-prefixed
- // paths pass through unchanged.
- themeAssetUri(uri) {
- if (typeof uri !== "string" || !uri.startsWith("/") || uri.startsWith("//")) {
+ // themeAssetUri resolves a theme asset reference against the base URI (e.g.
+ // "logo.svg" → "{baseUri}/_theme/logo.svg"); memoized since the base URI is
+ // fixed once the config is loaded.
+ themeAssetUri = memoizeOne((uri) => {
+ if (typeof uri !== "string" || uri === "") {
return uri;
+ } else if (schemeUriRegExp.test(uri) || uri.startsWith("//")) {
+ return uri; // absolute, data:/blob:, or protocol-relative
+ } else if (!uri.startsWith("/")) {
+ return `${this.baseUri || ""}/_theme/${uri}`; // bare name → theme dir
} else if (this.baseUri && uri.startsWith(`${this.baseUri}/`)) {
- return uri;
+ return uri; // already prefixed
}
- return `${this.baseUri || ""}${uri}`;
- }
+ return `${this.baseUri || ""}${uri}`; // other root path → add prefix
+ });
getIcon() {
if (this.theme?.variables?.icon) {
@@ -981,6 +936,10 @@ export default class Config {
case "crisp":
case "mint":
case "bold":
+ case "bloom":
+ case "flower":
+ case "ring":
+ case "shutter":
return `${this.staticUri}/icons/${this.get("appIcon")}.svg`;
default:
return `${this.staticUri}/icons/logo.svg`;
diff --git a/frontend/src/common/event.js b/frontend/src/common/event.js
index 0300a400b..3a74946fe 100644
--- a/frontend/src/common/event.js
+++ b/frontend/src/common/event.js
@@ -39,7 +39,7 @@ if (trace) {
// Action-verb constants for the backend's entity-event helpers —
// kept in sync with EntityCreated / EntityUpdated / EntityDeleted /
-// EntityArchived / EntityRestored / EntityEdited in
+// EntityArchived / EntityRestored in
// internal/event/publish_entities.go. Exported as symbols (not just
// strings in a Set) so that switch cases and grep / IDE find-
// references can locate every event-handling site without having
@@ -50,13 +50,12 @@ export const ACTION_UPDATED = "updated";
export const ACTION_DELETED = "deleted";
export const ACTION_ARCHIVED = "archived";
export const ACTION_RESTORED = "restored";
-export const ACTION_EDITED = "edited";
// ENTITY_MUTATIONS lists the action verbs the cache layers and
// namespace-level subscribers treat as "something changed; evict".
// Frozen so call sites can't mutate the shared default; pass a
// different Set explicitly when a caller needs a narrower scope.
-export const ENTITY_MUTATIONS = Object.freeze(new Set([ACTION_CREATED, ACTION_UPDATED, ACTION_DELETED, ACTION_ARCHIVED, ACTION_RESTORED, ACTION_EDITED]));
+export const ENTITY_MUTATIONS = Object.freeze(new Set([ACTION_CREATED, ACTION_UPDATED, ACTION_DELETED, ACTION_ARCHIVED, ACTION_RESTORED]));
// Subscribes to every . event whose action is
// in `actions`. Mirrors the page/photos.vue onUpdate switch
diff --git a/frontend/src/common/map.js b/frontend/src/common/map.js
index cbfd69a91..8cba93560 100644
--- a/frontend/src/common/map.js
+++ b/frontend/src/common/map.js
@@ -1,6 +1,124 @@
let loading = false;
let maplibregl = null;
+// Screen-space distance (in pixels) below which two photo markers are treated as sharing the
+// same spot and merged into one stack. Roughly the marker size, so pictures that would
+// otherwise overlap and hide each other are grouped until the map is zoomed in far enough to
+// separate them.
+const stackTolerancePx = 40;
+
+// projectCoords resolves a feature's [lng, lat] coordinate to a screen point using the given
+// projection. It accepts maplibregl Point objects ({x, y}) as well as plain [x, y] arrays and
+// falls back to the raw coordinate so the grouping stays testable without a live map.
+function projectCoords(coords, project) {
+ if (typeof project === "function") {
+ const p = project(coords);
+ if (p && typeof p.x === "number" && typeof p.y === "number") {
+ return [p.x, p.y];
+ }
+ if (Array.isArray(p) && p.length >= 2) {
+ return [p[0], p[1]];
+ }
+ }
+ // No projection: compare raw [lng, lat] degrees. The tolerance is then in degrees, not
+ // pixels, and grouping is no longer zoom-aware — callers rendering on a live map MUST pass
+ // a projection. This path exists so the grouping can be unit-tested without a map.
+ return [coords[0], coords[1]];
+}
+
+// groupGeoFeatures groups point features that render close enough to overlap so that
+// coincident or near-coincident pictures stack into a single marker with a counter instead of
+// hiding each other once the map is zoomed past the clustering threshold. The optional
+// `project` callback maps a feature's [lng, lat] coordinate to screen pixels, which keeps the
+// grouping zoom-aware: truly coincident pictures always stack, while ones a few meters apart
+// only separate once zoomed in far enough. Exact-coordinate keying is intentionally avoided
+// because stored coordinates rarely match bit for bit (GPS jitter, tile quantization).
+// Features are deduplicated by UID because querySourceFeatures may return the same point once
+// per tile it overlaps. Each group carries the lat/lng bounding box of its members and a
+// stable key (smallest UID) so a click opens exactly those pictures and the marker survives
+// re-renders.
+export function groupGeoFeatures(features, project, tolerance = stackTolerancePx) {
+ const groups = [];
+
+ if (!Array.isArray(features)) {
+ return groups;
+ }
+
+ const limit = tolerance * tolerance;
+
+ for (let i = 0; i < features.length; i++) {
+ const feature = features[i];
+ const coords = feature?.geometry?.coordinates;
+
+ if (!Array.isArray(coords) || coords.length < 2) {
+ continue;
+ }
+
+ const point = projectCoords(coords, project);
+
+ // Join the first existing group whose anchor lies within the tolerance.
+ let group = null;
+ for (let g = 0; g < groups.length; g++) {
+ const dx = groups[g].point[0] - point[0];
+ const dy = groups[g].point[1] - point[1];
+ if (dx * dx + dy * dy <= limit) {
+ group = groups[g];
+ break;
+ }
+ }
+
+ if (!group) {
+ group = {
+ coords,
+ point,
+ features: [],
+ uids: {},
+ bounds: { latN: coords[1], lngE: coords[0], latS: coords[1], lngW: coords[0] },
+ };
+ groups.push(group);
+ }
+
+ const uid = feature.properties?.UID;
+
+ // Skip duplicate features that reference the same picture.
+ if (uid) {
+ if (group.uids[uid]) {
+ continue;
+ }
+ group.uids[uid] = true;
+ }
+
+ group.features.push(feature);
+
+ // Expand the group's lat/lng bounding box to include this picture.
+ const lng = coords[0];
+ const lat = coords[1];
+ if (lat > group.bounds.latN) {
+ group.bounds.latN = lat;
+ }
+ if (lat < group.bounds.latS) {
+ group.bounds.latS = lat;
+ }
+ if (lng > group.bounds.lngE) {
+ group.bounds.lngE = lng;
+ }
+ if (lng < group.bounds.lngW) {
+ group.bounds.lngW = lng;
+ }
+ }
+
+ // Derive a stable key from the smallest UID so the marker survives re-renders, even when
+ // querySourceFeatures returns the same pictures in a different order between frames. Fall
+ // back to the first feature's id (never the float coordinates, which drift between frames).
+ for (let g = 0; g < groups.length; g++) {
+ const group = groups[g];
+ const uids = Object.keys(group.uids);
+ group.key = uids.length ? uids.sort()[0] : String(group.features[0]?.id ?? g);
+ }
+
+ return groups;
+}
+
// Loads the maplibregl library.
export async function load() {
if (maplibregl !== null || loading) {
diff --git a/frontend/src/common/session.js b/frontend/src/common/session.js
index 6799d42a2..622684eea 100644
--- a/frontend/src/common/session.js
+++ b/frontend/src/common/session.js
@@ -802,15 +802,22 @@ export default class Session {
$view.redirect(url, delay, true);
}
+ // isClusterSession reports whether the current session was signed in through the
+ // cluster Portal OIDC provider, so sign-out runs the cluster-wide fan-out and
+ // clears the Portal OP cookie. Read before reset()/signOut() clears the provider.
+ isClusterSession() {
+ return this.getProvider() === "oidc" && !!this.config?.isClusterOidc?.();
+ }
+
// logoutRedirectUri returns the post-sign-out landing URL: a cluster-OIDC session
- // goes to the OIDC login (which bounces to the Portal login) to re-auth with the
- // cluster account, everyone else to the local login. Read provider before reset().
+ // goes directly to the Portal login page (re-auth → instance chooser), everyone
+ // else to the local login. The instance OIDC roundtrip is never re-initiated on
+ // sign-out, since that would pin the Portal login's return_to to the just-left
+ // instance and dead-end accounts without a grant there; when the Portal login URL
+ // is unknown, the local form is the fallback landing. Read provider before reset().
logoutRedirectUri() {
- if (this.getProvider() === "oidc" && this.config?.isClusterOidc?.()) {
- const oidcLoginUri = this.config.oidcLoginUri();
- if (oidcLoginUri) {
- return oidcLoginUri;
- }
+ if (this.isClusterSession()) {
+ return this.config.portalLoginUri() || this.config.loginUri;
}
return this.config.loginUri;
diff --git a/frontend/src/common/typeahead-cache.js b/frontend/src/common/typeahead-cache.js
index bc5ca0df2..0a2396abb 100644
--- a/frontend/src/common/typeahead-cache.js
+++ b/frontend/src/common/typeahead-cache.js
@@ -1,9 +1,11 @@
-// Module-scope cache for the labels and albums typeahead lists shared by the
-// sidebar info panel, batch-edit dialog, and edit-dialog labels tab.
-// getLabels / getAlbums return a Promise and coalesce concurrent callers
-// onto a single in-flight request. WS mutation events evict the matching slot.
+// Module-scope cache for the labels, albums, and people typeahead lists shared
+// by the sidebar info panel, batch-edit dialog, edit-dialog tabs, and the
+// people/face name pickers. getLabels / getAlbums / getPeople return a
+// Promise and coalesce concurrent callers onto a single in-flight
+// request. WS mutation events evict the matching slot.
import Album from "model/album";
import Label from "model/label";
+import Subject from "model/subject";
import $event, { subscribeEntityActions } from "common/event";
// Pragmatic ceiling shared by every consumer; over-cap libraries log a warning
@@ -11,10 +13,14 @@ import $event, { subscribeEntityActions } from "common/event";
export const CAP = 5000;
const state = {
- labels: { data: null, fetch: null },
- albums: { data: null, fetch: null },
+ labels: { data: null, fetch: null, epoch: 0 },
+ albums: { data: null, fetch: null, epoch: 0 },
+ people: { data: null, fetch: null, epoch: 0 },
};
+// Bumping the epoch invalidates any fetch that started before this point, so a
+// request still in flight when the slot is evicted (or seeded) cannot resolve
+// later and silently overwrite the slot with stale data. See get().
function evict(field) {
const slot = state[field];
if (!slot) {
@@ -22,6 +28,61 @@ function evict(field) {
}
slot.data = null;
slot.fetch = null;
+ slot.epoch += 1;
+}
+
+// upsertPeople merges saved subjects into a populated people slot so a freshly
+// created or renamed name is suggestible immediately, without waiting for the
+// subjects/people WS event (which can lag a quick re-entry). It only mutates an
+// already-loaded slot; a cold slot is left untouched so the next getPeople()
+// fetches the full, server-ordered list. Entries are matched by UID, falling
+// back to a case-insensitive name match so an existing person is updated rather
+// than duplicated. The merge is idempotent: re-saving an unchanged name leaves
+// the slot and its epoch untouched, so a redundant save cannot invalidate a
+// pending fetch or replace the list with an equivalent copy.
+//
+// Contract: Marker.setName() and Face.setName() seed automatically. Callers that
+// create or rename a person through any other path (e.g. Subject.update() from
+// the recognized-people page) must call upsertPerson() themselves.
+function upsertPeople(items) {
+ const slot = state.people;
+ if (!Array.isArray(slot.data) || !Array.isArray(items)) {
+ return;
+ }
+
+ const next = slot.data.slice();
+ let changed = false;
+
+ for (const raw of items) {
+ const name = (raw?.Name || "").trim();
+ if (!name) {
+ continue;
+ }
+
+ const uid = raw?.UID || "";
+ let idx = uid ? next.findIndex((p) => p && p.UID === uid) : -1;
+ if (idx === -1) {
+ idx = next.findIndex((p) => p && p.Name && p.Name.localeCompare(name, undefined, { sensitivity: "base" }) === 0);
+ }
+
+ if (idx >= 0) {
+ const existing = next[idx];
+ const mergedUid = uid || existing.UID;
+ // Nothing to do when the slot already holds this exact UID and name.
+ if (existing.UID === mergedUid && existing.Name === name) {
+ continue;
+ }
+ next[idx] = { ...existing, UID: mergedUid, Name: name };
+ } else {
+ next.push({ UID: uid, Name: name });
+ }
+ changed = true;
+ }
+
+ if (changed) {
+ slot.data = next;
+ slot.epoch += 1;
+ }
}
function fetchLabels() {
@@ -44,6 +105,16 @@ function fetchAlbums() {
});
}
+function fetchPeople() {
+ return Subject.search({ count: CAP, order: "name", type: "person" }).then((resp) => {
+ const models = Array.isArray(resp?.models) ? resp.models : [];
+ if (models.length === CAP) {
+ console.warn(`Subject.search returned ${CAP} results — list may be truncated.`);
+ }
+ return models;
+ });
+}
+
function get(field, fetcher) {
const slot = state[field];
if (slot.data) {
@@ -52,14 +123,21 @@ function get(field, fetcher) {
if (slot.fetch) {
return slot.fetch;
}
+ // Snapshot the epoch so a fetch that finishes after an evict/upsert (which
+ // bump the epoch) is discarded instead of caching now-stale results.
+ const epoch = slot.epoch;
slot.fetch = fetcher()
.then((data) => {
- slot.data = data;
- slot.fetch = null;
+ if (slot.epoch === epoch) {
+ slot.data = data;
+ slot.fetch = null;
+ }
return data;
})
.catch((err) => {
- slot.fetch = null;
+ if (slot.epoch === epoch) {
+ slot.fetch = null;
+ }
throw err;
});
return slot.fetch;
@@ -70,11 +148,15 @@ function get(field, fetcher) {
export const typeaheadCache = {
getLabels: () => get("labels", fetchLabels),
getAlbums: () => get("albums", fetchAlbums),
+ getPeople: () => get("people", fetchPeople),
+ upsertPerson: (person) => upsertPeople([person]),
evictLabels: () => evict("labels"),
evictAlbums: () => evict("albums"),
+ evictPeople: () => evict("people"),
clear: () => {
evict("labels");
evict("albums");
+ evict("people");
},
};
@@ -83,15 +165,21 @@ export const typeaheadCache = {
subscribeEntityActions("labels", () => evict("labels"));
subscribeEntityActions("albums", () => evict("albums"));
+// People mutations surface on both the subjects and people channels (a rename
+// publishes subjects.updated and people.updated); either evicts the people slot.
+subscribeEntityActions("subjects", () => evict("people"));
+subscribeEntityActions("people", () => evict("people"));
+
// Belt-and-braces eviction for album mutations that surface only as a config
// reload (covers future config-touching mutations not on the entity channel).
$event.subscribe("config.updated", () => evict("albums"));
-// Drop both lists on logout so user A's data cannot be served to user B in
+// Drop all lists on logout so user A's data cannot be served to user B in
// the same tab; mirrors Photo.clearCache()'s session.logout path.
$event.subscribe("session.logout", () => {
evict("labels");
evict("albums");
+ evict("people");
});
export default typeaheadCache;
diff --git a/frontend/src/component/action/menu.vue b/frontend/src/component/action/menu.vue
index 206022b4a..f1f316c6c 100644
--- a/frontend/src/component/action/menu.vue
+++ b/frontend/src/component/action/menu.vue
@@ -54,7 +54,7 @@ export default {
},
buttonIcon: {
type: String,
- default: "mdi-dots-horizontal",
+ default: "mdi-dots-vertical",
},
},
emits: ["show", "hide"],
diff --git a/frontend/src/component/defaults.js b/frontend/src/component/defaults.js
index 0d1e3b69b..0fe136e3d 100644
--- a/frontend/src/component/defaults.js
+++ b/frontend/src/component/defaults.js
@@ -184,7 +184,8 @@ export default {
ripple: false,
},
VDataTable: {
- color: "background",
+ // Forwarded to the footer only as the "items per page" select's active-item color (not the table).
+ color: "surface-variant",
itemsPerPage: -1,
hover: true,
},
diff --git a/frontend/src/component/lightbox.vue b/frontend/src/component/lightbox.vue
index 5436d9d24..cf69629be 100644
--- a/frontend/src/component/lightbox.vue
+++ b/frontend/src/component/lightbox.vue
@@ -1618,7 +1618,7 @@ export default {
isButton: true,
html: {
isCustomSVG: true,
- inner: ``,
+ inner: ``,
outlineID: "pswp__icn-menu-button", // Add this to the in the inner property.
size: 16, // Depends on the original SVG viewBox, e.g. use 24 for viewBox="0 0 24 24".
},
@@ -1933,11 +1933,13 @@ export default {
// Ensure that content is focused.
this.focusContent();
},
- // Mirrors Title/Caption mutations from photos.updated WS events onto the
- // in-memory slide models so the dynamic caption (and any other model-bound
- // UI) reflects edits made by other clients. The lightbox stays mounted in
- // the background after close, so skip work unless it is actually visible
- // with a live PhotoSwipe instance.
+ // Mirrors Title/Caption mutations reported by photos.updated WS events
+ // onto the in-memory slide models so the dynamic caption (and any other
+ // model-bound UI) reflects edits made by other clients. The event carries
+ // only UIDs, so the values are refetched through the scoped REST API for
+ // the current slide and its preloaded neighbors. The lightbox stays
+ // mounted in the background after close, so skip work unless it is
+ // actually visible with a live PhotoSwipe instance.
onPhotosUpdated(ev, data) {
if (!this.visible || !this.lightbox || !this.models.length) {
return;
@@ -1945,33 +1947,28 @@ export default {
if (!data || !Array.isArray(data.entities)) {
return;
}
- if (ev.split(".")[1] !== "updated") {
- return;
- }
- let currentChanged = false;
- for (const values of data.entities) {
- if (!values || typeof values !== "object" || !values.UID) {
- continue;
- }
- const idx = this.models.findIndex((m) => m && m.UID === values.UID);
- if (idx < 0) {
- continue;
- }
+ for (let idx = this.index - 1; idx <= this.index + 1; idx++) {
const model = this.models[idx];
- if (typeof values.Title === "string") {
- model.Title = values.Title;
- }
- if (typeof values.Caption === "string") {
- model.Caption = values.Caption;
- }
- if (idx === this.index) {
- currentChanged = true;
- }
- }
- if (currentChanged) {
- this.captionPlugin?.refreshCurrentCaption();
+ if (!model || !model.UID || !data.entities.includes(model.UID)) {
+ continue;
+ }
+
+ new Photo()
+ .find(model.UID)
+ .then((values) => {
+ if (typeof values.Title === "string") {
+ model.Title = values.Title;
+ }
+ if (typeof values.Caption === "string") {
+ model.Caption = values.Caption;
+ }
+ if (idx === this.index) {
+ this.captionPlugin?.refreshCurrentCaption();
+ }
+ })
+ .catch(() => {});
}
},
// Fetches the full Photo model for the given UID using the LRU
diff --git a/frontend/src/component/lightbox/sidebar.vue b/frontend/src/component/lightbox/sidebar.vue
index cc538f4a6..6f84e83af 100644
--- a/frontend/src/component/lightbox/sidebar.vue
+++ b/frontend/src/component/lightbox/sidebar.vue
@@ -252,6 +252,7 @@
autocomplete="off"
class="meta-inline-edit meta-inline-marker"
:class="{ 'meta-inline-marker--named': m.SubjUID }"
+ @focus="loadChipOptions('people')"
@update:model-value="(v) => onPickPerson(m, v)"
@update:search="(v) => setMarkerInputValue(m.UID, v)"
@keydown.enter.stop.prevent="confirmMarkerName(m, 'enter')"
@@ -547,6 +548,9 @@ export default {
chipState: {
labels: { input: null, search: "", key: 0, options: [], removals: [] },
albums: { input: null, search: "", key: 0, options: [], removals: [] },
+ // People is read-only suggestions (no removals/typed-text editing); the
+ // full shape keeps the chipState iterations (pending-edit checks) uniform.
+ people: { input: null, search: "", key: 0, options: [], removals: [] },
},
markerDrafts: {},
markerMenuProps: {
@@ -705,18 +709,11 @@ export default {
}
return this.photo.getMarkers(true);
},
- // Sorted, locale-aware copy of `$config.values.people` for the marker
- // combobox. Reading from `$config` keeps the list reactive to WS
- // `people.{created,updated,deleted}` events.
+ // Name suggestions for the marker combobox, loaded from the shared people
+ // cache via loadChipOptions("people") and sorted there; the cache evicts on
+ // people.* / subjects.* WS events so the list stays current.
knownPeople() {
- const values = this.$config && this.$config.values;
- if (!values || !Array.isArray(values.people)) {
- return [];
- }
- return values.people
- .filter((p) => p && p.Name)
- .slice()
- .sort((a, b) => (a.Name || "").localeCompare(b.Name || "", undefined, { sensitivity: "base", numeric: true }));
+ return this.chipState.people.options;
},
labels() {
if (!this.photo?.Labels) {
@@ -1114,6 +1111,9 @@ export default {
if (this.canViewAlbums) {
this.loadChipOptions("albums");
}
+ if (this.canViewPeople) {
+ this.loadChipOptions("people");
+ }
}
},
methods: {
@@ -1794,6 +1794,17 @@ export default {
this.chipState.albums.options = models.map((a) => ({ Title: a.Title, UID: a.UID })).sort(collator("Title"));
})
.catch(() => {});
+ } else if (field === "people") {
+ typeaheadCache
+ .getPeople()
+ .then((models) => {
+ // Plain {Name, UID} objects, mirroring the labels mapping.
+ this.chipState.people.options = models
+ .filter((p) => p && p.Name)
+ .map((p) => ({ Name: p.Name, UID: p.UID }))
+ .sort(collator("Name"));
+ })
+ .catch(() => {});
}
},
// Clears typed text + selection for one combobox; the key bump
diff --git a/frontend/src/component/navigation.vue b/frontend/src/component/navigation.vue
index d5f6f0e94..ddc1b6b9f 100644
--- a/frontend/src/component/navigation.vue
+++ b/frontend/src/component/navigation.vue
@@ -10,7 +10,7 @@
{{ page.title }}
-
+
diff --git a/frontend/src/component/photo/batch-edit.vue b/frontend/src/component/photo/batch-edit.vue
index 84f742118..8c69496b1 100644
--- a/frontend/src/component/photo/batch-edit.vue
+++ b/frontend/src/component/photo/batch-edit.vue
@@ -1558,8 +1558,8 @@ export default {
},
// Reads from the shared typeahead cache (common/typeahead-cache.js)
// so opening this dialog while the lightbox sidebar is also editable
- // costs zero extra round-trips. The cache invalidates on
- // labels.updated / albums.updated / config.updated so a label or
+ // costs zero extra round-trips. The cache invalidates on any
+ // labels.* / albums.* mutation event so a label or
// album created in another tab shows up in the dropdowns next time
// the dialog opens. Stored on the raw cached* refs; the
// availableLabelOptions / availableAlbumOptions computeds filter
diff --git a/frontend/src/component/photo/edit/dialog.vue b/frontend/src/component/photo/edit/dialog.vue
index b81bec5d0..8f750e013 100644
--- a/frontend/src/component/photo/edit/dialog.vue
+++ b/frontend/src/component/photo/edit/dialog.vue
@@ -213,11 +213,18 @@ export default {
switch (type) {
case ACTION_UPDATED:
- for (let i = 0; i < data.entities.length; i++) {
- const values = data.entities[i];
- if (values.UID && values.Title && this.model.UID === values.UID) {
- this.model.setValues({ Title: values.Title, Caption: values.Caption }, true);
- }
+ // photos.updated carries only UIDs; refetch the open photo through
+ // the scoped REST API to mirror Title/Caption edits made by other
+ // clients into the form.
+ if (data.entities.includes(this.model.UID)) {
+ this.model
+ .find(this.model.UID)
+ .then((values) => {
+ if (values.Title) {
+ this.model.setValues({ Title: values.Title, Caption: values.Caption }, true);
+ }
+ })
+ .catch(() => {});
}
break;
}
diff --git a/frontend/src/component/photo/edit/people.vue b/frontend/src/component/photo/edit/people.vue
index ee3b3d9db..ffae2fd74 100644
--- a/frontend/src/component/photo/edit/people.vue
+++ b/frontend/src/component/photo/edit/people.vue
@@ -64,7 +64,7 @@
onSetPerson(m, person)"
@blur="(ev) => onSetName(m, ev)"
@keyup.enter="(ev) => onSetName(m, ev)"
@@ -103,6 +104,7 @@