Compare commits

..

1435 Commits

Author SHA1 Message Date
Michael Mayer
5f9b90bba8 Cluster: Shorten error log messages in cluster_nodes_register.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 15:49:44 +01:00
Michael Mayer
d19bf02233 Cluster: Use creds.Driver instead of provisioner.DatabaseDriver
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 15:02:28 +01:00
Michael Mayer
04aaf514b1 Cluster: Persist database credentials in cluster_nodes_register.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 14:48:04 +01:00
Keith Martin
b644be320f Tests: add Too many requests handling capability by default into page.login, add rate limiting test (#5293) 2025-10-26 13:56:51 +01:00
Michael Mayer
70b8867b6d AI: Reduce face.MatchDist from 0.43 to 0.42 #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 13:33:17 +01:00
Michael Mayer
544dd55263 AI: Reduce face.MatchDist from 0.46 to 0.43 #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 12:52:42 +01:00
Michael Mayer
31b00cbe1c Faces: Use ClusterRadius as default in background.go and children.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 11:42:55 +01:00
Michael Mayer
dd8698c938 Cluster: Shorten log message in node/bootstrap.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 11:34:22 +01:00
Michael Mayer
e8f0e45890 AI: Remove legacy PHOTOPRISM_FACE_ variables from face/config.go #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 10:53:58 +01:00
Michael Mayer
1a37a01897 Backend: Update github.com/yalue/onnxruntime_go in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 10:44:14 +01:00
Michael Mayer
9508fbf934 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 10:43:40 +01:00
Michael Mayer
64a29d4a5c AI: Add face matching config options #5167
This commit adds the following new config options:
- FaceClusterRadius
- FaceCollisionDist
- FaceEpsilonDist
- FaceMatchChildren
- FaceMatchBackground

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 10:40:08 +01:00
Michael Mayer
72a9a53426 AI: Rename SampleRadius to ClusterRadius and increase cap to 0.42 #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 10:08:59 +01:00
Michael Mayer
c53ac3353b AI: Add face.CollisionDist variable for face comparison #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 09:50:25 +01:00
graciousgrey
100883ea9a Update SPONSORS.md 2025-10-26 09:15:49 +01:00
Michael Mayer
3236a32a2b AI: Refactor face package configuration and reporting #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-26 09:02:11 +01:00
Michael Mayer
f94219404e CLI: Improve output of "photoprism config" command #5285
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-24 13:51:19 +02:00
Michael Mayer
5ad8a06a44 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-24 10:01:57 +02:00
Michael Mayer
e072e5bd85 Frontend: Update translations #5291
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-24 10:01:14 +02:00
Weblate
f35af9725a Weblate: Update frontend translations 2025-10-24 09:59:35 +02:00
Ömer Duran
d333bd2d2c UX: Improve behavior of dropdowns in the Add to Album and Upload dialogs #5177 #5290 2025-10-24 09:55:18 +02:00
graciousgey
212869679c Tests: Adapt acceptance tests 2025-10-24 09:11:22 +02:00
Michael Mayer
b91a7380ea Media: Associate ".mp.jpg" and ".mp.jpeg" files with ImageJpeg #5289
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 18:23:24 +02:00
Michael Mayer
f2313b8dfe Cluster: Shortened log message in node/bootstrap.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 14:09:22 +02:00
Michael Mayer
3f16de1e97 Server: Improve stability of WebDAV write tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 13:33:15 +02:00
Michael Mayer
eb5ac014c2 Config: Adjust default face SizeThreshold and ClusterSizeThreshold #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 13:14:07 +02:00
Michael Mayer
a611f9eaa0 Config: Normalize DSN in DatabaseDriver() method #5279
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 11:06:27 +02:00
Michael Mayer
357c19a379 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 10:53:28 +02:00
Michael Mayer
c91adadb3b Frontend: Update styles in text.css and vuetify.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 10:53:12 +02:00
Michael Mayer
b64c04df40 Frontend: Update src/locales.js, regenerate .po and .json files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 10:52:47 +02:00
Weblate
49b2e7d4e0 Weblate: Update frontend translations 2025-10-23 10:40:49 +02:00
Michael Mayer
22ed81a65d Frontend: Update src/locales.js and regenerate locales/*.po
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 10:19:11 +02:00
Michael Mayer
75ed91a9a4 Frontend: Update src/locales/json/fr.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 09:52:47 +02:00
Michael Mayer
f901759834 Translations: Regenerate frontend and backend *.po files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 09:51:31 +02:00
Michael Mayer
dd2ada0651 Frontend: Remove "#, fuzzy" from translations in src/locales/fr.po
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 09:49:27 +02:00
Weblate
7b97a5d43f Weblate: Update frontend translations 2025-10-23 09:28:43 +02:00
Michael Mayer
0858a2b65f Auth: Add "photoprism show scopes" command to list all supported scopes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 09:25:08 +02:00
Michael Mayer
6609e9c998 CLI: Refactor authentication subcommand flags
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-23 09:04:30 +02:00
Michael Mayer
9514542d44 Auth: Extend user accounts with custom scope setting
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-22 19:58:56 +02:00
Weblate
c5312d6eda Weblate: Update backend translations 2025-10-22 10:26:26 +02:00
Michael Mayer
dca68e653a Frontend: Update src/locales/json/*.json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-22 10:08:59 +02:00
Weblate
75bb3bebbe Weblate: Update frontend translations 2025-10-22 10:07:58 +02:00
Michael Mayer
ab3d8478dd Merge remote-tracking branch 'photoprismci/weblate-photoprism-frontend' into develop
# Conflicts:
#	frontend/src/locales/af.po
#	frontend/src/locales/be.po
#	frontend/src/locales/ca.po
#	frontend/src/locales/eu.po
#	frontend/src/locales/fa.po
#	frontend/src/locales/fr.po
#	frontend/src/locales/ga.po
#	frontend/src/locales/he.po
#	frontend/src/locales/hi.po
#	frontend/src/locales/hr.po
#	frontend/src/locales/ku.po
#	frontend/src/locales/ms.po
#	frontend/src/locales/th.po
#	frontend/src/locales/vi.po
#	frontend/src/locales/zh_TW.po
2025-10-22 10:01:00 +02:00
Michael Mayer
0d196ad5dc Frontend: Update src/locales/*.po and translations.pot
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-22 09:55:49 +02:00
Michael Mayer
1148a56bc3 Revert "Frontend: Update translations.pot"
This reverts commit 504d92efaa.
2025-10-22 09:51:50 +02:00
Weblate
76aa3eb11c Weblate: Update frontend translations 2025-10-22 07:51:28 +00:00
Michael Mayer
f9a2e54476 Frontend: Disable msgmerge fuzzy matching with vue3-gettext
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-22 09:51:13 +02:00
Michael Mayer
504d92efaa Frontend: Update translations.pot
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-22 09:07:35 +02:00
Michael Mayer
5e58e51f79 Frontend: Add SeverityPalette to model/logs.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-22 08:49:29 +02:00
Michael Mayer
a2dfdc24b6 Frontend: Correct log levels in logs.js and update tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-22 08:18:18 +02:00
Michael Mayer
55da70e955 Config: Add system warning log when DatabaseDsn is used #5279
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-22 08:16:49 +02:00
Michael Mayer
5606366d86 Backend: Update github.com/golang/geo in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 17:43:28 +02:00
Michael Mayer
572ddae06d Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 17:42:26 +02:00
Michael Mayer
dbaf8cef60 Frontend: Add AuditSeverityOptions in src/model/logs.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 17:42:08 +02:00
Michael Mayer
f0e8680404 Frontend: Update .json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 17:29:01 +02:00
Michael Mayer
4be8d08251 i18n: Update .po and .json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 17:24:41 +02:00
Weblate
73d6df3a2f Weblate: Update frontend translations 2025-10-21 17:19:20 +02:00
Michael Mayer
44518801fa Cluster: Improve API endpoint logs and headers
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 17:04:16 +02:00
Michael Mayer
53f7643583 Cluster: Improve API endpoint and CLI command logs
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 16:51:24 +02:00
Michael Mayer
5b7ea44eb5 Config: Retain support for DatabaseDsn in YAML files #5279
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 16:22:06 +02:00
Michael Mayer
8d9b75c9a7 Remove Developer Notes from README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 15:11:59 +02:00
Michael Mayer
69c816d616 Logs: Replace status string literals with generic constants
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 15:08:10 +02:00
Michael Mayer
cd7fa6adca Logs: Add package pkg/log/status to provide generic outcome constants
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-21 14:42:05 +02:00
Michael Mayer
91e4d72e1b Portal: Hide severity levels that are currently not used for audit logs
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 19:22:00 +02:00
Michael Mayer
e1b51bbc34 Cluster: Add comments and improve code formatting in registry/client.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 18:49:38 +02:00
Michael Mayer
227a8cf8a4 API: Improve audit log in cluster_nodes_register.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 18:48:39 +02:00
Michael Mayer
ce304abd2c API: Update endpoints to return HTTP 201 when a new resource was created
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 16:46:59 +02:00
Michael Mayer
ddc37e08ab API: Improve audit logs in cluster_nodes_register.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 14:53:11 +02:00
Michael Mayer
c5b5feee47 CLI: Add audit logs to cluster management commands
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 14:49:25 +02:00
Michael Mayer
252aff2a6b API: Improve audit log messages in the cluster endpoint handlers
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 14:29:40 +02:00
Michael Mayer
ced4be2e40 API: Improve audit log messages in cluster_nodes_register.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 12:53:18 +02:00
Michael Mayer
54d8470f90 API: Improve logging in cluster_nodes_register.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 06:20:20 +02:00
Michael Mayer
46f70c174f Config: Improve caching tests in config_cluster.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 02:22:07 +02:00
Michael Mayer
3624e73d36 Config: Add a simple cache to reduce disk I/O under stress
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 01:41:19 +02:00
Michael Mayer
f23069dd2c Security: Improve credential handling across the cluster tooling #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-20 00:06:17 +02:00
Michael Mayer
83d69f59cc Config: Refactor internal/config/config_cluster.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 22:16:31 +02:00
Michael Mayer
bc83e00273 CLI: Refactor cluster_helpers.go and cluster_theme_pull_oauth_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 22:16:07 +02:00
Michael Mayer
5d6e46b87f Develop: Add package "htop" to docker/develop/questing/Dockerfile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 22:13:33 +02:00
Michael Mayer
72f88be5fe Docs: Update /pkg/service/http/... -> /pkg/http/...
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 21:35:16 +02:00
Michael Mayer
a921f82a17 Pkg: Move /service/http/... to /http/... and add package /http/dns
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 21:08:48 +02:00
Michael Mayer
dacb5794f5 Server: Reformat routes_wellknown.go for better readability
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 19:00:38 +02:00
Michael Mayer
50abe4ddaf Config: Automatically download, install and activate cluster theme #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 16:09:26 +02:00
Michael Mayer
122f8f6dd1 Docs: Update specs and CODEMAP.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 14:32:56 +02:00
Michael Mayer
e6959e7e96 Cluster: Report Config.About() instead of Config.Name() as app name #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 14:30:10 +02:00
Michael Mayer
695b33f097 Cluster: Change conf.AppName() to Name() in node register request #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 13:15:45 +02:00
Michael Mayer
1b85f84943 Cluster: Add AppName, AppVersion and Theme request/response fields #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 12:44:21 +02:00
Michael Mayer
1c0f68aa39 Logs: Fix mismatch between audit log placeholders and parameters
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 09:03:07 +02:00
Michael Mayer
1ba41b6656 PWA: Update CODEMAP.md files #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 08:44:36 +02:00
Michael Mayer
89a9362fa8 PWA: Update webpack.config.js #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 08:22:28 +02:00
Michael Mayer
3aa5a3902f PWA: Prevent .ttf and .woff font precaching #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 08:14:21 +02:00
Michael Mayer
6d0f720574 PWA: Reduce Workbox service worker precaching #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 08:11:43 +02:00
Michael Mayer
fd2a386c71 PWA: Improve handling of service worker requests #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 07:25:50 +02:00
Michael Mayer
5cae6af468 PWA: Handle hashed Workbox runtime requests #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 06:08:12 +02:00
Michael Mayer
2616fc9610 Frontend: Refactor themes.Get() function and related tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 04:54:05 +02:00
Michael Mayer
ad1a6dfac1 Portal: Disable index, metadata, share, and sync background workers
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 03:42:49 +02:00
Michael Mayer
1a5dca4871 Cluster: Update assertions in config_cluster_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 03:17:52 +02:00
Michael Mayer
9ce87e6d61 Cluster: Update api/cluster_theme.go and config/config_cluster.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 03:12:34 +02:00
Michael Mayer
6ed9d2715a Cluster: Improve defaultClusterDomain() in bootstrap.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 02:52:57 +02:00
Michael Mayer
a779c5d89a Cluster: Auto-derive Advertise/Site URLs from node name #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 02:40:06 +02:00
Michael Mayer
bad4b84267 Cluster: Improve log messages in internal/service/cluster/node #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 02:12:45 +02:00
Michael Mayer
6802be48a4 Frontend: Update locales/json/fr.json #5275
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 01:36:40 +02:00
Michael Mayer
b28aaa6c2c Frontend: Add $util.openUrl() helper function to enhance security
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 01:35:01 +02:00
Weblate
8e73ce9a2d Weblate: Update frontend translations 2025-10-19 01:16:05 +02:00
Michael Mayer
baa08b7558 Frontend: Reformat CSS files with Prettier
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 01:12:18 +02:00
Michael Mayer
47553d5346 Frontend: Add rel="noopener" to external links
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 00:47:45 +02:00
Michael Mayer
47d1a11c2d Cluster: Update CODEMAP.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-19 00:06:43 +02:00
Michael Mayer
b5c4fd3dcf Cluster: Refactor registration and database provisioning
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 23:54:56 +02:00
Michael Mayer
b47ee0fddc Cluster: Refactor request/response structs and JSON serialization
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 17:42:22 +02:00
Michael Mayer
04f015bdf0 Cluster: Improve logging in node/bootstrap.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 16:19:08 +02:00
Michael Mayer
dc7ca44165 Backend: Upgrade deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 14:06:35 +02:00
Michael Mayer
b829090e15 Develop: Increase stop_grace_period in compose.yaml service configs
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 12:44:28 +02:00
Michael Mayer
f99466293a Develop: Add stop_grace_period to compose.yaml service configs
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 12:42:01 +02:00
Michael Mayer
5a95d972a8 PWA: Improve service worker server endpoint #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 12:30:38 +02:00
Michael Mayer
f65d473171 Docker: Upgrade base image from Ubuntu 25.04 to 25.10 (Questing) #5276
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 12:11:02 +02:00
Michael Mayer
c4bb774195 libheif: Upgrade library version from v1.19.7 to v1.20.2 #5276
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 11:55:13 +02:00
Michael Mayer
580751a051 Docker: Add Makefile targets and Dockerfiles for Ubuntu 25.10 #5276
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 10:49:09 +02:00
Michael Mayer
7c8438a47f PWA: Update license NOTICE files #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 09:53:14 +02:00
Michael Mayer
7872e7f967 Frontend: Remove "server" package and update "eslint" #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 09:46:39 +02:00
Michael Mayer
0cb58db96b Config: Improve comments and tests for StaticFile methods #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 09:37:28 +02:00
Michael Mayer
627acaf64e PWA: Add fs constants for "assets.json" and "manifest.json" #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 09:23:53 +02:00
Michael Mayer
5bfa9803f1 PWA: Add code comments to internal/server/routes_webapp.go #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 09:16:33 +02:00
Michael Mayer
bf6d7e4f94 Config: Add StaticBuildFile() and StaticImgFile() functions #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-18 09:09:56 +02:00
Michael Mayer
703f355c09 PWA: Include minimal no-op service worker for tests #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 20:41:22 +02:00
Michael Mayer
0354fad37e Demo: Improve protection against AI-generated reports #5269
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 19:34:39 +02:00
Michael Mayer
b400666a17 PWA: Update license NOTICE files #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 17:01:33 +02:00
Michael Mayer
977dd2bafd PWA: Replace "@lcdp/offline-plugin" with "workbox-webpack-plugin" #5274
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 16:52:42 +02:00
Michael Mayer
ab9a0a969b Frontend: Use vue-gettext-extract instead of gettext-extract #1152
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 16:05:32 +02:00
Michael Mayer
0a727de361 GitHub: Delete question.yml and question.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 13:33:08 +02:00
Michael Mayer
07b0938bf2 GitHub: Update question.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 13:31:08 +02:00
Michael Mayer
565001f56e GitHub: Update question.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 13:30:38 +02:00
Michael Mayer
da8ab3b302 GitHub: Add ISSUE_TEMPLATE/config.yml and update question.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 13:28:50 +02:00
Michael Mayer
f58d319aa1 GitHub: Update feature-request.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 13:17:58 +02:00
Michael Mayer
fe4edf8f9b GitHub: Update feature-request.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 13:15:03 +02:00
Michael Mayer
e218a503c3 GitHub: Update feature-request.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 13:13:21 +02:00
Michael Mayer
82807110e4 GitHub: Update bug_report.yml and feature-request.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 13:10:31 +02:00
Michael Mayer
dcb1f91938 GitHub: Update .github/ISSUE_TEMPLATE/bug_report.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 12:59:58 +02:00
Michael Mayer
575e09a797 GitHub: Update .github/ISSUE_TEMPLATE/bug_report.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 12:57:57 +02:00
Michael Mayer
c5b764abea GitHub: Update issue templates and form in .github/ISSUE_TEMPLATE
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 12:51:38 +02:00
Michael Mayer
7eae368b3c GitHub: Update forms in .github/ISSUE_TEMPLATE
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 12:49:45 +02:00
Michael Mayer
942650bb2f GitHub: Add YML files to define form fields based on existing templates
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 12:44:39 +02:00
Michael Mayer
b42c3f8945 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 11:55:43 +02:00
Michael Mayer
56c8843572 Lightbox: Set closing to false after leave #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-17 11:55:16 +02:00
Michael Mayer
865b1513ee Lightbox: Improve logging of media error events #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-16 18:02:03 +02:00
Michael Mayer
d64db46239 Lightbox: Log video.load() errors in debug mode #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-16 17:36:24 +02:00
Michael Mayer
3142c39c84 Lightbox: Explicitly load video when flipping preload flag #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-16 17:05:06 +02:00
Michael Mayer
2227aa57b2 Portal: Add cluster admin UI #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-16 16:21:56 +02:00
Michael Mayer
76f372f8f8 Lightbox: Enhance iOS compatibility when playing videos #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-16 16:18:55 +02:00
Michael Mayer
f7a0711c87 Frontend: Update package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-16 10:29:02 +02:00
Michael Mayer
e6ac194b61 Lightbox: Don't set is-playing class in playVideo() #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-16 08:32:22 +02:00
Michael Mayer
effed76095 Lightbox: Refactor video playback and styles #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-16 07:20:43 +02:00
Michael Mayer
cb9d8d236a Config: Move Portal flag to ClientConfig struct
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-15 23:32:54 +02:00
Michael Mayer
0ef0c79766 Config: Add Portal feature flag
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-15 23:19:51 +02:00
Michael Mayer
0aa34a4775 Develop: Upgrade base image from 251010-plucky to 251014-plucky
Includes the latest Go release v1.25.3

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-15 15:29:57 +02:00
Michael Mayer
ed1e5e1236 Docs: Update Title Case headings rule for documents
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-15 14:22:04 +02:00
Michael Mayer
7bb9bf0a91 Docs: Update Playwright MCP Usage
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-15 13:11:30 +02:00
Michael Mayer
71c0137446 Backend: Update github.com/golang/geo in go.mod & go.sum; update NOTICE
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 21:20:00 +02:00
Michael Mayer
b1fc7ed55c Entity: Add missing json and yaml struct field tags; update swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 21:18:34 +02:00
Michael Mayer
3f6c7062bc Develop: Allow to use internal/tmp/ as scratch space for testing
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 21:12:11 +02:00
Michael Mayer
bd3fad6457 Demo: Add protection against AI-generated vulnerability reports #5269
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 20:47:25 +02:00
Michael Mayer
32ab48921b Lightbox: Remove @mousedown and @pointerdown handlers #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 18:02:17 +02:00
Michael Mayer
37c8c83a3f Lightbox: Improve debug logs #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 16:41:44 +02:00
Michael Mayer
74fd3e7913 Docs: Update license NOTICE
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 16:09:28 +02:00
Michael Mayer
118b082ac0 Frontend: Update deps in package.json and package-lock.json #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 16:08:07 +02:00
Michael Mayer
bd1d4f45b9 UX: Refactor esc keydown handlers #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 16:07:34 +02:00
Michael Mayer
66852ac6cb Lightbox: Remove close-on-back as it is handled by view.js #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 15:58:44 +02:00
Michael Mayer
2ce3772958 Lightbox: Disable close-on-back and add close on esc down #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 15:54:54 +02:00
Michael Mayer
25c1375c4c UX: Refactor Lightbox close event handling #5258 #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-14 15:00:38 +02:00
Michael Mayer
74abddb3aa Backend: Downgrade github.com/gin-contrib/gzip in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 10:40:28 +02:00
Michael Mayer
c9fdb4c518 Lightbox: Only watchAvailability if video.castable is false #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 10:34:05 +02:00
Michael Mayer
8fc557a428 Backend: Update github.com/gin-contrib/gzip in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 10:26:48 +02:00
Michael Mayer
34751d5898 Frontend: Update deps in package.json and package-lock.json#5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 10:26:13 +02:00
Michael Mayer
3686895f42 Lightbox: Remove videoAvailabilityListener on abort #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 10:22:40 +02:00
Michael Mayer
3c25e1c9fa Lightbox: Abort any existing AbortController before reattaching #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 10:14:43 +02:00
Michael Mayer
0a9eb50fcc Lightbox: Rename data.ctrlVideoListeners to data.events #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 10:04:22 +02:00
Michael Mayer
3007706a20 Lightbox: Update frontend/CODEMAP.md #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 09:54:36 +02:00
Michael Mayer
8f97672930 Frontend: Replace } catch (_) { with } catch {
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 09:46:01 +02:00
Michael Mayer
58e040c5ac Lightbox: Use AbortController to clean up the event handlers #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 09:40:57 +02:00
Michael Mayer
fc46808d03 Lightbox: Improve state management when playing videos #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-13 05:50:14 +02:00
Michael Mayer
0b0f312b3e Backend: Upgrade all packages from "math/rand" to "math/rand/v2"
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 21:34:07 +02:00
Michael Mayer
954070871e CLI: Update remux policy and metadata docs #5261
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 20:01:31 +02:00
Michael Mayer
829d4291fd CLI: Improve photoprism dl command with additional flags #5261
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 19:41:08 +02:00
Michael Mayer
f3deeee655 Lightbox: Improve memory and event management #5260
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 17:44:03 +02:00
Michael Mayer
131f584b8e Places: Improve memory and event management #5259
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 17:06:02 +02:00
Michael Mayer
2b10245e50 Lightbox: Use this.subscriptions as array #5258
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 15:45:00 +02:00
Michael Mayer
e1fcbe024f Lightbox: Regenerate .po translation files #5258
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 15:15:29 +02:00
Michael Mayer
864934d085 Lightbox: Refactor touch and pointer event listeners #5258
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 15:03:45 +02:00
Michael Mayer
8b9d2e6459 Frontend: Improve browser capabilities check #5047
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 12:38:52 +02:00
Michael Mayer
5bc5d28b78 UX: Improve event handling in components/lightbox.vue #5258
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 12:22:52 +02:00
Michael Mayer
f55611762f Docs: Update CODEMAP.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 10:56:18 +02:00
Michael Mayer
e8473ae22a Docs: Update CODEMAP.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 10:54:37 +02:00
Michael Mayer
bce39eabfc Docs: Update SPlaywright MCP Usage guidelines
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 10:49:45 +02:00
Michael Mayer
6969e3e8a1 Docs: Update Safety & Data guidelines
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-12 09:25:54 +02:00
Michael Mayer
024a6727fe Frontend: Regenerate JSON translation files #5177
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-11 15:46:02 +02:00
Weblate
ef117ba842 Weblate: Update frontend translations 2025-10-11 15:45:22 +02:00
Michael Mayer
e145ae359d Frontend: Regenerate translations.pot #5177
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-11 15:44:03 +02:00
Michael Mayer
064bd5051c Frontend: Regenerate JSON translation files #5177
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-11 15:26:12 +02:00
Weblate
143f91e1b4 Weblate: Update frontend translations 2025-10-11 15:24:15 +02:00
Michael Mayer
864b8eadee Frontend: Regenerate translations.pot #5177
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-11 15:21:45 +02:00
Michael Mayer
4924114a53 Clean: Add Yes/No/Bool funcs consistent with strconv.ParseBool() #5191
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-11 14:35:39 +02:00
Michael Mayer
c9dc431a71 API: Add force flag and update docs for DELETE /api/v1/albums/UID #5122
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-11 14:11:29 +02:00
Ömer Duran
3e87ad9809 UX: Improve "Add to Album" dialog to support multiple albums #5177
* Frontend: add multi-select to Add to Album and support multi-target actions
* Tests: Adapt acceptance tests to changes
* Frontend: Enhance clipboard functionality by adding input validation and deduplication for album UIDs across multiple components
* Tests: Enhance album functionality tests to support adding/removing photos from multiple albums and address album duplication bug
* Tests: Improve page mdoel and remove .only
* Frontend: Increase max-width of photo album dialog from 390 to 500
* Tests: Remove unused triggerAlbumDialogAndType method
* Frontend: Remove deep watcher from album dialog and implement deduplication logic for selected albums in upload dialog
* Frontend: Update album dialog placeholder text
* Tests: Refactor album duplication test for clarity and consistency
* Tests: Cover additional test cases
* Tests: Improve acceptance tests
* Frontend: Remove error logging
* Frontend: Add utility functions for album selection and implement watcher in dialog
* Frontend: Enhance album creation logic to handle partial failures and improve user feedback
* Frontend: Fix title casing for album selection chips in dialog
* Frontend: Fix title rendering logic for album selection chips in dialog

---------

Co-authored-by: graciousgrey <theresagresch@gmail.com>
2025-10-11 13:43:41 +02:00
Michael Mayer
a3c298f617 Frontend: Add browser capabilities check #5047
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-11 12:48:30 +02:00
Michael Mayer
c0f02637a9 Forms: Improve validation to support "+" signs in email addresses #5254
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-11 11:24:10 +02:00
graciousgrey
cfb3fd18c1 Tests: Adapt tests to changes 2025-10-10 21:51:55 +02:00
Michael Mayer
e6dd2020bb Albums: Run UpdateClientConfig asynchronously #5253
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 20:25:20 +02:00
Michael Mayer
c5d17c579c Albums: Improve performance when setting/refreshing cover images #5253
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 17:51:55 +02:00
Michael Mayer
92d21af697 AI: Do not run face detection on-demand by default #5167 #5234
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 16:28:36 +02:00
Michael Mayer
958ea37fa0 AI: Do not run face detection on-schedule by default #5167 #5234
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 16:22:42 +02:00
Michael Mayer
cda6ecac83 UX: Increase person menu from opacity-80 to opacity-85 #4151 #797 #5249
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 16:04:46 +02:00
Michael Mayer
054be35f92 UX: Disable input autofocus on mobile devices #5213
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 16:03:52 +02:00
Michael Mayer
5d587cbbf2 Frontend: Update JSON translation files #4151 #797 #5249 #5252
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 14:27:59 +02:00
Weblate
e1275c97a3 Weblate: Update frontend translations 2025-10-10 14:27:18 +02:00
Michael Mayer
b28f55ff59 UX: Refactor person action menu in edit dialog #4151 #797 #5249
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 14:23:59 +02:00
Michael Mayer
f26f6ecd17 Backend: Refactor new enum package and yes/no matching #5191
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 13:40:51 +02:00
Keith Martin
b1822229ca Backend: Improve Yes/No capabilities #5191
* Backend: improve Yes/No capabilities
* Backend: constants package with Yes/No maps and True/False strings
* Backend: rename constants to enum
* Backend: correct case on russian Yes, more tests
* Enum: utilise enum package
2025-10-10 13:15:15 +02:00
Ömer Duran
1d216f2dfc UX: New Action Menu for Faces in People Editing Tab #4151 #797 #5249
* Frontend: Add 3-dot menu for face actions in people page #4151 #797
* Tests: Add unit test for manual cover setting in subjects API #4151 and #797
* Tests: Add unit tests for face actions in PeopleTab component #4151 #797
* Tests: Enhance face action functionality in PeopleTab with new tests for removing faces and setting person cover #4151 #797
2025-10-10 13:02:31 +02:00
Michael Mayer
1778c7e46c UX: Adjust thinking theme colors in options/themes.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 12:38:35 +02:00
Michael Mayer
091cd19086 UX: Update thinking theme surface color in options/themes.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 12:28:20 +02:00
Michael Mayer
a8fcf7cca2 Frontend: Update docs on Playwright MCP Usage
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 10:50:28 +02:00
Michael Mayer
31312b3e93 Frontend: Update docs on Playwright MCP Usage
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 10:22:50 +02:00
Michael Mayer
e8ceba4e2f Database: Update entity/schema/mariadb.sql
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 09:47:01 +02:00
Michael Mayer
6e41c46db0 API: Update swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 09:45:52 +02:00
Michael Mayer
85a0543df5 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 09:45:27 +02:00
Michael Mayer
ed2809b1e7 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 09:38:59 +02:00
Michael Mayer
e0b4c5d136 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 09:38:44 +02:00
Michael Mayer
4ab48cd461 Develop: Update Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 09:36:37 +02:00
Michael Mayer
670bc823c2 Develop: Upgrade base image from 251007-plucky to 251010-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 09:18:34 +02:00
Michael Mayer
fde403e3e1 Frontend: Update CODEMAP.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 09:13:20 +02:00
Michael Mayer
6373e487fc Frontend: Add docs on Playwright MCP Usage
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 09:05:43 +02:00
Michael Mayer
d36e83d2ef Develop: Remove whitespace from docker/develop/plucky/Dockerfile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 08:52:45 +02:00
Michael Mayer
1273991a7d Develop: Add xvfb and fonts to docker/develop/plucky/Dockerfile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-10 08:47:49 +02:00
Michael Mayer
4215243ab6 Cluster: Add comments to service/cluster/provisioner/database.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 17:23:19 +02:00
Michael Mayer
7c2bb9bd30 API: Remove leftover MariaDB databases and users from cluster tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 17:19:37 +02:00
Michael Mayer
01af8dd2ff CLI: Add internal/api/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 16:40:21 +02:00
Michael Mayer
e9c34f5f80 CLI: Add internal/commands/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 16:34:56 +02:00
Michael Mayer
97ab742f6b Docs: Move note on metadata sources
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 16:14:41 +02:00
Michael Mayer
683d1f90e8 Docs: Move note on shared CLI flag helpers
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 16:08:10 +02:00
Michael Mayer
132a12cae4 Docs: Add note on shared CLI flag helpers
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 16:04:31 +02:00
Michael Mayer
84cb9d9855 CLI: Reorder flags of cluster management commands
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 15:58:04 +02:00
Michael Mayer
9d968ab357 CLI: Refactor "dry-run" and "yes" command flags to use helper functions
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 15:41:35 +02:00
Michael Mayer
f125bfd638 Docs: Document preferred CLI command flags and arguments order
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 15:05:43 +02:00
Michael Mayer
81b8ed8182 Cluster: Ensure credentials are deleted after tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 14:56:45 +02:00
Michael Mayer
b46a6aef77 Metadata: Add USB to pkg/txt/specialwords.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 13:51:09 +02:00
Michael Mayer
03ca4031a5 Frontend: Update "all" route in src/app/routes.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 12:57:21 +02:00
Michael Mayer
3563d3f13c Frontend: Remove unnecessary saveWindowScrollPos() calls #5211
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 12:32:41 +02:00
Michael Mayer
0dbe118186 Frontend: Restore scroll state on back navigation #5211
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 11:57:19 +02:00
graciousgrey
c9c50fd31e Tests: Adapt tests to changes 2025-10-09 11:16:25 +02:00
Michael Mayer
a8487bf793 Frontend: Update deps in package.json and package-lock.json #5211
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 10:29:57 +02:00
Michael Mayer
db0c1a4c1d Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-09 10:29:25 +02:00
Michael Mayer
1117e0b1dc UX: Increase BatchSize from 60 to 180 in model/album.js #5211
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 19:24:02 +02:00
Michael Mayer
354414a5e1 Vision: Allow to combine default model config with custom run type #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 17:46:03 +02:00
Michael Mayer
77d6b7fe00 UX: Update "Thinking" surface theme color in options/themes.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 17:13:37 +02:00
Michael Mayer
401d910b2f Specs: Prevent auto-generated docs from getting edited manually
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 15:41:52 +02:00
Michael Mayer
3efb69483e Faces: Update README.md #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 15:08:37 +02:00
Michael Mayer
8571600a1b Faces: Update README.md #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 15:04:22 +02:00
Michael Mayer
316cd2c919 Faces: Update README.md #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 14:46:05 +02:00
Michael Mayer
87b63b71dc Faces: Update README.md #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 14:37:11 +02:00
Michael Mayer
7d05767a8f Faces: Update timestamp in README.md #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 14:35:48 +02:00
Michael Mayer
9e888703c5 Faces: Add face kinds reference to README.md #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 14:35:33 +02:00
Michael Mayer
7e64ecb77a Config: Reorganized function order in config_faces.go #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 14:02:43 +02:00
Michael Mayer
729b4c4bdb Config: Return face.EngineNone in FaceEngine() when config is nil #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 13:58:54 +02:00
Michael Mayer
3bd17fb1a2 Config: Return face.EngineNone in FaceEngine() when config is nil #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 13:54:14 +02:00
Michael Mayer
251a8dfd4a Config: Update config_vision.go and config_faces_test.go #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 13:50:48 +02:00
Michael Mayer
a302955c02 Faces: Remove PHOTOPRISM_FACE_ENGINE_RUN config option #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 13:41:51 +02:00
Michael Mayer
26b937d8b0 Config: Update config_faces.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 12:35:49 +02:00
Michael Mayer
77c9959f12 Faces: Update README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 12:35:07 +02:00
Michael Mayer
62661f597f Faces: Update internal/ai/face/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 11:34:47 +02:00
Michael Mayer
756c6fe9c1 Faces: Update internal/ai/face/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 11:33:41 +02:00
Michael Mayer
d693e2235c Setup: Update link in setup/pkg/linux/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 11:28:08 +02:00
Michael Mayer
81344c9ab1 Docs: Add style notes to AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 11:23:23 +02:00
Michael Mayer
5b83aea1f5 Setup: Update package installation docs in setup/pkg/linux/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 11:23:23 +02:00
graciousgrey
012a7605f5 Backend: Update count in scheduleModels 2025-10-08 11:14:01 +02:00
Michael Mayer
73312ada41 Setup: Update package installation docs in setup/pkg/linux/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 10:53:09 +02:00
Michael Mayer
5610f8fafb Setup: Update package installation docs in setup/pkg/linux/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 10:43:04 +02:00
Michael Mayer
3b5d185e8c Setup: Update package installation docs in setup/pkg/linux/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 10:31:14 +02:00
Michael Mayer
a59134ebd6 Setup: Update package installation docs in setup/pkg/linux/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-08 10:13:12 +02:00
Michael Mayer
9b56b4ec01 Faces: Add note on background filtering to background.go and docs #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 23:10:06 +02:00
Michael Mayer
22d8a63bfe Develop: Upgrade base image from 251006-plucky to 251007-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 22:36:32 +02:00
Michael Mayer
87b540b438 Scripts: Add shellcheck annotations and fix reported issues
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 22:32:31 +02:00
Michael Mayer
ab60112f99 AI: Update download-scrfd.sh script #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 22:16:19 +02:00
Michael Mayer
1eac265978 AI: Rename "scrfs" to "scrfd" in config and download script #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 22:12:37 +02:00
Michael Mayer
3693db0946 AI: Change download URL of scrfd model in download-scrfs.sh #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 21:54:21 +02:00
Michael Mayer
7fa6dfe0b5 Config: Set SystemLog level based on application log level #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 21:30:19 +02:00
Michael Mayer
9f22a2f73e Faces: Use system log in internal/photoprism/faces_optimize.go #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 21:19:39 +02:00
Michael Mayer
4bbba226b7 Security: Add a system log for publishing internal warnings and errors
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 21:08:04 +02:00
Michael Mayer
0d27cee391 Faces: Change search to return all face markers, regardless of src #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 20:01:43 +02:00
Michael Mayer
68e1ddcc89 AI: Improve conflict resolution when merging face clusters #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 18:58:21 +02:00
Michael Mayer
3502251f7e AI: Improve logging of face cluster merge conflicts #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 17:52:02 +02:00
Michael Mayer
698ef753e2 Frontend: Update src/locales/json/fr.json #5243
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 16:44:12 +02:00
Weblate
99c4c4bea6 Weblate: Update frontend translations 2025-10-07 16:42:52 +02:00
Michael Mayer
221d3196f4 Index: Refactor IndexOptions to determine vision tasks from Config #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 16:22:41 +02:00
Michael Mayer
f5e233194f Frontend: Update Thinking theme colors in src/options/themes.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 14:57:10 +02:00
Michael Mayer
2ff6eae58a Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 14:56:39 +02:00
Michael Mayer
5989c3578d AI: Run face detection after indexing if CPU threads <= 2 #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 14:28:41 +02:00
Michael Mayer
c71e4c8828 AI: Ensure face detection only runs once (during or after index) #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 14:16:11 +02:00
Michael Mayer
3b3a01317b AI: Add IndexedAt time to indicate when a photo was fully indexed #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 13:57:01 +02:00
Michael Mayer
8640e60c14 AI: Refactor face detection code #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-07 11:28:52 +02:00
Michael Mayer
04dd4ba24d Develop: Upgrade base image from 251004-plucky to 251006-plucky #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-06 19:07:50 +02:00
Michael Mayer
94f8a5f35d AI: Improve Face Detection with an ONNX-based model #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-06 18:51:49 +02:00
Michael Mayer
677e190b6e AI: Adjust Pigo parameters for improved Face Detection #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-06 11:51:43 +02:00
Michael Mayer
ea693e9ab7 Faces: Improve "photoprism faces audit --fix" command
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-05 18:52:30 +02:00
Michael Mayer
00d41144a0 Faces: Migrate & normalize face.Children from Embeddings to Clusters
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-05 18:11:18 +02:00
Michael Mayer
4b625d8217 Faces: Migrate out-of-distribution (OOD) embeddings to face.Background
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-05 17:38:13 +02:00
Michael Mayer
dcd4e684ae UX: Disable "public" filter under Search > Private
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-05 05:12:49 +02:00
Michael Mayer
240ee9f0ce AI: Do not add portrait or people labels from face markers #5232
Related issues: #5233 (reset command), #5234 (schedule for models)

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-05 04:37:20 +02:00
Michael Mayer
e5dc335bcf AI: Include NSFW flag & score when generating labels with Ollama #5232
Related issues: #5233 (reset command), #5234 (schedule for models)

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-05 04:23:36 +02:00
Michael Mayer
79654170eb Ollama: Remove code fences and commentary from JSON API responses
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 16:46:55 +02:00
Michael Mayer
fba00a843c Config: Add "test-hub" target to Makefile and improve log messages
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 15:59:34 +02:00
Michael Mayer
47b7a0faf7 Develop: Upgrade base image from 250930-plucky to 251004-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 15:57:52 +02:00
Michael Mayer
a988459ef0 Dockerfiles: Update environment variables and their defaults
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 15:07:40 +02:00
Michael Mayer
4275290f93 Dockerfiles: Remove optional and database password env variables
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 14:58:04 +02:00
Michael Mayer
b71ec5bce1 Config: Fix assets path and disable hub updates when running unit tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 14:16:11 +02:00
Michael Mayer
133afda8ce Frontend: Update JSON translation files #5241
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 11:06:39 +02:00
Weblate
17030940c8 Weblate: Update frontend translations 2025-10-04 11:06:00 +02:00
Michael Mayer
875275828e UX: Update class attributes for the action buttons in the Edit dialog
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 11:03:01 +02:00
Michael Mayer
6a84a2536e UX: Rename "Apply" button to "Save" and add aria-label attributes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 11:00:35 +02:00
Weblate
12df9cb954 Weblate: Update frontend translations 2025-10-04 10:58:47 +02:00
Michael Mayer
ac9d33a1b0 UX: Change "Close" button to "Discard" when there are unsaved changes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 10:40:36 +02:00
Michael Mayer
28017c47c6 Frontend: Reduce "Thinking" theme focus-opacity
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 10:38:37 +02:00
Michael Mayer
84b9f1bb1b Frontend: Adjust "Thinking" user interface theme colors
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 10:35:10 +02:00
Michael Mayer
f56dd6b197 Labels: Add Thumb and ThumbSrc properties to the frontend model #4151
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 10:00:24 +02:00
Michael Mayer
8dd3197b8c Frontend: Make Subject model a Collection #4151
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-04 09:58:49 +02:00
Michael Mayer
d7ee54ec58 API: Update Thumb/ThumbSrc for subjects and labels #4151
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-03 23:17:07 +02:00
Michael Mayer
241f1df4c4 Frontend: Add a "Collection" model type for use in lightbox.vue #4151
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-03 18:14:18 +02:00
Michael Mayer
2cc0ef7eae MariaDB: Document terminal command for running SQL statements
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-03 16:37:44 +02:00
Michael Mayer
c40bf0b47d Frontend: Update CODEMAP.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-03 14:18:57 +02:00
Michael Mayer
dc9b8d78da Frontend: Update "Thinking" user interface theme
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-03 14:09:10 +02:00
Michael Mayer
b23fc123d7 Frontend: Add new "Thinking" user interface theme
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-03 13:51:15 +02:00
Michael Mayer
006123c94c Frontend: Update deps in package.json and package-lock.json #5211
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-03 12:54:17 +02:00
Michael Mayer
99e06f5f95 UX: Improve window scroll position restoration when navigating #5211
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-03 12:47:47 +02:00
Michael Mayer
a6f153b065 Faces: Add in-memory veto cache to avoid conflicts #4669 #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 23:00:44 +02:00
Michael Mayer
30dfacaab7 Faces: Optimize matching performance with spatial index #4669 #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 22:00:11 +02:00
Michael Mayer
8fdf405288 Faces: Optimize distance-based matching #4669 #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 21:27:55 +02:00
Michael Mayer
f7dff58f2e Faces: Normalize stored face embeddings and distances #4669 #5167
Run `photoprism faces audit --fix` to normalize existing embeddings.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 21:04:35 +02:00
Michael Mayer
cdee55fdf8 Faces: Add README.md for detection & embeddings #4669 #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 20:15:47 +02:00
Michael Mayer
dcb3dd6f18 Faces: Optimized midpoint computation and performance #4669 #5167
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 19:21:29 +02:00
Michael Mayer
d19d59632d Vision: Improve performance of Areas.Relative() in face/area.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 17:35:54 +02:00
Michael Mayer
9d81edcff7 Vision: Add comments and tests for internal/ai/face/landmarks.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 17:18:52 +02:00
letreturn
c57cacb834 Benchmarks: Use b.Loop() to simplify the code and enhance performance #5226
Signed-off-by: letreturn <letreturn@outlook.com>
2025-10-02 17:00:13 +02:00
Michael Mayer
1d984fb8b0 Docs: Improve code comments in internal/entity/passcode.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 16:27:22 +02:00
Michael Mayer
6218c7dda6 Docs: Update code comments in internal/entity/category.go and details.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 16:19:57 +02:00
Michael Mayer
5dda30e7e9 Docs: Improve code comments in internal/entity/country.go and cell.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 16:19:24 +02:00
Michael Mayer
0893e1ac80 Docs: Improve code comments in internal/entity/auth*.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 16:15:18 +02:00
Michael Mayer
71f00e9f4f Docs: Improve code comments in internal/entity/src.go and string.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 16:08:22 +02:00
Michael Mayer
c22201331d Docs: Improve code comments in internal/entity/entity*.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 16:05:56 +02:00
Michael Mayer
51083caef8 Docs: Improve code comments in internal/entity/label*.go and keyword.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 16:03:02 +02:00
Michael Mayer
7a5b623a83 Docs: Improve code comments in internal/entity/album*.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 15:59:38 +02:00
Michael Mayer
cdea0e5664 Docs: Improve code comments in internal/entity/file*.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 15:55:44 +02:00
Michael Mayer
59b54663d8 Docs: Improve code comments in internal/entity/photo*.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 15:52:05 +02:00
Michael Mayer
0ca3310f0a Backend: Fix internal/service/cluster/provisioner/naming_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 15:15:45 +02:00
Michael Mayer
b00dd133db Test: Use PascalCase names for all Go subtests in /pkg
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 15:03:47 +02:00
Michael Mayer
94b6631b3d Test: Use PascalCase names for all Go subtests in /internal
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 14:50:02 +02:00
Michael Mayer
c68493da8a Test: Document use of CamelCase names for Go subtests in /internal
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 14:40:09 +02:00
Michael Mayer
54d5659a93 Vision: Move PriorityFromTopicality() to topicality.go #5232
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 14:18:36 +02:00
Michael Mayer
1aa6fe4f35 Vision: Export PriorityFromTopicality() in label_normalizer.go #5232
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 14:16:11 +02:00
Michael Mayer
713beeff0f Labels: Improve conversion of topicality scores into priorities #5232
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 14:12:11 +02:00
Michael Mayer
c57387d119 AI: Add "on-newly-indexed" alias for "newly-indexed" in RunTypes #5234
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 13:26:57 +02:00
Michael Mayer
088bdff69d Frontend: Update JSON translation files #5232 #5237
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 13:18:46 +02:00
Weblate
662d233fa3 Weblate: Update frontend translations 2025-10-02 13:17:42 +02:00
Michael Mayer
470724f75a Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 13:15:00 +02:00
Michael Mayer
b2805a63a3 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 13:14:43 +02:00
Michael Mayer
c81f9f4b3f Frontend: Fix update target in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 13:14:07 +02:00
Michael Mayer
746f26724c AI: Improve the generation, sorting, and filtering of labels #5232
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-02 13:08:52 +02:00
graciousgrey
ac91c98ed0 AI: Decouple NSFW detection from label generation #5234 2025-10-02 12:53:07 +02:00
Michael Mayer
fe0d51a5ac Labels: Change defaultOrder in frontend/src/page/labels.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 19:52:21 +02:00
Michael Mayer
6cbc7aa20c Labels: Sort results by picture count instead of label name
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 19:39:03 +02:00
Michael Mayer
858840c59a Scripts: Update version in dist/install-nuclei.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 18:30:57 +02:00
Michael Mayer
7dd3218493 Entity: Fix Map type alias in internal/entity/migrate/migrate.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 09:58:18 +02:00
Michael Mayer
8490e79a46 AI: Remove duplicate comments from label_normalizer.go #5232
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 09:25:08 +02:00
Michael Mayer
0eca39428f AI: Use classify.Rules and a new prompt to improve Ollama labels #5232
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 09:20:51 +02:00
Michael Mayer
54d96f613b CLI: Ensure vision reset command and worker use same default src #5233
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 08:52:28 +02:00
Michael Mayer
a49cecd5f7 Entity: Re-add Map shorthand alias for map[string]interface{}
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 08:48:45 +02:00
Michael Mayer
6ddcc8a585 Develop: Update .gitignore and .dockerignore files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 02:00:20 +02:00
Michael Mayer
bd1be3346e AI: Prevent adding labels without title or slug #5232 #5233 #5234
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 01:40:34 +02:00
Michael Mayer
9b5ee0513b AI: Allow underscores in vision model names #5232 #5233 #5234
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 00:59:40 +02:00
Michael Mayer
b52c66624f AI: Update comments in the internal/ai/vision/ollama and openai engines
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 00:37:49 +02:00
Michael Mayer
6490d158be AI: Refactor engine defaults in internal/ai/vision/** #5232 #5233 #5234
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-10-01 00:27:36 +02:00
Michael Mayer
838adee3eb Backend: Refactor middleware naming and improve code comments #5235
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 23:25:53 +02:00
Michael Mayer
873454ddd2 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 23:10:24 +02:00
Michael Mayer
07f1d2a434 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 23:09:36 +02:00
Michael Mayer
9315e87d45 NVIDIA: Refactor ffmpeg.DefaultAvcEncoder() function
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 22:51:10 +02:00
Michael Mayer
46ae2fa208 Docs: improve testing notes in AGENTS.mdd
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 22:22:45 +02:00
Michael Mayer
bb503a7322 WebDAV: Use isolated test environments for server/webdav_write_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 22:17:13 +02:00
Michael Mayer
983cbb50ff API: Add const, func, and struct comments for easier troubleshooting
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 22:02:43 +02:00
Michael Mayer
bbf6580512 Meta: Add const, func, and struct comments for easier troubleshooting
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 22:00:30 +02:00
Michael Mayer
ece066fb47 Event: Add code comments for easier troubleshooting #5235
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 21:55:54 +02:00
Michael Mayer
8c59d17993 Config: Add code comments for easier troubleshooting #5235
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 21:54:22 +02:00
Michael Mayer
6d551c5939 Query: Add code comments for easier troubleshooting #5235
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 21:46:42 +02:00
Michael Mayer
f49328345e Index: Fix in-memory Files/Photos lookup tables #5235
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 21:30:21 +02:00
Michael Mayer
e3925d779f Backend: Improve inline code comments
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 20:41:36 +02:00
Michael Mayer
52cc66af6d AI: Improve entity.Photo.ShouldGenerateLabels() check #5232 #5233 #5234
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 18:31:21 +02:00
Michael Mayer
7de88e0ec9 Develop: Upgrade base image from 250922-plucky to 250930-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 16:18:39 +02:00
Michael Mayer
fddd3c9626 Scripts: Update dist/install-yt-dlp.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 16:06:50 +02:00
Michael Mayer
4d4cac446e Docker: Add package xxd to develop/plucky/Dockerfile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 15:52:45 +02:00
Michael Mayer
d782a43c2b AI: Configure vision model execution and scheduling #5232 #5233 #5234
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 15:51:48 +02:00
graciousgrey
0c9f82a641 Makefile: Remove unused test targets 2025-09-30 13:02:23 +02:00
Michael Mayer
3f8f39e117 AI: Add a setting to specify when vision models should run #5234
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 10:52:11 +02:00
Michael Mayer
47def3c791 API: Removed unused code from api_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 01:28:49 +02:00
Michael Mayer
70aced3b12 API: Remove temporary SQLite files before running tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 01:27:16 +02:00
Michael Mayer
9c5abb05ad AI: Generate caption/labels in the background after indexing #5232 #5233
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-30 01:18:55 +02:00
Michael Mayer
327e1d587e AI: Automatically set model defaults and use default source #5232 #5233
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 23:09:29 +02:00
Michael Mayer
84e11829dc CLI: Refactor "photoprism vision" subcommands #5233
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 21:39:36 +02:00
Michael Mayer
e21174c297 CLI: Add txt.JoinAnd() helper function to format lists of items #5233
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 19:25:47 +02:00
Michael Mayer
7ae7ce9edd Tests: Update entity.FindPhoto() usage example
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 19:03:52 +02:00
Michael Mayer
ee46794509 CLI: Add "photoprism vision reset" command to reset metadata #5233
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 18:59:52 +02:00
Michael Mayer
114f4033e0 Docs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 17:25:14 +02:00
Michael Mayer
72de6c8db7 AI: Add Model.Provider value to set defaults by provider type #5232
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 14:20:30 +02:00
Michael Mayer
40c5c4d712 AI: Add ApiFormat constants to vision/ollama and vision/openai #5232
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 11:58:42 +02:00
Michael Mayer
e4f78a19ac Backend: Remove temporary SQLite files before running unit tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 11:49:10 +02:00
Michael Mayer
7cc758346f AI: Add source "ollama" for labels generated with Ollama models #5232
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 11:45:08 +02:00
Michael Mayer
3f9d6863db Vision: Add ModelTypeGenerate for multi-modal models that return JSON
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 10:39:09 +02:00
Michael Mayer
3e14eed7d7 Scripts: Update success and error messages
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-29 09:47:29 +02:00
Michael Mayer
8a7c61f467 AI: Generate Labels using the Ollama API #5232
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-28 13:29:49 +02:00
Michael Mayer
cf06f52025 AI: Add vision/ollama and vision/openai packages for service integration
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-28 11:07:43 +02:00
Michael Mayer
a58fa36f34 Develop: Add "build-docker" as an alias for "docker-build" to Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-27 11:59:18 +02:00
Michael Mayer
7919b9ddc2 Develop: Improved "npm-version" and "codex-version" output in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-27 11:56:08 +02:00
Michael Mayer
1e7786ad1c Develop: Update "npm" install targets in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-27 11:47:12 +02:00
Michael Mayer
e888b0ddb1 FFmpeg: Remove unstable "directory is unwritable" tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-27 11:46:27 +02:00
Michael Mayer
44f561b7d6 CLI: Add "photoprism dl --format-sort" flag and dl-method env variable
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 15:51:50 +02:00
Michael Mayer
cbda4abe7a Downloads: Add CLI reference to photoprism/dl/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 14:35:37 +02:00
Michael Mayer
a3dac7c707 Metadata: Update folder_test.go, photo_estimate_test.go, country_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 11:44:27 +02:00
Michael Mayer
4d91f5ffdf Metadata: Update TestCountryCode in pkg/txt/country_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 11:27:16 +02:00
Michael Mayer
1b48cb2a25 Metadata: Remove ambiguous location names from countries.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 11:25:56 +02:00
Michael Mayer
58180accee Config: Require secure cluster join tokens >= 24 chars #98 #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 11:01:48 +02:00
Michael Mayer
52337eba27 Cluster: Renamed service/cluster/instance to cluster/node #98 #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 07:01:09 +02:00
Michael Mayer
90f62a732e API: Add internal/api/cluster_metrics_test.go #98 #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 06:59:05 +02:00
Michael Mayer
bc6c34cb2b API: Add GET /api/v1/cluster/metrics endpoint #98 #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 06:36:23 +02:00
Michael Mayer
9f119a8cfa Auth: Return and persist ClusterCIDR when registering a node #98 #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 06:17:31 +02:00
Michael Mayer
66e2027c10 Auth: Shorten code comments in pkg/clean/scope.go #98 #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 05:55:50 +02:00
Michael Mayer
bd66110c18 Auth: Improve code comments in internal/auth/acl/scopes.go #98 #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 05:53:28 +02:00
Michael Mayer
07658dac69 Docs: Recommend acl.Scope* functions for scope checks #98 #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 05:49:23 +02:00
Michael Mayer
108b2c2df4 Auth: Recommend acl.ScopeAttrPermits / acl.ScopePermits #98 #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 05:45:59 +02:00
Michael Mayer
48a965a7cc API: Refactor JWT-based request authorization #98 #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 05:32:30 +02:00
Michael Mayer
32c054da7a CLI: Added JWT issuance and diagnostics sub commands #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-26 02:38:49 +02:00
Michael Mayer
566eed05e0 Backend: Remove temporary SQLite files after running unit tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-25 23:21:48 +02:00
Michael Mayer
660c0a89db Backend: Introduce optimized test config helpers to improve performance
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-25 23:09:52 +02:00
Michael Mayer
ebb0410b20 Docs: Add reminder to keep "Last Updated" lines updated
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-25 20:28:08 +02:00
Michael Mayer
7e419f7419 Docs: Add "Last Updated" timestamps to AGENTS.md and CODEMAP.md files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-25 20:08:45 +02:00
Michael Mayer
633d4222ab Auth: Improve JWKS Fetch Concurrency & Timeouts #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-25 18:46:24 +02:00
Michael Mayer
bae8ceb3a7 Auth: Support asymmetric JSON Web Tokens (JWT) and Key Sets (JWKS) #5230
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-25 17:52:44 +02:00
Michael Mayer
4828c0423d Docs: Update Go package documentation requirements
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-25 14:22:23 +02:00
Michael Mayer
cb81f9be12 FFmpeg: Add descriptions to encoder packages in internal/ffmpeg/
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-25 14:20:35 +02:00
Michael Mayer
4ea6e12a10 Docs: Update development quick tips
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-24 13:05:25 +02:00
Michael Mayer
41a7045c26 Docs: Update descriptions of permission variables
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-24 09:59:56 +02:00
Michael Mayer
c202a09241 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-24 08:29:09 +02:00
Michael Mayer
61ced7119c Auth: Refactor cluster configuration and provisioning API endpoints #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-24 08:28:38 +02:00
Michael Mayer
3baabebf50 Docs: Update Go test guidelines
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-23 16:39:13 +02:00
Michael Mayer
0a66f1476d Develop: Upgrade base image from 250912-plucky to 250922-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 11:10:06 +02:00
Michael Mayer
59fb8e2b4c API: Update Swagger usage notes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 10:56:34 +02:00
Michael Mayer
8930cb7b79 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 10:46:22 +02:00
Michael Mayer
ade3b40a42 Docker: Add "python" symlink to develop/plucky/Dockerfile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 10:45:12 +02:00
Michael Mayer
9ea5f0596c Backend: Add security-focused tests, harden WebDAV and use safe.Download
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 10:42:53 +02:00
Michael Mayer
a22babe3d1 API: Update swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 06:20:47 +02:00
Michael Mayer
bfd26c55e3 Config: Update visibility/order of cluster options and flags #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 05:37:54 +02:00
Michael Mayer
578fbe4d10 API: Add missing Swagger endpoint annotations and update swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 04:12:02 +02:00
Michael Mayer
c8964fdc6b Make: Improve "reset-sqlite" target to delete all SQLite test databases
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 04:06:24 +02:00
Michael Mayer
eca06dcdfb Config: Remove redundant InitializeTestData tests
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 03:34:51 +02:00
Michael Mayer
38cdde5518 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 03:33:32 +02:00
Michael Mayer
2a113f167d Docs: Update CODEMAP.md and AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 03:24:56 +02:00
Michael Mayer
91804b9652 Backend: Improve Copy()/Move() and increase pkg/internal test coverage
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-22 03:07:51 +02:00
Michael Mayer
458a320bb8 Pkg: Add fs.Exists() function to check for any existing file/dir/link
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-21 23:09:33 +02:00
Michael Mayer
c312c0d109 Docs: Update CODEMAP.md and AGENTS.md #5220
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-21 19:58:56 +02:00
Michael Mayer
6e33575ba7 CLI: Skip help sub-commands in "photoprism show commands" output #5220
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-21 19:51:22 +02:00
Michael Mayer
d6cb6b7a2e CLI: Add "photoprism show commands" command to generate CLI docs #5220
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-21 19:34:39 +02:00
Michael Mayer
f1c57c72d8 CLI: Flatten config options output when using the "--json" flag #5220
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-21 16:52:56 +02:00
Michael Mayer
25253afcf2 Docs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-21 14:41:57 +02:00
Michael Mayer
f878ca0cb0 Docs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-21 14:39:56 +02:00
Michael Mayer
93493aba28 Docs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-21 14:17:54 +02:00
Michael Mayer
6901225a2b CLI: Add "--json" as an additional output format to show commands #5220
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-21 13:46:59 +02:00
Michael Mayer
ecdec6b408 CLI: Update Download CLI developer docs and testing hints #5219
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-20 14:59:48 +02:00
Michael Mayer
f7fe6b569a CLI: Improve "photoprism dl" post-processing and default settings #5219
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-20 14:36:41 +02:00
Michael Mayer
5e84da55e5 CLI: Improve "photoprism dl" to download multiple URLs with auth #5219
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-20 13:14:58 +02:00
Michael Mayer
d447adc59c Index: Don't fail if thumbs for a sidecar file cannot be created
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 07:53:06 +02:00
Michael Mayer
41da164469 Backend: Add fix for concurrent cleanups to convert_sidecar_json.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 07:06:33 +02:00
Michael Mayer
29ca2c1331 CLI: Improve "photoprism cluster" sub-commands #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 06:52:45 +02:00
Michael Mayer
2fe48605a2 Auth: Update cluster/instance/bootstrap.go and registry/client.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 05:21:17 +02:00
Michael Mayer
75af48c0c0 API: Refactor the node registry to use the entity.Client model #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 04:15:53 +02:00
Michael Mayer
13e1c751d4 API: Update entity.Client and cluster config options #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 01:13:32 +02:00
Michael Mayer
f6f4b85e66 Specs: Update AGENTS.md and CODEMAP.md to reflect code changes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 01:10:23 +02:00
Michael Mayer
eee1b3fbfc Import: Fix duplicates handling in internal/photoprism/import_worker.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 18:05:13 +02:00
Michael Mayer
ce2d793a48 API: Update internal/api/cluster_nodes_register_test.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:57:58 +02:00
Michael Mayer
83a12fb58b API: Clean up nodes dir in internal/api/api_test.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:51:23 +02:00
Michael Mayer
1315df8c1f Auth: Reformat internal/auth/acl/roles_test.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:39:50 +02:00
Michael Mayer
c9e6b7c22b Auth: Add tests to internal/auth/acl/roles_test.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:35:11 +02:00
Michael Mayer
518079450e Docs: Update quick start tips
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:32:26 +02:00
Michael Mayer
aa5368e00a Docs: Update quick start tips
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:29:19 +02:00
Michael Mayer
1c3009d9b5 Auth: Add alias for RoleNone and improve unit tests coverage #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:10:39 +02:00
Michael Mayer
2818a9e6a8 Auth: Add "instance" and "service" roles, fix entity/auth_client.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 15:23:06 +02:00
Michael Mayer
464a64339f Tests: Fix internal/photoprism/import_worker_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 15:07:14 +02:00
Michael Mayer
b40e4c5597 CLI: Improve usage descriptions of client/user management commands #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 14:30:19 +02:00
Michael Mayer
887a39e7d9 Auth: Add "node" and "portal" roles, refactor session entity #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 13:33:18 +02:00
Michael Mayer
2a116cffb3 API: Remove auth check from cluster health endpoint #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 10:28:02 +02:00
Michael Mayer
1f10dcaf85 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 09:52:43 +02:00
Michael Mayer
202d513019 Scripts: Update dist/install-nodejs.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 09:52:02 +02:00
Michael Mayer
e221a8ee73 Frontend: Update npm install targets in Makefile and package.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 09:51:11 +02:00
Michael Mayer
fb27969e30 Dev: Add "git-pull" target to Makefile (pulls all changes)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 09:05:57 +02:00
Michael Mayer
4a7c355d28 Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 08:45:30 +02:00
Michael Mayer
c7380111b2 Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 14:49:20 +02:00
Michael Mayer
40a4dbfe26 API: Improve cluster theme endpoint and tests #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 14:28:30 +02:00
Michael Mayer
1ab4c32ee8 Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 14:25:51 +02:00
Michael Mayer
19b09ebf0b Specs: Update AGENTS.md and CODEMAP.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 12:01:52 +02:00
Michael Mayer
00088d66cd Specs: Update AGENTS.md and CODEMAP.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 11:56:36 +02:00
Michael Mayer
e04df34453 Specs: Add CODEMAP.md and frontend/CODEMAP.md files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 00:50:23 +02:00
Michael Mayer
e1d031bea7 Config: Add cluster instance bootstrap and registration hook #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 23:30:23 +02:00
Michael Mayer
ec8ea96f31 Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 23:17:56 +02:00
Michael Mayer
b3fec4a2f5 Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 22:12:50 +02:00
Michael Mayer
0ce82056ca Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 21:42:35 +02:00
Michael Mayer
dbf1650c1c CLI: Add cluster operations and management commands #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 18:09:09 +02:00
Michael Mayer
5db044284b Frontend: Update Makefile, package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 18:06:11 +02:00
Michael Mayer
3c821a3ea7 Frontend: Add "@ctrl/tinycolor" version override to package.json
Popular Tinycolor npm Package Compromised in Supply Chain Attack:
https://socket.dev/blog/tinycolor-supply-chain-attack-affects-40-packages

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 10:34:51 +02:00
Michael Mayer
5a4e03eff0 Update .gitignore and .dockerignore files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 15:04:39 +02:00
Michael Mayer
a4cd1ac1fd API: Move "service/cluster" package from "pkg" to "internal" #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 13:40:56 +02:00
Michael Mayer
ea8d413deb Config: Add "portal-uuid" to report.go and improve usage description #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 10:55:40 +02:00
Michael Mayer
b5c9e9f160 Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 10:44:36 +02:00
Quentin BARON
d3775f02e6 API: Add cluster operations endpoints to manage and register nodes #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 06:43:43 +02:00
Michael Mayer
efbcf34588 Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 04:43:37 +02:00
Michael Mayer
ced562dfb3 API: Update swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-14 21:40:55 +02:00
Michael Mayer
e639c962d7 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-14 20:13:42 +02:00
Michael Mayer
efd55b50d9 Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-14 20:13:13 +02:00
Michael Mayer
8de7fa35af CI: Add Instructions for GitHub Copilot
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-14 20:12:15 +02:00
Michael Mayer
970a0a190e Config: Improve site-url and internal-url usage descriptions #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-14 14:51:23 +02:00
Michael Mayer
f0b9faac8b Setup: Fix typo in WEBUI_URL example
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-13 15:21:57 +02:00
Michael Mayer
023fbe3a1d Pkg: Add service/cluster package & rename media/http → service/http #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-13 12:58:28 +02:00
Michael Mayer
3f11165f61 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-13 04:12:10 +02:00
Michael Mayer
c36e66c847 Config: Add fs.ExtYml file extension const for transitioning to ".yaml"
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-13 02:09:22 +02:00
Michael Mayer
dbf0fa6c25 Scripts: Add dist/install-codex.sh and update Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-13 01:23:50 +02:00
Michael Mayer
4ea628af5c Dev: Update Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 23:40:37 +02:00
Michael Mayer
cd81094d25 Setup: Add "open-webui" service to compose.yaml config examples
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 16:13:17 +02:00
graciousgrey
11c7d9f7af API: Improve swagger annotations 2025-09-12 15:46:49 +02:00
Michael Mayer
64da1d36ed AI: Fix "photoprism-vision" service in compose.yaml (development only)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 15:29:52 +02:00
Michael Mayer
e45a23f9a4 AI: Add "open-webui" service to compose.yaml (development only)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 15:28:59 +02:00
Michael Mayer
cc93144bcb Develop: Upgrade base image from 250907-plucky to 250912-plucky
Includes additional CLI tool packages for development.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 14:06:48 +02:00
Michael Mayer
7ff62e0194 Config: Update flags and options for cluster configuration #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:52:37 +02:00
Michael Mayer
ce6546c635 Docker: Update env variables in compose.yaml files (development only)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:15:52 +02:00
Michael Mayer
b894079f62 Dev: Reformat Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:11:52 +02:00
Michael Mayer
7bed1cd46a Dev: Update "dep-codex" target in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:11:03 +02:00
Michael Mayer
886794874d Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:10:26 +02:00
Michael Mayer
55755f6ede Dev: Add ".local" to ignore files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:10:07 +02:00
Michael Mayer
acdf91d668 Dockerfiles: Add system packages for the development environment
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:07:53 +02:00
Michael Mayer
f84bfbefaa Docker: Update Dockerfiles for development base images
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 11:38:32 +02:00
Michael Mayer
9d79f448bd Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 11:34:56 +02:00
Michael Mayer
3f519b7a87 Docker: Update compose.yaml files for development environment
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 11:17:41 +02:00
Michael Mayer
cdbd6a9fb6 Dev: Update .gitignore and .dockerignore files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 11:16:35 +02:00
Michael Mayer
aaf222e29b Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 10:49:48 +02:00
Michael Mayer
29dcf7070c Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 10:35:57 +02:00
Michael Mayer
9bb323f965 Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 10:26:48 +02:00
Michael Mayer
0d572032a9 API: Add GET /cluster/theme endpoint and refactor config package #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-11 06:47:45 +02:00
Michael Mayer
68d387778e Frontend: Harden NPM usage and add version overrides to package.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 12:56:40 +02:00
Michael Mayer
71f5bab407 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 11:24:37 +02:00
Michael Mayer
08616ae426 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 11:24:14 +02:00
graciousgrey
5ee5974188 AI: Increase vision client timeout 2025-09-09 10:56:12 +02:00
Michael Mayer
ea5dd3c002 Develop: Add a note about the naming of photoprism binaries to AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 09:55:36 +02:00
Michael Mayer
28b9c39f1b Develop: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 09:10:53 +02:00
Michael Mayer
f948cd4efb Develop: Update Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 05:21:38 +02:00
Michael Mayer
a806ef8d71 Develop: Update tips for watching frontend changes in AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:44:50 +02:00
Michael Mayer
c27052a735 Develop: Add Docker Compose examples in AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:40:20 +02:00
Michael Mayer
4f3b694164 Develop: Improve Docker Compose examples in AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:28:37 +02:00
Michael Mayer
634445fb97 Develop: Add docker compose logs -f example to AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:25:22 +02:00
Michael Mayer
6cdca39fad Develop: Add a note about Windows to AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:18:29 +02:00
Michael Mayer
6a57daffb4 Develop: Refine examples and context in AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:10:46 +02:00
Michael Mayer
13730174fe Develop: Add/update "help" and "list" targets in Makefiles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 03:36:37 +02:00
Michael Mayer
632cc1f425 Develop: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 02:44:19 +02:00
Michael Mayer
f0df9d2c88 Develop: Shorten AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 02:30:11 +02:00
Michael Mayer
5afc09ecaf Develop: Add AGENTS.md file
Provides guidelines and context for coding agents:
- https://agents.md/
- https://agentsmd.net/

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 02:24:14 +02:00
graciousgrey
cc0661eff6 AI: Improve rules.yml 2025-09-08 10:16:25 +02:00
Michael Mayer
a6f66127fb Config: Update Progressive Web App (PWA) flag usage and defaults
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 22:03:05 +02:00
Michael Mayer
7d3978cfd4 UX: Update Default and Lightbox themes in frontend/src/options/themes.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 19:29:12 +02:00
Michael Mayer
e7d4bc509d Frontend: Update deps in package.json and package-lock.json #5014 #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 16:25:48 +02:00
Michael Mayer
d44b85a0df Frontend: Update src/locales/json/fr.json #5196
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 16:08:01 +02:00
Michael Mayer
b0c3572432 Backend: Refactor function calls with missing params... after Go update
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 16:02:54 +02:00
Michael Mayer
cb9ada8478 Develop: Upgrade base image from 250822-plucky to 250907-plucky
Includes Go v1.25.1

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 15:30:17 +02:00
Ömer Duran
95c6743b2c Tests: Remove Karma / Mocha and switch to Vitest #4995 #5014 #5087
* Tests: Remove unused Karma configuration and test files

This commit deletes the Karma configuration file and  test files that are no longer needed

* Tests: Refactor setup file for Vitest and remove legacy vue-setup.js

* Tests: Update truncate test case to use Vitest string

* Tests: Add unit tests for PLocationInput component using Vitest

* Tests: Improve unit tests for PLoadingBar component

* Tests: Move karma test to vitest

* Frontend: Update deps in package-lock.json

* Tests: Adapt test to vitest

* Tests: Refactor Makefile and package.json for test commands
2025-09-07 15:29:01 +02:00
Michael Mayer
22863b8b0f Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 14:58:55 +02:00
Michael Mayer
351c3688b8 Merge pull request #5196 from photoprismci/weblate-photoprism-frontend 2025-09-04 20:25:20 +02:00
Weblate
95ac440d28 Weblate: Update frontend translations 2025-09-04 18:02:04 +00:00
Michael Mayer
2e3d187938 API: Update swagger.json endpoint documentation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 16:34:32 +02:00
Michael Mayer
e7e49c3644 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 16:33:29 +02:00
Michael Mayer
f2ec047c85 Frontend: Update *.json translation files in src/locales/json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 16:18:24 +02:00
Weblate
9545cd8a3e Weblate: Update frontend translations 2025-09-03 16:17:26 +02:00
Michael Mayer
34c66ebfdd Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 16:13:14 +02:00
Michael Mayer
22d7e65f3f Frontend: Refactor source name translations in the edit dialog
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 16:11:53 +02:00
Michael Mayer
f5a4aacc5c Videos: Log ffmpeg command in debug mode #5189
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 11:48:06 +02:00
Michael Mayer
c36bb566af Videos: Refine still image extraction with ffmpeg #5189
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 11:44:09 +02:00
Michael Mayer
a88580af7c AI: Update compose.yaml config examples #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-02 11:06:11 +02:00
Michael Mayer
9ea676c7e5 AI: Add "photoprism vision sources" CLI command #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-02 11:01:52 +02:00
Michael Mayer
2dc82bfa48 Videos: Improve log message when image extraction fails #5189
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 18:12:12 +02:00
Michael Mayer
ff2c3b9559 Videos: Skip non-keyframes when extracting images with FFmpeg #5189
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 18:02:23 +02:00
Michael Mayer
a0b44b2ca2 Setup: Update Ollama service examples in compose.yaml files #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 16:03:27 +02:00
Michael Mayer
c3537b10e5 AI: Use "gemma3" as default caption model #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 14:54:49 +02:00
Keith Martin
aa6c62abcb Search: Add escaping capability for the characters "|" and "&" #5188
* Backend: Add query escape capability
* Tests: escape capability verification
* Backend: Clean up comments and remove commented out code.
2025-09-01 14:00:26 +02:00
Michael Mayer
19fff8b0bf Setup: Update Ollama service examples in compose.yaml files #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 13:07:22 +02:00
Michael Mayer
fccdc50e6e AI: Update ApiRequestOptions in internal/ai/vision/api_request.go #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 12:21:38 +02:00
Michael Mayer
7de8ee88d8 Setup: Update Ollama service examples in compose.yaml files #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 12:08:33 +02:00
Michael Mayer
2c17b21569 AI: Update caption model defaults to work with Ollama #127 #5123 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 11:18:28 +02:00
Michael Mayer
09e8a15a7f AI: Update testdata/vision.yml #127 #5123 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:52:50 +02:00
Michael Mayer
6c61eb5010 AI: Change Ollama caption default prompt #127 #5123 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:51:50 +02:00
Michael Mayer
6766cc330d AI: Add Ollama options to model configuration #127 #5123 #5011
This also renames the Meta option to TensorFlow so it is clear these
values are to configure TensorFlow models only.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:13:16 +02:00
Michael Mayer
b887ef9aed Config: Refactor options and command flags
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:04:05 +02:00
Michael Mayer
de4b8b9539 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:02:04 +02:00
Michael Mayer
8241f1c559 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:01:44 +02:00
Michael Mayer
fd6216ad3a CLI: Update command flag description in migrations.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-29 10:03:22 +02:00
Michael Mayer
a8dd73737f CLI: Update command flag usage descriptions
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 19:36:08 +02:00
Michael Mayer
619949ffc1 CLI: Update usage description of "backup-database" flag
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 19:29:20 +02:00
Michael Mayer
0357bc9abd CLI: Update usage descriptions for Boolean command flags
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 19:10:36 +02:00
Michael Mayer
68590ab408 API: Update metrics endpoint swagger documentation #213
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 16:16:42 +02:00
Michael Mayer
27d6834a22 Thumbs: Update package config, add IccProfilesPath & ExamplesPath #5178
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 15:39:12 +02:00
Michael Mayer
1b437c38f4 Auth: Add portal resource grants #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 12:14:50 +02:00
graciousgrey
5b61fe3782 Tests: Improve unit test to be case-insensitive 2025-08-28 11:42:18 +02:00
Michael Mayer
7bebf3bd60 API: Update swagger endpoint documentation #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 11:20:00 +02:00
Michael Mayer
0823dceab1 API: Update swagger endpoint documentation #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 11:13:28 +02:00
Michael Mayer
8337eb268c API: Update swagger endpoint documentation #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 11:00:19 +02:00
Michael Mayer
b1eda7abe1 API: Update swagger endpoint documentation #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 10:56:30 +02:00
Michael Mayer
cfe1bf62fd Backend: Update github.com/stretchr/testify in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 09:54:32 +02:00
Michael Mayer
45e998d941 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 09:54:11 +02:00
Michael Mayer
0cb4acbc20 Develop: Add "traefik.docker.network" label to compose.yaml files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 09:52:44 +02:00
Michael Mayer
a1ea21161b API: Update swagger endpoint documentation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-27 17:16:03 +02:00
Michael Mayer
e9fca94656 API: Update swagger endpoint documentation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-27 17:08:06 +02:00
Michael Mayer
2e15e1868f API: Update swagger endpoint documentation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-27 16:57:02 +02:00
Michael Mayer
9980cf5bdc AI: Reduce vision API client timeout from 10 to 5 minutes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-27 09:54:37 +02:00
Michael Mayer
6e50ef0135 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-26 08:58:38 +02:00
Michael Mayer
09ce6c77de Develop: Update .gitignore
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-26 08:56:03 +02:00
Michael Mayer
16dc286976 Develop: Add Docker Compose "down" target to Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-26 08:54:52 +02:00
Michael Mayer
46683a155c Backend: Upgrade Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-26 08:54:17 +02:00
Michael Mayer
7470924a84 Develop: Add upload config options to compose.yaml files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-26 08:44:37 +02:00
Michael Mayer
8a976825bf Develop: Add start-traefik and stop-traefik targets to Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-25 09:45:45 +02:00
Keith Martin
e80c1e1df7 Docker: Ensure that cmd.sh terminates its child processes when the parent script closes #5172
* Scripts: Ensure that child processes are terminated when parent script closes
* Scripts: Exclude pgrep process id from kill
2025-08-24 12:44:38 +02:00
Michael Mayer
c7e71bbbe2 CLI: Refactor photoprism/dl test suite
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-23 14:31:39 +02:00
Michael Mayer
37908ca3b5 Develop: Upgrade base image from 250808-plucky to 250822-plucky
Includes the latest dependencies, such as Go v1.25.0.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-22 15:28:19 +02:00
Michael Mayer
2a8e991550 CLI: Skip remaining YouTube download tests until issues are resolved
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-22 15:08:24 +02:00
Michael Mayer
a55a4f8ae4 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-22 10:58:56 +02:00
Michael Mayer
eba9e89380 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-22 10:58:28 +02:00
Oleksandr Redko
589ed92904 Videos: Refactor slice to array conversion (#5150) 2025-08-22 10:55:28 +02:00
Michael Mayer
41804a262b CLI: Skip YouTube download tests until issues are resolved
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-20 13:17:50 +02:00
graciousgrey
597593f4ee Tests: Adapt fixtures to have valid slugs 2025-08-19 19:44:23 +02:00
Michael Mayer
e3e034cc68 Index: Refactor error logging to happen inside IndexRelated() #5166
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-19 12:31:43 +02:00
Michael Mayer
0bce60c046 Index: Improve logging when PDF documents cannot be indexed #5166
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-19 12:24:29 +02:00
Michael Mayer
13177b0c32 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-19 09:58:37 +02:00
Michael Mayer
af7983b77c Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-19 09:56:14 +02:00
Michael Mayer
4da369d8b8 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-16 16:47:07 +02:00
raystlin
519a6ab34a AI: Add TensorFlow model shape detection #127 #5164
* AI: Added support for non BHWC models

Tensorflow models use BHWC by default, however, if we are using
converted models, we can find that the expected input is BCHW. Now the
input is configurable (although the restriction of being dimesion 4 is
still there) via Shape parameter on the input definition. Also, the
model instrospection will try to deduce the input shape from the model
signature.

* AI: Added more tests for enum parsing

ShapeComponent was missing from the tests

* AI: Modified external tests to the new url

The path has been moved from tensorflow/vision to tensorflow/models

* AI: Moved the builder to the model to reuse it

It should reduce the amount of allocations done

* AI: fixed errors after merge

Mainly incorrect paths and duplicated variables
2025-08-16 15:55:59 +02:00
Michael Mayer
2a7351ee9a Database Schema: Update internal/entity/schema/mariadb.sql
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-16 11:46:27 +02:00
Michael Mayer
ff00681137 Scripts: Add dist/export-help.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-15 22:47:15 +02:00
Michael Mayer
21c8b18bf0 API: Update internal/api/swagger.json #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-13 16:16:35 +02:00
Michael Mayer
a7a41fe000 API: Add OPTIONS wildcard handler to serve CORS preflight requests #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-13 15:59:38 +02:00
Michael Mayer
d47b38bc8b Server: Add standard liveness/readiness check endpoints
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-13 13:07:01 +02:00
Michael Mayer
52204ee246 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-13 13:02:20 +02:00
Michael Mayer
3d4e2bde49 Setup: Update compose.yaml examples
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-12 17:33:10 +02:00
Weblate
05a550aa8a Weblate: Update frontend translations 2025-08-12 16:45:00 +02:00
Michael Mayer
f55a7190fc Frontend: Update .json translation files #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-11 18:11:10 +02:00
Weblate
0f999703c3 Weblate: Update frontend translations 2025-08-11 18:09:31 +02:00
Michael Mayer
db3a2b0309 Frontend: Update .po translation files #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-11 18:07:36 +02:00
Weblate
39be3d7122 Weblate: Update frontend translations 2025-08-11 18:06:46 +02:00
Michael Mayer
db22069997 Frontend: Add "batch" source and translation to edit dialog #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-11 18:06:04 +02:00
Michael Mayer
745a0a3661 Batch Edit: Increase source priority of changes to 64 (like manual) #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-11 18:02:39 +02:00
Michael Mayer
242083080d AI: Increase timeout for API client requests from 1 to 10 minutes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-10 20:34:54 +02:00
Michael Mayer
e7db7efc58 Frontend: Update install and update targets in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-10 17:22:43 +02:00
Michael Mayer
dbfe4e5dc1 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-10 17:13:29 +02:00
Michael Mayer
a890f8da16 Backend: Update Go dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-10 14:42:29 +02:00
Michael Mayer
c22c5c0151 CLI: Update count flag usage in commands.go, find.go, and vision_run.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-10 14:41:51 +02:00
Michael Mayer
6655a66e8f Develop: Upgrade base image from 250805-plucky to 250808-plucky #127
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-08 19:25:43 +02:00
Michael Mayer
875880110b Build: Simplify assets/.buildignore file #127
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-08 19:09:17 +02:00
Michael Mayer
ab0bd1c732 Config: Change default vision model assets path to assets/models/ #127
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-08 19:06:56 +02:00
Michael Mayer
2b48fe20dd Frontend: Update src/locales/json/en.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-08 19:00:16 +02:00
Weblate
ca8490d048 Weblate: Update frontend translations 2025-08-08 10:32:43 +02:00
Michael Mayer
2b9a3c9924 Setup: Update compose.yaml config examples #5123
Related Documentation:
- https://github.com/photoprism/photoprism-docs/pull/203
- https://docs.photoprism.app/developer-guide/vision/caption-generation/

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-06 20:13:07 +02:00
graciousgrey
3c84771c01 AI: Update rules.yml to work with original ImageNet1k labels 2025-08-06 17:22:58 +02:00
Michael Mayer
a6d840056c Media: Log underlying error when MIME type detection fails #5149
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-06 09:59:38 +02:00
Michael Mayer
0d24ec5abb Develop: Create default network in custom compose YAML files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 11:12:01 +02:00
Michael Mayer
fb6d920b1b Develop: Upgrade base image from 250724-plucky to 250805-plucky #5149
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 11:10:48 +02:00
Michael Mayer
9c7c6c3d27 Docker: Preinstall "libmagic-mgc" package for media type detection #5149
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 10:56:29 +02:00
Michael Mayer
16ac7a9d11 Batch Edit: Add SrcBatch to internal/entity/src.go #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 10:09:46 +02:00
Michael Mayer
9388cb7f66 Backend: Update license NOTICE file #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 10:09:21 +02:00
Michael Mayer
29c70cb0a9 Backend: Update deps in go.mod and go.sum #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 10:07:38 +02:00
Michael Mayer
6a20ca45b5 Frontend: Update deps in package.json and package-lock.json #5081 #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 10:05:54 +02:00
Michael Mayer
34065a6bf8 AI: Allow to use defaults when having a custom vision.yml #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 13:24:27 +02:00
Michael Mayer
b241fa621d AI: Refactor error logs in internal/ai packages #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 12:14:23 +02:00
Michael Mayer
b7dc81fe29 Frontend: Update deps in package.json and package-lock.json #5081 #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 10:47:03 +02:00
Michael Mayer
f83d77e40a AI: Make built-in model names lowercase in internal/ai/vision #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 10:32:08 +02:00
Michael Mayer
3177a61f75 AI: Update log messages and tests in internal/ai/classify #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 10:31:39 +02:00
Michael Mayer
523605f7d7 AI: Update log messages in internal/ai/tensorflow/labels.go #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 10:08:03 +02:00
Michael Mayer
10fe7d2b40 AI: Make error messages lower case in ai/tensorflow/info.go #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 10:00:09 +02:00
Michael Mayer
75785ff2f3 Merge branch 'develop' into feature/custom-tf-model-127 2025-08-04 09:58:18 +02:00
Michael Mayer
f6c922be00 AI: Update inline comments in internal/ai/tensorflow/info.go #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 09:57:09 +02:00
Michael Mayer
a80bdf065f AI: Improve logging in "photoprism vision run" command #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-02 10:58:32 +02:00
Michael Mayer
977d06b560 AI: Fix logging in "photoprism vision run" command #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-02 10:47:20 +02:00
Michael Mayer
c2b4af2a3a AI: Improve "photoprism vision run" command #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-02 10:19:31 +02:00
Michael Mayer
fd3f6311d4 Backend: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-01 18:14:56 +02:00
Michael Mayer
5246677ffa Backend: Update deps in go.mod and go.sum #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-01 14:37:58 +02:00
Michael Mayer
6e955523b6 AI: Add "--count" flag to the photoprism vision run command #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-01 14:37:36 +02:00
Michael Mayer
1bd9bb9d0c Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-01 14:32:03 +02:00
Michael Mayer
98e9daf687 Server: Add "trusted-platform" config option
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-01 13:51:03 +02:00
Michael Mayer
31901ff2e3 Server: Add "proxy-ip-header" config option
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-29 13:16:14 +02:00
Michael Mayer
e5dcf23f0c Config: Add "trusted-proxy" defaults to pkg/media/http/header/cidr.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-29 12:11:05 +02:00
Michael Mayer
0f5b774b06 Scripts: Update dist/install-forward-dns.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-29 09:54:41 +02:00
Michael Mayer
34b71f800e Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-28 16:35:58 +02:00
Michael Mayer
2df90b45fa Scripts: Update dist/install-forward-dns.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-28 16:35:27 +02:00
Michael Mayer
8ea7494456 Scripts: Add dist/install-forward-dns.sh to set up a forward DNS service
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-27 12:44:47 +02:00
Michael Mayer
96137a849a Scripts: Add dist/install-k8s-tools.sh for managing Kubernetes clusters
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-27 09:20:53 +02:00
raystlin
aeba5bfc4c Added labels download to model_external_test
If a model needs to have its labels downloaded from another source, it
can now be added to the test information.
2025-07-26 22:27:20 +00:00
raystlin
eef76ded5f Added new params to vision models for completion
ResizeOperation and ColorChannelOrder, just to have them on the
examples.
2025-07-26 21:43:12 +00:00
raystlin
b4ac12c301 Merge branch 'develop' into feature/custom-tf-model-127 2025-07-26 21:24:05 +00:00
Michael Mayer
38cafb1c2b Scripts: Add dist/add-swap.sh to help configure swap on Linux
see https://docs.photoprism.app/getting-started/troubleshooting/docker

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-26 10:21:33 +02:00
raystlin
3b1e1bb32a Added tests for resize operations
And fixed a typo detected by using them.
2025-07-25 22:22:19 +00:00
raystlin
e704ccfc47 Merge branch 'develop' into feature/custom-tf-model-127 2025-07-25 21:22:28 +00:00
Michael Mayer
fe7af9ec91 Backend: Update deps in go.mod, go.sum, and license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 20:27:35 +02:00
Michael Mayer
8149d4c63a Setup: Update compose.yaml config examples #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 15:46:41 +02:00
Michael Mayer
fce72f01a2 Develop: Upgrade base image from 250709-plucky to 250724-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 15:40:09 +02:00
Michael Mayer
d622c4d214 Setup: Upgrade traefik image version from v3.4 to v3.5
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 15:17:17 +02:00
Michael Mayer
468080ec6d Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 14:55:36 +02:00
Michael Mayer
4c24973a24 Setup: Update compose.yaml examples and add ollama service #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 13:07:11 +02:00
Michael Mayer
9d5a5d848a Develop: Add .project, .vscode, and *.tmproj to .gitignore file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-23 02:32:44 +02:00
Michael Mayer
5a7c5613b1 CLI: Refactor internal/commands/reset.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-23 00:53:34 +02:00
Michael Mayer
4b5e3b574a Index: Improve generation, caching and logging of labels #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 22:09:00 +02:00
Michael Mayer
99159f072a Frontend: Update json translation files #1152 #5129
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:50:56 +02:00
Weblate
f0939094fc Weblate: Update frontend translations 2025-07-22 20:50:13 +02:00
Michael Mayer
a851e325dd Frontend: Update templates to always have a context for "Archive" #1152
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:48:16 +02:00
Michael Mayer
0ff2d0df5e Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:47:12 +02:00
Michael Mayer
f6d9ff8e43 Backend: Regenerate .po translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:09:21 +02:00
Michael Mayer
f1a33a5516 Frontend: Regenerate .po translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:09:08 +02:00
Michael Mayer
3dcc33260e Frontend: Update src/locale/json/ar.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:07:31 +02:00
Michael Mayer
7dd870fcf1 Scripts: Add Kustomize to dist/install-admin-tools.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:06:20 +02:00
graciousgrey
1afc7d955a Translations: Add context #1152 2025-07-22 17:10:52 +02:00
graciousgrey
b2d36b395b Tests: Add unit tests 2025-07-22 13:01:22 +02:00
Weblate
3448d1a635 Weblate: Update backend translations 2025-07-21 17:32:44 +02:00
Weblate
02ab8caef1 Weblate: Update frontend translations 2025-07-21 17:32:16 +02:00
Michael Mayer
da86263390 AI: Use defaults when returning classify label from response #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-21 12:19:55 +02:00
Michael Mayer
ae42af54d8 AI: Generate captions using the Ollama API #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-21 10:43:49 +02:00
graciousgey
f67ba0e634 Tests: Adapt acceptance tests #465 2025-07-18 18:27:01 +02:00
raystlin
1912f17aaf Changed InputOrder to ColorChannelOrder
The previous name was not clear enough.
2025-07-17 21:26:50 +00:00
Michael Mayer
6a803a8614 Search: Improve camera and lens filter notes in form annotations #5113
https://docs.photoprism.app/user-guide/search/filters/#filter-reference
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-17 12:23:14 +02:00
Michael Mayer
57f4e39b33 Search: Improve type filter description in form annotations #5113
https://docs.photoprism.app/user-guide/search/filters/#filter-reference
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-17 12:15:00 +02:00
Michael Mayer
aa533ff7ef Search: Improve position filter descriptions in form annotations #5113
https://docs.photoprism.app/user-guide/search/filters/#filter-reference
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-17 12:03:29 +02:00
Michael Mayer
3ff0a30469 Metadata: Improve search filter and media type documentation #5113
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-17 11:55:20 +02:00
Michael Mayer
6cccef7ae8 Backend: Update deps in go.mod, go.sum, and license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-16 18:35:38 +02:00
Michael Mayer
c6f7a6f373 Frontend: Update deps in package-lock.json #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-16 18:35:04 +02:00
Michael Mayer
ddd343d528 Frontend: Refactor user model and permission checks #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-16 18:29:35 +02:00
Michael Mayer
c05fe19ba9 AI: Default to the 720x720 fit thumb for generating captions #3438 #5011
These changes also auto assign labels based on the generated captions.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-16 14:58:44 +02:00
graciousgrey
b608eae3e5 Tests: Add unit tests #683 2025-07-16 14:25:39 +02:00
graciousgrey
df61612d73 Tests: Add unit tests #5111 2025-07-16 14:13:15 +02:00
Michael Mayer
f7f403fef7 AI: Add link to qwen2.5vl release notes in vision/caption.go #3438 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 18:12:56 +02:00
Michael Mayer
1c5cea7683 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 18:03:21 +02:00
Michael Mayer
2a7e06e35f Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 18:03:05 +02:00
raystlin
adc4dc0f74 Added new parameters to model input.
New parameters have been added to define the input of the models:
* ResizeOperation: by default center-crop was being performed, now it is
  configurable.
* InputOrder: by default RGB was being used as the order for the array
  values of the input tensor, now it can be configured.
* InputInterval has been changed to InputIntervals (an slice). This
  means that every channel can have its own interval conversion.
* InputInterval can define now stddev and mean, because sometimes
  instead of adjusting the interval, the stddev and mean of the training
data should be use.
2025-07-15 13:31:31 +00:00
Michael Mayer
4bc9cd6ca2 AI: Add "source" flag to the "photoprism vision run" command #3438 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 12:52:02 +02:00
Michael Mayer
eb8d2062a5 AI: Update caption prompt and replace existing captions #3438 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 11:23:03 +02:00
Michael Mayer
4e6e0d287b API: Add mock album and label items to batch edit form for testing #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 10:25:03 +02:00
Michael Mayer
546635f8b6 AI: Update photoprism vision default prompt for captioning #3438 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 05:13:33 +02:00
Michael Mayer
ff229e1bd0 AI: Update photoprism vision defaults for captioning #3438 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 00:51:46 +02:00
Michael Mayer
e029a64632 AI: Update photoprism vision defaults for captioning #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 23:32:00 +02:00
Michael Mayer
e2763c4aee Frontend: Update .po and .json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 20:11:30 +02:00
Andres Hočevar
e24d8f532a Quickfix spanish locale 2025-07-14 20:09:42 +02:00
Weblate
2ad1466e06 Weblate: Update frontend translations 2025-07-14 20:09:18 +02:00
Michael Mayer
a571a228e6 Backend: Upgrade github.com/klauspost/cpuid/v2 in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 19:32:01 +02:00
Michael Mayer
f7a6b0fa6c Config: Add an option to disable the web user interface #5111
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 19:30:24 +02:00
Michael Mayer
88126e3e48 Search: Add "reverse" query param to sort results in reverse order #683
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 18:08:05 +02:00
Michael Mayer
66cd55461f API: Always send and expect "mixed" fields in batch edit endpoint #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 11:13:04 +02:00
Michael Mayer
65b8503f63 API: Allow batch edit fields to be empty in requests and responses #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 10:42:34 +02:00
Michael Mayer
6e859ceecb Frontend: Add inline code comments for clipboard use #5106
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 09:33:30 +02:00
Michael Mayer
2b4234da00 Frontend: Update .json translation files #5106
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 09:27:01 +02:00
Michael Mayer
28873182be Auth: Activate 2FA, even if the recovery code cannot be copied #5106
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 09:23:02 +02:00
Michael Mayer
a910795525 Setup: Update service image names for the Raspberry Pi #4414 #5100
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 16:36:36 +02:00
Michael Mayer
d5816e0f9f Setup: Update compose.yaml defaults for the Raspberry Pi #4414 #5100
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 16:30:59 +02:00
Michael Mayer
f1cfe8d406 Scripts: Refactor dist/heif-convert.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 12:00:05 +02:00
Michael Mayer
aca000854c Scripts: Add doctl CLI command to install-admin-tools.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 11:59:46 +02:00
Ömer Duran
312f8e10be Raspberry Pi: Upgrade mariadb version in compose.yaml #4414 #5100
* Setup: Update mariadb version
* Setup: Remove unnecessary mariadbd from MariaDB container command
2025-07-11 11:58:33 +02:00
Michael Mayer
1fa7b455a1 Tests: Reformat .js test files with "npm run fmt" #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 06:01:23 +02:00
Michael Mayer
86401086ba Frontend: Add ContentTypeMp4AvcHigh to common/media.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 06:00:06 +02:00
Michael Mayer
342519a518 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 03:33:59 +02:00
Michael Mayer
ad653db969 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 03:33:38 +02:00
Michael Mayer
675c2a3f95 Setup: Add build script for the PhotoPrismPi SD card image #4414
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 00:37:44 +02:00
Michael Mayer
78f5a48b0b Setup: Remove "Ofelia" from DigitalOcean app image docs #4414
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 22:08:38 +02:00
Michael Mayer
e6a1b54547 Setup: Reorganize config files for Raspberry Pi and DigitalOcean #4414
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 22:02:38 +02:00
Ömer Duran
287b921d4f Setup: Update user-data for PhotoPrismPI #5099
* Setup: Update user-data for PhotoPrismPI
* Setup: Replaces '<your IP address>' with '<IP address>'
2025-07-10 16:49:08 +02:00
Michael Mayer
31614697a2 API: Update Swagger docs of batch edit endpoint #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 11:16:23 +02:00
Michael Mayer
2229ee32fb API: Add batch.PhotosResponse and update Swagger docs #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 11:08:17 +02:00
Michael Mayer
41dc0febba API: Rename album and label value to "items" in batch edit response #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 10:28:47 +02:00
Michael Mayer
50c345f0ad API: Add empty Albums and Labels to the batch edit response #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 10:18:01 +02:00
Michael Mayer
38da638f88 API: Improve logging of bad request errors across all endpoints #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 09:38:36 +02:00
Michael Mayer
6bfbad40af API: Add batch edit form validation error to gin.Context #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 09:06:11 +02:00
Michael Mayer
02ef7dbdee Develop: Upgrade base image from 250703-plucky to 250709-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-09 16:48:38 +02:00
Michael Mayer
845813d642 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-09 16:48:22 +02:00
graciousgrey
f99fee1fe7 Tests: Add unit tests #465 2025-07-09 14:57:32 +02:00
graciousgrey
ee443c066b Tests: Add unit tests #5089 2025-07-09 14:42:01 +02:00
graciousgrey
02109cf4e6 Tests: Add unit tests #5038 2025-07-09 14:42:01 +02:00
Michael Mayer
38e331a48d Intel QSV: Add libvpl2 if PHOTOPRISM_INIT is set to "intel" #4967 #5098
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-09 14:13:28 +02:00
Ömer Duran
61683015f2 Places: Refactor Adjust Location dialog to reuse the p-map component #465 #5097
* Places: refactor location dialog to reuse PMap component
* Places: Refactor map and location dialog components coordinate validation
* Places: Update map and location dialog components to use coordinates array for better validation
* Places: Rename coordinates prop to latlng in map and location components for consistency
* Places: Simplify latlng watcher
* Places: Map component with animation settings and handle missing style images
2025-07-09 13:26:26 +02:00
Michael Mayer
9ad5a533af Backend: Update github.com/golang/geo in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-08 10:41:03 +02:00
Michael Mayer
2481de49c4 API: Improve form and tests for POST /batch/photos/edit endpoint #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-08 10:40:45 +02:00
Michael Mayer
004feeb708 Index: Re-determine media types when "Complete Rescan" is selected #5096
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-07 17:22:15 +02:00
Michael Mayer
d28b3101e0 Build: Update .buildignore and .dockerignore files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-07 12:44:59 +02:00
Michael Mayer
8fcc2a232b Live Photos: Reset duration and improve type checks when indexing #5089
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-07 11:15:02 +02:00
Michael Mayer
5ad7f6318b Live Photos: Require video type MOV as sidecar for HEIC and JPEG #5089
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 14:04:15 +02:00
Michael Mayer
cedc8799d3 Places: Update compose.yaml config examples #883
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 11:24:50 +02:00
Michael Mayer
5860b01248 Live Photos: Delete pkg/media/video/live.go #5089
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 11:10:24 +02:00
Michael Mayer
f80ac62e6b Live Photos: Only flag actual Live and Motion Photos as "Live" #5089
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 11:07:25 +02:00
Michael Mayer
57349bdb99 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 11:04:34 +02:00
Michael Mayer
0fc3ec8183 Frontend: Update .json translation files #5089 #5092
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 11:02:58 +02:00
Weblate
b582133df7 Weblate: Update frontend translations 2025-07-06 11:00:25 +02:00
Michael Mayer
037c0351d9 Docs: Update internal/api/swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 10:58:31 +02:00
Michael Mayer
ff6151f84a Docs: Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 10:58:05 +02:00
Michael Mayer
3ff0ec01be Frontend: Add translations and update .po translation files #5089
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 10:57:12 +02:00
Michael Mayer
595b116ae6 Config: Update automatically generated docs for configuration options
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-04 10:51:13 +02:00
Michael Mayer
73374cb325 Backup: Do not delete old dumps when filename is set manually #5088
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 20:59:54 +02:00
Michael Mayer
77ac3b545f Darktable: Update install-darktable.sh script
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 20:38:02 +02:00
Michael Mayer
c49ba11288 Frontend: Reformat karma.conf.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 19:46:38 +02:00
Michael Mayer
395ee8426e Develop: Upgrade base image from 250630-plucky to 250703-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 19:34:44 +02:00
Michael Mayer
d43ec9492a Frontend: Update install-nodejs.sh script
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 19:27:30 +02:00
Michael Mayer
20a82df0e8 Frontend: Remove package eslint-plugin-promise
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 19:27:10 +02:00
Michael Mayer
55704fea58 Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 12:58:35 +02:00
Michael Mayer
02d8525ade Places: Add config option to specify location details locale #465 #883
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 12:58:20 +02:00
Michael Mayer
4b1cc5d424 API: Update swagger.json #465
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 20:45:22 +02:00
Michael Mayer
829611c37f API: Update Swagger docs for the /api/v1/places endpoints #465
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 20:42:48 +02:00
graciousgey
cb208bc09f Tests: Adapt acceptance tests to changes 2025-07-02 17:14:22 +02:00
Michael Mayer
24b7b03f7b CSS: Move embedded map styles to css/places.css #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 12:23:45 +02:00
Michael Mayer
1b4b478067 Frontend: Update translations in fr.json #5086
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 11:57:36 +02:00
Weblate
76f6f2d52f Weblate: Update frontend translations 2025-07-02 11:56:34 +02:00
Michael Mayer
5b152ac542 Metadata: Reset the day string value to 01 if exact day is unknown #5038
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 11:33:13 +02:00
Michael Mayer
d7298eeb80 Backend: Update github.com/golang/geo in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 11:07:13 +02:00
Michael Mayer
c18d04e104 Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 11:00:18 +02:00
Michael Mayer
8b5b06d116 API: Add unit tests for new /api/v1/places endpoints #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 10:59:07 +02:00
Michael Mayer
7fb447897e Location: Update .json frontend translation files #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:33:17 +02:00
Weblate
9c5470744f Weblate: Update frontend translations 2025-07-01 17:30:53 +02:00
Michael Mayer
bd4ca7b848 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:28:46 +02:00
Michael Mayer
3a74db145a Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:28:33 +02:00
Michael Mayer
6bf5e03336 Backend: Regenerate assets/locales/js/default.po
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:27:27 +02:00
Michael Mayer
24025524ab Location: Update .po frontend translation files #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:27:08 +02:00
Michael Mayer
80ba7e9934 Location: Change "No results" message in dialog.vue #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:26:38 +02:00
Michael Mayer
a5c50b1301 Places: Refactor Location API, Dialog and Input #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:21:26 +02:00
Michael Mayer
318d38a1da Places: Round coordinates returned by s2.LatLng() #465 #5080
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 10:19:39 +02:00
Michael Mayer
08ae7b0229 Places: Add new package pkg/geo/latlng #465 #5080
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 10:12:54 +02:00
Ömer Duran
ee0f104262 UX: Refactor position dialog #465 #5082
* Places: Use $nextTick for state updates
* Places: Refactor duplicate code
2025-06-30 16:29:56 +02:00
Michael Mayer
a30c04bab6 UX: Adjust config of places search autocomplete component #465 #5080
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-30 10:21:04 +02:00
Ömer Duran
056c6f3917 UX: Replace v-menu with v-autocomplete and add loading state to apply button #465 #5080
* Places:  Replace v-menu with v-autocomplete for better search experience
* Places: Add loading state for location info retrieval
2025-06-30 09:38:01 +02:00
Michael Mayer
10f15431ff Videos: Set timestamps to zero when remuxing containers to MP4 #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-30 09:35:26 +02:00
Michael Mayer
1709f708ed Viewer: Disable video looping when seeking manually #1307 #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-30 09:35:26 +02:00
Michael Mayer
4475a8d914 Develop: Upgrade base image from 250608-plucky to 250630-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-30 09:35:26 +02:00
Simon Rettberg
00d1cddf37 Metadata: Update list of unwanted descriptions (#5078)
Signed-off-by: Simon Rettberg <simon.rettberg@rz.uni-freiburg.de>
2025-06-29 17:15:01 +02:00
Michael Mayer
a39c1d3248 Download: Skip Playlist test in dl_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-29 17:13:26 +02:00
Michael Mayer
dec24ece73 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-29 17:09:08 +02:00
Michael Mayer
fd33e54c20 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-29 17:08:06 +02:00
Michael Mayer
af3357bfdc Metadata: Update list of stop words in pkg/txt
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-29 17:07:05 +02:00
Michael Mayer
761cf6a47e Metadata: Refactor position input and dialog components #465 #5043 #5069
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-27 15:35:49 +02:00
Michael Mayer
7e2d55ece4 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-27 15:33:44 +02:00
Ömer Duran
0e66db223c UX: Improve GPS position input and dialog components #465 #5069
* Places: Remove the close button for design consistency #465
* Places: Enhance coordinate input in photo edit details #465
* Places: Refactor layout in location dialog #465
* Places: Improve layout and styling in location dialog #465
* Places: Delete coordinate input formatting in photo edit details #465
* Places: Create reusable coordinate input component
2025-06-27 12:38:42 +02:00
Keith Martin
22e865c66a SQLite: Fix "too many SQL variables" error when flagging pictures as hidden #3742 #5074
* Backend: Refactor update statement to resolve too many sql variables (retro fit from gorm2)
* Backend: Refactor subquery to gorm1 compliance
2025-06-27 12:28:50 +02:00
graciousgrey
3679c11c34 Scans: Add scan detection for epson scanner #5703 2025-06-26 11:42:22 +02:00
graciousgey
55575623c5 Tests: Adapt acceptance test #4999 2025-06-26 11:39:15 +02:00
graciousgrey
40df1d71cf Translations: Update fr.json 2025-06-26 09:25:05 +02:00
Weblate
c2d981e4d1 Weblate: Update frontend translations 2025-06-26 09:10:26 +02:00
Ömer Duran
aadde256eb Setup: Add Cloud-Init configuration for the PhotoPrismPi SD image #4414 #5068
This adds initial cloud-init configuration files for the automatic installation of PhotoPrism on a Raspberry Pi. The files include metadata, network configuration, and an in-depth user-data script that installs Docker, configures paths, sets services, and prepares the system for PhotoPrism with Traefik and MariaDB.
2025-06-25 14:44:39 +02:00
Michael Mayer
60cb5684c2 UX: Redirect to the collection page when albums are deleted #4994
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-25 13:20:42 +02:00
Michael Mayer
8cef088bba Places: Refactor location input and dialog styles #465 #5043
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-25 04:20:57 +02:00
Michael Mayer
7a2cb27c1f Places: Refactor search and reverse API endpoint validation #465 #5043
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-25 03:07:50 +02:00
Michael Mayer
033cfc4922 Places: Refactor search and reverse API endpoints #465 #5043
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-25 00:43:31 +02:00
Michael Mayer
bcbbbcd7b3 Backend: Add WebLocale formatting function to clean package #465 #5043
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-25 00:03:41 +02:00
Ömer Duran
baa5f2d9a0 UX: Add a map for selecting locations in the Edit dialog #465 #5043
* Frontend: Map Dialog first version
* Frontend: Simplify street address handling and remove reset location control in map dialog
* Frontend: Enhance map undo functionality
* Frontend: Refactor location info handling to use backend API for reverse geocoding
* Frontend: Improve coordinate input handling
* Frontend: Adjust layout in photo details
* Frontend: Add feature to clear coordinates
* Frontend: Update button alignment
* Frontend: Implement place search feature in map dialog
2025-06-24 23:22:16 +02:00
Ömer Duran
7d1c453960 Setup: Update DigitalOcean Docker configuration (#4978)
* Setup: Update Digital Ocean Docker Image

* Setup: update digital ocean docs

* Setup: Update Docker CE version in cloud README

* Setup: Update Traefik version to 3.4

* Setup: Update software versions in DigitalOcean README
2025-06-24 22:54:18 +02:00
Michael Mayer
4dc703c855 Frontend: Regenerate .json translation files #4994 #4999 #5067
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-24 21:44:32 +02:00
Weblate
58ffaf1bfa Weblate: Update frontend translations 2025-06-24 21:43:57 +02:00
Michael Mayer
d1c6efa2b6 Frontend: Regenerate .po translation files #4994 #4999
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-24 21:36:02 +02:00
Michael Mayer
595e528258 UX: Refactor album toolbar menu and add "danger" theme color #4994 #4999
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-24 21:34:51 +02:00
Ömer Duran
95cb881f56 Albums: Add "Delete Album" action to the album toolbar menu #4994 #4999
* Frontend: Add "Delete Album" option to album toolbar #4994
* Frontend: Replace dialog with confirmation dialog in toolbar #4994
* Frontend: Refine visibility condition for "Delete Album" option in toolbar #4994
2025-06-24 20:44:25 +02:00
graciousgey
702b83870f Tests: Add test #5018 2025-06-24 17:52:36 +02:00
Michael Mayer
e201e27842 Frontend: Update test deps and scripts in package.json #5014
This removes the "test-" prefix from vitest script targets.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-24 12:59:17 +02:00
Michael Mayer
a965c32188 Backend: Upgrade github.com/olekukonko/tablewriter from v0.0.5 to v1.0.7
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-24 12:48:38 +02:00
graciousgrey
982f864cc0 Translations: Update cs.json 2025-06-24 11:19:01 +02:00
Weblate
b054a1e09a Weblate: Update frontend translations 2025-06-24 11:01:20 +02:00
findnature
b3bdd5d8ce Media: Replace sort.Slice with slices.Sort for natural ordering (#4981)
Signed-off-by: findnature <cricis@aliyun.com>
2025-06-23 15:38:55 +02:00
Michael Mayer
47f9a509b1 Backend: Update dependencies in go.mod and go.sum #5042
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-23 15:34:33 +02:00
graciousgrey
a49181f75d Tests: Skip unstable test #5014 2025-06-23 15:33:05 +02:00
Brandon Richardson
1d8fa4e3ea Backend: Set content-type on metrics endpoints (#5042)
The prometheus text format requires metrics endpoints respond with the
content-type 'text/plain; version=0.0.4'. Without this, newer versions
of prometheus fail to scrape the metrics endpoint and report an error.
It's possible to work around this by setting the
'fallback_scrape_protocol' setting in the prometheus scrape target
configuration, but this revision sets the content type appropriately to
avoid this in the first place.
2025-06-23 15:32:01 +02:00
Michael Mayer
758d86f903 Frontend: Update test deps in package.json and license NOTICE #5014
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-20 16:39:38 +02:00
Ömer Duran
a82d657b6b Frontend: Convert tests from mocha to vitest #5014
* Tests: convert all common tests from mocha to karma

* Tests: refactor Vuetify setup in tests

* Tests: update package-lock.json

* Tests: convert all model test to vitest 1/2

* Tests: convert all model test to vitest 2/2

* Tests: fix broken test

* Tests: time zone UTC

* Tests: Add playwright screenshots folder to gitignore

* Tests: Add timezone to vitest scripts

* Tests: Add Vitest scripts to Makefile

* Tests: delete unused timezone configs

* Tests: Update some tests

* Tests: Update vitest config

* Tests: Delete usesless try-catch
2025-06-20 16:28:26 +02:00
Ömer Duran
985e2febf4 Fix: timezone handling in sidebar component (#5015) 2025-06-20 01:22:39 +02:00
Michael Mayer
40be3cc290 Backend: Fix typo in inline function documentation #5059
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-20 01:19:49 +02:00
Michael Mayer
087594161e Frontend: Update *.json translation files #5061
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 20:13:38 +02:00
Weblate
a9d0f3e9a4 Weblate: Update frontend translations 2025-06-19 20:12:26 +02:00
Michael Mayer
44c85a8a46 Docs: Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 20:06:49 +02:00
Michael Mayer
55b8042c98 Auth: Update ACL grants and actions
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 20:04:33 +02:00
Michael Mayer
2596fe0252 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 18:37:35 +02:00
Michael Mayer
1e89fa5d32 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 18:37:07 +02:00
Michael Mayer
7d05ecab9a Frontend: Add .overflow-hidden style to css/layout.css #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 17:40:52 +02:00
graciousgrey
f7218f67e2 Classify: Improve rules.yml #5057 2025-06-19 09:14:02 +02:00
graciousgey
cdcfc69e05 Tests: Refactor acceptance tests 2025-06-17 20:20:48 +02:00
Michael Mayer
d57ee7b7ab Header: Add "Content-Language" const
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-12 02:30:48 +02:00
Michael Mayer
fd056913d8 Frontend: Improve user interface styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-12 00:32:58 +02:00
Michael Mayer
c8ce9ec772 Videos: Extract embedded metadata with ExifTool #4982 #4892 #5040
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 21:49:02 +02:00
Michael Mayer
6a65f86bf9 Frontend: Improve user interface styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 21:11:53 +02:00
Michael Mayer
42a22f1377 M2TS: Improve inline code docs #4982 #4892 #5040
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 19:26:43 +02:00
Michael Mayer
86fe4404ef M2TS: Extract embedded metadata with ExifTool #4982 #4892 #5040
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 19:22:20 +02:00
Michael Mayer
6fa0ab4734 Setup: Update inline docs in compose.yaml config examples #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 10:58:18 +02:00
Michael Mayer
7759aad68f Videos: Auto-install/update yt-dlp in the dev environment #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 10:54:09 +02:00
Michael Mayer
47a4d1ab0a Docs: Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:31:04 +02:00
Michael Mayer
38c8fec985 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:29:46 +02:00
Michael Mayer
e9a76efc3b Videos: Update yt-dlp when building new Docker images #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:27:03 +02:00
Michael Mayer
cf7aaa5059 Videos: Add "update-yt-dlp" init target to scripts/dist/Makefile #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:22:07 +02:00
Michael Mayer
dc265085a8 WebDAV: Add "/import/" path check to internal/service/heuristic.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:02:57 +02:00
Michael Mayer
03f5bb322d Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:01:47 +02:00
Michael Mayer
2e2ebab433 Videos: Improve downloading, remuxing, and transcoding #4982 #4892 #5040
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-09 15:31:23 +02:00
graciousgrey
a45d9d30b9 Update SPONSORS.md 2025-06-09 15:15:13 +02:00
graciousgrey
7a1929797c Translations: Update fr.po 2025-06-07 08:51:18 +02:00
Weblate
1ac9a8a3bf Weblate: Update frontend translations 2025-06-07 08:23:22 +02:00
graciousgrey
f98f2bcc8e Translations: Update hu.json and zh.json 2025-05-26 11:58:17 +02:00
Weblate
eda33e2032 Weblate: Update frontend translations 2025-05-26 11:46:53 +02:00
graciousgey
cf9258949a Tests: Adapt acceptance tests to be more stable 2025-05-25 11:26:56 +02:00
Michael Mayer
ae530fec1b CLI: Force overwrite of existing video and metadata downloads #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 07:03:35 +02:00
Michael Mayer
3bcc415c06 Frontend: Update package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 01:47:02 +02:00
Michael Mayer
72fdd05358 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 01:41:28 +02:00
Michael Mayer
798c77464e Develop: Upgrade base image from 250507-plucky to 250524-plucky #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 01:40:13 +02:00
Michael Mayer
69600fdbe3 Video Downloads: Update test video URL #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 01:33:59 +02:00
Michael Mayer
03dba1fe20 Video Downloads: Set --playlist-index and --embed-metadata flags #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 01:20:59 +02:00
graciousgrey
2499b13f51 Tests: Add unit tests #271 2025-05-21 13:16:11 +02:00
raystlin
c682a94a07 Updated vision.yml testdata
This version adds the new fields to the test configuration
2025-05-18 11:08:34 +00:00
raystlin
f28f3d1a07 Fixed format on model_external_test
make fmt-go was applied
2025-05-18 11:06:34 +00:00
graciousgey
af832247fc Tests: Update testcafe timeouts 2025-05-16 16:48:55 +02:00
Michael Mayer
a5aef038ef Batch Edit: Fix PhotoLng.Mixed flag in form/batch/photos.go #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-15 16:37:28 +02:00
graciousgey
fce886f077 Tests: Refactor page model for more stability 2025-05-15 08:57:50 +02:00
raystlin
7214479bc4 Merge remote-tracking branch 'upstream/develop' into feature/custom-tf-model-127 2025-05-14 21:08:35 +00:00
graciousgrey
876a421ad7 Frontend: Update ja.json 2025-05-14 14:18:44 +02:00
Weblate
8292f97469 Weblate: Update backend translations 2025-05-14 13:12:48 +02:00
Weblate
f5ee512a70 Weblate: Update frontend translations 2025-05-14 13:12:21 +02:00
graciousgrey
0ecc08750b Tests: Update test commands 2025-05-14 10:58:49 +02:00
Michael Mayer
4326523194 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 14:36:55 +02:00
Michael Mayer
465245eb85 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 14:30:55 +02:00
Ömer Duran
7ab90720ff Tests: write Initial Tests for .vue Components (#5003)
* Tests: Add initial Vue component tests
* Tests: Update package scripts
2025-05-13 11:53:17 +02:00
Michael Mayer
b642be2c91 API: Update swagger.json endpoint documentation #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 11:34:23 +02:00
Michael Mayer
cfc8bac26f Batch Edit: Return -2 for mixed CameraID and LensID values #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 11:08:04 +02:00
Michael Mayer
e754af0e08 Batch Edit: Return -2 for mixed day, month, and year values #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 10:50:47 +02:00
Michael Mayer
bf37bf44c7 API: Update swagger.json endpoint documentation #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 10:24:17 +02:00
Michael Mayer
9a39adebae API: Refactor /batch/photos/edit endpoint to return "models" #271
The "photos" array in the response has been renamed to "models". This
data is now always returned, so using the "return" flag in the request
is no longer necessary.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 10:22:35 +02:00
Michael Mayer
bdaab4b412 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 10:09:27 +02:00
Michael Mayer
e89efc9d39 Clean: Add version assertions to version_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 10:06:07 +02:00
raystlin
05808241b9 Fix AI Faces test.
The test was broken because of the new parameters
2025-05-12 18:48:42 +00:00
raystlin
38956e0f4a Merge remote-tracking branch 'upstream/develop' into feature/custom-tf-model-127 2025-05-12 18:46:57 +00:00
Michael Mayer
699cff429c GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-10 12:05:48 +02:00
Michael Mayer
f6908837ee Vision Client: Allow a custom prompt to be included in requests
see https://github.com/photoprism/photoprism-vision/issues/11

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-09 18:59:28 +02:00
Michael Mayer
9c16bb11b8 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-09 10:05:36 +02:00
graciousgrey
e02f543808 Frontend: Open thumb fromPhotos on the labels tab 2025-05-08 13:02:33 +02:00
Michael Mayer
0e74afa358 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 05:31:58 +02:00
Michael Mayer
53d43f7933 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 04:51:50 +02:00
Michael Mayer
0597269fc4 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 04:49:23 +02:00
Michael Mayer
1554d52b00 Frontend: Update yaml dep in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 01:38:37 +02:00
Michael Mayer
3c09bb9475 Frontend: Update babel deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 01:35:59 +02:00
Michael Mayer
43238cf6e4 Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 01:22:18 +02:00
Michael Mayer
7958239f7e Vision Client: Add configured model version to request data #1090
also see https://github.com/photoprism/photoprism-vision/issues/1

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 01:19:13 +02:00
Michael Mayer
2eb731e721 Develop: Update GPU device count in compose.nvidia.yaml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 00:24:34 +02:00
Michael Mayer
ade2c5e269 Develop: Upgrade base image from 250505-plucky to 250507-plucky
The new image includes updated dependencies such as Go v1.24.3.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 00:22:22 +02:00
graciousgrey
2ddfa5c9a1 Tests: Add unit tests #4947 2025-05-07 15:00:09 +02:00
graciousgrey
1a794da1fe Tests: Add unit tests #4969 2025-05-07 12:03:50 +02:00
Michael Mayer
dd1f3b820f Frontend: Update fr.json and ja.json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 17:01:32 +02:00
Cathie Integra
39e8b5b9ad Weblate: Update frontend translations (#4993)
Co-authored-by: Weblate <noreply@weblate.org>
2025-05-06 17:00:31 +02:00
graciousgrey
cccb0ca00a Tests: Add unit tests 2025-05-06 16:52:02 +02:00
Michael Mayer
ade59eebf0 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 16:23:41 +02:00
Michael Mayer
7b2a9a11c3 Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 16:23:22 +02:00
Michael Mayer
2e626b8221 Backend: Run fmt-go to format photos_test.go and selection_test.go #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 16:22:51 +02:00
Ömer Duran
4f04ffe133 Frontend: Integrate Vitest test framework #4990
- Includes fixtures and mocks system for API and models as well as npm scripts for running tests, watch mode, coverage and UI
- Adds test setup with JSDOM environment and utility function tests
- Converts marker model tests from Mocha/Chai to Vitest
2025-05-06 16:18:39 +02:00
Michael Mayer
b5d2d1c7fb Makefile: Remove "docker-" prefix from nvidia and intel targets
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 16:02:08 +02:00
Cathie Integra
d18be7e76c Weblate: Update frontend translations (#4991)
Co-authored-by: Weblate <noreply@weblate.org>
2025-05-06 15:32:31 +02:00
Michael Mayer
2787059411 GitHub: Update question.md and PULL_REQUEST_TEMPLATE.md templates
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 15:07:59 +02:00
graciousgrey
5e4d258860 Tests: Add unit tests #271 2025-05-06 14:45:58 +02:00
graciousgrey
79b6a75703 API: Add security definitions to swagger annotations 2025-05-05 16:50:33 +02:00
Michael Mayer
723dee6620 Develop: Upgrade base image from 250502-plucky to 250505-plucky #4979
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 12:23:00 +02:00
Michael Mayer
cbcee62444 Dist: Update install-tensorflow.sh script #4979
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 11:57:54 +02:00
Michael Mayer
4349087272 Entity: Use Db() instead of UnscopedDb() in details_fixtures.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 11:17:11 +02:00
Michael Mayer
83717bda02 TensorFlow 2: Build AMD64 binaries for generic x86-64 march #4979
see https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 10:57:01 +02:00
Michael Mayer
333c54f3a2 TensorFlow 2: Build AMD64 binaries with "nocona" compatibility #4979
see https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 10:46:22 +02:00
Michael Mayer
80e6d02509 TensorFlow 2: Build AMD64 binaries with Prescott compatibility #4979
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 10:41:58 +02:00
Michael Mayer
4484b885d4 TensorFlow 2: Update docker/tensorflow/Makefile #4979
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 10:33:49 +02:00
Michael Mayer
2b788fd258 TensorFlow 2: Build AMD64 binaries with Pentium 4 compatibility #4979
see https://github.com/photoprism/photoprism/discussions/4979

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 10:32:32 +02:00
Michael Mayer
c4ddc4a119 API: Remove unused Filter property from batch request forms #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 09:25:52 +02:00
Michael Mayer
3d325015af Setup: Update nvidia/compose.yaml configuration example #4986
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 09:06:17 +02:00
Michael Mayer
f50bae84b1 Develop: Update compose.nvidia.yaml and compose.intel.yaml #4986
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 09:05:55 +02:00
Michael Mayer
a55b3ecc9c Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 08:57:39 +02:00
Michael Mayer
6bd86d6032 Develop: Update compose.nvidia.yaml configuration #4986
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 08:57:24 +02:00
Michael Mayer
ca843987f7 Setup: Update compose.yaml configuration examples #4986
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 07:40:21 +02:00
Michael Mayer
fdea09518c UX: Remove transition from "scroll to top" button for faster rendering
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 16:00:06 +02:00
Michael Mayer
b6d031a4ba API: Omit markers when serializing JSON search results #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 15:09:40 +02:00
Michael Mayer
3d730884ce Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 14:33:33 +02:00
Michael Mayer
b20f9d6e50 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 14:32:32 +02:00
Michael Mayer
5973aeca5f Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 14:31:09 +02:00
Michael Mayer
dd6e17e97e API: Rename /batch/photos endpoint to /batch/photos/edit #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 14:09:23 +02:00
Michael Mayer
b423b1980b API: Add /batch/photos endpoint to get metadata of selected photos #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 12:43:01 +02:00
graciousgrey
43ff8b2a8d Tests: Add unit tests 2025-05-03 10:25:58 +02:00
Michael Mayer
c80f703ecd UX: Maintain scroll position when refreshing search results #4985
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 10:05:53 +02:00
Michael Mayer
bd4b7b3ad3 API: Update swagger.json endpoint documentation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 09:30:42 +02:00
Michael Mayer
6f3f1fd392 Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 09:29:41 +02:00
Michael Mayer
6b4a32a1b3 UX: Optimize generation of thumbnail image URL in photo.js #4985
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 09:25:55 +02:00
Michael Mayer
033a956e21 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 09:12:57 +02:00
graciousgey
a23058ce4b Tests: Refactor acceptance tests 2025-05-02 18:44:32 +02:00
graciousgrey
b61f3063d9 Tests: Add unit tests #4973 2025-05-02 18:39:40 +02:00
Michael Mayer
d530ab4f23 Frontend: Regenerate translation .po files #4980
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 14:32:33 +02:00
Michael Mayer
4677579f9a i18n: Change locale "ja_JP" to "ja", so it matches the filename #4980
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 14:30:37 +02:00
Michael Mayer
4a992dc350 CLI: Add image, vector, raw, pdf, and audio support to dl command #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 13:55:52 +02:00
Theresa Gresch
fb0c22fb4b Merge pull request #4974 from photoprism/unit-test-stack-original-name
Tests: Add unit tests for photo stack determination and original file retrieval
2025-05-02 12:25:01 +02:00
Michael Mayer
607b285443 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 12:17:14 +02:00
Michael Mayer
de14b30570 Videos: Add "photoprism dl" CLI command to import from a URL #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 12:16:59 +02:00
Michael Mayer
06529c3854 Develop: Upgrade base image from 250426-plucky to 250502-plucky #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 10:06:18 +02:00
Michael Mayer
8faf3fc918 Import: Add ytdl package for downloading videos from URLs #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 10:04:34 +02:00
Michael Mayer
a7d927a83b Videos: Add install-yt-dlp.sh script #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 09:57:52 +02:00
hardlydearly
060924c19a Backend: Use slices.Contains to simplify code (#4975)
Signed-off-by: hardlydearly <799511800@qq.com>
2025-04-30 15:25:05 +02:00
graciousgrey
bb67dca507 Tests: Add unit tests and test fixtures 2025-04-30 14:07:04 +02:00
Ömer Duran
9526f1d4dc Tests: Add unit tests for photo stack determination and original file retrieval 2025-04-29 21:54:11 +03:00
graciousgey
8ce192ceba Tests: Refactor sharing test to be stable 2025-04-29 16:45:44 +02:00
Theresa Gresch
d0f7393ebe Merge pull request #4972 from photoprism/cover-test-improvements
Tests: Enhance album cover selection logic in acceptance tests
2025-04-29 10:24:52 +02:00
Michael Mayer
fe3071ba18 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-29 08:56:32 +02:00
Michael Mayer
a64e2ea445 Sharing: Allow authenticated clients to share albums #4973
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-29 08:54:16 +02:00
Radon Rosborough
138cc3c458 Upload: Generate a more elegant random token #4970 #4971
* Upload: More elegant generateToken
* Add unit test
2025-04-29 08:01:44 +02:00
Ömer Duran
aeaa39969b Tests: Enhance album cover selection logic in acceptance tests 2025-04-29 01:46:53 +03:00
graciousgey
ba8d38a761 Tests: Refactor acceptance tests 2025-04-28 10:35:54 +02:00
Michael Mayer
05b68db22d Config: Update internal/api/swagger.json #4969
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-27 15:08:32 +02:00
Michael Mayer
3f2f0a7e67 Config: Allow FFmpeg bitrate limit to be disabled with -1 #4969
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-27 15:07:28 +02:00
Michael Mayer
eb4fc032ff Config: Add preset, quality, and device options for FFmpeg #4969
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-27 14:36:36 +02:00
raystlin
6565fb2d6f AI: Fixed unitialization problems
* vision_list command failed silently for models without meta.
* face model panicked for models without meta.
2025-04-27 10:41:53 +00:00
Michael Mayer
27ec7a1282 Videos: Add "va-driver-all" and "libva2" to Docker base images #4967
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 11:41:01 +02:00
Michael Mayer
9ab1772b64 Develop: Export SEMVER_MAJOR and SEMVER_MINOR in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 11:25:01 +02:00
Michael Mayer
a3883c1cd4 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 11:11:18 +02:00
Michael Mayer
591ec1fad7 Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 11:10:51 +02:00
Michael Mayer
a7ee4a6cff Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 11:10:29 +02:00
Michael Mayer
98f2cbd51b Develop: Export SEMVER_VERSION, BUILD_TAG and BUILD_ARCH in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 10:59:26 +02:00
Michael Mayer
eb9c64772f Develop: Upgrade base image from 250418-plucky to 250426-plucky #4967
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 09:40:50 +02:00
Michael Mayer
8fbe03ee1b Videos: Update driver packages for Intel QSV and add "amd" target "#4967
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 09:09:26 +02:00
Michael Mayer
21ddba4595 Setup: Install optimized TensorFlow 2 version on first startup #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-25 11:05:21 +02:00
Michael Mayer
cbc415d32b CLI: Correct indentation of backup and restore command descriptions
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-25 08:34:43 +02:00
Michael Mayer
71a623b5e0 Docker: Increase TF_CPP_MIN_LOG_LEVEL from 2 (info) to 4 (error)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-25 07:56:27 +02:00
Michael Mayer
eddb096adb Docker: Reduce MALLOC_ARENA_MAX from 4 to 2 for less memory consumption
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-25 07:52:49 +02:00
Michael Mayer
f73b703123 Videos: Increase transcoding bitrate limit default to 60 Mbps #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 11:59:29 +02:00
Michael Mayer
9e39b2f81d Videos: Improve log message when file has already been transcoded #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 11:25:15 +02:00
Michael Mayer
fed0cfff6a Videos: Stream AVC only if native format/codec is not supported #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 11:18:10 +02:00
Michael Mayer
cc5a4a6fd8 NSFW: Remove "nsfw:" prefix from returned errors
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 08:49:00 +02:00
Michael Mayer
7c7f89b2ac Convert: Update commands after upgrading ImageMagick from v6 to v7 #4963
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 08:48:13 +02:00
Michael Mayer
2a2a55b9fa Docs: Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 07:24:01 +02:00
Michael Mayer
451c172a70 Docs: Update internal/api/swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 07:23:47 +02:00
Michael Mayer
5648469247 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 07:22:24 +02:00
Michael Mayer
c6e571aab1 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 07:22:14 +02:00
Michael Mayer
f2a89063c6 Metadata: Fix typo in LocationUTC() function #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 17:54:33 +02:00
Michael Mayer
e59fdded1b Metadata: Preserve UTC time when a location time zone is set #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 17:15:49 +02:00
Michael Mayer
56ba9f1ee5 Metadata: Use Local time for file modification timestamps #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 16:15:00 +02:00
Michael Mayer
5e77c6a3bb Metadata: Improve timezone parsing in /pkg/time/tz #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 15:35:43 +02:00
Michael Mayer
4c7ca93dcc Metadata: Improve handling of Local and UTC timezones #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 15:08:15 +02:00
Michael Mayer
947e7a0fb1 Metadata: Normalize timezone names from YAML sidecar files #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 13:39:22 +02:00
Michael Mayer
d96b8027bd Metadata: Ensure that time zone names are always normalized #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 13:29:48 +02:00
Michael Mayer
8e17a8780b Backend: Limit error message chars, not runes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 13:25:55 +02:00
Michael Mayer
36afc4a215 Backend: Clip error messages when too long
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 13:22:52 +02:00
Michael Mayer
c4d4b91488 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 12:52:37 +02:00
Michael Mayer
b9dda9337a Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 12:52:21 +02:00
Michael Mayer
5cd2c25489 Metadata: Move timezone related functions to /pkg/time/tz #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 12:50:12 +02:00
Michael Mayer
598be273aa Metadata: Set time zone based on location #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 15:45:18 +02:00
Michael Mayer
2a9741e826 Metadata: Default to "Local" if no time zone is set #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 14:44:50 +02:00
Theresa Gresch
44a3a9dcba Merge pull request #4944 from photoprism/test/album-cover-setting
Tests: Add test for setting album cover
2025-04-22 13:21:28 +02:00
Michael Mayer
da7af617f7 Docs: Update internal/api/swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:48:51 +02:00
Michael Mayer
4bd4d17c5c Docs: Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:48:32 +02:00
Michael Mayer
20036b5de0 Frontend: Update .po translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:48:03 +02:00
Michael Mayer
582fc5d359 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:46:47 +02:00
Michael Mayer
c9777b39ed Frontend: Upgrade maplibre-gl to v5.4.0 in package.json #4959
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:46:26 +02:00
Michael Mayer
3bf5e59c63 Places: Add raster planet and hillshading tiles to Default map #4959
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:42:54 +02:00
Michael Mayer
bb8d835034 Frontend: Update .po and .json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-21 12:54:52 +02:00
Cathie Integra
f8563adbcc Weblate: Update frontend translations (#4958)
Co-authored-by: Weblate <noreply@weblate.org>
2025-04-21 12:52:59 +02:00
Michael Mayer
e616ced26e Places: Remove "Buildings" map style (now included in Default)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-21 12:52:10 +02:00
Michael Mayer
264a1d67f6 Places: Add "Buildings" map style
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-20 19:45:31 +02:00
Michael Mayer
7d56a454dc Viewer: Remove experimental flag checks for info sidebar #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 18:50:11 +02:00
Michael Mayer
a86d64b828 Viewer: Remove experimental flag check for info sidebar #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 18:49:12 +02:00
Michael Mayer
ddf5924917 Viewer: Ignore jpeg codec for non-image media types #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 18:19:26 +02:00
Michael Mayer
f50d833a0e Viewer: Display additional metadata in the Info sidebar #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 18:13:18 +02:00
Ömer Duran
91ebcfab33 Tests: Implement album cover setting functionality across multiple pages 2025-04-19 16:24:29 +02:00
Michael Mayer
27b72aa1e9 Search: Parse lat,lng string into float64 coordinates #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 16:04:44 +02:00
Michael Mayer
e7bb9bfb56 Viewer: Add link to maplibre.org/maputnik/ in comments #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 14:52:43 +02:00
Michael Mayer
bbac7b91f0 Viewer: Don't render sidebar map when Places is disabled #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 14:46:02 +02:00
Michael Mayer
ecf8af193b Viewer: Refactor #4930 to load dynamic map in info sidebar #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 14:24:41 +02:00
Ömer Duran
ca1f5cf781 Tests: Fix album cover test using proper selectors 2025-04-19 11:46:16 +02:00
Ömer Duran
140dc7b23c Viewer: Add Interactive Map to Sidebar Info (#4930)
* Backend: Clean up Unix socket file on shutdown

* Backend: Clean up Unix socket file on startup

* Backend: Clean up Unix socket file

* Refactor Unix socket cleanup in server startup process

* Viewer: Reorganize the sidebar to display additional metadata attributes based on file type #4812

* Viewer: Add map view to sidebar #4812

* Viewer: Improve sidebar metadata spacing. #4812

* Viewer: Optimize megapixels calculation #4812

* Viewer: Move styles to lightbox.css #4812

* Viewer: Removing click event from Lat Lng #4812

* Viewer: Adjust css for map

* Viewer: extract map component from sidebar info

* fix: restore actions array in sidebar info

* Viewer: Offline map feature removed from sidebar

* Viewer: Use TakenAtLocal for consistent sidebar date format

* Viewer: Add zoom controls to the map component

* Viewer: Add map attribution in sidebar with default collapsed state
2025-04-19 11:15:06 +02:00
Michael Mayer
f0629cb151 Frontend: Update dependencies in go.mod and go.sum #4952
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 11:05:58 +02:00
Michael Mayer
d60a4c5767 Frontend: Update timestamp formats #4952
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 11:02:20 +02:00
Ömer Duran
555936d939 Merge branch 'develop' into test/album-cover-setting 2025-04-19 10:20:28 +02:00
Michael Mayer
79ceeb1ada Settings: Apply custom time zone under App Passwords and Services #4952
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 17:14:01 +02:00
Michael Mayer
e811422c44 Config: Shorten time zone in timestamps #4952
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 16:41:13 +02:00
Michael Mayer
4a0f285a2c Config: Use configured timezone for logs, errors and mod dates #4952
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 16:06:15 +02:00
Michael Mayer
a746cc1779 Docker: Upgrade libheif to v1.19.7 in jammy base images
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 14:43:42 +02:00
Michael Mayer
ac8ee9e4dd Build: Change variable export in Makefiles for Make v4 compatibility
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 13:52:14 +02:00
Michael Mayer
9e521b244d Develop: Upgrade default base image from oracular to plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 13:12:47 +02:00
Michael Mayer
eb228b0e45 Docker: Install libheif v1.19.5 in jammy base images
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 12:54:26 +02:00
Michael Mayer
b64ba76bc5 Scripts: Update install-libheif.sh and install-tensorflow.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 12:53:56 +02:00
Michael Mayer
bdf97fff58 Makefile: Add build-libheif build commands for Ubuntu 25.04 (Plucky)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:55:19 +02:00
Michael Mayer
fa3d7d831d Dist: Update install-libheif.sh script and related Makefile targets
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:51:37 +02:00
Michael Mayer
da4e9d57c1 Develop: Add deploy image for Ubuntu 25.04 (Plucky Puffin)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:24:11 +02:00
Michael Mayer
d7ea086c5d Develop: Add Docker base image files for Ubuntu 25.04 (Plucky Puffin)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:18:17 +02:00
Michael Mayer
9e56672019 Frontend: Update dependencies in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:17:20 +02:00
Michael Mayer
7dad78eb91 Backend: Update Go dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:16:59 +02:00
Michael Mayer
d15c6e59fa Frontend: Update .json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:07:46 +02:00
Weblate
1c086455e2 Weblate: Update frontend translations 2025-04-18 11:07:06 +02:00
Michael Mayer
9b78cc3406 Frontend: Update .po translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 10:58:32 +02:00
graciousgey
c83d5f2f17 Tests: Adapt acceptance tests 2025-04-17 18:07:09 +02:00
graciousgrey
53c853dae5 Tests: Add unit tests #4942 2025-04-17 15:40:42 +02:00
Michael Mayer
b6423e5090 UX: Add wide sidepanel style for batch edit dialog #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 15:13:45 +02:00
Michael Mayer
5877be38df Search: Improve generated search filter documentation #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 12:51:09 +02:00
Michael Mayer
7da6a97d15 Search: Improve generated search filter documentation #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 12:46:57 +02:00
Michael Mayer
2b66db8216 Search: Improve generated search filter documentation #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 12:44:27 +02:00
Michael Mayer
46e4810391 Search: Improve generated search filter documentation #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 12:40:46 +02:00
Michael Mayer
f7b80bf34d Search: Update generated search filter documentation #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 12:12:02 +02:00
Michael Mayer
9c33235a83 Frontend: Update dependencies and package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 11:38:32 +02:00
Michael Mayer
04ac2a383e Search: Find pictures with a specific term in Title or Caption #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 11:38:08 +02:00
Michael Mayer
dff52f8ca0 Frontend: Update vuetify from v3.8.1 to v3.8.2 in package.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 19:48:49 +02:00
Michael Mayer
23a1182d00 Settings: Ensure that defaults are used instead of empty values
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 19:28:05 +02:00
Michael Mayer
b3a38224af Settings: Change the initial maps style to "default"
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 18:15:03 +02:00
Michael Mayer
1b519fbc33 Places: Change the Default map setting value to "default"
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 18:09:23 +02:00
Michael Mayer
49e84c4a7f Config: Apply configured default time zone to user settings #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 17:56:57 +02:00
Michael Mayer
557a25a6b5 Metadata: Change date_med_tz to datetime_med_tz #4812 #4946 #4930
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 17:39:08 +02:00
Michael Mayer
a440eb6bc7 Metadata: Update tests after changing Local timezone identifier #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 17:36:25 +02:00
Michael Mayer
5f32d75700 Metadata: Use "Local" as identifier for the local time zone #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 17:12:37 +02:00
Michael Mayer
dddfee3920 Frontend: Update .po translation files #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 17:10:35 +02:00
Michael Mayer
e21bdc3b22 Frontend: Update translation .json files #4945
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 12:52:27 +02:00
Weblate
3f5e040a5a Weblate: Update frontend translations 2025-04-16 12:50:49 +02:00
Ömer Duran
4096583b1c Tests: Remove 'only' flag from album cover test 2025-04-16 10:50:15 +02:00
Ömer Duran
33afc04d86 Tests: Add test for setting album cover 2025-04-16 10:48:42 +02:00
raystlin
d082929dee Removed parameter Channels
It seems to be standarized, so it is now used as an additional check for
input signatures.
2025-04-16 08:19:58 +00:00
Michael Mayer
6ee74461ed API: Update swagger.json docs
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:10:15 +02:00
Michael Mayer
a446218933 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:10:01 +02:00
Michael Mayer
35e0e112bd Frontend: Update translation .po and .json files #4942
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:09:22 +02:00
Michael Mayer
f28aaac518 Frontend: Update deps in package.json and package-lock.json #4942
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:08:47 +02:00
Michael Mayer
fbcd210578 UX: Add language selector to login page #4942
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:07:32 +02:00
Michael Mayer
fcd17f8859 Frontend: Update translation .json files #4941
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:07:32 +02:00
Weblate
af7c71e762 Weblate: Update frontend translations 2025-04-16 10:07:26 +02:00
Weblate
e1b9946448 Weblate: Update frontend translations 2025-04-16 08:12:47 +02:00
Michael Mayer
7f4f63775d Frontend: Update translation .po and .json files #4939
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 17:00:02 +02:00
Weblate
208ff18a5d Weblate: Update frontend translations 2025-04-15 16:57:55 +02:00
Michael Mayer
c22b118dd6 MediaFile: Use thumb.FileInfo() to determine image width and height
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 15:43:24 +02:00
Michael Mayer
96dbb5ccbc Config: Refactor command flags, reports, and client options
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 15:42:03 +02:00
Michael Mayer
2c47644ea8 Metadata: Add "local" as an alias for an unknown (local) time zone
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 15:39:04 +02:00
Michael Mayer
161b18e5e8 Backend: Update Go dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 15:35:36 +02:00
Michael Mayer
55394d4137 AI: Remove Hidden flag from "photoprism vision run" command #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 14:51:55 +02:00
raystlin
eca0bc5205 AI Test: Added path protection to tests
As we are decompressing, we have to check the paths before writing to
disk.
2025-04-14 19:32:42 +00:00
Michael Mayer
a89d386541 UX: Tweak video controls background in fullscreen viewer
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 19:08:39 +02:00
Michael Mayer
eb39662e36 UX: Darken video controls background in fullscreen viewer
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 18:58:24 +02:00
Michael Mayer
b2a36c24dc UX: Refactor notification styles in notify.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 18:46:02 +02:00
Michael Mayer
0b390f356f UX: Add role attributes to progress bars in templates/app.gohtml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 17:41:49 +02:00
Michael Mayer
61ceed0726 UX: Refactor notification styles in notify.css and notify.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 17:41:05 +02:00
Michael Mayer
60e41b425b UX: Refactor notification teleport and transition in notify.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 17:29:58 +02:00
Michael Mayer
41d9dd7c21 Frontend: Refactor setTokens() and updateTokens() in common/config.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 15:35:05 +02:00
Theresa Gresch
c3741cb912 Merge pull request #4934 from photoprism/keyboard-shortcut-tests
Tests: Add Keyboard Shortcuts
2025-04-14 12:20:25 +02:00
Michael Mayer
ac8db75a3f UX: Improve mobile notification styles in notify.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 10:31:02 +02:00
raystlin
8d9a16cef6 AI Test: Added resolution to external models
The definition of the models now contain the expected resolution. This
has improved the results for efficientnet-m.
2025-04-14 08:15:10 +00:00
Ömer Duran
65fcb25952 Merge branch 'develop' into keyboard-shortcut-tests 2025-04-14 10:11:51 +02:00
Ömer Duran
ab31f20508 Test: Move nav selectors to constructor 2025-04-14 10:11:25 +02:00
Michael Mayer
38155190c5 Import: Ignore archive sidecar files #4929
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 08:59:21 +02:00
Michael Mayer
66b7d83d7e Search: Reset view when there are no results or an error occurs #4935
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 08:46:31 +02:00
Michael Mayer
d4becb575f Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 07:46:30 +02:00
Michael Mayer
bc4f1f3080 API: Update swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 07:45:56 +02:00
Michael Mayer
328938d268 Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 07:44:10 +02:00
Michael Mayer
f8bf1d45fc UX: Improve notification styles in notify.css and notify.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 07:42:58 +02:00
raystlin
5521d06bc0 Added Interval parameter to PhotoInput
This parameter allows us to rescale the input of the models because some
of them need values between [0, 1] and other between [-1, 1].
2025-04-13 20:32:02 +00:00
raystlin
e55536e581 Merge remote-tracking branch 'upstream/develop' into feature/custom-tf-model-127 2025-04-13 15:27:50 +00:00
raystlin
457a47b36f AI: Added a test for external models
The tests has a envar check to avoid running it by default, as it
downloads the models and generates a lot of errors.
2025-04-13 14:54:42 +00:00
raystlin
ad94d03576 Fixed classify and nsfw tests
They were broken when the constructors changed to include metadata.
2025-04-13 14:53:34 +00:00
raystlin
d993eb2a85 AI: Added some intelligence to label loading.
Now when loading labels internal/ai/tensorflow package will try to look
for all the files that match the glob label*.txt and will return the
labels that match the expected number. Some models add a first label
called background, which is a bias.
Also, a new parameter has been added to models to allow a second path to
look for the label files. This path is set to nasnet asset on
internal/ai/vision.
2025-04-13 14:49:54 +00:00
Michael Mayer
f09aa7749b UX: Update tabindex attributes and remove focus workaround in notify.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-13 13:44:25 +02:00
Michael Mayer
914476ffe7 Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-13 11:36:50 +02:00
Michael Mayer
41abde5db8 Frontend: Update dependencies in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-13 11:36:35 +02:00
Michael Mayer
916276e36a UX: Check if elements are already active before setting focus
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-13 11:35:10 +02:00
Michael Mayer
8189503a69 AI: Add additional vision service API configuration options #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-13 10:58:15 +02:00
Michael Mayer
e5916b98b9 UX: Remove .is-rtl styles from css/notify.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 20:08:42 +02:00
Michael Mayer
1d77c2306f UX: Remove unnecessary notification classes in notify.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 20:03:28 +02:00
Michael Mayer
e6ec733303 UX: Improve notification styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 19:27:37 +02:00
Michael Mayer
6f3ad2dea3 UX: Replace v-snackbar component with div elements
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 19:03:01 +02:00
Michael Mayer
377c7ed1d5 Config: Change the order of options in settings.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 17:53:46 +02:00
Michael Mayer
128df65f54 Develop: Upgrade base image from 250407-oracular to 250412-oracular
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 15:30:37 +02:00
Michael Mayer
8068e471d1 Develop: Update Makefile and compose.nvidia.yaml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 15:30:22 +02:00
Michael Mayer
494f75917c Develop: Update service configuration in compose.yaml files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 15:11:09 +02:00
Michael Mayer
52cc9b1cd3 Docker: Update install-s6.sh script
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 15:10:37 +02:00
Michael Mayer
06de8e2b66 Docker: Refactor service initialization and reduce startup log verbosity
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 14:06:39 +02:00
Michael Mayer
b03f06a1a2 Dist: Refactor install-s6.sh script
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 12:22:30 +02:00
Michael Mayer
1831261cfd Dist: Add script to install the latest nats-server binary
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 11:50:12 +02:00
Michael Mayer
43c794d242 AI: Add script to install the latest qdrant database binary #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 11:49:03 +02:00
Ömer Duran
7d39c51e31 Merge branch 'keyboard-shortcut-tests' of https://github.com/photoprism/photoprism into keyboard-shortcut-tests 2025-04-12 11:35:22 +02:00
Ömer Duran
d0a23491df Tests: Refactor lightbox archive and download shortcut tests 2025-04-12 11:33:25 +02:00
Ömer Duran
36c5b7012f Merge branch 'develop' into keyboard-shortcut-tests 2025-04-12 10:57:05 +02:00
Ömer Duran
26b552bb58 Tests: Remove 'only' from photo scroll test to ensure it runs with other tests 2025-04-12 10:55:45 +02:00
Ömer Duran
285c0f4543 Tests: Test scroll restoration and fix deprecation 2025-04-12 10:54:36 +02:00
Ömer Duran
6d6671c356 Tests: verify search not focused before ctrl+f 2025-04-12 10:27:21 +02:00
Ömer Duran
6088ebd617 Tests: Update selector for upload dialog visibility check 2025-04-12 10:22:04 +02:00
Ömer Duran
6c05e02077 Tests: Changed test messages for slideshow functionality 2025-04-12 10:20:03 +02:00
raystlin
0895a085a1 Migrated nsfw to the new model loading system.
nsfw/model.go and vision/model.go modified to make it work. Testing
remains undone.
2025-04-11 20:29:31 +00:00
raystlin
88508679b0 Modified classify to add custom models
Vision input parameters have also been changed to support the new
parameters needed for the models.
2025-04-11 20:01:36 +00:00
Michael Mayer
63fb46578a API: Remove unused "api/hooks" package
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 20:02:08 +02:00
Michael Mayer
07e22b0c14 API: Remove unused Webhook endpoint due to architecture change
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 19:39:39 +02:00
Michael Mayer
63d72ee867 AI: Refactor Webhook endpoint and improve related unit tests #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 19:22:54 +02:00
raystlin
8bc7121394 Added a comment to clarify
EnsureShape operation may seem unnecesary, but PredictCosts fails it it
is not added to the graph.
2025-04-11 16:57:27 +00:00
Michael Mayer
f2ffb0fdce AI: Add Webhook endpoint and refactor ACL for Vision API #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 18:41:54 +02:00
raystlin
7bcbaea492 Dynamically add a softmax layer to a loaded graph.
By inspecting existing models we saw that many times logits are returned
instead of probabilities. Photoprism uses probabilites to rank the
quality of the results, so we need to transform those logits. Our
approach is to add a new layer at runtime to the graph that performs the
softmax operation.
2025-04-11 14:32:17 +00:00
raystlin
d0f6d903e2 Added utilities to inspect tensorflow models.
These new functions allows us to inspect the saved models, get the tags
and try to guess the inputs and outputs.
2025-04-11 14:30:48 +00:00
Ömer Duran
7925ab205d Tests: Add acceptance tests for keyboard shortcuts
The following shortcuts are tested:
- Common page shortcuts: Search focus (Ctrl+F), Refresh (Ctrl+R), Upload dialog (Ctrl+U).
- Lightbox shortcuts: Info panel toggle (Ctrl+I), Mute/Unmute (Ctrl+M), Slideshow play/pause (Ctrl+S), Archive (Ctrl+A), Download (Ctrl+D), Edit (Ctrl+E), Fullscreen toggle (Ctrl+F), Like/Unlike (Ctrl+L).
- Expansion panel toggle (Shift+Ctrl+F) and focusing search fields on specific pages (People, Labels, Library Errors) (Ctrl+F).
2025-04-11 15:22:36 +02:00
Michael Mayer
35bfe0694b API: Disable gzip compression for /api/v1/dl endpoint #127 #1090
Required for compatibility with the Python HTTP client. In addition,
this commit refactors function names and adds tests.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 14:13:25 +02:00
Michael Mayer
bd634c828b AI: Shorten "face/embeddings" model type to just "face" #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 05:48:00 +02:00
Michael Mayer
720d83ef3a AI: Disable Vision API in demo mode #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 05:37:08 +02:00
Michael Mayer
c14be8f57e Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 05:20:08 +02:00
Michael Mayer
76757811cb Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 05:19:47 +02:00
Michael Mayer
f80acab4c2 AI: Add "photoprism vision run" command and vision worker #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 05:15:14 +02:00
Michael Mayer
5b8be2f5d4 AI: Add "photoprism vision" CLI subcommands #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 02:11:53 +02:00
Michael Mayer
6fcce84623 AI: Add photoprism-vision test service and caption API client #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 01:17:47 +02:00
Michael Mayer
068ee52301 AI: Improve code comments in vision package #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-10 22:08:49 +02:00
Michael Mayer
627f4f8d21 AI: Refactor API client in vision package #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-10 21:16:03 +02:00
Michael Mayer
0304ed37c3 AI: Set default vision API client timeout to one minute #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-10 21:07:57 +02:00
Michael Mayer
190be2a1b5 AI: Finalize facial embeddings, labels and nsfw API endpoints #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-10 20:28:26 +02:00
Michael Mayer
caf3ae1ab5 AI: Refactor use of face embeddings, labels, and nsfw models #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-10 16:49:34 +02:00
graciousgey
ecef34a8da Tests: Adapt acceptance tests 2025-04-10 11:27:49 +02:00
Michael Mayer
204ce2b100 Logs: Allow restart of logging after database provider reset #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-09 16:31:06 +02:00
Michael Mayer
eaea3a416d Logs: Stop logging errors when database connection is gone #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-09 12:50:44 +02:00
Michael Mayer
cf3b933e59 API: Refactor data URL encoding and decoding in pkg/media #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-09 10:58:48 +02:00
Michael Mayer
7f1041c434 Labels: Add image classification service client #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-08 04:14:18 +02:00
Michael Mayer
42897bde35 API: Add download package to allow temporary file downloads #127 #1090
This is necessary to provide external services with temporary access to
specific media files without giving them permanent access, a regular
download, or an access token.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 23:56:35 +02:00
Michael Mayer
0f76186663 AI: Reject API requests with content-type multipart/form-data #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 23:05:34 +02:00
Michael Mayer
d304509c0d AI: Add VisionApi, VisionUri, and VisionKey config options #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 20:30:07 +02:00
Michael Mayer
2a6b9fb237 AI: Add config option to specify the vision.yml settings file #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 13:18:03 +02:00
Michael Mayer
9d648f74dd AI: Add Code and Error to Vision API service response #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 12:51:44 +02:00
Michael Mayer
f3e066af45 AI: Add Vision API service endpoint for image classification #127 #1090
This is a proof of concept and still under development. The other
Vision API endpoints are stubs for testing and not yet functional.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 12:19:39 +02:00
Michael Mayer
907850cb80 Develop: Upgrade base image from 250402-oracular to 250407-oracular #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 11:36:51 +02:00
Michael Mayer
c6b6bfde70 CI: Exclude ARMv7 when building new Docker images and packages #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 11:36:16 +02:00
raystlin
ae735f6a1e Migrated arm64 Dockerfile to jammy
To support more gcc versions
2025-04-07 06:08:05 +02:00
raystlin
fd0baeb5a4 Modified comment on Dockerfile
Simply to add the llvm installation to the existing comment.
2025-04-07 06:08:05 +02:00
Michael Mayer
bfdb839d01 AI: Add TensorFlow utility package and improve model loading #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 05:26:45 +02:00
Michael Mayer
35e9294d87 AI: Add vision package and vision API endpoints #127 #1090
These changes allow to configure the computer vision models through an
optional vision.yml configuration file. Note that the API endpoints
are not yet functional and require further work.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 23:39:37 +02:00
Michael Mayer
b791896fc6 UX: Prevent buttons and menus from getting selected
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 15:04:25 +02:00
Michael Mayer
043f6c2569 Build: Downgrade TensorFlow from v2.18.0 to v1.15.2 in docker/armv7 #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 11:03:08 +02:00
Michael Mayer
332e57d59f AI: Update build target and install-tensorflow.sh for AVX512 #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 10:15:34 +02:00
Michael Mayer
a3456637cd AI: Detect AMX-AVX512 instructions in install-tensorflow.sh #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 10:01:22 +02:00
Michael Mayer
5650ea29b5 AI: Update libtensorflow-avx512 build target in Makefile #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 10:00:20 +02:00
Michael Mayer
c9e305808b AI: Add nano package to tensorflow Dockerfiles #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:41:26 +02:00
Michael Mayer
efe36603f8 AI: Add libtensorflow-avx512 to default targets in Makefile #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:39:21 +02:00
Michael Mayer
96fdd1a41a AI: Add libtensorflow build target for Intel AMX-AVX512 #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:37:49 +02:00
Michael Mayer
0b9233f44b AI: Build libtensorflow with --copt=-O2 instead of --copt=-O3 #222 #4922
This should optimize for fast execution as much as possible without
significantly increasing the binary size.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:25:20 +02:00
Michael Mayer
5a9e3a8645 AI: Update Makefile targets for tensorflow build images #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:14:06 +02:00
Michael Mayer
3900573a7c AI: Fix libtensorflow tar.gz path in create_archive.sh #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:09:03 +02:00
Michael Mayer
d9c260b865 AI: Use Docker build argument to specify TensorFlow version #222 #4922
This also ensures that the archives will be created in /build.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:05:06 +02:00
Michael Mayer
a97d66d6e4 AI: Update libtensorflow build targets in Makefiles #222 #4922
This normalizes the archive names and adds required compiler flags.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 08:35:06 +02:00
Michael Mayer
5256a7f276 Viewer: Add title and caption styles for collapsible sidebar #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 23:22:00 +02:00
Michael Mayer
eed7bfff73 Viewer: Refactor getViewport() function in component/lightbox.vue #4927
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 22:42:44 +02:00
Michael Mayer
d6c215c9c6 Viewer: Set max video width to 100% in lightbox.css #4927
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 22:42:18 +02:00
Michael Mayer
b6ca5a1717 Config: Add upload-limit flag to limit total upload size #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 15:44:13 +02:00
Michael Mayer
1350eff0f5 UX: Improve action menu styles in css/controls.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 14:40:45 +02:00
Michael Mayer
bf66a9e19a Config: Update import-allow description in flags.go #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 13:15:02 +02:00
Michael Mayer
5a1ca738f6 Config: Update options.go #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 13:04:14 +02:00
Michael Mayer
63d6902605 Config: Update upload-allow description in flags.go #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 12:53:55 +02:00
Michael Mayer
de89979e45 Upload: Add new config options to compose.yaml examples #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 12:49:32 +02:00
Michael Mayer
fe424d8966 Upload: Reject files that exceed the originals limit #4929 #4895 #2049
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 12:43:51 +02:00
Michael Mayer
b0e42bebf1 Upload: Add support for uploading zip archives #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 12:02:33 +02:00
Weblate
cf3b7f8d18 Weblate: Update frontend translations 2025-04-05 09:46:00 +02:00
Michael Mayer
83c30987eb Viewer: Improve $util.thumb() test in unit/common/util_test.js #4927
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 09:33:34 +02:00
Michael Mayer
1cf69e231f Viewer: Enhance thumbnail size selection for high aspect ratios #4927
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 09:31:28 +02:00
graciousgrey
6d776c8a97 Frontend: Tests set default timezone in karma.conf.js 2025-04-04 17:06:49 +02:00
Ömer Duran
974369966a UX: prevent duplicate folder selection in remote sync 2025-04-04 15:41:51 +02:00
Michael Mayer
cdc1866720 Viewer: Skip loading new image if no matching thumbnail size is set
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 13:02:04 +02:00
Michael Mayer
4915840035 Videos: Skip forward/back 10 seconds with right/left #1131 #3623 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 12:26:43 +02:00
raystlin
0ff942342f AI: Improve TensorFlow for C build images and scripts (#4922)
* Fixed create_archive.sh

The previous version followed symlinks on doing the copy to a temporary
folder, so the resulting size was 3 times what it should be. Also
*.param files have been excluded from the final tar.gz file.

* Migrated tensorflow image to jammy

So as to build against an older version of glibc and support more OS
versions.

* Extend new create_archive.sh to all build types

The changes on the main create_archive.sh are now on all the other
versions.
2025-04-04 11:36:36 +02:00
Michael Mayer
990a0a40ba Frontend: Update line numbers in translation *.po files #1131 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 11:29:52 +02:00
Michael Mayer
405c9e7650 UX: Refactor shortcut event handling to use common/view.js #1131 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 11:28:50 +02:00
Michael Mayer
dc2370ebf3 Viewer: Add tooltips to metadata in info sidebar #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 10:15:56 +02:00
Michael Mayer
439d683fdb Viewer: Update translation *.json files #4925
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 10:04:19 +02:00
Weblate
15e6ea0a4d Weblate: Update frontend translations 2025-04-04 10:03:38 +02:00
Michael Mayer
c9a8d8f89d Viewer: Shorten title of slideshow-toggle button #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 10:01:26 +02:00
Michael Mayer
e9a6973d16 Viewer: Update translation *.json files #4811 #4812 #4924
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 09:58:58 +02:00
Weblate
8a537755a0 Weblate: Update frontend translations 2025-04-04 09:57:22 +02:00
Michael Mayer
ff47ff7366 UX: Add title to information sidebar close button #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 09:55:09 +02:00
Michael Mayer
53feb26fa9 Frontend: Update dependencies in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 09:49:49 +02:00
Michael Mayer
f8e32d260e Viewer: Rename sidebar-button to info-button ("Information") #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 09:49:25 +02:00
Michael Mayer
bb60ea028e UX: Increase background opacity for error and warning notifications
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 15:54:55 +02:00
Michael Mayer
fb040de538 UX: Improve notification snackbar styles and theme colors
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 15:40:32 +02:00
Michael Mayer
e76bf0c4da Viewer: Fix copying coordinates to clipboard #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 15:39:35 +02:00
Michael Mayer
db77ddce0f UX: Refactor notification snackbar component model and styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 14:45:35 +02:00
Michael Mayer
1ed65ba8f6 UX: Refactor action menu event handling #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 13:17:16 +02:00
Michael Mayer
0fc7aa3767 Viewer: Darken info sidebar colors #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 07:03:20 +02:00
Michael Mayer
f8d2cfd1f2 Viewer: Remove anchor attribute in lightbox/menu.vue #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 06:58:27 +02:00
Michael Mayer
252784c029 Viewer: Improve info sidebar colors #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 06:43:31 +02:00
Michael Mayer
e6fecc5020 Viewer: Prevent video controls from being selected #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 06:22:26 +02:00
Michael Mayer
c973d4edd6 Viewer: Fix action menu in Firefox and improve input focus #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 06:12:47 +02:00
Michael Mayer
2dc1baf2e8 Viewer: Improve styles for and refactor collapsible sidebar #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 03:51:30 +02:00
Michael Mayer
b0e3ff1231 UX: Add transparent busy overlay style and improve keyboard shortcuts
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 20:53:57 +02:00
Michael Mayer
17154e33d2 Frontend: Rename PPhotoUploadDialog to PUploadDialog
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 20:16:10 +02:00
Michael Mayer
37d609c2bd UX: Remove Ctrl+H key shortcut in lightbox.vue #1131 #3623 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 19:23:17 +02:00
Michael Mayer
e78414ac1e Frontend: Update *.json translation file #4918
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 18:57:48 +02:00
Weblate
f3dddef6a4 Weblate: Update frontend translations 2025-04-02 18:57:03 +02:00
Michael Mayer
3d66556acf UX: Add keyboard shortcuts & improve focus management #1131 #3623 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 18:55:50 +02:00
Michael Mayer
433d726d75 SQLite: Update database initialization for entity unit tests #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 13:53:11 +02:00
Michael Mayer
6596474389 SQLite: Refactor database initialization for unit tests #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 13:44:40 +02:00
Michael Mayer
7b5f295a9b TensorFlow: Improve install-tensorflow.sh script to detect AVX-VNNI #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 13:20:47 +02:00
Michael Mayer
5ff21ad589 TensorFlow: Enable oneDNN optimizations in Dockerfiles #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 12:48:29 +02:00
Michael Mayer
8cd1de6b64 TensorFlow: Improve install-tensorflow.sh script #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 12:44:09 +02:00
Michael Mayer
f4fa80a8cf Develop: Add clean-build target to Makefile #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 11:52:44 +02:00
Michael Mayer
00e12b8bd8 Develop: Don't install AVX/AVX2 version of TensorFlow by default #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 11:50:55 +02:00
Michael Mayer
083c59550a AI: Upgrade Go language bindings for the TensorFlow C API #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 04:16:27 +02:00
Michael Mayer
b5c1c6b974 Develop: Upgrade base image from 250329-oracular to 250402-oracular #222
The new image includes TensorFlow v2.18.0 and Go v1.24.2.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 04:06:23 +02:00
Michael Mayer
0dd2639d97 SQLite: Use file storage instead of memory for unit tests #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 04:05:08 +02:00
Michael Mayer
e2d74220d5 TensorFlow: Update install-tensorflow.sh to default to v2.18.0 #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 03:40:39 +02:00
Michael Mayer
f0959c2796 Dockerfiles: Add TF_ENABLE_ONEDNN_OPTS variable for TensorFlow 2 #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 00:03:10 +02:00
Michael Mayer
6b26974ce7 TensorFlow: Upgrade build scripts to v2.18.0 #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 23:43:22 +02:00
Michael Mayer
a6b4378533 UX: Reduce flickering when refreshing search results #4917
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 21:04:17 +02:00
Michael Mayer
512f044ec6 UX: Refactor keyboard event handler in lightbox.vue #1131 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 19:56:45 +02:00
Michael Mayer
67c99fb322 UX: Support meta (Cmd) key as alternative to Ctrl for macOS #1131 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 19:44:00 +02:00
Michael Mayer
57d0869e65 Frontend: Add "focus-trap" and update dependencies in package.json #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 19:12:36 +02:00
Michael Mayer
64f051ece3 Docs: Update README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 14:11:07 +02:00
Michael Mayer
eba878dea1 Frontend: Update *.json translation files #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 12:40:58 +02:00
Weblate
a2825be165 Weblate: Update frontend translations 2025-04-01 12:40:26 +02:00
Michael Mayer
8f8d901787 Viewer: Rename PSidebarMetadata to PSidebarInfo #4812
Also allows to test the sidebar when experimental features are enabled.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 12:39:39 +02:00
Michael Mayer
80f93b471a Frontend: Update *.po translation files #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 12:36:36 +02:00
Michael Mayer
36a359eb6f Viewer: Add a lightbox theme to use for the info sidebar #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 10:35:06 +02:00
Michael Mayer
0dc3e1c8a4 Viewer: Add map marker example to sidebar metadata #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 08:45:47 +02:00
Michael Mayer
17dbe15dc2 Viewer: Set viewPortWidth during initialization #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 02:47:29 +02:00
Michael Mayer
72435cd0e8 Viewer: Remove dataSource option and add getNumItems() instead #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 02:22:40 +02:00
Michael Mayer
a12323cf2e Viewer: Make sidebar title and caption read only #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 02:22:07 +02:00
Michael Mayer
ecbcb8f63c Frontend: Update *.json translation files #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 01:54:18 +02:00
Weblate
ebc013a204 Weblate: Update frontend translations 2025-04-01 01:53:45 +02:00
Michael Mayer
f861bbece8 Frontend: Update *.po translation files #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 01:51:30 +02:00
Michael Mayer
86113d1429 Viewer: Preserve slide data while Viewer is open #383
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 01:48:32 +02:00
Michael Mayer
9f8c8b4c10 Viewer: Show "Remove from Album" action only for regular albums #383
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 01:27:29 +02:00
Michael Mayer
1ec6562799 Viewer: Implement proof-of-concept for info sidebar with metadata #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 00:34:40 +02:00
Michael Mayer
b729f53d9d Docs: Update README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 22:45:06 +02:00
Michael Mayer
cd630536e2 Docs: Update README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 22:21:17 +02:00
Michael Mayer
cdbb4eefcc Viewer: Rename PActionLightbox to PLightboxMenu #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:57:37 +02:00
Michael Mayer
b015abf85f Places: Update *.json translation files #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:44:18 +02:00
Weblate
a9e6874fe0 Weblate: Update frontend translations 2025-03-31 21:42:27 +02:00
Michael Mayer
47a5412eeb Places: Update *.po translation files #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:39:36 +02:00
Michael Mayer
70402ba46f Places: Update map title in /frontend/src/options/options.js #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:39:29 +02:00
Weblate
d3c8af196d Weblate: Update frontend translations 2025-03-31 21:38:02 +02:00
Michael Mayer
955fd1d247 Places: Update *.po translation files #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:33:45 +02:00
Michael Mayer
995da0f611 Places: Update map style options and terrain styles #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:31:24 +02:00
Michael Mayer
9c79f54994 Viewer: Add TimeZone to thumbnail model data #4812 #4905
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 20:51:26 +02:00
Michael Mayer
5a3aa9db18 Frontend: Remove unused code from component/album/toolbar.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 20:48:20 +02:00
Michael Mayer
e637034a8c Places: Improve map initialization and add satellite map style #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 20:47:48 +02:00
Michael Mayer
62987fbbe1 Viewer: Improve thumb model and thumb size calculation #4812 #4905
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 19:20:48 +02:00
Michael Mayer
5dbbf340a0 Search: Fix opening randomly sorted results in Viewer #4905
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:59:50 +02:00
Michael Mayer
31ae58435e Frontend: Update dependencies in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:37:11 +02:00
Michael Mayer
1ff381d0b7 Viewer: Refactor "Remove from Album" menu action #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:36:54 +02:00
Michael Mayer
16777de1a9 Viewer: Update *.json translation files #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:32:43 +02:00
Michael Mayer
24adfcb9f2 Viewer: Update *.po translation files #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:31:51 +02:00
Weblate
9e036d259f Weblate: Update frontend translations 2025-03-31 13:29:55 +02:00
Michael Mayer
df5695a220 Viewer: Add "Remove from Album" menu action #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:28:41 +02:00
Michael Mayer
aa687ade0b AI: Add Qdrant vector database for test & development #1090 #1287 #4669
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 12:35:28 +02:00
Michael Mayer
422256122d UX: Check permissions before opening upload dialog #1131
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 19:13:03 +02:00
Michael Mayer
2ebac920f2 UX: Show keyboard shortcuts in action menus #1131
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 18:40:35 +02:00
Michael Mayer
b678bf384c Viewer: Update *.json translation files #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 15:04:30 +02:00
Weblate
9a4773610a Weblate: Update frontend translations 2025-03-30 15:03:22 +02:00
Michael Mayer
d895affffa Frontend: Update dependencies in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 14:34:40 +02:00
Michael Mayer
1a207e3543 Viewer: Update translations in src/locales/*.po #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 14:34:18 +02:00
Michael Mayer
7bc4417eff Viewer: Add "Set as Album Cover" menu action #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 14:26:03 +02:00
Michael Mayer
7afffe1809 Setup: Improve compose.yaml inline documentation #4051
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-29 04:24:47 +01:00
Michael Mayer
4080901576 Develop: Upgrade base image from 250326 to 250329-oracular #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-29 03:40:42 +01:00
Michael Mayer
deeb8b987a PostgreSQL: Install "postgresql-client" package in Dockerfiles #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-29 02:25:37 +01:00
Michael Mayer
f142a9d52c Frontend: Update hls.js in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 23:47:00 +01:00
Michael Mayer
7bc9347909 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 23:43:19 +01:00
Michael Mayer
c6176d0b1e UX: Update counters and covers in the background #4323
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 23:20:28 +01:00
Michael Mayer
cef91e442a Import: Preserve hidden .keep and .gitkeep files #4092
This prevents directories from being deleted when using the "move"
import option, which would otherwise delete hidden files and empty
directories.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 22:20:03 +01:00
Michael Mayer
45e0504dab Config: Read OIDC client secret from file #2302
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 21:29:14 +01:00
Michael Mayer
ad5baf2823 Config: Read admin and database password from file #2302
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 21:00:56 +01:00
Michael Mayer
a89f186f40 UX: Immediately return focus when displaying notification snackbar
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 19:44:01 +01:00
Michael Mayer
0951720512 UX: Do not close notification snackbar on content click anymore
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 19:20:00 +01:00
Michael Mayer
0d251a9d43 UX: Use arrow keys to navigate in edit dialog #3623
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 18:37:05 +01:00
Michael Mayer
e025f22553 UX: Refactor notification snackbar and loading bar components
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 18:32:20 +01:00
Michael Mayer
a76bbba2a6 FFmpeg: Fix Intel Quick Sync Video (QSV) hardware transcoding #4382
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 16:31:20 +01:00
graciousgey
a24b385560 Tests: Adapt page model to changes 2025-03-28 16:22:19 +01:00
Michael Mayer
2934319591 UX: Close notification snackbar on content click
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 10:00:57 +01:00
Michael Mayer
ca708c3f56 Codespell: Fix invalid inline comments and broken test assertions #4506
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 16:57:56 +01:00
Yaroslav Halchenko
15668ee7b5 CI: Add codespell config and fix typos (#4506)
More about codespell: https://github.com/codespell-project/codespell
2025-03-27 16:42:24 +01:00
Michael Mayer
47e740fd88 Metadata: Use "github.com/ugjka/go-tz/v2" instead of custom fork
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 16:34:47 +01:00
Michael Mayer
ae0b63eb50 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 15:37:49 +01:00
Michael Mayer
9de641eb66 Backend: Remove unnecessary usage of fmt.Sprintf() #3846
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 15:12:03 +01:00
graciousgrey
9aff925c94 Tests: Add unit tests #4895 2025-03-27 14:42:59 +01:00
Michael Mayer
02bc6b6bce Faces: Remove check that is always true in ai/face/detector.go #4457
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 14:34:00 +01:00
Michael Mayer
5fe3c34167 Config: Improve parsing of boolean environment variables #4372
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 13:35:47 +01:00
Michael Mayer
4ea2ab0ddb Frontend: Update *.json translation files #4900
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 10:50:38 +01:00
Michael Mayer
ed06bbda9d Frontend: Update src/locales/*.po translation files #4900
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 10:48:07 +01:00
Cathie Integra
7c70c247b9 Weblate: Update frontend translations (#4900)
Co-authored-by: Weblate <noreply@weblate.org>
2025-03-27 10:46:42 +01:00
Michael Mayer
0761be3258 Videos: Improve transcoding and indexing logs #4549
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 10:36:15 +01:00
Michael Mayer
4329b43b76 Backend: Improve error handling and logging #4491
These changes are based on a pull request submitted by @songzhibin97.
Thank you very much!

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 09:51:38 +01:00
Michael Mayer
8836f90251 WebDAV: Refactor service discovery heuristic to add custom headers #4608
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 03:31:48 +01:00
Esteve Fernandez
a36e8b19f8 WebDAV: Add depth header to service discovery request for Hetzner compatibility (#4608)
Signed-off-by: Esteve Fernandez <esteve@apache.org>
2025-03-27 03:07:21 +01:00
Jacob D
0d487b6490 Faces: Improve performance when manual tagging (#4691)
This PR implements a strategy to improve Optimize() performance by returning the correct number of modified rows in PurgeOrphanFaces and treating the result 0 as an error condition in MergeFaces. Logging around this has been improved in faces.go and faces_optimize.go.

Related Comments:
- https://github.com/photoprism/photoprism/issues/3124#issuecomment-2566025503
- https://github.com/photoprism/photoprism/pull/4691#issuecomment-2566164179
2025-03-27 01:40:31 +01:00
Michael Mayer
4ab9b14bcb Backend: Update github.com/bytedance/sonic in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 22:15:30 +01:00
Michael Mayer
fc0aac9877 Backend: Update indirect Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 22:11:57 +01:00
Michael Mayer
3ec92af160 Frontend: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:38:29 +01:00
Michael Mayer
7fe8ad9b35 Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:36:44 +01:00
Michael Mayer
58d55f820f Frontend: Reformat *.vue components with ESLint 9
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:24:47 +01:00
Michael Mayer
9927eb62eb Develop: Upgrade base image from 250317-oracular to 250326-oracular
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:23:03 +01:00
Michael Mayer
8b89c60418 Frontend: Reformat *.vue and *.js files with ESLint 9
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:08:50 +01:00
Michael Mayer
62eff7c4c3 Frontend: Upgrade ESLint from v8.57.0 to v9.23.0
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:07:45 +01:00
Michael Mayer
858130da9c Frontend: Update build deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 20:25:34 +01:00
Michael Mayer
a62d3d0e57 Frontend: Update "maplibre-gl" in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 20:20:39 +01:00
Michael Mayer
2df077df26 Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 20:17:16 +01:00
Michael Mayer
4176303d6f Timezones: Upgrade gopkg.in/photoprism/go-tz.v2 from v2.1.3 to v2.2.0
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 20:11:43 +01:00
Michael Mayer
dce754182e Logs: Refactor message formatting in event package
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 12:58:51 +01:00
Michael Mayer
a2186f3fa4 Frontend: Update *.json translation files #4694
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 12:56:04 +01:00
Weblate
dc15a4aabe Weblate: Update frontend translations 2025-03-26 12:55:20 +01:00
Michael Mayer
b0eb7aacdd UX: Rename "Videos" to "Media" in navigation and add audio type #4694
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 12:53:15 +01:00
Weblate
6f08d7f5b9 Weblate: Update frontend translations 2025-03-26 11:55:07 +01:00
graciousgey
4996c2db0d Tests: Add acceptance tests 2025-03-26 09:19:18 +01:00
Michael Mayer
9e95c7e71c Upload: Delete invalid files, improve type checks and import logs #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 11:58:59 +01:00
Michael Mayer
1f36d35d23 Upload: Report successful number of files in users_upload.go #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 08:48:00 +01:00
Michael Mayer
3acd41027b Viewer: Update menu styles in css/lightbox.css #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 08:35:21 +01:00
Michael Mayer
ff5135c2a3 Viewer: Improve menu styles and refactor close event handler #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 08:07:40 +01:00
Michael Mayer
7de72bd99a Upload: Allow to limit the types of files users can upload #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 06:32:01 +01:00
Michael Mayer
b771e86f8d Viewer: Replace me-1 and ms-1 padding classes with custom button styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 04:09:22 +01:00
Michael Mayer
b25209f114 Settings: Refactor list of supported user interface locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 03:45:49 +01:00
Michael Mayer
0a58484d6d Viewer: Improve menu styles and move close button to the left #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 03:18:15 +01:00
Michael Mayer
c702699f45 Viewer: Regenerate frontend translation json files #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 00:23:32 +01:00
Weblate
99653613ee Weblate: Update frontend translations 2025-03-25 00:22:50 +01:00
Michael Mayer
4acba7de18 Viewer: Update frontend translation files #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 00:20:21 +01:00
Michael Mayer
8765cf4d3f Viewer: Add a three-dot menu to perform additional actions #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 00:19:29 +01:00
Michael Mayer
c78b023675 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 23:11:21 +01:00
Michael Mayer
c9f0c5f475 Frontend: Regenerate src/locales/json/*.json #4893
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 21:22:20 +01:00
Weblate
33867d4d1f Weblate: Update frontend translations 2025-03-24 21:20:41 +01:00
Michael Mayer
6e07d42a1b UX: Reduce JS bundle size by dynamically loading MapLibre GL JS #4778
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 21:20:05 +01:00
Michael Mayer
67811d87fa Videos: Create fragmented MP4s when transcoding with FFmpeg #4892
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 20:47:57 +01:00
Michael Mayer
d9924010d4 UX: Reduce JS size by loading hls.light.min.js instead of hls.js #4778
hls.light.js is a smaller version of hls.js that does not include
support for alternate audio, subtitles, CMCD, EME (DRM), and variable
substitution.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 20:16:33 +01:00
Michael Mayer
0ddc179737 UX: Reduce JS bundle size by loading translation files on demand #4778
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 12:43:08 +01:00
Michael Mayer
a125219751 Update README.md 2025-03-24 07:43:30 +01:00
Michael Mayer
93b53214f6 Update README.md 2025-03-24 07:42:23 +01:00
Michael Mayer
50b0e8babf Update README.md 2025-03-24 06:35:14 +01:00
Michael Mayer
06d6a370b7 Frontend: Update src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 14:49:28 +01:00
Weblate
4890447787 Weblate: Update frontend translations 2025-03-23 14:49:03 +01:00
Michael Mayer
0bf2c5c580 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 14:44:11 +01:00
Michael Mayer
00359b1a4e Settings: Update labels in content.vue and regenerate translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 14:43:48 +01:00
Michael Mayer
c6225f7117 Setup: Update inline docs in Docker Compose config examples #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 14:14:22 +01:00
Michael Mayer
173fa526e9 Config: Improve --prod docs in flags.go #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 14:00:22 +01:00
Michael Mayer
555d5cdbbe Config: Improve --prod docs in flags.go #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:57:50 +01:00
Michael Mayer
4ed7c6c242 Config: Update --prod and --log-level docs in flags.go #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:54:59 +01:00
Michael Mayer
9a01ace34d Config: Update --prod flag documentation in flags.go #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:48:38 +01:00
Michael Mayer
6e20ad6edb Dependencies: Update NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:14:49 +01:00
Michael Mayer
68d1bbb359 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:12:29 +01:00
Michael Mayer
c081155c4f Config: Improve log options documentation in flags.go #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:11:55 +01:00
Michael Mayer
0b02c5d17c Database: Reduce log level for connection info to debug #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 12:06:10 +01:00
Michael Mayer
cd577f5108 Update README.md 2025-03-23 11:10:17 +01:00
Michael Mayer
d3882edebc Update README.md 2025-03-23 11:08:20 +01:00
Michael Mayer
cf8fbf5870 Update README.md 2025-03-23 10:25:23 +01:00
Michael Mayer
3b6efc1786 Update README.md 2025-03-22 12:35:37 +01:00
Michael Mayer
cd427c66be Update README.md 2025-03-22 12:34:57 +01:00
Michael Mayer
9467dd89bf Update README.md 2025-03-21 18:31:22 +01:00
Michael Mayer
57590c48bb Docs: Update desktop and mobile screenshots in README.md 2025-03-21 05:44:29 +01:00
Michael Mayer
f4b3ed33a2 Dependencies: Update NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-20 22:11:23 +01:00
Michael Mayer
8af26827de Backend: Upgrade indirect Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-20 22:09:15 +01:00
2092 changed files with 191932 additions and 89205 deletions

9
.codespellrc Normal file
View File

@@ -0,0 +1,9 @@
[codespell]
# Ref: https://github.com/codespell-project/codespell#using-a-config-file
skip = .git*,*.svg,go.sum,package-lock.json,*.css,.codespellrc,locales,stopwords.*,shortwords.*,countries.*,keywords.json,smallwords.*
check-hidden = true
# ACRONYMS and generally mixed case/Capitalized words
# Also ignore some German
ignore-regex = ^(SMethod=shal|biuld: build)$|https://\S+|\b([A-Z][a-zA-Z]+|ist auf)\b|"(datin|alis|hel)"|\bfixe == false\b
# common variables or other tricky cases
ignore-words-list = renderd,nd,folde,crate,ue,fo,ist,alo,mot,te,admiraal

View File

@@ -1,4 +1,4 @@
# Local build files and directories
# Local build files and directories:
/photos/*
/frontend/node_modules/*
/node_modules
@@ -7,32 +7,63 @@
/assets/facenet
/assets/nasnet
/assets/nsfw
/assets/efficientnet
/assets/imagenet
/assets/resnet
/assets/vision
/assets/models
/storage
/build
/photoprism
/photoprism-*
/coverage.*
/frontend/tests/acceptance/screenshots
/test/
/specs/
/docs/
/bin/
# Custom config, database, log, and temporary files
/tmp/
.env
# Docker configuration files:
.dockerignore
*.log
*.jsonl
*.db
*.db-journal
Dockerfile
docker-compose*
compose.yaml
compose.*.yaml
*.override.yml
*.override.yaml
*.tmp.yml
*.tmp.yaml
# Automatically generated files, e.g. by editors and operating systems
# Customization, database, log, and temporary files:
*.socket
*.lock
*.sock
*.pid
*.log
*.jsonl
*.db
*.db-journal
*.sqlite
*.override.yml
*.tmp.yml
*.override.yaml
*.tmp.yaml
*.out
*.test
*.exe
*.exe~
*.dll
*.so
*.dylib
*.tmp
*.img
*.img.xz
*.img.gz
/*.zip
/coverage.*
__pycache__
venv
.venv
.env
.tmp
.nv
.eslintcache
.gocache
.DS_Store
.DS_Store?
._*
@@ -42,10 +73,13 @@ ehthumbs.db
Thumbs.db
.heartbeat
.idea
.glide
.codex
.local
*~
.goutputstream*
.c9revisions
.settings
.swp
.tmp
.glide
/tmp/
/internal/tmp/

View File

@@ -1,5 +1,5 @@
---
name: Bug Report
name: Bug Report 🐞
about: Report a new and clearly identified bug that must be fixed directly in the application
title: 'SHORT DESCRIPTION OF THE PROBLEM YOU ARE REPORTING'
labels: bug

92
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,92 @@
name: Bug Report 🐞
description: Report a new and clearly identified bug that must be fixed directly in the application.
title: "Category: Short bug description (PLEASE CHANGE)"
labels:
- bug
assignees: []
body:
- type: markdown
attributes:
value: |
PLEASE ONLY PROCEED IF YOU ARE SURE THIS IS NOT A SUPPORT REQUEST, AND THE ISSUE IS NOT RELATED TO A CUSTOM SETUP OR OTHER SOFTWARE YOU ARE USING:
1. Thoroughly review our [Getting Started](https://docs.photoprism.app/getting-started/) and [User Guides](https://docs.photoprism.app/user-guide/).
2. Work through the [Troubleshooting Checklists](https://docs.photoprism.app/getting-started/troubleshooting/) we provide.
3. Do not report [known issues](https://docs.photoprism.app/known-issues/) or [missing features](https://github.com/photoprism/photoprism/issues) as bugs.
- type: checkboxes
id: prerequisites
attributes:
label: Before You Continue
description: Confirm that you reviewed the guidance above.
options:
- label: This is a new, confirmed bug that has not yet been reported or documented
required: true
- type: textarea
id: documented-behavior
attributes:
label: What Is Not Working as Documented?
description: Be specific and include links to the relevant documentation when possible.
placeholder: Describe the incorrect behavior and link to the related documentation on https://docs.photoprism.app/.
validations:
required: true
- type: textarea
id: reproduction-steps
attributes:
label: How Can We Reproduce It?
description: Provide numbered steps so we can reproduce the behavior reliably.
placeholder: |
1. Go to ...
2. Click ...
3. Scroll to ...
4. Expected vs. actual result
render: markdown
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: What Behavior Do You Expect?
description: Share the correct outcome you expected to see.
validations:
required: true
- type: textarea
id: possible-cause
attributes:
label: What Could Be the Cause?
description: Summarize any investigation you have already completed and the potential root cause.
- type: textarea
id: supporting-material
attributes:
label: Logs, Sample Files, or Screenshots
description: Attach or link to files that help us reproduce the problem. Import and indexing issues require sample files and logs.
placeholder: Provide links to archives, logs, or screenshots. See https://www.photoprism.app/contact for secure sharing options.
- type: textarea
id: software-versions
attributes:
label: Which Software Versions Do You Use?
description: Include all relevant software versions so we can reproduce the environment.
placeholder: |
- PhotoPrism Architecture & Build Number (AMD64, ARM64, ARMv7, ...):
- Database Type & Version (MariaDB, MySQL, SQLite, ...):
- Operating System Types & Versions (Linux, Windows, Android, ...):
- Browser Types & Versions (Firefox, Chrome, Safari on iPhone, ...):
- Ad Blockers, Browser Plugins, or Firewall Software:
render: markdown
validations:
required: true
- type: textarea
id: installation-device
attributes:
label: On What Device Is PhotoPrism Installed?
description: Provide hardware details, especially for performance, import, or indexing issues.
placeholder: |
- Device / Processor Type (Raspberry Pi 4, Intel Core i7-3770, AMD Ryzen 7 3800X, ...):
- Physical Memory & Swap Space (GB):
- Storage Type (HDD, SSD, RAID, USB, Network Storage, ...):
- Additional Context:
render: markdown
- type: textarea
id: networking-setup
attributes:
label: Do You Use a Reverse Proxy, Firewall, VPN, or CDN?
description: Specify type and version if applicable; include NGINX configuration when relevant.
placeholder: Describe proxies, VPNs, CDNs, or firewall software involved. Include versions and configuration snippets when helpful.

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
blank_issues_enabled: true
contact_links:
- name: Ask a Question in GitHub Discussions
url: https://github.com/photoprism/photoprism/discussions
about: Use Discussions for general questions, community support, and troubleshooting help.
- name: Read Our Support Guide
url: https://www.photoprism.app/kb/getting-support
about: Learn about official support options and how to get assistance with PhotoPrism.

View File

@@ -0,0 +1,47 @@
name: Feature Request
description: Suggest a new feature or enhancement.
title: "Category: Short feature description (PLEASE CHANGE)"
labels:
- idea
assignees: []
body:
- type: markdown
attributes:
value: |
Be sure to [check our roadmap](https://link.photoprism.app/roadmap) and [search GitHub for similar features](https://github.com/photoprism/photoprism/issues) before submitting a new request.
- type: checkboxes
id: request-prep
attributes:
label: Confirmation
description: Make sure you completed these steps before opening a new request.
options:
- label: I checked this request against the roadmap and existing issues
required: true
- type: textarea
id: problem-statement
attributes:
label: What Problem Does This Solve and Why Is It Valuable?
description: Explain the underlying problem and why solving it matters to many users.
placeholder: Describe the problem, why it is important, and who is affected.
validations:
required: true
- type: textarea
id: proposed-solution
attributes:
label: What Solution Would You Like?
description: Provide a clear and concise description of the feature or enhancement you propose.
placeholder: Outline the proposed solution or experience from the user's perspective.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: What Alternatives Have You Considered?
description: Describe other options you explored and why they are less suitable.
placeholder: Mention any alternative solutions, workarounds, or related features you evaluated.
- type: textarea
id: additional-context
attributes:
label: Additional Context
description: Share relevant context, references, or screenshots that illustrate the request.
placeholder: Add links, references, or screenshots that help explain the request.

View File

@@ -1,18 +0,0 @@
---
name: Question
about: You have a general question or need assistance
title: 'STOP! DO NOT PROCEED, USE GITHUB DISCUSSIONS INSTEAD - THANK YOU'
labels: technical-support
assignees: ''
---
FOR GENERAL QUESTIONS, TECHNICAL SUPPORT, AND TO GET TO KNOW OTHER COMMUNITY MEMBERS:
<https://github.com/photoprism/photoprism/discussions>
OUR TROUBLESHOOTING CHECKLISTS HELP YOU QUICKLY DIAGNOSE AND FIX COMMON PROBLEMS:
<https://docs.photoprism.app/getting-started/troubleshooting/>
DO NOT PROCEED, THANK YOU!

View File

@@ -1,33 +1,34 @@
<!--
Thank you for your interest in contributing!
Because we want to create the best possible product for our users, we have a set of criteria to ensure that all submissions are acceptable, see https://docs.photoprism.app/developer-guide/pull-requests/ for details.
(1) Please provide a concise description of your pull request.
- What does it implement / fix / improve? Why?
- Are the changes related to an existing issue?
(2) After you submit your first pull request, you will be asked to accept our CLA, see https://www.photoprism.app/cla.
(3) Finally, please confirm that the following criteria are met by replacing "[ ]" with "[x]" (also possible at a later time).
-->
Acceptance Criteria:
- [ ] Features and enhancements must be fully implemented so that they can be released at any time without additional work
- [ ] Automated unit and/or acceptance tests are mandatory to ensure the changes work as expected and to reduce repetitive manual work
- [ ] Frontend components must be responsive to work and look properly on phones, tablets, and desktop computers; you must have tested them on all major browsers and different devices
- [ ] Documentation and translation updates should be provided if needed
- [ ] In case you submit database-related changes, they must be tested and compatible with SQLite 3 and MariaDB 10.5.12+
### Description
<!--
We appreciate your interest in contributing! Please provide a brief description of your changes so that we know what is included in this pull request, and confirm that it meets the acceptance criteria:
Since reviewing, testing and finally merging pull requests requires significant resources on our side, this can take several months if it's not just a small fix, especially if extensive testing is required to prevent bugs from getting into our stable version.
We thank you for your patience! :)
What does it aim to implement, fix or improve? Why?
-->
These changes implement/fix/improve...
#### Related Issues
- Links to issues that this PR fixes, implements, or is otherwise related to...
### Acceptance Criteria
<!-- You may add additional criteria and/or remove criteria that do not apply, e.g. because your PR does not include frontend changes: -->
- [ ] New features or enhancements are fully implemented and do not break existing functionality, so that they can be released at any time without requiring additional work
- [ ] Automated unit and/or acceptance tests are included to ensure that changes work as expected and to reduce repetitive manual work
- [ ] Documentation has been / will be updated, especially as it relates to new configuration options or potentially disruptive changes
- [ ] The user interface has been tested on Chrome, Safari, and Firefox and is fully responsive for use on phones, tablets, and desktop computers
- [ ] Database-related changes have been successfully tested with SQLite 3 and MariaDB 10.5.12+
<!--
Contribution Agreement:
After submitting your first pull request, you will be asked to confirm our contribution agreement. This allows us to safely use your Contribution in all our projects without risking unexpected legal disputes or having to repeatedly ask for permission.
The agreement is solely for our protection and that of our users. It does not grant us exclusive rights to your code.
PhotoPrism UG ("PhotoPrism", "we" or "us") hereby confirms to you that, to the fullest extent permitted by applicable law, this Contribution is provided "AS IS" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OR CONDITIONS OF NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. You have no obligation to provide support, maintenance, or other services for your Contribution.
Thank you very much! 🌈💎✨
-->

86
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,86 @@
# Instructions for GitHub Copilot
## Purpose
- Provide Copilot with the single sources of truth for building, testing, and contributing to PhotoPrism.
- Improve PR reviews and code suggestions by aligning them with our documented workflows and style.
## Single Sources of Truth (SOT)
- Makefile targets (always prefer existing targets): https://github.com/photoprism/photoprism/blob/develop/Makefile
- Developer Guide Setup: https://docs.photoprism.app/developer-guide/setup/
- Developer Guide Tests: https://docs.photoprism.app/developer-guide/tests/
- Contributing: https://github.com/photoprism/photoprism/blob/develop/CONTRIBUTING.md
- Security: https://github.com/photoprism/photoprism/blob/develop/SECURITY.md
- REST API (Swagger): https://docs.photoprism.dev/
- REST API Guide: https://docs.photoprism.app/developer-guide/api/
- Agents reference for tools/commands: https://github.com/photoprism/photoprism/blob/develop/AGENTS.md
## Build & Run (local dev; use Makefile first)
- Show tasks: `make help`
- Build local image: `make docker-build`
- Start dev env: `docker compose up` (add `-d` for detached)
- Logs: `docker compose logs -f --tail=100 photoprism`
- Open app: http://localhost:2342/ (HTTP) / https://app.localssl.dev/ (TLS via Traefik when enabled)
- From the dev container:
- Install deps: `make dep`
- Build frontend: `make build-js` (or `cd frontend && npm run build`)
- Build backend: `make build-go`
- Watch frontend: `make watch-js` (stop with Ctrl+C)
- Run server binary: `./photoprism start`
## Tests & Lint
- Full tests: `make test`
- Frontend tests (Vitest): `make test-js` (watch: `make vitest-watch`, coverage: `make vitest-coverage`)
- Backend tests: `make test-go`
- Formatting:
- Go: `go fmt`, `goimports` (see `make fmt`, `make fmt-go`)
- JS/Vue: use scripts in `frontend/package.json` (ESLint + Prettier)
## Project Structure & Languages
- Backend: Go (`internal/`, `pkg/`, `cmd/`) + MariaDB/SQLite
- Frontend: Vue 3 + Vuetify 3 (`frontend/`)
- Docker/compose for dev/CI; Traefik used for local TLS in dev profile when enabled.
## Code Review Instructions (for Copilot)
- Respect SOT above; do not invent flags, env vars, or Compose options. If a command/env var is not in the docs/Makefile/CLI help, say “not documented” and suggest checking the SOT.
- Prefer minimal, surgical diffs. Propose changes as concrete patches and reference the relevant Makefile target or doc section.
- Before suggesting refactors, check tests and build tasks exist and can pass with the change. If tests are missing, suggest specific Vitest/Go test snippets.
- Security: never suggest committing secrets; prefer env vars and `.env` in dev only. Point to SECURITY.md for disclosures.
- Data safety: never run or recommend destructive CLI operations in examples without explicit backups and `--yes`. Avoid `photoprism reset`, `photoprism users reset`, `photoprism auth reset`, or `photoprism audit reset` in PR comments unless the change is specifically about those commands; if unavoidable, add bold warnings and backup steps.
- Database/schema: if a change touches persistence, check for migrations and mention `photoprism migrate` / `migrations` commands.
- API changes: align with the REST API docs/spec; include curl examples only if they match current endpoints and auth notes.
- UX/i18n: keep UI strings concise, translatable, and consistent; avoid hard-coded language constructs; prefer existing patterns/components.
## Style & Patterns
- Go: idiomatic Go, clear error handling, small functions, packages with focused responsibilities. Keep public surface minimal. Add/adjust unit tests.
- Vue/JS: options API, store patterns as in existing code, avoid breaking translations. Keep ESLint/Prettier clean.
- Config & flags: suggest `photoprism --help`, `photoprism show config-options` or `photoprism show config-yaml` to verify names before using them.
## Performance & Reliability
- Prefer using existing caches, workers, and batching strategies referenced in code and Makefile. Consider memory/CPU impact; suggest benchmarks or profiling only when justified.
## When Unsure
- Ask for the exact Makefile target or doc link you need, then proceed. Defer to SOT if any conflict arises.
## References To Help Copilot Answer Questions
- Show supported formats/filters: run `photoprism show file-formats` and `photoprism show search-filters` (use results rather than guessing).
- For CI/dev containers, assume Linux/Unix shell by default; link Windows specifics in Developer Guide FAQ.
## Output Expectations
- Prefer short, actionable comments with code blocks that pass tests locally: `make test-js` (frontend) / `make test-go` (backend)
- If a suggestion requires additional context (e.g., DB access, external service), call it out explicitly.
## Safety Checklist Before Proposing a CLI Command
- Include a dry-run or non-destructive variant if possible.
- Recommend creating/using backups before any reset/migrate.

View File

@@ -0,0 +1,13 @@
---
applyTo:
- "internal/**"
- "pkg/**"
- "cmd/**"
---
For backend changes:
- Maintain Go style; keep functions small, errors wrapped with context.
- Add/update unit tests; ensure `make test-go` passes.
- Touching schema? Mention migrations and verify with `photoprism migrations ls`/`migrate`.
- For CLI/config, confirm flags/envs via `photoprism --help` / `photoprism show config-options` before suggesting.

View File

@@ -0,0 +1,12 @@
---
applyTo:
- "frontend/**"
---
For frontend changes:
- Keep Vue 3 idioms; prefer options API and existing components.
- Run `make build-js` and `make test-js`; fix ESLint/Prettier before proposing changes.
- Avoid introducing global state; follow existing store patterns.
- Keep strings translatable; dont hardcode locales.
- For performance, avoid unnecessary reactivity and re-renders; justify new deps.

25
.gitignore vendored
View File

@@ -18,6 +18,10 @@
*.dll
*.so
*.dylib
*.tmp
*.img
*.img.xz
*.img.gz
/*.zip
/coverage.*
__pycache__
@@ -25,8 +29,13 @@ venv
.venv
.env
.tmp
.nv
.eslintcache
.gocache
/pro
/plus
/tmp/
/internal/tmp/
/test/
*-lock.json
/node_modules
@@ -37,6 +46,7 @@ venv
/frontend/src/locales/*.mo
/frontend/tests_output
frontend/coverage/
**/__screenshots__/
/photoprism
/photoprism-*
/photos/originals/*
@@ -48,8 +58,12 @@ frontend/coverage/
/assets/nasnet
/assets/nsfw
/assets/static/build/
/pro
/plus
/assets/static/maps/
/assets/*net
/assets/vision
/specs/
/docs/
/bin/
# Files created automatically by editors and/or operating systems:
.DS_Store
@@ -60,8 +74,13 @@ frontend/coverage/
ehthumbs.db
Thumbs.db
.heartbeat
.idea
.glide
.idea
.codex
.local
.project
.vscode
*.tmproj
*~
.goutputstream*
.c9revisions

335
.qdrant.yaml Normal file
View File

@@ -0,0 +1,335 @@
log_level: INFO
# Logging configuration
# Qdrant logs to stdout. You may configure to also write logs to a file on disk.
# Be aware that this file may grow indefinitely.
# logger:
# # Logging format, supports `text` and `json`
# format: text
# on_disk:
# enabled: true
# log_file: path/to/log/file.log
# log_level: INFO
# # Logging format, supports `text` and `json`
# format: text
storage:
# Where to store all the data
storage_path: ./storage
# Where to store snapshots
snapshots_path: ./snapshots
snapshots_config:
# "local" or "s3" - where to store snapshots
snapshots_storage: local
# s3_config:
# bucket: ""
# region: ""
# access_key: ""
# secret_key: ""
# Where to store temporary files
# If null, temporary snapshots are stored in: storage/snapshots_temp/
temp_path: null
# If true - point payloads will not be stored in memory.
# It will be read from the disk every time it is requested.
# This setting saves RAM by (slightly) increasing the response time.
# Note: those payload values that are involved in filtering and are indexed - remain in RAM.
#
# Default: true
on_disk_payload: true
# Maximum number of concurrent updates to shard replicas
# If `null` - maximum concurrency is used.
update_concurrency: null
# Write-ahead-log related configuration
wal:
# Size of a single WAL segment
wal_capacity_mb: 32
# Number of WAL segments to create ahead of actual data requirement
wal_segments_ahead: 0
# Normal node - receives all updates and answers all queries
node_type: "Normal"
# Listener node - receives all updates, but does not answer search/read queries
# Useful for setting up a dedicated backup node
# node_type: "Listener"
performance:
# Number of parallel threads used for search operations. If 0 - auto selection.
max_search_threads: 0
# Max number of threads (jobs) for running optimizations across all collections, each thread runs one job.
# If 0 - have no limit and choose dynamically to saturate CPU.
# Note: each optimization job will also use `max_indexing_threads` threads by itself for index building.
max_optimization_threads: 0
# CPU budget, how many CPUs (threads) to allocate for an optimization job.
# If 0 - auto selection, keep 1 or more CPUs unallocated depending on CPU size
# If negative - subtract this number of CPUs from the available CPUs.
# If positive - use this exact number of CPUs.
optimizer_cpu_budget: 0
# Prevent DDoS of too many concurrent updates in distributed mode.
# One external update usually triggers multiple internal updates, which breaks internal
# timings. For example, the health check timing and consensus timing.
# If null - auto selection.
update_rate_limit: null
# Limit for number of incoming automatic shard transfers per collection on this node, does not affect user-requested transfers.
# The same value should be used on all nodes in a cluster.
# Default is to allow 1 transfer.
# If null - allow unlimited transfers.
#incoming_shard_transfers_limit: 1
# Limit for number of outgoing automatic shard transfers per collection on this node, does not affect user-requested transfers.
# The same value should be used on all nodes in a cluster.
# Default is to allow 1 transfer.
# If null - allow unlimited transfers.
#outgoing_shard_transfers_limit: 1
# Enable async scorer which uses io_uring when rescoring.
# Only supported on Linux, must be enabled in your kernel.
# See: <https://qdrant.tech/articles/io_uring/#and-what-about-qdrant>
#async_scorer: false
optimizers:
# The minimal fraction of deleted vectors in a segment, required to perform segment optimization
deleted_threshold: 0.2
# The minimal number of vectors in a segment, required to perform segment optimization
vacuum_min_vector_number: 1000
# Target amount of segments optimizer will try to keep.
# Real amount of segments may vary depending on multiple parameters:
# - Amount of stored points
# - Current write RPS
#
# It is recommended to select default number of segments as a factor of the number of search threads,
# so that each segment would be handled evenly by one of the threads.
# If `default_segment_number = 0`, will be automatically selected by the number of available CPUs
default_segment_number: 0
# Do not create segments larger this size (in KiloBytes).
# Large segments might require disproportionately long indexation times,
# therefore it makes sense to limit the size of segments.
#
# If indexation speed have more priority for your - make this parameter lower.
# If search speed is more important - make this parameter higher.
# Note: 1Kb = 1 vector of size 256
# If not set, will be automatically selected considering the number of available CPUs.
max_segment_size_kb: null
# Maximum size (in KiloBytes) of vectors to store in-memory per segment.
# Segments larger than this threshold will be stored as read-only memmapped file.
# To enable memmap storage, lower the threshold
# Note: 1Kb = 1 vector of size 256
# To explicitly disable mmap optimization, set to `0`.
# If not set, will be disabled by default.
memmap_threshold_kb: null
# Maximum size (in KiloBytes) of vectors allowed for plain index.
# Default value based on https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md
# Note: 1Kb = 1 vector of size 256
# To explicitly disable vector indexing, set to `0`.
# If not set, the default value will be used.
indexing_threshold_kb: 20000
# Interval between forced flushes.
flush_interval_sec: 5
# Max number of threads (jobs) for running optimizations per shard.
# Note: each optimization job will also use `max_indexing_threads` threads by itself for index building.
# If null - have no limit and choose dynamically to saturate CPU.
# If 0 - no optimization threads, optimizations will be disabled.
max_optimization_threads: null
# This section has the same options as 'optimizers' above. All values specified here will overwrite the collections
# optimizers configs regardless of the config above and the options specified at collection creation.
#optimizers_overwrite:
# deleted_threshold: 0.2
# vacuum_min_vector_number: 1000
# default_segment_number: 0
# max_segment_size_kb: null
# memmap_threshold_kb: null
# indexing_threshold_kb: 20000
# flush_interval_sec: 5
# max_optimization_threads: null
# Default parameters of HNSW Index. Could be overridden for each collection or named vector individually
hnsw_index:
# Number of edges per node in the index graph. Larger the value - more accurate the search, more space required.
m: 16
# Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build index.
ef_construct: 100
# Minimal size (in KiloBytes) of vectors for additional payload-based indexing.
# If payload chunk is smaller than `full_scan_threshold_kb` additional indexing won't be used -
# in this case full-scan search should be preferred by query planner and additional indexing is not required.
# Note: 1Kb = 1 vector of size 256
full_scan_threshold_kb: 10000
# Number of parallel threads used for background index building.
# If 0 - automatically select.
# Best to keep between 8 and 16 to prevent likelihood of building broken/inefficient HNSW graphs.
# On small CPUs, less threads are used.
max_indexing_threads: 0
# Store HNSW index on disk. If set to false, index will be stored in RAM. Default: false
on_disk: false
# Custom M param for hnsw graph built for payload index. If not set, default M will be used.
payload_m: null
# Default shard transfer method to use if none is defined.
# If null - don't have a shard transfer preference, choose automatically.
# If stream_records, snapshot or wal_delta - prefer this specific method.
# More info: https://qdrant.tech/documentation/guides/distributed_deployment/#shard-transfer-method
shard_transfer_method: null
# Default parameters for collections
collection:
# Number of replicas of each shard that network tries to maintain
replication_factor: 1
# How many replicas should apply the operation for us to consider it successful
write_consistency_factor: 1
# Default parameters for vectors.
vectors:
# Whether vectors should be stored in memory or on disk.
on_disk: null
# shard_number_per_node: 1
# Default quantization configuration.
# More info: https://qdrant.tech/documentation/guides/quantization
quantization: null
# Default strict mode parameters for newly created collections.
strict_mode:
# Whether strict mode is enabled for a collection or not.
enabled: false
# Max allowed `limit` parameter for all APIs that don't have their own max limit.
max_query_limit: null
# Max allowed `timeout` parameter.
max_timeout: null
# Allow usage of unindexed fields in retrieval based (eg. search) filters.
unindexed_filtering_retrieve: null
# Allow usage of unindexed fields in filtered updates (eg. delete by payload).
unindexed_filtering_update: null
# Max HNSW value allowed in search parameters.
search_max_hnsw_ef: null
# Whether exact search is allowed or not.
search_allow_exact: null
# Max oversampling value allowed in search.
search_max_oversampling: null
service:
# Maximum size of POST data in a single request in megabytes
max_request_size_mb: 32
# Number of parallel workers used for serving the api. If 0 - equal to the number of available cores.
# If missing - Same as storage.max_search_threads
max_workers: 0
# Host to bind the service on
host: 0.0.0.0
# HTTP(S) port to bind the service on
http_port: 6333
# gRPC port to bind the service on.
# If `null` - gRPC is disabled. Default: null
# Comment to disable gRPC:
grpc_port: 6334
# Enable CORS headers in REST API.
# If enabled, browsers would be allowed to query REST endpoints regardless of query origin.
# More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
# Default: true
enable_cors: true
# Enable HTTPS for the REST and gRPC API
enable_tls: false
# Check user HTTPS client certificate against CA file specified in tls config
verify_https_client_certificate: false
# Set an api-key.
# If set, all requests must include a header with the api-key.
# example header: `api-key: <API-KEY>`
#
# If you enable this you should also enable TLS.
# (Either above or via an external service like nginx.)
# Sending an api-key over an unencrypted channel is insecure.
#
# Uncomment to enable.
# api_key: your_secret_api_key_here
# Set an api-key for read-only operations.
# If set, all requests must include a header with the api-key.
# example header: `api-key: <API-KEY>`
#
# If you enable this you should also enable TLS.
# (Either above or via an external service like nginx.)
# Sending an api-key over an unencrypted channel is insecure.
#
# Uncomment to enable.
# read_only_api_key: your_secret_read_only_api_key_here
# Uncomment to enable JWT Role Based Access Control (RBAC).
# If enabled, you can generate JWT tokens with fine-grained rules for access control.
# Use generated token instead of API key.
#
# jwt_rbac: true
# Hardware reporting adds information to the API responses with a
# hint on how many resources were used to execute the request.
#
# Uncomment to enable.
# hardware_reporting: true
cluster:
# Use `enabled: true` to run Qdrant in distributed deployment mode
enabled: false
# Configuration of the inter-cluster communication
p2p:
# Port for internal communication between peers
port: 6335
# Use TLS for communication between peers
enable_tls: false
# Configuration related to distributed consensus algorithm
consensus:
# How frequently peers should ping each other.
# Setting this parameter to lower value will allow consensus
# to detect disconnected nodes earlier, but too frequent
# tick period may create significant network and CPU overhead.
# We encourage you NOT to change this parameter unless you know what you are doing.
tick_period_ms: 100
# Compact consensus operations once we have this amount of applied
# operations. Allows peers to join quickly with a consensus snapshot without
# replaying a huge amount of operations.
# If 0 - disable compaction
compact_wal_entries: 128
# Set to true to prevent service from sending usage statistics to the developers.
# Read more: https://qdrant.tech/documentation/guides/telemetry
telemetry_disabled: true

429
AGENTS.md Normal file
View File

@@ -0,0 +1,429 @@
# PhotoPrism® Repository Guidelines
**Last Updated:** October 21, 2025
## Purpose
This file tells automated coding agents (and humans) where to find the single sources of truth for building, testing, and contributing to PhotoPrism.
Learn more: https://agents.md/
## Sources of Truth
- Makefile targets (always prefer existing targets): https://github.com/photoprism/photoprism/blob/develop/Makefile
- Developer Guide Setup: https://docs.photoprism.app/developer-guide/setup/
- Developer Guide Tests: https://docs.photoprism.app/developer-guide/tests/
- Contributing: https://github.com/photoprism/photoprism/blob/develop/CONTRIBUTING.md
- Security: https://github.com/photoprism/photoprism/blob/develop/SECURITY.md
- REST API: https://docs.photoprism.dev/ (Swagger), https://docs.photoprism.app/developer-guide/api/ (Docs)
- Code Maps: [`CODEMAP.md`](CODEMAP.md) (Backend/Go), [`frontend/CODEMAP.md`](frontend/CODEMAP.md) (Frontend/JS)
- Face Detection & Embeddings Notes: [`internal/ai/face/README.md`](internal/ai/face/README.md)
> Quick Tip: to inspect GitHub issue details without leaving the terminal, run `curl -s https://api.github.com/repos/photoprism/photoprism/issues/<id>`.
### Specifications (Versioning & Usage)
- In the main repo, `specs/` appears ignored because it is managed as a nested Git repository; change into `specs/` before staging or committing spec updates.
- Availability: The `specs/` repository is private and is not guaranteed to be present in every clone or environment. Do not add `Makefile` targets in the main project that depend on `specs/` paths. When `specs/` is available, run its tools directly (e.g., `bash specs/scripts/lint-status.sh`).
- If available, always use the latest spec version for a topic (highest `-vN`), as linked from `specs/README.md`.
- Testing Guides: `specs/dev/backend-testing.md` (Backend/Go), `specs/dev/frontend-testing.md` (Frontend/JS)
- Whenever the Change Management instructions for a document require it, publish changes as a new file with an incremented version suffix (e.g., `*-v3.md`) rather than overwriting the original file.
- Older spec versions remain in the repo for historical reference but are not linked from the main TOC. Do not base new work on superseded files (e.g., `*-v1.md` when `*-v2.md` exists).
- Auto-generated configuration and command references live under `specs/generated/`. Agents MUST NOT read, analyse, or modify anything in this directory; refer humans to `specs/generated/README.md` if regeneration is required.
- Regenerate NOTICE files with `make notice` when dependencies change. Do not edit `NOTICE` or `frontend/NOTICE` manually.
**Style note:** Document headings must use Title Case (capitalize words ≥4 letters in AP-style) across Markdown files to keep generated navigation and changelogs consistent.
**CLI note:** When writing CLI examples or scripts, place option flags before positional arguments unless the command requires a different order.
## Project Structure & Languages
- Backend: Go (`internal/`, `pkg/`, `cmd/`) + MariaDB/SQLite
- Package boundaries: Code in `pkg/*` MUST NOT import from `internal/*`.
- If you need access to config/entity/DB, put new code in a package under `internal/` instead of `pkg/`.
- GORM field naming: When adding struct fields that include uppercase abbreviations (e.g., `LabelNSFW`), set an explicit `gorm:"column:<name>"` tag so column names stay consistent (`label_nsfw` instead of `label_n_s_f_w`).
- Frontend: Vue 3 + Vuetify 3 (`frontend/`)
- Docker/compose for dev/CI; Traefik is used for local TLS (`*.localssl.dev`)
### Web Templates & Shared Assets
- HTML entrypoints live under `assets/templates/`; key files are `index.gohtml`, `app.gohtml`, `app.js.gohtml`, and `splash.gohtml`. The browser check logic resides in `assets/static/js/browser-check.js` and is included via `app.js.gohtml`; it performs capability checks (Promise, fetch, AbortController, `script.noModule`, etc.) before the main bundle executes.
- To preserve the fallback messaging, keep the `<script>` order in `app.js.gohtml` so `browser-check.js` loads before `{{ .config.JsUri }}`. Do not add `defer` or `async` to the bundle tag unless you reintroduce a guarded loader.
- The same loader partial is reused in private packages (`pro/assets/templates/index.gohtml`, `plus/assets/templates/index.gohtml`). Whenever you touch `app.js.gohtml` or change how we load the bundle, mirror the update by running commands such as `cd pro && sed -n '1,160p' assets/templates/index.gohtml` (and similarly for `plus`) to confirm they include the shared partial instead of hard-coding `<script src="{{ .config.JsUri }}">`.
- Splash styles are defined in `frontend/src/css/splash.css`. Add new splash elements (for example `.splash-warning`) there so both public and private editions remain visually consistent.
- Browser baseline: PhotoPrism requires Safari 13 / iOS 13 or current Chrome, Edge, or Firefox. Update the message in `assets/templates/app.js.gohtml` (and the matching CSS) if support changes.
## Agent Runtime (Host vs Container)
Agents MAY run either:
- **Inside the Development Environment container** (recommended for least privilege).
- **On the host** (outside Docker), in which case the agent MAY start/stop the Dev Environment as needed.
### Detecting the environment (agent logic)
Agents SHOULD detect the runtime and choose commands accordingly:
- **Inside container if** one of the following is true:
- File exists: `/.dockerenv`
- Project path equals (or is a direct child of): `/go/src/github.com/photoprism/photoprism`
#### Examples
Bash:
```bash
if [ -f "/.dockerenv" ] || [ -d "/go/src/github.com/photoprism/photoprism/.git" ]; then
echo "container"
else
echo "host"
fi
```
Node.js:
```js
const fs = require("fs");
const inContainer = fs.existsSync("/.dockerenv");
const inDevPath = fs.existsSync("/go/src/github.com/photoprism/photoprism/.git");
console.log(inContainer || inDevPath ? "container" : "host");
```
### Agent installation and invocation
- **Inside container**: Prefer running agents via `npm exec` (no global install), for example:
- `npm exec --yes <agent-binary> -- --help`
- Or use `npx <agent-binary> ...`
- If the agent is distributed via npm and must be global, install inside the container only:
- `npm install -g <agent-npm-package>`
- Replace `<agent-binary>` / `<agent-npm-package>` with the names from the agents official docs.
- **On host**: Use the vendors recommended install for your OS. Ensure your agent runs from the repository root so it can discover `AGENTS.md` and project files.
## Build & Run (local)
- Run `make help` to see common targets (or open the `Makefile`).
- **Host mode** (agent runs on the host; agent MAY manage Docker lifecycle):
- Build local dev image (once): `make docker-build`
- Start services: `docker compose up` (add `-d` to start in the background)
- Follow live app logs: `docker compose logs -f --tail=100 photoprism` (Ctrl+C to stop)
- All services: `docker compose logs -f --tail=100`
- Last 10 minutes only: `docker compose logs -f --since=10m photoprism`
- Plain output (easier to copy): `docker compose logs -f --no-log-prefix --no-color photoprism`
- Execute a single command in the app container: `docker compose exec photoprism <command>`
- Example: `docker compose exec photoprism ./photoprism help`
- Why `./photoprism`? It runs the locally built binary in the project directory.
- Run as non-root to avoid root-owned files on bind mounts:
`docker compose exec -u "$(id -u):$(id -g)" photoprism <command>`
- Durable alternative: set the service user or `PHOTOPRISM_UID`/`PHOTOPRISM_GID` in `compose.yaml`; if you hit issues, run `make fix-permissions`.
- Open a terminal session in the app container: `make terminal`
- Stop everything when done: `docker compose --profile=all down --remove-orphans` (`make down` does the same)
- **Container mode** (agent runs inside the app container):
- Install deps: `make dep`
- Build frontend/backend: `make build-js` and `make build-go`
- Watch frontend changes (auto-rebuild): `make watch-js`
- Or run directly: `cd frontend && npm run watch`
- Tips: refresh the browser to see changes; running the watcher outside the container can be faster on non-Linux hosts; stop with Ctrl+C
- Start the PhotoPrism server: `./photoprism start`
- Open http://localhost:2342/ (HTTP)
- Or https://app.localssl.dev/ (HTTPS via Traefik reverse proxy)
- Only if Traefik is running and the dev compose labels are active
- Labels for `*.localssl.dev` are defined in the dev compose files, e.g. https://github.com/photoprism/photoprism/blob/develop/compose.yaml
- Admin Login: Local compose files set `PHOTOPRISM_ADMIN_USER=admin` and `PHOTOPRISM_ADMIN_PASSWORD=photoprism`; if the credentials differ, inspect `compose.yaml` (or the active environment) for these variables before logging in.
- Do not use the Docker CLI inside the container; starting/stopping services requires host Docker access.
Note: Across our public documentation, official images, and in production, the command-line interface (CLI) name is `photoprism`. Other PhotoPrism binary names are only used in development builds for side-by-side comparisons of the Community Edition (CE) with PhotoPrism Plus (`photoprism-plus`) and PhotoPrism Pro (`photoprism-pro`).
## Tests
- From within the Development Environment:
- Full unit test suite: `make test` (runs backend and frontend tests)
- Test frontend/backend: `make test-js` and `make test-go`
- Go packages: `go test` (all tests) or `go test -run <name>` (specific tests only)
- Need to inspect the MariaDB data while iterating? Connect directly inside the dev shell with `mariadb -D photoprism` and run SQL without rebuilding Go code.
- Go tests live beside sources: for `path/to/pkg/<file>.go`, add tests in `path/to/pkg/<file>_test.go` (create if missing). For the same function, group related cases as `t.Run(...)` sub-tests (table-driven where helpful) and use **PascalCase** for subtest names (for example, `t.Run("Success", ...)`).
- Frontend unit tests use **Vitest**; see scripts in `frontend/package.json`.
- Vitest watch/coverage: `make vitest-watch` and `make vitest-coverage`
- Acceptance tests: use the `acceptance-*` targets in the `Makefile`
### Playwright MCP Usage
- **Endpoint & Navigation** — Playwright MCP is preconfigured to reach the dev server at `http://localhost:2342/`.
Use `playwright__browser_navigate` to open `/library/login`, sign in, and then call `playwright__browser_take_screenshot` to capture the page state.
- **Viewport Defaults** — Desktop sessions open with a `1280×900` viewport by default.
Use `playwright__browser_resize` if the viewport is not preconfigured or you need to adjust it mid-run.
- **Mobile Workflows** — When testing responsive layouts, use the `playwright_mobile` server (for example, `playwright_mobile__browser_navigate`).
It launches with a `375×667` viewport, matching a typical smartphone display, so you can capture mobile layouts without manual resizing.
- **Authentication** — Default admin credentials are `admin` / `photoprism`:
- If login fails, check your active Compose file or container environment for `PHOTOPRISM_ADMIN_USER` and `PHOTOPRISM_ADMIN_PASSWORD`.
- Tip: if your MCP supports it, persist a storage state after login and reuse it in later steps to skip re-authentication.
- **Sidebar Navigation** — The sidebar nests items such as `Library → Errors`:
- Expand a parent entry by clicking its chevron before selecting links inside.
- **Session Cleanup** — After scripted interactions, close the browser tab with `playwright__browser_close` (or `playwright_mobile__browser_close`) to keep the MCP session tidy for subsequent runs.
- **Stability / Waiting** — Prefer robust waits over sleeps:
- After navigation: `waitUntil: 'networkidle'` (or wait for a key locator).
- Before clicking: ensure the locator is `visible` and `enabled`.
- Use role/label/text selectors over brittle XPaths.
- **Screenshot Format & Size** — Keep artifacts small and reproducible:
- Prefer **JPEG** with quality (e.g., `quality: 80`) instead of PNG.
- Limit to the visible viewport (`fullPage: false`), unless explicitly required.
- Name files deterministically, e.g., `.local/screenshots/<case>/<step>__<viewport>.jpg` (create the folder if it doesnt exist).
- Avoid embedding large screenshots in chat history—reference the file path instead.
- **Desktop example** (if your MCP tool exposes Playwright options 1:1):
```json
{
"path": ".local/screenshots/fix-event-leaks/login__desktop.jpg",
"type": "jpeg",
"quality": 80,
"fullPage": false
}
```
- **Non-interactive runs** — If `npx` is fetching the MCP server at runtime, add `--yes` to its args (or preinstall and use `--no-install`) to avoid prompts in CI.
### FFmpeg Tests & Hardware Gating
- By default, do not run GPU/HW encoder integrations in CI. Gate with `PHOTOPRISM_FFMPEG_ENCODER` (one of: `vaapi`, `intel`, `nvidia`).
- Negative-path tests should remain fast and always run:
- Missing ffmpeg binary → immediate exec error.
- Unwritable destination → command fails without creating files.
- Prefer command-string assertions when hardware is unavailable; enable HW runs locally only when a device is configured.
### Fast, Focused Test Recipes
- Filesystem + archives (fast): `go test ./pkg/fs -run 'Copy|Move|Unzip' -count=1`
- Media helpers (fast): `go test ./pkg/media/... -count=1`
- Thumbnails (libvips, moderate): `go test ./internal/thumb/... -count=1`
- FFmpeg command builders (moderate): `go test ./internal/ffmpeg -run 'Remux|Transcode|Extract' -count=1`
### CLI Testing Gotchas (Go)
- Exit codes and `os.Exit`:
- `urfave/cli` calls `os.Exit(code)` when a command returns `cli.Exit(...)`, which will terminate `go test` abruptly (often after logs like `http 401:`).
- Use the test helper `RunWithTestContext` (in `internal/commands/commands_test.go`) which temporarily overrides `cli.OsExiter` so the process doesnt exit; you still receive the error to assert `ExitCoder`.
- If you only need to assert the exit code and dont need printed output, you can invoke `cmd.Action(ctx)` directly and check `err.(cli.ExitCoder).ExitCode()`.
- Noninteractive mode: set `PHOTOPRISM_CLI=noninteractive` and/or pass `--yes` to avoid prompts that block tests and CI.
- SQLite DSN in tests:
- `config.NewTestConfig("<pkg>")` defaults to SQLite with a persuite DSN like `.<pkg>.db`. Dont assert an empty DSN for SQLite.
- Clean up any persuite SQLite files in tests with `t.Cleanup(func(){ _ = os.Remove(dsn) })` if you capture the DSN.
## Code Style & Lint
- Go: run `make fmt-go swag-fmt` to reformat the backend code + Swagger annotations (see `Makefile` for additional targets)
- Doc comments for packages and exported identifiers must be complete sentences that begin with the name of the thing being described and end with a period.
- All newly added functions, including unexported helpers, must have a concise doc comment that explains their behavior.
- For short examples inside comments, indent code rather than using backticks; godoc treats indented blocks as preformatted.
- Branding: Always spell the product name as `PhotoPrism`; this proper noun is an exception to generic naming rules.
- Every Go package must contain a `<package>.go` file in its root (for example, `internal/auth/jwt/jwt.go`) with the standard license header and a short package description comment explaining its purpose.
- JS/Vue: use the lint/format scripts in `frontend/package.json` (ESLint + Prettier)
- All added code and tests **must** be formatted according to our standards.
> Remember to update the `**Last Updated:**` line at the top whenever you edit these guidelines or other files containing a timestamp.
## Safety & Data
- Never commit secrets, local configurations, or cache files. Use environment variables or a local `.env`.
- Ensure `.env` and `.local` are ignored in `.gitignore` and `.dockerignore`.
- Prefer using existing caches, workers, and batching strategies referenced in code and `Makefile`. Consider memory/CPU impact; suggest benchmarks or profiling only when justified.
- Do not run destructive commands against production data. Prefer ephemeral volumes and test fixtures when running acceptance tests.
> If anything in this file conflicts with the `Makefile` or the Developer Guide, the `Makefile` and the documentation win. When unsure, **ask** for clarification before proceeding.
### Filesystem Permissions & io/fs Aliasing (Go)
- Always use our shared permission variables from `pkg/fs` when creating files/directories:
- Directories: `fs.ModeDir` (0o755 with umask)
- Regular files: `fs.ModeFile` (0o644 with umask)
- Config files: `fs.ModeConfigFile` (default 0o664)
- Secrets/tokens: `fs.ModeSecretFile` (default 0o600)
- Backups: `fs.ModeBackupFile` (default 0o600)
- Do not pass stdlib `io/fs` flags (e.g., `fs.ModeDir`) to functions expecting permission bits.
- When importing the stdlib package, alias it to avoid collisions: `iofs "io/fs"` or `gofs "io/fs"`.
- Our package is `github.com/photoprism/photoprism/pkg/fs` and provides the only approved permission constants for `os.MkdirAll`, `os.WriteFile`, `os.OpenFile`, and `os.Chmod`.
- Prefer `filepath.Join` for filesystem paths; reserve `path.Join` for URL paths.
### File I/O — Overwrite Policy (force semantics)
- Default is safety-first: callers must not overwrite non-empty destination files unless they opt-in with a `force` flag.
- Replacing empty destination files is allowed without `force=true` (useful for placeholder files).
- Open destinations with `O_WRONLY|O_CREATE|O_TRUNC` to avoid trailing bytes when overwriting; use `O_EXCL` when the caller must detect collisions.
- Where this lives:
- App-level helpers: `internal/photoprism/mediafile.go` (`MediaFile.Copy/Move`).
- Reusable utils: `pkg/fs/copy.go`, `pkg/fs/move.go`.
- When to set `force=true`:
- Explicit “replace” actions or admin tools where the user confirmed overwrite.
- Not for import/index flows; Originals must not be clobbered.
### Archive Extraction — Security Checklist
- Always validate ZIP entry names with a safe join; reject:
- absolute paths (e.g., `/etc/passwd`).
- Windows drive/volume paths (e.g., `C:\\…` or `C:/…`).
- any entry that escapes the target directory after cleaning (path traversal via `..`).
- Enforce per-file and total size budgets to prevent resource exhaustion.
- Skip OS metadata directories (e.g., `__MACOSX`) and reject suspicious names.
- Where this lives: `pkg/fs/zip.go` (`Unzip`, `UnzipFile`, `safeJoin`).
- Tests to keep:
- Absolute/volume paths rejected (Windows-specific backslash path covered on Windows).
- `..` traversal skipped; `__MACOSX` skipped.
- Per-file and total size limits enforced; directory entries created; nested paths extracted safely.
- Examples assume a Linux/Unix shell. For Windows specifics, see the Developer Guide FAQ:
https://docs.photoprism.app/developer-guide/faq/#can-your-development-environment-be-used-under-windows
### HTTP Download — Security Checklist
- Use the shared safe HTTP helper instead of adhoc `net/http` code:
- Package: `pkg/http/safe` → `safe.Download(destPath, url, *safe.Options)`.
- Default policy in this repo: allow only `http/https`, enforce timeouts and max size, write to a `0600` temp file then rename.
- SSRF protection (mandatory unless explicitly needed for tests):
- Set `AllowPrivate=false` to block private/loopback/multicast/linklocal ranges.
- All redirect targets are validated; the final connected peer IP is also checked.
- Prefer an imagefocused `Accept` header for image downloads: `"image/jpeg, image/png, */*;q=0.1"`.
- Avatars and small images: use the thin wrapper in `internal/thumb/avatar.SafeDownload` which applies stricter defaults (15s timeout, 10 MiB, `AllowPrivate=false`).
- Tests using `httptest.Server` on 127.0.0.1 must pass `AllowPrivate=true` explicitly to succeed.
- Keep perresource size budgets small; rely on `io.LimitReader` + `Content-Length` prechecks.
## Agent Quick Tips (Do This)
### Testing & Fixtures
- Go tests live next to their sources (`path/to/pkg/<file>_test.go`); group related cases as `t.Run(...)` sub-tests to keep table-driven coverage readable, and name each subtest with a PascalCase string.
- Keep Go scratch work inside `internal/...`; Go refuses to import `internal/` packages from directories like `/tmp`, so create temporary helpers under a throwaway folder such as `internal/tmp/` instead of using external paths.
- Prefer focused `go test` runs for speed (`go test ./internal/<pkg> -run <Name> -count=1`, `go test ./internal/commands -run <Name> -count=1`) and avoid `./...` unless you need the entire suite.
- Heavy packages such as `internal/entity` and `internal/photoprism` run migrations and fixtures; expect 30120s on first run and narrow with `-run` to keep iterations low.
- For CLI-driven tests, wrap commands with `RunWithTestContext(cmd, args)` so `urfave/cli` cannot exit the process, and assert CLI output with `assert.Contains`/regex because `show` reports quote strings.
- In `internal/photoprism` tests, rely on `photoprism.Config()` for runtime-accurate behavior; only build a new config if you replace it via `photoprism.SetConfig`.
- Generate identifiers with `rnd.GenerateUID(entity.ClientUID)` for OAuth client IDs and `rnd.UUIDv7()` for node UUIDs; treat `node.uuid` as required in responses.
- When adding persistent fixtures (photos, files, labels, etc.), always obtain new IDs via `rnd.GenerateUID(...)` with the matching prefix (`entity.PhotoUID`, `entity.FileUID`, `entity.LabelUID`, …) instead of inventing manual strings so the search helpers recognize them.
- For database updates, prefer the `entity.Values` type alias over raw `map[string]interface{}` so helpers stay type-safe and consistent with existing code.
- Reach for `config.NewMinimalTestConfig(t.TempDir())` when a test only needs filesystem/config scaffolding, and use `config.NewMinimalTestConfigWithDb("<name>", t.TempDir())` when you need a fresh SQLite schema without the cached fixture snapshot.
- Config test helpers now auto-discover the repo `assets/` directory; you should not set `PHOTOPRISM_ASSETS_PATH` manually in package `init()` functions unless you have a non-standard layout.
- Hub API traffic is disabled in tests by default via `hub.ApplyTestConfig()`; opt back in with `PHOTOPRISM_TEST_HUB=test`.
- Avoid `config.TestConfig()` in new tests unless you truly need the fully seeded fixture set: it shares a singleton instance that runs `InitializeTestData()` and wipes `storage/testdata`. Tests that write to Originals/Import (e.g. WebDAV helpers) should instead call `config.NewMinimalTestConfig(t.TempDir())` (or the DB variant) and follow up with `conf.CreateDirectories()` so they operate on an isolated sandbox.
- Shared fixtures live under `storage/testdata`; `NewTestConfig("<pkg>")` already calls `InitializeTestData()`, but call `c.InitializeTestData()` (and optionally `c.AssertTestData(t)`) when you construct custom configs so originals/import/cache/temp exist. `InitializeTestData()` clears old data, downloads fixtures if needed, then calls `CreateDirectories()`.
- `PhotoFixtures.Get()` and similar helpers return value copies; when a test needs the database-backed row (with associations preloaded), re-query by UID/ID using helpers like `entity.FindPhoto(fixture)` so updates observe persisted IDs and in-memory caches stay coherent.
- For slimmer tests that only need config objects, prefer the new helpers in `internal/config/test.go`: `NewMinimalTestConfig(t.TempDir())` when no database is needed, or `NewMinimalTestConfigWithDb("<pkg>", t.TempDir())` to spin up an isolated SQLite schema without seeding all fixtures.
- When you need illustrative credentials (join tokens, client IDs/secrets, etc.), reuse the shared `Example*` constants (see `internal/service/cluster/examples.go`) so tests, docs, and examples stay consistent.
### Roles & ACL
- 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`; no caller-specific overrides.
- Default unknown client roles to `RoleClient`; `acl.ParseRole` already handles `0/false/nil` as none for users.
- Build CLI role help from `Roles.CliUsageString()` (e.g., `acl.ClientRoles.CliUsageString()`); never hand-maintain role lists.
- When checking JWT/client scopes, use the shared helpers (`acl.ScopePermits` / `acl.ScopeAttrPermits`) instead of hand-written parsing.
### Import/Index
- ImportWorker may skip files if an identical file already exists (duplicate detection). Use unique copies or assert DB rows after ensuring a nonduplicate destination.
- Mixed roots: when testing related files, keep `ExamplesPath()/ImportPath()/OriginalsPath()` consistent so `RelatedFiles` and `AllowExt` behave as expected.
- `IndexOptions*` helpers now require a `*config.Config`; pass the active config (or `config.NewMinimalTestConfig(t.TempDir())` in unit tests) so face/label/NSFW scheduling matches the current run.
### CLI Usage & Assertions
- Prefer the shared helpers like `DryRunFlag(...)` and `YesFlag()` when adding new CLI flags so behaviour stays consistent across commands.
- Wrap CLI tests in `RunWithTestContext(cmd, args)` so `urfave/cli` cannot exit the process; assert quoted `show` output with `assert.Contains`/regex for the trailing ", or <last>" rule.
- Prefer `--json` responses for automation. `photoprism show commands --json [--nested]` exposes the tree view (add `--all` for hidden entries).
- Use `internal/commands/catalog` to inspect commands/flags without running the binary; when validating large JSON docs, marshal DTOs via `catalog.BuildFlat/BuildNode` instead of parsing CLI stdout.
- Expect `show` commands to return arrays of snake_case rows, except `photoprism show config`, which yields `{ sections: [...] }`, and the `config-options`/`config-yaml` variants, which flatten to a top-level array.
### API & Config Changes
- Respect precedence: `options.yml` overrides CLI/env values, which override defaults. When adding a new option, update `internal/config/options.go` (yaml/flag tags), register it in `internal/config/flags.go`, expose a getter, surface it in `*config.Report()`, and write generated values back to `options.yml` by setting `c.options.OptionsYaml` before persisting. Use `CliTestContext` in `internal/config/test.go` to exercise new flags.
- When touching configuration in Go code, use the public accessors on `*config.Config` (e.g. `Config.JWKSUrl()`, `Config.SetJWKSUrl()`, `Config.ClusterUUID()`) instead of mutating `Config.Options()` directly; reserve raw option tweaks for test fixtures only.
- When introducing new metadata sources (e.g., `SrcOllama`, `SrcOpenAI`), define them in both `internal/entity/src.go` and the frontend lookup tables (`frontend/src/common/util.js`) so UI badges and server priorities stay aligned.
- Vision worker scheduling is controlled via `VisionSchedule` / `VisionFilter` and the `Run` property set in `vision.yml`. Utilities like `vision.FilterModels` and `entity.Photo.ShouldGenerateLabels/Caption` help decide when work is required before loading media files.
- Logging: use the shared logger (`event.Log`) via the package-level `log` variable (see `internal/auth/jwt/logger.go`) instead of direct `fmt.Print*` or ad-hoc loggers.
- Audit outcomes: import `github.com/photoprism/photoprism/pkg/log/status` and end every `event.Audit*` slice with a single outcome token such as `status.Succeeded`, `status.Failed`, `status.Denied`, or other constants defined there (no additional segments afterwards).
- Error outcomes: when a sanitized error string should be the outcome, call `status.Error(err)` instead of adding a placeholder and passing `clean.Error(err)` manually.
- Cluster registry tests (`internal/service/cluster/registry`) currently rely on a full test config because they persist `entity.Client` rows. They run migrations and seed the SQLite DB, so they are intentionally slow. If you refactor them, consider sharing a single `config.TestConfig()` across subtests or building a lightweight schema harness; do not swap to the minimal config helper unless the tests stop touching the database.
- Favor explicit CLI flags: check `c.cliCtx.IsSet("<flag>")` before overriding user-supplied values, and follow the `ClusterUUID` pattern (`options.yml` → CLI/env → generated UUIDv4 persisted).
- Database helpers: reuse `conf.Db()` / `conf.Database*()`, avoid GORM `WithContext`, quote MySQL identifiers, and reject unsupported drivers early.
- Handler conventions: reuse limiter stacks (`limiter.Auth`, `limiter.Login`) and `limiter.AbortJSON` for 429s, lean on `api.ClientIP`, `header.BearerToken`, and `Abort*` helpers, compare secrets with constant time checks, set `Cache-Control: no-store` on sensitive responses, and register routes in `internal/server/routes.go`. For new list endpoints default `count=100` (max 1000) and `offset≥0`, document parameters explicitly, and set portal mode via `PHOTOPRISM_NODE_ROLE=portal` plus `PHOTOPRISM_JOIN_TOKEN` when needed.
- Swagger & docs: annotate only routed handlers in `internal/api/*.go`, use full `/api/v1/...` paths, skip helpers, and regenerate docs with `make fmt-go swag-fmt swag` or `make swag-json` (which also strips duplicate `time.Duration` enums). When iterating, target packages with `go test ./internal/api -run Cluster -count=1` or similarly scoped runs.
- Testing helpers: isolate config paths with `t.TempDir()`, reuse `NewConfig`, `CliTestContext`, and `NewApiTest()` harnesses, authenticate via `AuthenticateAdmin`, `AuthenticateUser`, or `OAuthToken`, toggle auth with `conf.SetAuthMode(config.AuthModePasswd)`, and prefer OAuth client tokens over non-admin fixtures for negative permission checks.
- Registry data and secrets: store portal/node registry files under `conf.PortalConfigPath()/nodes/` with mode `0600`, keep secrets out of logs, and only return them on creation/rotation flows.
### Formatting (Go)
- Go is formatted by `gofmt` and uses tabs. Do not hand-format indentation.
- Always run after edits: `make fmt-go` (gofmt + goimports).
### API Shape Checklist
- When renaming or adding fields:
- Update DTOs in `internal/service/cluster/response.go` and any mappers.
- Update handlers and regenerate Swagger: `make fmt-go swag-fmt swag`.
- Update tests (search/replace old field names) and examples in `specs/`.
- Quick grep: `rg -n 'oldField|newField' -S` across code, tests, and specs.
### API/CLI Tests: Known Pitfalls
- Gin routes: Register `CreateSession(router)` once per test router; reusing it twice panics on duplicate route.
- CLI commands: Some commands defer `conf.Shutdown()` or emit signals that close the DB. The harness reopens DB before each run, but avoid invoking `start` or emitting signals in unit tests.
- Signals: `internal/commands/start.go` waits on `process.Signal`; calling `process.Shutdown()/Restart()` can close DB. Prefer not to trigger signals in tests.
### Download CLI Workbench (yt-dlp, remux, importer)
- Code anchors
- CLI flags and examples: `internal/commands/download.go`
- Core implementation (testable): `internal/commands/download_impl.go`
- yt-dlp helpers and arg wiring: `internal/photoprism/dl/*` (`options.go`, `info.go`, `file.go`, `meta.go`)
- Importer entry point: `internal/photoprism/get/import.go`; options: `internal/photoprism/import_options.go`
- Quick test runs (fast feedback)
- yt-dlp package: `go test ./internal/photoprism/dl -run 'Options|Created|PostprocessorArgs' -count=1`
- CLI command: `go test ./internal/commands -run 'DownloadImpl|HelpFlags' -count=1`
- FFmpeg-less tests
- In tests: set `c.Options().FFmpegBin = "/bin/false"` and `c.Settings().Index.Convert = false` to avoid ffmpeg dependencies when not validating remux.
- Stubbing yt-dlp (no network)
- Use a tiny shell script that:
- prints minimal JSON for `--dump-single-json`
- creates a file and prints its path when `--print` is requested
- Harness env vars (supported by our tests):
- `YTDLP_ARGS_LOG` — append final args for assertion
- `YTDLP_OUTPUT_FILE` — absolute file path to create for `--print`
- `YTDLP_DUMMY_CONTENT` — file contents to avoid importer duplicate detection between tests
- Remux policy and metadata
- Pipe method: PhotoPrism remux (ffmpeg) always embeds title/description/created.
- File method: ytdlp writes files; we pass `--postprocessor-args 'ffmpeg:-metadata creation_time=<RFC3339>'` so imports get `Created` even without local remux (fallback from `upload_date`/`release_date`).
- Default remux policy: `auto`; use `always` for the most complete metadata (chapters, extended tags).
- CLI defaults: `photoprism dl` now defaults to `--method pipe` and `--impersonate firefox`; pass `-i none` to disable impersonation. Pipe mode streams raw media and PhotoPrism handles the final FFmpeg remux so metadata (title, description, author, creation time) still comes from `RemuxOptionsFromInfo`.
- Testing workflow: lean on the focused commands above; if importer dedupe kicks in, vary bytes with `YTDLP_DUMMY_CONTENT` or adjust `dest`, and remember `internal/photoprism` is heavy so validate downstream packages first.
### Sessions & Redaction (building sessions in tests)
- Admin session (full view): `AuthenticateAdmin(app, router)`.
- User session: Create a nonadmin test user (role=guest), set a password, then `AuthenticateUser`.
- Client session (redacted internal fields; `SiteUrl` visible):
```go
s, _ := entity.AddClientSession("test-client", conf.SessionMaxAge(), "cluster", authn.GrantClientCredentials, nil)
token := s.AuthToken()
r := AuthenticatedRequest(app, http.MethodGet, "/api/v1/cluster/nodes", token)
```
Admins see `AdvertiseUrl` and `Database`; client/user sessions dont. `SiteUrl` is safe to show to all roles.
### Preflight Checklist
- `go build ./...`
- `make fmt-go swag-fmt swag`
- `go test ./internal/service/cluster/registry -count=1`
- `go test ./internal/api -run 'Cluster' -count=1`
- `go test ./internal/commands -run 'ClusterRegister|ClusterNodesRotate' -count=1`
- Tooling constraints: `make swag` may fetch modules, so confirm network access before running it.
### Cluster Operations
- Keep bootstrap code decoupled: avoid importing `internal/service/cluster/node/*` from `internal/config` or the cluster root, let nodes talk to the Portal over HTTP(S), and rely on constants from `internal/service/cluster/const.go`.
- Config init order: load `options.yml` (`c.initSettings()`), run `EarlyExt().InitEarly(c)`, connect/register the DB, then invoke `Ext().Init(c)`.
- Theme endpoint: `GET /api/v1/cluster/theme` streams a zip from `conf.ThemePath()`; only reinstall when `app.js` is missing and always use the header helpers in `pkg/http/header`.
- Registration flow: send `rotate=true` only for MySQL/MariaDB nodes without credentials, treat 401/403/404 as terminal, include `ClientID` + `ClientSecret` when renaming an existing node, and persist only newly generated secrets or DB settings.
- Registry & DTOs: use the client-backed registry (`NewClientRegistryWithConfig`)—the file-backed version is legacy—and treat migration as complete only after swapping callsites, building, and running focused API/CLI tests. Nodes are keyed by UUID v7 (`/api/v1/cluster/nodes/{uuid}`), the registry interface stays UUID-first (`Get`, `FindByNodeUUID`, `FindByClientID`, `RotateSecret`, `DeleteAllByUUID`), CLI lookups resolve `uuid → ClientID → name`, and DTOs normalize `Database.{Name,User,Driver,RotatedAt}` while exposing `ClientSecret` only during creation/rotation. `nodes rm --all-ids` cleans duplicate client rows, admin responses may include `AdvertiseUrl`/`Database`, client/user sessions stay redacted, registry files live under `conf.PortalConfigPath()/nodes/` (mode 0600), and `ClientData` no longer stores `NodeUUID`.
- Provisioner & DSN: database/user names use UUID-based HMACs (`photoprism_d<hmac11>`, `photoprism_u<hmac11>`); `BuildDSN` accepts a `driver` but falls back to MySQL format with a warning when unsupported.
- If we add Postgres provisioning support, extend `BuildDSN` and `provisioner.DatabaseDriver` handling, add validations, and return `driver=postgres` consistently in API/CLI.
- Testing: exercise Portal endpoints with `httptest`, guard extraction paths with `pkg/fs.Unzip` size caps, and expect admin-only fields to disappear when authenticated as a client/user session.

266
CODEMAP.md Normal file
View File

@@ -0,0 +1,266 @@
PhotoPrism — Backend CODEMAP
**Last Updated:** October 21, 2025
Purpose
- Give agents and contributors a fast, reliable map of where things live and how they fit together, so you can add features, fix bugs, and write tests without spelunking.
- Sources of truth: prefer Makefile targets and the Developer Guide linked in AGENTS.md.
Quick Start
- Inside dev container (recommended):
- Install deps: `make dep`
- Build backend: `make build-go`
- Run server: `./photoprism start`
- Open: http://localhost:2342/ or https://app.localssl.dev/ (Traefik required)
- On host (manages Docker):
- Build image: `make docker-build`
- Start services: `docker compose up -d`
- Logs: `docker compose logs -f --tail=100 photoprism`
Executables & Entry Points
- CLI app (binary name across docs/images is `photoprism`):
- Main: `cmd/photoprism/photoprism.go`
- Commands registry: `internal/commands/commands.go` (array `commands.PhotoPrism`)
- Catalog helpers: `internal/commands/catalog` (DTOs and builders to enumerate commands/flags; Markdown renderer)
- Web server:
- Startup: `internal/commands/start.go``server.Start` (starts HTTP(S), workers, session cleanup)
- HTTP server: `internal/server/start.go` (compression, security, healthz, readiness, TLS/AutoTLS/unix socket)
- Routes: `internal/server/routes.go` (registers all v1 API groups + UI, WebDAV, sharing, .well-known)
- API group: `APIv1 = router.Group(conf.BaseUri("/api/v1"), Api(conf))`
High-Level Package Map (Go)
- `internal/api` — Gin handlers and Swagger annotations; only glue, no business logic
- `internal/commands` — CLI command definitions and orchestration (`start`, `index`, `import`, `migrate`, etc.); `commands.go` wires them into the app and subpackages like `catalog` emit CLI documentation.
- `internal/server` — HTTP server, middleware, routing, static/ui/webdav
- `internal/config` — configuration, flags/env/options, client config, DB init/migrate
- `internal/entity` — GORM v1 models, queries, search helpers, migrations
- `internal/photoprism` — core domain logic (indexing, import, faces, thumbnails, cleanup)
- `internal/workers` — background schedulers (index, vision, sync, meta, backup)
- `internal/auth` — ACL, sessions, OIDC
- `internal/service` — cluster/portal, maps, hub, webdav
- `internal/event` — logging, pub/sub, audit; canonical outcome tokens live in `pkg/log/status` (use helpers like `status.Error(err)` when the sanitized message should be the outcome)
- `internal/ffmpeg`, `internal/thumb`, `internal/meta`, `internal/form`, `internal/mutex` — media, thumbs, metadata, forms, coordination
- `pkg/*` — reusable utilities (must never import from `internal/*`), e.g. `pkg/clean`, `pkg/enum`, `pkg/fs`, `pkg/txt`, `pkg/http/header`
Templates & Static Assets
- Entry HTML lives in `assets/templates/index.gohtml`, which includes the splash markup from `app.gohtml` and the SPA loader from `app.js.gohtml`.
- The browser check logic resides in `assets/static/js/browser-check.js` and is included via `app.js.gohtml`; it performs capability checks (Promise, fetch, AbortController, `script.noModule`, etc.) before the main bundle runs. Update this file (and the partial) in lockstep with the templates in private repos (`pro/assets/templates/index.gohtml`, `plus/assets/templates/index.gohtml`) because they import the same partial, and keep the `<script>` order so the check is executed first.
- `splash.gohtml` renders the loading screen text while the bundle loads; styles are in `frontend/src/css/splash.css`.
- When adjusting browser support messaging, update both the loader partial and splash styles so the warning message stays consistent across editions.
- Service worker routes live in `internal/server/routes_webapp.go`. The helper that serves Workbox runtime files (`/workbox-:hash`) sits there as well so service workers run under both the site root and a base URI; remember Gins `:hash` parameter excludes the `.js` suffix, so the handler/test matches the full filename manually.
HTTP API
- Handlers live in `internal/api/*.go` and are registered in `internal/server/routes.go`.
- Annotate new endpoints in handler files; generate docs with: `make fmt-go swag-fmt && make swag`.
- Do not edit `internal/api/swagger.json` by hand.
- Swagger notes:
- Use full `/api/v1/...` in every `@Router` annotation (match the group prefix).
- Annotate only public handlers; skip internal helpers to avoid stray generic paths.
- `make swag-json` runs a stabilization step (`swaggerfix`) removing duplicated enums for `time.Duration`; API uses integer nanoseconds for durations.
- Common groups in `routes.go`: sessions, OAuth/OIDC, config, users, services, thumbnails, video, downloads/zip, index/import, photos/files/labels/subjects/faces, batch ops, cluster, technical (metrics, status, echo).
Configuration & Flags
- Options struct: `internal/config/options.go` with `yaml:"…"` (for `defaults.yml`/`options.yml`), `json:"…"` (clients/API), and `flag:"…"` (CLI flags/env) tags.
- For secrets/internals: `json:"-"` disables JSON processing to prevent values from being exposed through the API (see `internal/api/config_options.go`).
- If needed: `yaml:"-"` disables YAML processing; `flag:"-"` prevents `ApplyCliContext()` from assigning CLI values (flags/env variables) to a field, without affecting the flags in `internal/config/flags.go`.
- Annotations may include edition tags like `tags:"plus,pro"` to control visibility (see `internal/config/options_report.go` logic).
- Global flags/env: `internal/config/flags.go` (`EnvVars(...)`)
- Available flags/env: `internal/config/cli_flags_report.go` + `internal/config/report_sections.go` → surfaced by `photoprism show config-options --md/--json`
- YAML options mapping: `internal/config/options_report.go` + `internal/config/report_sections.go` → surfaced by `photoprism show config-yaml --md/--json`
- Report current values: `internal/config/report.go` → surfaced by `photoprism show config` (alias `photoprism config --md`).
- CLI commands catalog: `internal/commands/show_commands.go` → surfaced by `photoprism show commands` (Markdown by default; `--json` alternative; `--nested` optional tree; `--all` includes hidden commands/flags; nested `help` subcommands omitted).
- Precedence: `defaults.yml` < CLI/env < `options.yml` (global options rule). See Agent Tips in `AGENTS.md`.
- Getters are grouped by topic, e.g. DB in `internal/config/config_db.go`, server in `config_server.go`, TLS in `config_tls.go`, etc.
- Client Config (read-only)
- Endpoint: GET `/api/v1/config` (see `internal/api/api_client_config.go`).
- Assembly: Built from `internal/config/client_config.go` (not a direct serialization of Options) plus extension values registered via `config.Register` in `internal/config/extensions.go`.
- Updates: Back-end calls `UpdateClientConfig()` to publish "config.updated" over websockets after changes (see `internal/api/config_options.go` and `internal/api/config_settings.go`).
- ACL/mode aware: Values are filtered by user/session and may differ for public vs. authenticated users.
- Dont expose secrets: Treat it as client-visible; avoid sensitive data. To add fields, extend client values via `config.Register` rather than exposing Options directly.
- Refresh cadence: The web UI (nonmobile) also polls for updates every 10 minutes via `$config.update()` in `frontend/src/app.js`, complementing the websocket push.
Database & Migrations
- Driver: GORM v1 (`github.com/jinzhu/gorm`). No `WithContext`. Use `db.Raw(stmt).Scan(&nop)` for raw SQL.
- Entities and helpers: `internal/entity/*.go` and subpackages (`query`, `search`, `sortby`).
- Migrations engine: `internal/entity/migrate/*` run via `config.MigrateDb()`; CLI: `photoprism migrate` / `photoprism migrations`.
- DB init/migrate flow: `internal/config/config_db.go` chooses driver/DSN, sets `gorm:table_options`, then `entity.InitDb(migrate.Opt(...))`.
AuthN/Z & Sessions
- Session model and cache: `internal/entity/auth_session*` and `internal/auth/session/*` (cleanup worker).
- ACL: `internal/auth/acl/*` roles, grants, scopes; use constants; avoid logging secrets, compare tokens constanttime; for scope checks use `acl.ScopePermits` / `ScopeAttrPermits` instead of rolling your own parsing.
- OIDC: `internal/auth/oidc/*`.
Media Processing
- Thumbnails: `internal/thumb/*` and helpers in `internal/photoprism/mediafile_thumbs.go`.
- Metadata: `internal/meta/*`.
- FFmpeg integration: `internal/ffmpeg/*`.
- HEIF tooling: distribution binaries live under `scripts/dist/install-libheif.sh`; regenerate archives with `make build-libheif-*` (wraps `scripts/dist/build-libheif.sh` for each supported distro/arch) before publishing to `dl.photoprism.app/dist/libheif/`.
Background Workers
- Scheduler and workers: `internal/workers/*.go` (index, vision, meta, sync, backup, share); started from `internal/commands/start.go`.
- Auto indexer: `internal/workers/auto/*`.
Cluster / Portal
- Node types: `internal/service/cluster/const.go` (`cluster.RoleInstance`, `cluster.RolePortal`, `cluster.RoleService`).
- Node bootstrap & registration: `internal/service/cluster/node/*` (HTTP to Portal; do not import Portal internals).
- Registry/provisioner: `internal/service/cluster/registry/*`, `internal/service/cluster/provisioner/*`.
- Theme endpoint (server): GET `/api/v1/cluster/theme`; client/CLI installs theme only if missing or no `app.js`.
- See specs cheat sheet: `specs/portal/README.md`.
Logging & Events
- Logger and event hub: `internal/event/*`; `event.Log` is the shared logger.
- HTTP headers/constants: `pkg/http/header/*` always prefer these in handlers and tests.
Server Startup Flow (happy path)
1) `photoprism start` (CLI) `internal/commands/start.go`
2) Config init, DB init/migrate, session cleanup worker
3) `internal/server/start.go` builds Gin engine, middleware, API group, templates
4) `internal/server/routes.go` registers UI, WebDAV, sharing, wellknown, and all `/api/v1/*` routes
5) Workers and autoindex start; health endpoints `/livez`, `/readyz` available
Common HowTos
- Add a CLI command
- Create `internal/commands/<name>.go` with a `*cli.Command`
- Add it to `PhotoPrism` in `internal/commands/commands.go`
- Tests: prefer `RunWithTestContext` from `internal/commands/commands_test.go` to avoid `os.Exit`
- Add a REST endpoint
- Create handler in `internal/api/<area>.go` with Swagger annotations
- Register it in `internal/server/routes.go`
- Use helpers: `api.ClientIP(c)`, `header.BearerToken(c)`, `Abort*` functions
- Validate pagination bounds (default `count=100`, max `1000`, `offset>=0`) for list endpoints
- Run `make fmt-go swag-fmt && make swag`; keep docs accurate
- Tests: `go test ./internal/api -run <Name>` and focused helpers (`NewApiTest()`, `PerformRequest*`)
- Add a config option
- Add field with tags to `internal/config/options.go`
- Register CLI flag/env in `internal/config/flags.go` via `EnvVars(...)`
- Expose a getter (e.g., in `config_server.go` or topic file)
- Append to `rows` in `*config.Report()` after the same option as in `options.go`
- If value must persist, write back to `options.yml` and reload into memory
- Tests: cover CLI/env/file precedence (see `internal/config/test.go` helpers)
- Touch the DB schema
- Use GORM auto-migration, or add a custom migration in `internal/entity/migrate/<dialect>/...` and run `go generate` or `make generate` (runs `go generate` for all packages)
- Bump/review version gates in `migrate.Version` usage via `config_db.go`
- Tests: run against SQLite by default; for MySQL cases, gate appropriately
Testing
- Full suite: `make test` (frontend + backend). Backend only: `make test-go`.
- Focused packages: `go test ./internal/<pkg> -run <Name>`.
- CLI tests: `PHOTOPRISM_CLI=noninteractive` or pass `--yes` to avoid prompts; use `RunWithTestContext` to prevent `os.Exit`.
- SQLite DSN in tests is persuite (not empty). Clean up files if you capture the DSN.
- Frontend unit tests via Vitest are separate; see `frontend/CODEMAP.md`.
- Config helpers automatically disable Hub service calls for tests (`hub.ApplyTestConfig()`).
- Test configs auto-discover the repo `assets/` folder, so avoid adding per-package `PHOTOPRISM_ASSETS_PATH` shims unless you have an unusual layout.
Security & Hot Spots (Where to Look)
- Zip extraction (path traversal prevention): `pkg/fs/zip.go`
- Uses `safeJoin` to reject absolute/volume paths and `..` traversal; enforces per-file and total size limits.
- Tests: `pkg/fs/zip_extra_test.go` cover abs/volume/.. cases and limits.
- Force-aware Copy/Move and truncation-safe writes:
- App helpers: `internal/photoprism/mediafile.go` (`MediaFile.Copy/Move` with `force`).
- Utils: `pkg/fs/copy.go`, `pkg/fs/move.go` (use `O_TRUNC` to avoid trailing bytes).
- FFmpeg command builders and encoders:
- Core: `internal/ffmpeg/transcode_cmd.go`, `internal/ffmpeg/remux.go`.
- Encoders (string builders only): `internal/ffmpeg/{apple,intel,nvidia,vaapi,v4l}/avc.go`.
- Tests guard HW runs with `PHOTOPRISM_FFMPEG_ENCODER`; otherwise assert command strings and negative paths.
- libvips thumbnails:
- Pipeline: `internal/thumb/vips.go` (VipsInit, VipsRotate, export params).
- Sizes & names: `internal/thumb/sizes.go`, `internal/thumb/names.go`, `internal/thumb/filter.go`; face/marker crop helpers live in `internal/thumb/crop` (e.g., `ParseThumb`, `IsCroppedThumb`).
- Safe HTTP downloader:
- Shared utility: `pkg/http/safe` (`Download`, `Options`).
- Protections: scheme allowlist (http/https), preDNS + perredirect hostname/IP validation, final peer IP check, size and timeout enforcement, temp file `0600` + rename.
- Avatars: wrapper `internal/thumb/avatar.SafeDownload` applies stricter defaults (15s, 10MiB, `AllowPrivate=false`, imagefocused `Accept`).
- Tests: `go test ./pkg/http/safe -count=1` (includes redirect SSRF cases); avatars: `go test ./internal/thumb/avatar -count=1`.
Performance & Limits
- Prefer existing caches/workers/batching as per Makefile and code.
- When adding list endpoints, default `count=100` (max `1000`); set `Cache-Control: no-store` for secrets.
Conventions & Rules of Thumb
- Respect package boundaries: code in `pkg/*` must not import `internal/*`.
- Prefer constants/helpers from `pkg/http/header` over string literals.
- Never log secrets; compare tokens constanttime.
- Dont import Portal internals from cluster instance/service bootstraps; use HTTP.
- Prefer small, hermetic unit tests; isolate filesystem paths with `t.TempDir()` and env like `PHOTOPRISM_STORAGE_PATH`.
- Cluster nodes: identify by UUID v7 (internally stored as `NodeUUID`; exposed as `UUID` in API/CLI). The OAuth client ID (`NodeClientID`, exposed as `ClientID`) is for OAuth only. Registry lookups and CLI commands accept UUID, ClientID, or DNS-label name (priority in that order).
Filesystem Permissions & io/fs Aliasing
- Use `github.com/photoprism/photoprism/pkg/fs` permission variables when creating files/dirs:
- `fs.ModeDir` (0o755 with umask), `fs.ModeFile` (0o644 with umask), `fs.ModeConfigFile` (0o664), `fs.ModeSecretFile` (0o600), `fs.ModeBackupFile` (0o600).
- Do not use stdlib `io/fs` mode bits as permission arguments. When importing stdlib `io/fs`, alias it (`iofs`/`gofs`) to avoid `fs.*` collisions with our package.
- Prefer `filepath.Join` for filesystem paths across platforms; use `path.Join` for URLs only.
Cluster Registry & Provisioner Cheatsheet
- UUIDfirst everywhere: API paths `{uuid}`, Registry `Get/Delete/RotateSecret` by UUID; explicit `FindByClientID` exists for OAuth.
- Node/DTO fields: `uuid` required; `clientId` optional; database metadata includes `driver`.
- Provisioner naming (no slugs):
- database: `photoprism_d<hmac11>`
- username: `photoprism_u<hmac11>`
HMAC is base32 of ClusterUUID+NodeUUID; drivers currently `mysql|mariadb`.
- DSN builder: `BuildDSN(driver, host, port, user, pass, name)`; warns and falls back to MySQL format for unsupported drivers.
- Go tests live beside sources: for `path/to/pkg/<file>.go`, add tests in `path/to/pkg/<file>_test.go` (create if missing). For the same function, group related cases as `t.Run(...)` sub-tests (table-driven where helpful) and name each subtest string in PascalCase.
- Public API and internal registry DTOs use normalized field names:
- `Database` (not `db`) with `Name`, `User`, `Driver`, `RotatedAt`.
- Node-level rotation timestamps use `RotatedAt`.
- Registration returns `Secrets.ClientSecret`; the CLI persists it under config `NodeClientSecret`.
- Admin responses may include `AdvertiseUrl` and `Database`; non-admin responses are redacted by default.
- Cluster CLI highlights:
- `photoprism cluster register` supports `--site-url` and `--advertise-url`. Both values are always forwarded to the Portal; `SiteUrl` no longer depends on being different from the advertised URL.
- Automatic MariaDB credential rotation logic now lives in `config.ShouldAutoRotateDatabase()` and is shared by both the CLI and node bootstrap.
Frequently Touched Files (by topic)
- CLI wiring: `cmd/photoprism/photoprism.go`, `internal/commands/commands.go`
- Server: `internal/server/start.go`, `internal/server/routes.go`, middleware in `internal/server/*.go`
- API handlers: `internal/api/*.go` (plus `docs.go` for package docs)
- Config: `internal/config/*` (`flags.go`, `config_db.go`, `config_server.go`, `options.go`)
- Entities & queries: `internal/entity/*.go`, `internal/entity/query/*`
- Migrations: `internal/entity/migrate/*`
- Workers: `internal/workers/*`
- Cluster: `internal/service/cluster/*`
- Theme support: `internal/service/cluster/theme/version.go` exposes `DetectVersion`, used by bootstrap, CLI, and API handlers to compare portal vs node theme revisions (prefers `fs.VersionTxtFile`, falls back to `app.js` mtime).
- Registration sanitizes `AppName`, `AppVersion`, and `Theme` with `clean.TypeUnicode`; defaults for app metadata come from `config.About()` / `config.Version()`. `cluster.RegisterResponse` now includes a `Theme` hint when the portal has a newer bundle so nodes can decide whether to download immediately.
- Headers: `pkg/http/header/*`
Downloads (CLI) & yt-dlp helpers
- CLI command & core:
- `internal/commands/download.go` (flags, defaults, examples)
- `internal/commands/download_impl.go` (testable implementation used by CLI)
- yt-dlp wrappers:
- `internal/photoprism/dl/options.go` (arg wiring; `FFmpegPostArgs` hook for `--postprocessor-args`)
- `internal/photoprism/dl/info.go` (metadata discovery)
- `internal/photoprism/dl/file.go` (file method with `--output`/`--print`)
- `internal/photoprism/dl/meta.go` (`CreatedFromInfo` fallback; `RemuxOptionsFromInfo`)
- Importer:
- `internal/photoprism/get/import.go` (work pool)
- `internal/photoprism/import_options.go` (`ImportOptionsMove/Copy`)
- Testing hints:
- Fast loops: `go test ./internal/photoprism/dl -run 'Options|Created|PostprocessorArgs' -count=1`
- CLI only: `go test ./internal/commands -run 'DownloadImpl|HelpFlags' -count=1`
- Disable ffmpeg when not needed: set `FFmpegBin = "/bin/false"`, `Settings.Index.Convert=false` in tests.
- Stub yt-dlp: shell script that prints JSON for `--dump-single-json`, creates a file and prints path for `--print`.
- Avoid importer dedup: vary file bytes (e.g., `YTDLP_DUMMY_CONTENT`) or dest.
Useful Make Targets (selection)
- `make help` list targets
- `make dep` install Go/JS deps in container
- `make build-go` build backend
- `make test-go` backend tests (SQLite)
- `make swag` generate Swagger JSON in `internal/api/swagger.json`
- `make fmt-go swag-fmt` format Go code and Swagger annotations
See Also
- AGENTS.md (repository rules and tips for agents)
- Developer Guide (Setup/Tests/API) links in AGENTS.md Sources of Truth
- Specs: `specs/dev/backend-testing.md`, `specs/dev/api-docs-swagger.md`, `specs/portal/README.md`
Go Internal Import Rule
- Keep temporary Go helpers inside `internal/...`; the Go toolchain blocks importing `internal/` packages from directories such as `/tmp`, so use a disposable path like `internal/tmp/` when you need scratch space.
Fast Test Recipes
- Filesystem + archives (fast): `go test ./pkg/fs -run 'Copy|Move|Unzip' -count=1`
- Media helpers (fast): `go test ./pkg/media/... -count=1`
- Thumbnails (libvips, moderate): `go test ./internal/thumb/... -count=1`
- FFmpeg command builders (moderate): `go test ./internal/ffmpeg -run 'Remux|Transcode|Extract' -count=1`

View File

@@ -1,7 +1,11 @@
# Ubuntu 24.10 (Oracular Oriole)
FROM photoprism/develop:250317-oracular
# Ubuntu 25.10 (Questing Quokka)
FROM photoprism/develop:251018-questing
# Harden npm usage by default (applies to npm ci / install in dev container)
ENV NPM_CONFIG_IGNORE_SCRIPTS=true
## Alternative Environments:
# FROM photoprism/develop:plucky # Ubuntu 25.04 (Plucky Puffin)
# FROM photoprism/develop:armv7 # ARMv7 (32bit)
# FROM photoprism/develop:oracular # Ubuntu 24.10 (Oracular Oriole)
# FROM photoprism/develop:noble # Ubuntu 24.04 LTS (Noble Numbat)
@@ -19,3 +23,5 @@ WORKDIR "/go/src/github.com/photoprism/photoprism"
# Copy source to image.
COPY . .
COPY --chown=root:root /scripts/dist/ /scripts/
RUN sudo /scripts/install-yt-dlp.sh

298
Makefile
View File

@@ -4,20 +4,23 @@
# more about our team, products and services: https://www.photoprism.app/
export GO111MODULE=on
export NPM_CONFIG_IGNORE_SCRIPTS ?= true
-include .semver
-include .env
export
# Binary file names.
BINARY_NAME=photoprism
GOIMPORTS=goimports
# Build version.
SEMVER_MAJOR ?= 0
# Build version string.
SEMVER_MAJOR ?= 1
export SEMVER_MAJOR
SEMVER_MINOR ?= $(shell date -u +%y%m)
export SEMVER_MINOR
SEMVER_PATCH ?= $(shell date -u +%d)
SEMVER_VERSION ?= $(SEMVER_MAJOR).$(SEMVER_MINOR).$(SEMVER_PATCH)
export SEMVER_VERSION
# Build parameters.
BUILD_PATH ?= $(shell realpath "./build")
@@ -25,9 +28,12 @@ BUILD_DATE ?= $(shell date -u +%y%m%d)
REPORT_DATE ?= $(shell date -u +%Y-%m-%d)
BUILD_VERSION ?= $(shell git describe --always)
BUILD_TAG ?= $(BUILD_DATE)-$(BUILD_VERSION)
export BUILD_TAG
BUILD_OS ?= $(shell uname -s)
BUILD_ARCH ?= $(shell scripts/dist/arch.sh)
BUILD_ARCH ?= $(shell ./scripts/dist/arch.sh)
export BUILD_ARCH
JS_BUILD_PATH ?= $(shell realpath "./assets/static/build")
TF_VERSION ?= 2.18.0
# Install parameters.
INSTALL_PATH ?= $(BUILD_PATH)/photoprism-ce_$(BUILD_TAG)-$(shell echo $(BUILD_OS) | tr '[:upper:]' '[:lower:]')-$(BUILD_ARCH)
@@ -59,25 +65,31 @@ endif
# Declare "make" targets.
all: dep build-js
dep: dep-tensorflow dep-js
dep: dep-tensorflow dep-onnx dep-js
biuld: build
build: build-go
watch: watch-js
build-all: build-go build-js
pull: docker-pull
test: test-js test-go
test-go: reset-sqlite run-test-go
test-pkg: reset-sqlite run-test-pkg
test-api: reset-sqlite run-test-api
test-entity: reset-sqlite run-test-entity
test-commands: reset-sqlite run-test-commands
test-photoprism: reset-sqlite run-test-photoprism
test-short: reset-sqlite run-test-short
test-go: run-test-go
test-hub: run-test-hub
test-pkg: run-test-pkg
test-ai: run-test-ai
test-api: run-test-api
test-video: run-test-video
test-entity: run-test-entity
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
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:
@@ -94,13 +106,15 @@ devtools: install-go dep-npm
.SILENT: help;
logs:
$(DOCKER_COMPOSE) logs -f
help:
@echo "For build instructions, visit <https://docs.photoprism.app/developer-guide/>."
down:
$(DOCKER_COMPOSE) --profile=all down --remove-orphans
docs: swag
swag: swag-json
swag-json:
@echo "Generating ./internal/api/swagger.json..."
swag init --ot json --parseDependency --parseDepth 1 --dir internal/api -g api.go -o ./internal/api
@echo "Fixing unstable time.Duration enums in swagger.json..."
@GO111MODULE=on go run scripts/tools/swaggerfix/main.go internal/api/swagger.json || { echo "swaggerfix failed"; exit 1; }
swag-yaml:
@echo "Generating ./internal/api/swagger.yaml..."
swag init --ot yaml --parseDependency --parseDepth 1 --dir internal/api -g api.go -o ./internal/api
@@ -146,10 +160,12 @@ clean:
[ ! -d "frontend/node_modules" ] || rm -rf frontend/node_modules
[ ! -d "$(BUILD_PATH)" ] || rm -rf --preserve-root $(BUILD_PATH)
[ ! -d "$(JS_BUILD_PATH)" ] || rm -rf --preserve-root $(JS_BUILD_PATH)
clean-build:
[ ! -d "$(BUILD_PATH)" ] || rm -rf --preserve-root $(BUILD_PATH)
tar.gz:
$(info Creating tar.gz archives from the directories in "$(BUILD_PATH)"...)
find "$(BUILD_PATH)" -maxdepth 1 -mindepth 1 -type d -name "photoprism*" -exec tar --exclude='.[^/]*' -C {} -czf {}.tar.gz . \;
pkg: pkg-amd64 pkg-arm64 pkg-armv7
pkg: pkg-amd64 pkg-arm64
pkg-amd64:
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" photoprism/develop:jammy make all install tar.gz
pkg-arm64:
@@ -161,6 +177,7 @@ install:
@[ ! -d "$(DESTDIR)" ] || (echo "ERROR: Install path '$(DESTDIR)' already exists!"; exit 1)
mkdir --mode=$(INSTALL_MODE) -p $(DESTDIR)
env TMPDIR="$(BUILD_PATH)" ./scripts/dist/install-tensorflow.sh $(DESTDIR)
env TMPDIR="$(BUILD_PATH)" ./scripts/dist/install-onnx.sh $(DESTDIR)
rm -rf --preserve-root $(DESTDIR)/include
(cd $(DESTDIR) && mkdir -p bin lib assets)
./scripts/build.sh prod "$(DESTDIR)/bin/$(BINARY_NAME)"
@@ -176,6 +193,8 @@ install-go:
go build -v ./...
install-tensorflow:
sudo scripts/dist/install-tensorflow.sh
install-onnx:
sudo scripts/dist/install-onnx.sh
install-darktable:
sudo scripts/dist/install-darktable.sh
acceptance-sqlite-restart:
@@ -188,15 +207,15 @@ acceptance-sqlite-restart:
rm -rf storage/acceptance/originals/2011
rm -rf storage/acceptance/originals/2013
rm -rf storage/acceptance/originals/2017
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" --test start -d
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" start -d
acceptance-sqlite-stop:
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" --test stop
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" stop
acceptance-auth-sqlite-restart:
cp -f storage/acceptance/backup.db storage/acceptance/index.db
cp -f storage/acceptance/config-sqlite/settingsBackup.yml storage/acceptance/config-sqlite/settings.yml
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" --test start -d
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" start -d
acceptance-auth-sqlite-stop:
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" --test stop
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" stop
start:
./photoprism start -d
stop:
@@ -228,20 +247,44 @@ clean-local-config:
rm -f $(BUILD_PATH)/config/*
dep-list:
go list -u -m -json all | go-mod-outdated -direct
dep-list-all:
go list -u -m -json all | go-mod-outdated
npm: dep-npm npm-version
npm-version:
@echo "📦 Installed npm $$(npm --version)."
dep-npm:
sudo npm install -g npm
@echo "Installing NPM package manager..."
@if command -v sudo >/dev/null 2>&1; then \
sudo npm install -g --location=global --no-fund --no-audit "npm@latest"; \
else \
npm install -g --location=global --no-fund --no-audit "npm@latest"; \
fi
dep-js:
(cd frontend && npm ci --no-update-notifier --no-audit)
(cd frontend && npm ci --ignore-scripts --no-update-notifier --no-audit)
codex: dep-codex codex-version
codex-version:
@echo "🤖 Installed $$(codex --version)."
dep-codex:
@echo "Installing Codex CLI..."
@[ -n "$(CODEX_HOME)" ] && [ "$(CODEX_HOME)" != "/" ] && install -d -m 700 -- "$(CODEX_HOME)" || true
@if command -v sudo >/dev/null 2>&1; then \
sudo npm install -g --location=global --no-fund --no-audit "@openai/codex@latest"; \
else \
npm install -g --location=global --no-fund --no-audit "@openai/codex@latest"; \
fi
dep-go:
go build -v ./...
dep-upgrade:
go get -u -t ./...
dep-upgrade-js:
(cd frontend && npm update --legacy-peer-deps)
frontend-update:
make -C frontend update
dep-upgrade-js: frontend-update
dep-tensorflow:
scripts/download-facenet.sh
scripts/download-nasnet.sh
scripts/download-nsfw.sh
dep-onnx:
scripts/download-scrfd.sh
dep-acceptance: storage/acceptance
storage/acceptance:
[ -f "./storage/acceptance/index.db" ] || (cd storage && rm -rf acceptance && wget -c https://dl.photoprism.app/qa/acceptance.tar.gz -O - | tar -xz)
@@ -271,59 +314,75 @@ 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:oracular ./scripts/dist/build-libheif.sh v1.19.5
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.19.5
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.19.5
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.19.5
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.20.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.20.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.20.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.20.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.20.2
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:oracular ./scripts/dist/build-libheif.sh v1.19.5
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.19.5
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.19.5
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.19.5
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.20.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.20.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.20.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.20.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.20.2
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.19.5
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:jammy ./scripts/dist/build-libheif.sh v1.19.5
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.20.2
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:oracular ./scripts/dist/build-libheif.sh
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
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
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
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
build-libheif-arm64-latest:
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:oracular ./scripts/dist/build-libheif.sh
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
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
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
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
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
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:jammy ./scripts/dist/build-libheif.sh
build-tensorflow:
docker build -t photoprism/tensorflow:build docker/tensorflow
docker run -ti photoprism/tensorflow:build bash
build-tensorflow-arm64:
docker build -t photoprism/tensorflow:arm64 docker/tensorflow/arm64
docker run -ti photoprism/tensorflow:arm64 bash
build-tensorflow: docker-tensorflow-amd64
docker-tensorflow: docker-tensorflow-amd64
docker-tensorflow-amd64:
docker build --pull --no-cache -t photoprism/tensorflow:latest -t photoprism/tensorflow:amd64 -t photoprism/tensorflow:$(TF_VERSION)-amd64 --build-arg TF_VERSION=$(TF_VERSION) docker/tensorflow
terminal-tensorflow: terminal-tensorflow-amd64
terminal-tensorflow-amd64:
mkdir -p ./build
docker run --rm --pull missing -ti --platform=amd64 -v "./build:/build" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/tensorflow:amd64 bash
build-tensorflow-arm64: docker-tensorflow-arm64
docker-tensorflow-arm64:
docker build --pull --no-cache -t photoprism/tensorflow:arm64 -t photoprism/tensorflow:$(TF_VERSION)-arm64 --build-arg TF_VERSION=$(TF_VERSION) docker/tensorflow/arm64
terminal-tensorflow-arm64:
mkdir -p ./build
docker run --rm --pull missing -ti --platform=arm64 -v "./build:/build" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/tensorflow:arm64 bash
build-setup: build-setup-nas-raspberry-pi
build-setup-nas-raspberry-pi:
./scripts/setup/nas/raspberry-pi/build.sh
watch-js:
(cd frontend && env BUILD_ENV=development NODE_ENV=production npm run watch)
test-js:
$(info Running JS unit tests...)
(cd frontend && env TZ=UTC BUILD_ENV=development NODE_ENV=development BABEL_ENV=test npm run test)
(cd frontend && npm run test)
acceptance:
$(info Running public-mode tests in Chrome...)
(cd frontend && npm run testcafe -- "chrome --headless=new" --test-grep "^(Multi-Window)\:*" --test-meta mode=public --config-file ./testcaferc.json --experimental-multiple-windows "tests/acceptance" && npm run testcafe -- "chrome --headless=new" --test-grep "^(Common|Core)\:*" --test-meta mode=public --config-file ./testcaferc.json "tests/acceptance")
acceptance-short:
$(info Running JS acceptance tests in Chrome...)
(cd frontend && npm run testcafe -- "chrome --headless=new" --test-grep "^(Multi-Window)\:*" --test-meta mode=public --config-file ./testcaferc.json --experimental-multiple-windows "tests/acceptance" && npm run testcafe -- "chrome --headless=new" --test-grep "^(Common|Core)\:*" --test-meta mode=public,type=short --config-file ./testcaferc.json "tests/acceptance")
acceptance-firefox:
$(info Running JS acceptance tests in Firefox...)
(cd frontend && npm run testcafe -- firefox:headless --test-grep "^(Common|Core)\:*" --test-meta mode=public --config-file ./testcaferc.json --disable-native-automation "tests/acceptance")
acceptance-auth:
$(info Running JS acceptance-auth tests in Chrome...)
(cd frontend && npm run testcafe -- "chrome --headless=new" --test-grep "^(Multi-Window)\:*" --test-meta mode=auth --config-file ./testcaferc.json --experimental-multiple-windows "tests/acceptance" && npm run testcafe -- "chrome --headless=new" --test-grep "^(Common|Core)\:*" --test-meta mode=auth --config-file ./testcaferc.json "tests/acceptance")
acceptance-auth-short:
$(info Running JS acceptance-auth tests in Chrome...)
(cd frontend && npm run testcafe -- "chrome --headless=new" --test-grep "^(Multi-Window)\:*" --test-meta mode=auth --config-file ./testcaferc.json --experimental-multiple-windows "tests/acceptance" && npm run testcafe -- "chrome --headless=new" --test-grep "^(Common|Core)\:*" --test-meta mode=auth,type=short --config-file ./testcaferc.json "tests/acceptance")
acceptance-auth-firefox:
$(info Running JS acceptance-auth tests in Firefox...)
(cd frontend && npm run testcafe -- firefox:headless --test-grep "^(Common|Core)\:*" --test-meta mode=auth --config-file ./testcaferc.json --disable-native-automation "tests/acceptance")
vitest-watch:
$(info Running Vitest unit tests in watch mode...)
(cd frontend && npm run test-watch)
vitest-coverage:
$(info Running Vitest unit tests with coverage...)
(cd frontend && npm run test-coverage)
vitest-component:
$(info Running Vitest component tests...)
(cd frontend && npm run test-component)
reset-mariadb:
$(info Resetting photoprism database...)
mysql < scripts/sql/reset-photoprism.sql
@@ -336,27 +395,36 @@ reset-mariadb-local:
reset-mariadb-acceptance:
$(info Resetting acceptance database...)
mysql < scripts/sql/reset-acceptance.sql
reset-mariadb-all: reset-mariadb-testdb reset-mariadb-local reset-mariadb-acceptance reset-mariadb-photoprism
reset-mariadb-all: reset-mariadb-testdb reset-mariadb-local reset-mariadb-acceptance
reset-testdb: reset-sqlite reset-mariadb-testdb
reset-acceptance: reset-mariadb-acceptance
reset-sqlite:
$(info Removing test database files...)
find ./internal -type f -name ".test.*" -delete
find ./internal -type f \( -iname '.*.db' -o -iname '.*.db-journal' -o -iname '.test.*' \) -delete
run-test-short:
$(info Running short Go tests in parallel mode...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -short -timeout 5m ./pkg/... ./internal/...
run-test-go:
$(info Running all Go tests...)
$(GOTEST) -parallel 1 -count 1 -cpu 1 -tags="slow,develop" -timeout 20m ./pkg/... ./internal/...
run-test-hub:
$(info Running all Go tests with hub requests...)
env PHOTOPRISM_TEST_HUB="true" $(GOTEST) -parallel 1 -count 1 -cpu 1 -tags="slow,develop,debug" -timeout 20m ./pkg/... ./internal/...
run-test-mariadb:
$(info Running all Go tests on MariaDB...)
PHOTOPRISM_TEST_DRIVER="mysql" PHOTOPRISM_TEST_DSN="root:photoprism@tcp(mariadb:4001)/acceptance?charset=utf8mb4,utf8&collation=utf8mb4_unicode_ci&parseTime=true" $(GOTEST) -parallel 1 -count 1 -cpu 1 -tags="slow,develop" -timeout 20m ./pkg/... ./internal/...
run-test-pkg:
$(info Running all Go tests in "/pkg"...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./pkg/...
run-test-ai:
$(info Running all AI tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/ai/...
run-test-api:
$(info Running all API tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/api/...
run-test-video:
$(info Running all video tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/ffmpeg/... ./internal/photoprism/dl/... ./pkg/media/...
run-test-entity:
$(info Running all Entity tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/entity/...
@@ -380,31 +448,58 @@ test-coverage:
go test -parallel 1 -count 1 -cpu 1 -failfast -tags="slow,develop" -timeout 30m -coverprofile coverage.txt -covermode atomic ./pkg/... ./internal/...
go tool cover -html=coverage.txt -o coverage.html
go tool cover -func coverage.txt | grep total:
git-pull:
@echo "Pulling changes from remote repositories..."; \
if [ -d .git ]; then \
echo "Updating photoprism"; \
git pull --ff-only || echo "Warning: git pull failed in root"; \
else \
echo "Skipping: current directory is not a Git repo"; \
fi; \
for d in */ ; do \
[ -d "$$d" ] || continue; \
[ -d "$$d/.git" ] || continue; \
echo "Updating photoprism/$$d"; \
git -C "$$d" pull --ff-only || echo "Warning: git pull failed in $$d"; \
done;
docker-pull:
$(DOCKER_COMPOSE) --profile=all pull --ignore-pull-failures
$(DOCKER_COMPOSE) -f compose.latest.yaml pull --ignore-pull-failures
build-docker: docker-build
docker-build:
$(DOCKER_COMPOSE) --profile=all pull --ignore-pull-failures
$(DOCKER_COMPOSE) down --remove-orphans
$(DOCKER_COMPOSE) build --pull
docker-nvidia: docker-nvidia-up
docker-nvidia-up:
docker compose -f compose.nvidia.yaml up
docker-local-up:
$(DOCKER_COMPOSE) -f compose.local.yaml up --force-recreate
docker-local-down:
$(DOCKER_COMPOSE) -f compose.local.yaml down -V
nvidia: nvidia-up
nvidia-build:
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml pull --ignore-pull-failures
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml build
nvidia-up:
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml pull --ignore-pull-failures
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml up --remove-orphans
nvidia-down:
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml down --remove-orphans
intel: intel-up
intel-build:
$(DOCKER_COMPOSE) -f compose.intel.yaml pull --ignore-pull-failures
$(DOCKER_COMPOSE) -f compose.intel.yaml build
intel-up:
$(DOCKER_COMPOSE) -f compose.intel.yaml pull --ignore-pull-failures
$(DOCKER_COMPOSE) -f compose.intel.yaml up --remove-orphans
intel-down:
$(DOCKER_COMPOSE) -f compose.intel.yaml down --remove-orphans
develop: docker-develop
docker-develop: docker-develop-latest
docker-develop-all: docker-develop-latest docker-develop-other
docker-develop-latest: docker-develop-ubuntu
docker-develop-debian: docker-develop-bookworm docker-develop-bookworm-slim
docker-develop-ubuntu: docker-develop-oracular docker-develop-oracular-slim
docker-develop-ubuntu: docker-develop-questing docker-develop-questing-slim
docker-develop-other: docker-develop-debian docker-develop-bullseye docker-develop-bullseye-slim docker-develop-buster
docker-develop-bookworm:
docker pull --platform=amd64 debian:bookworm-slim
docker pull --platform=arm64 debian:bookworm-slim
docker pull --platform=arm debian:bookworm-slim
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64,linux/arm bookworm /bookworm "-t photoprism/develop:debian"
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bookworm /bookworm "-t photoprism/develop:debian"
docker-develop-bookworm-slim:
docker pull --platform=amd64 debian:bookworm-slim
docker pull --platform=arm64 debian:bookworm-slim
@@ -413,7 +508,7 @@ docker-develop-bullseye:
docker pull --platform=amd64 golang:1-bullseye
docker pull --platform=arm64 golang:1-bullseye
docker pull --platform=arm golang:1-bullseye
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64,linux/arm bullseye /bullseye
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bullseye /bullseye
docker-develop-bullseye-slim:
docker pull --platform=amd64 debian:bullseye-slim
docker pull --platform=arm64 debian:bullseye-slim
@@ -433,8 +528,7 @@ docker-develop-impish:
docker-develop-jammy:
docker pull --platform=amd64 ubuntu:jammy
docker pull --platform=arm64 ubuntu:jammy
docker pull --platform=arm ubuntu:jammy
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64,linux/arm jammy /jammy
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 jammy /jammy
docker-develop-jammy-slim:
docker pull --platform=amd64 ubuntu:jammy
docker pull --platform=arm64 ubuntu:jammy
@@ -466,11 +560,27 @@ docker-develop-noble-slim:
docker-develop-oracular:
docker pull --platform=amd64 ubuntu:oracular
docker pull --platform=arm64 ubuntu:oracular
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 oracular /oracular "-t photoprism/develop:latest -t photoprism/develop:ubuntu"
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 oracular /oracular
docker-develop-oracular-slim:
docker pull --platform=amd64 ubuntu:oracular
docker pull --platform=arm64 ubuntu:oracular
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 oracular-slim /oracular-slim
docker-develop-plucky:
docker pull --platform=amd64 ubuntu:plucky
docker pull --platform=arm64 ubuntu:plucky
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 plucky /plucky
docker-develop-plucky-slim:
docker pull --platform=amd64 ubuntu:plucky
docker pull --platform=arm64 ubuntu:plucky
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 plucky-slim /plucky-slim
docker-develop-questing:
docker pull --platform=amd64 ubuntu:questing
docker pull --platform=arm64 ubuntu:questing
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 questing /questing "-t photoprism/develop:latest -t photoprism/develop:ubuntu"
docker-develop-questing-slim:
docker pull --platform=amd64 ubuntu:questing
docker pull --platform=arm64 ubuntu:questing
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 questing-slim /questing-slim
unstable: docker-unstable
docker-unstable: docker-unstable-mantic
docker-unstable-jammy:
@@ -488,10 +598,10 @@ docker-unstable-mantic:
preview: docker-preview-ce
docker-preview: docker-preview-ce
docker-preview-all: docker-preview-latest docker-preview-other
docker-preview-ce: docker-preview-oracular
docker-preview-ce: docker-preview-questing
docker-preview-latest: docker-preview-ubuntu
docker-preview-debian: docker-preview-bookworm
docker-preview-ubuntu: docker-preview-oracular
docker-preview-ubuntu: docker-preview-questing
docker-preview-other: docker-preview-debian docker-preview-bullseye
docker-preview-arm: docker-preview-arm64 docker-preview-armv7
docker-preview-bookworm:
@@ -556,12 +666,24 @@ docker-preview-oracular:
docker pull --platform=arm64 photoprism/develop:oracular
docker pull --platform=arm64 photoprism/develop:oracular-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /oracular
docker-preview-questing:
docker pull --platform=amd64 photoprism/develop:questing
docker pull --platform=amd64 photoprism/develop:questing-slim
docker pull --platform=arm64 photoprism/develop:questing
docker pull --platform=arm64 photoprism/develop:questing-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /questing "-t photoprism/photoprism:preview -t photoprism/photoprism:ubuntu"
docker-preview-plucky:
docker pull --platform=amd64 photoprism/develop:plucky
docker pull --platform=amd64 photoprism/develop:plucky-slim
docker pull --platform=arm64 photoprism/develop:plucky
docker pull --platform=arm64 photoprism/develop:plucky-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /plucky
release: docker-release
docker-release: docker-release-latest
docker-release-all: docker-release-latest docker-release-other
docker-release-latest: docker-release-ubuntu
docker-release-debian: docker-release-bookworm
docker-release-ubuntu: docker-release-oracular
docker-release-ubuntu: docker-release-questing
docker-release-other: docker-release-debian docker-release-bullseye
docker-release-arm: docker-release-arm64 docker-release-armv7
docker-release-bookworm:
@@ -626,6 +748,22 @@ docker-release-oracular:
docker pull --platform=arm64 photoprism/develop:oracular
docker pull --platform=arm64 photoprism/develop:oracular-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /oracular
docker-release-questing:
docker pull --platform=amd64 photoprism/develop:questing
docker pull --platform=amd64 photoprism/develop:questing-slim
docker pull --platform=arm64 photoprism/develop:questing
docker pull --platform=arm64 photoprism/develop:questing-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /questing "-t photoprism/photoprism:latest -t photoprism/photoprism:ubuntu"
docker-release-plucky:
docker pull --platform=amd64 photoprism/develop:plucky
docker pull --platform=amd64 photoprism/develop:plucky-slim
docker pull --platform=arm64 photoprism/develop:plucky
docker pull --platform=arm64 photoprism/develop:plucky-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /plucky
start-traefik:
$(DOCKER_COMPOSE) up -d --wait traefik
stop-traefik:
$(DOCKER_COMPOSE) down traefik
start-local:
$(DOCKER_COMPOSE) -f compose.local.yaml up -d --wait
stop-local:
@@ -668,8 +806,12 @@ terminal-preview:
$(DOCKER_COMPOSE) -f compose.preview.yaml exec photoprism-preview bash
logs-preview:
$(DOCKER_COMPOSE) -f compose.preview.yaml logs -f photoprism-preview
docker-local: docker-local-oracular
docker-local-all: docker-local-oracular docker-local-noble docker-local-mantic docker-local-lunar docker-local-jammy docker-local-bookworm docker-local-bullseye docker-local-buster
docker-local: docker-local-questing
docker-local-up:
$(DOCKER_COMPOSE) -f compose.local.yaml up --force-recreate
docker-local-down:
$(DOCKER_COMPOSE) -f compose.local.yaml down --remove-orphans
docker-local-all: docker-local-questing docker-local-plucky docker-local-oracular docker-local-noble docker-local-mantic docker-local-lunar docker-local-jammy docker-local-bookworm docker-local-bullseye docker-local-buster
docker-local-bookworm:
docker pull photoprism/develop:bookworm
docker pull photoprism/develop:bookworm-slim
@@ -706,9 +848,17 @@ docker-local-oracular:
docker pull photoprism/develop:oracular
docker pull ubuntu:oracular
scripts/docker/build.sh photoprism ce-oracular /oracular "-t photoprism/photoprism:local"
docker-local-questing:
docker pull photoprism/develop:questing
docker pull ubuntu:questing
scripts/docker/build.sh photoprism ce-questing /questing "-t photoprism/photoprism:local"
docker-local-plucky:
docker pull photoprism/develop:plucky
docker pull ubuntu:plucky
scripts/docker/build.sh photoprism ce-plucky /plucky "-t photoprism/photoprism:local"
local-develop: docker-local-develop
docker-local-develop: docker-local-develop-oracular
docker-local-develop-all: docker-local-develop-oracular docker-local-develop-noble docker-local-develop-mantic docker-local-develop-lunar docker-local-develop-jammy docker-local-develop-bookworm docker-local-develop-bullseye docker-local-develop-buster docker-local-develop-impish
docker-local-develop: docker-local-develop-questing
docker-local-develop-all: docker-local-develop-questing docker-local-develop-oracular docker-local-develop-noble docker-local-develop-mantic docker-local-develop-lunar docker-local-develop-jammy docker-local-develop-bookworm docker-local-develop-bullseye docker-local-develop-buster docker-local-develop-impish
docker-local-develop-bookworm:
docker pull debian:bookworm-slim
scripts/docker/build.sh develop bookworm /bookworm
@@ -736,6 +886,12 @@ docker-local-develop-noble:
docker-local-develop-oracular:
docker pull ubuntu:oracular
scripts/docker/build.sh develop oracular /oracular
docker-local-develop-questing:
docker pull ubuntu:questing
scripts/docker/build.sh develop questing /questing
docker-local-develop-plucky:
docker pull ubuntu:plucky
scripts/docker/build.sh develop plucky /plucky
docker-ddns:
docker pull golang:alpine
scripts/docker/buildx-multi.sh ddns linux/amd64,linux/arm64 $(BUILD_DATE)

1794
NOTICE

File diff suppressed because it is too large Load Diff

View File

@@ -12,7 +12,7 @@ PhotoPrism® is an AI-Powered Photos App for the [Decentralized Web](https://en.
It makes use of the latest technologies to tag and find pictures automatically without getting in your way.
You can run it at home, on a private server, or in the cloud.
![](https://dl.photoprism.app/img/ui/search-cards-view.jpg)
![](https://dl.photoprism.app/img/ui/2025/desktop-search.jpg)
To get a first impression, you are welcome to play with our [public demo](https://try.photoprism.app/). Please be careful not to upload any private, unlawful or offensive pictures.
@@ -20,23 +20,21 @@ To get a first impression, you are welcome to play with our [public demo](https:
**Our mission is to provide the most user- and privacy-friendly solution to keep your pictures organized and accessible.** That's why PhotoPrism was built from the ground up to run wherever you need it, without compromising freedom, privacy, or functionality:
* Browse [all your photos](https://docs.photoprism.app/user-guide/organize/browse/) and [videos](https://try.photoprism.app/library/videos) without worrying about [RAW conversion, duplicates or video formats](https://docs.photoprism.app/user-guide/settings/library/)
* Easily find specific pictures using [powerful search filters](https://try.photoprism.app/library/browse?view=cards&q=flower%20color%3Ared)
* Recognizes [the faces of your family and friends](https://try.photoprism.app/library/people)
* [Automatic classification](https://try.photoprism.app/library/labels) of pictures based on their content and location
* [Play Live Photos](https://try.photoprism.app/library/live) by hovering over them in [albums](https://try.photoprism.app/library/albums) and [search results](https://try.photoprism.app/library/browse?view=cards&q=type%3Alive)
* Since the [User Interface](https://try.photoprism.app/) is a [Progressive Web App](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps),
it provides a native app-like experience, and you can conveniently install it on the home screen of all major operating systems and mobile devices
* Includes four high-resolution [World Maps](https://try.photoprism.app/library/places) to bring back the memories of your favorite trips
* Metadata is extracted and merged from Exif, XMP, and other sources such as Google Photos
* Many more image properties like [Colors](https://try.photoprism.app/library/browse?view=cards&q=color:red), [Chroma](https://try.photoprism.app/library/browse?view=cards&q=mono%3Atrue), and [Quality](https://try.photoprism.app/library/review) can be searched as well
* Use [PhotoSync](https://link.photoprism.app/photosync) to securely backup iOS and Android phones in the background
* WebDAV clients such as Microsoft's Windows Explorer and Apple's Finder [can connect directly](https://docs.photoprism.app/user-guide/sync/webdav/) to PhotoPrism, allowing you to open, edit, and delete files from your computer as if they were local
<img align="right" height="270" src="https://dl.photoprism.app/img/ui/2025/iphone-crocus-540px.png">
* Browse [all your pictures](https://docs.photoprism.app/user-guide/organize/browse/) without worrying about [RAW images](https://www.photoprism.app/kb/file-formats) or [video formats](https://docs.photoprism.app/user-guide/organize/video/)
* Whether you're using a phone, tablet, or desktop computer, our [intuitive PWA](https://try.photoprism.app/) provides a native app-like experience and can be [easily installed](https://docs.photoprism.app/user-guide/pwa/) on your home screen
* Quickly find specific photos and videos with [powerful search filters](https://docs.photoprism.app/user-guide/search/filters/) that can be combined and are available for [many different properties](https://docs.photoprism.app/user-guide/search/filters/#filter-reference), including [labels](https://try.photoprism.app/library/labels), [location](https://try.photoprism.app/library/places?q=s2:47a85a63f764), [resolution](https://try.photoprism.app/library/browse?view=cards&q=mp:4), [color](https://try.photoprism.app/library/browse?view=cards&q=color:red), [chroma](https://try.photoprism.app/library/browse?view=cards&q=mono%3Atrue), and [quality](https://try.photoprism.app/library/review)
* [Automatically labels your pictures](https://try.photoprism.app/library/labels) based on content and location, and recognizes the faces of [your family and friends](https://try.photoprism.app/library/people/new)
* [Live Photos](https://try.photoprism.app/library/live) start playing when you [hover over them](https://try.photoprism.app/library/browse?view=cards&q=type%3Alive) and when viewing a slideshow
* Six high-resolution [World Maps](https://try.photoprism.app/library/places) and our [privacy-preserving geocoding service](https://docs.photoprism.app/getting-started/#maps-places) help bring back memories of your favorite trips and let you explore the world
* Metadata can be extracted and merged from Exif, XMP, and other sources like Google Photos
* [Use compatible apps](https://docs.photoprism.app/user-guide/native-apps/) like [PhotoSync](https://link.photoprism.app/photosync) to back up iOS and Android phones in the background
* WebDAV clients such as [Microsoft's Windows Explorer](https://docs.photoprism.app/user-guide/sync/webdav/#__tabbed_1_2) and [Apple's Finder](https://docs.photoprism.app/user-guide/sync/webdav/#connect-to-a-webdav-server) can [connect directly to PhotoPrism](https://docs.photoprism.app/user-guide/sync/webdav/), allowing you to open, edit, and delete files from your computer as if they were local
Being completely [**self-funded and independent**](https://link.photoprism.app/membership), we can promise you that we will [never sell your data](https://www.photoprism.app/privacy) and that we will [always be transparent](https://www.photoprism.app/terms) about our software and services. Your data will never be shared with Google, Amazon, Microsoft or Apple unless you intentionally upload files to one of their services. 🔒
## Getting Started ##
<img align="right" width="25%" src="https://www.photoprism.app/user/pages/01.home/03._screenshots/iphone-maps-hybrid-540px.png">
Step-by-step [installation instructions](https://docs.photoprism.app/getting-started/) for our self-hosted [community edition](https://link.photoprism.app/personal-editions) can be found on [docs.photoprism.app](https://docs.photoprism.app/getting-started/) - all you need is a Web browser and [Docker](https://docs.docker.com/get-docker/) to run the server. It is available for Mac, Linux, and Windows.
@@ -79,11 +77,15 @@ Common problems can be quickly diagnosed and solved using our [Troubleshooting C
## Upcoming Features and Enhancements ##
<a href="https://github.com/orgs/photoprism/projects/5"><img align="right" height="240" src="https://dl.photoprism.app/img/ui/2025/upcoming-features-240px.png"></a>
Our [Project Roadmap](https://link.photoprism.app/roadmap) shows what tasks are in progress and what features will be implemented next. You are invited to give ideas you like a thumbs-up, so we know what's most popular.
Be aware that we have a zero-bug policy and do our best to help users when they need support or have other questions. This comes at a price though, as we can't give exact release dates for new features. Our team receives many more requests than can be implemented, so we want to emphasize that we are in no way obligated to implement the features, enhancements, or other changes you request. We do, however, appreciate your feedback and carefully consider all requests.
**Because sustained funding is key to quickly releasing new features, we encourage you to support our mission by [signing up as a sponsor](https://link.photoprism.app/sponsor) or purchasing a [commercial license](https://www.photoprism.app/teams). Ultimately, that's what's best for the product and the community.**
**Because sustained funding is key to quickly releasing new features, we encourage you to support our mission by [signing up for a personal membership](https://link.photoprism.app/membership) or [purchasing a commercial license](https://www.photoprism.app/teams#compare).**
[Become a Member ](https://link.photoprism.app/membership)
## GitHub Issues ⚠️ ##
@@ -96,6 +98,8 @@ We kindly ask you not to report bugs via GitHub Issues **unless you are certain
## Connect with the Community ##
<a href="https://link.photoprism.app/chat"><img align="right" width="144" height="144" src="https://dl.photoprism.app/img/brands/element-logo.svg"></a>
Follow us on [Mastodon](https://floss.social/@photoprism), [Bluesky](https://bsky.app/profile/photoprism.app), or join the [Community Chat](https://link.photoprism.app/chat) to get regular updates, connect with other users, and discuss your ideas. Our [Code of Conduct](https://www.photoprism.app/code-of-conduct) explains the "dos and donts" when interacting with other community members.
As a [contributor](CONTRIBUTING.md), you are also welcome to [contact us directly](https://www.photoprism.app/contact) if you have something on your mind that you don't want to discuss publicly. Please note, however, that due to the high volume of emails we receive, our team may be unable to get back to you immediately. We do our best to respond within five business days or less.

View File

@@ -30,6 +30,8 @@ You are [welcome to contact us](https://www.photoprism.app/contact) for change r
**[Andreas Krizek](https://github.com/Cosmic314)** (January 2025)
**[Jason Grim](https://github.com/jgrim)** (June 2025)
## Gold Sponsors ##
[**Simen Eriksen**](https://github.com/dennorske) (GitHub Sponsors, December 2019)
@@ -86,6 +88,8 @@ You are [welcome to contact us](https://www.photoprism.app/contact) for change r
[**Kevin "BentoFox" Gelking**](https://github.com/KevinGelking) (Patreon, December 2024)
[**Philipp Marmet**](https://github.com/fujexo) (October 2025)
## Infrastructure Sponsors ##
Our project infrastructure is provided by the following companies:

View File

@@ -1,4 +1,5 @@
examples
README.md
docs
.*
.*
_*

BIN
assets/examples/bear.m2ts Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

BIN
assets/examples/example.zip Normal file

Binary file not shown.

BIN
assets/examples/green.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
assets/examples/m2ts.mp4 Normal file

Binary file not shown.

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: none\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Iets het verkeerd geloop, probeer weer"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Kan dit nie doen nie"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Veranderinge kon nie gestoor word nie"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Kan nie verwyder word nie"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s bestaan reeds"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Nie gevind"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Lêer nie gevind nie"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Lêer te groot"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Ongesteun"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Ongesteunde tipe"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Ongesteunde formaat"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Oorspronklike omslag is leeg"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Seleksie nie gevind nie"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entiteit nie gevind nie"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Rekening nie gevind nie"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Verbruiker nie gevind nie"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Merker nie gevind nie"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album nie gevind nie"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Onderwerp nie gevind nie"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Persoon nie gevind nie"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Gesig nie gevind nie"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Nie beskikbaar in publieke modus nie"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Nie beskikbaar in leesalleen modus nie"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Teken asseblief in op jou rekening"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Toegang geweier"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Betaling vereis"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Oplegging mag aanstoot gee"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Oplegging misluk"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Geen items gekies nie"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Kon nie lêer skep nie. Gaan asseblief toestemmings na"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Kon nie vouer skep nie. Gaan asseblief toestemmings na"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Kon nie konnekteer nie, probeer asseblief weer"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Tik verifikasiekode"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Ongeldige verifikasiekode, probeer asseblief weer"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Ongeldige wagwoord, probeer asseblief weer"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Eienskap gedeaktiveer"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Geen merker geselekteer"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Geen albums geselekteer nie"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Geen lêers beskikbaar vir aflaai nie"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Kon nie zip-lêer skep nie"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Ongeldige magtiging"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Ongeldige skakel"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Ongeldige naam"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Besig, probeer asseblief later weer"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Jou rekening kon nie gekoppel word nie"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Te veel versoeke"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Onvoldoende berging"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kwota oorskry"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Veranderinge suksesvol gestoor"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album geskep"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album gestoor"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s uitgevee"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Albuminhoud gekloon"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Lêer verwyder uit stapel"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Lêer uitgevee"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Seleksie bygevoeg na %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Een inskrywing bygevoeg na %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d inskrywings by %s gevoeg"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Een inskrywing verwyder uit %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d inskrywings verwyder uit %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Rekening geskep"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Rekening gestoor"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Rekening uitgevee"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Stellings gestoor"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Wagwoord verander"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Invoer voltooi in %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Invoer gekanselleer"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "inhoudsopgawe voltooi in %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indekseer van oorspronklikes …"
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indekseer lêers in %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indeksering gekanselleer"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d lêers en %d foto's verwyder"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Skuif lêers van %s af"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Kopieer lêers van %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Merkers uitgevee"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Merkers gestoor"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Onderwerp gestoor"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Onderwerp uitgevee"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Persoon gestoor"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Persoon uitgevee"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Lêer opgelaai"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d lêers opgelaai in %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Verwerk oplegging..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Oplegging geprosesseer"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Seleksie goedgekeur"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Seleksie geargiveer"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Seleksie herstel"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Seleksie gemerk as privaat"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albums uitgevee"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip geskep in %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Permanent uitgevee"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s geherstel"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Suksesvol geverifieer"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Suksesvol geaktiveer"

View File

@@ -2,10 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
"translate@weblate.org>\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: none\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
@@ -13,400 +12,404 @@ 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.9.2\n"
#: messages.go:103
msgid "Something went wrong, try again"
msgstr "حدث خطأ ما حاول مرة أخرى"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "حدث خطأ ما، حاول مرة أخرى"
#: messages.go:105
msgid "Unable to do that"
msgstr "غير قادر على فعل ذلك"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "لا يمكن حفظ التغييرات"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "لا يمكن حذفه"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s موجود بالفعل"
#: messages.go:108
msgid "Not found"
msgstr "لم يتم العثور على"
#: messages.go:109
msgid "Not found"
msgstr "لم يتم العثور"
#: messages.go:110
msgid "File not found"
msgstr "لم يتم العثور على الملف"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "الملف كبير جدًا"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "غير مدعوم"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "نوع غير معتمد"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "صيغة غير مدعومة"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "مجلد النسخ الأصلية فارغ"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "الاختيار غير موجود"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "الكيان غير موجود"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "الحساب غير موجود"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "المستخدم غير موجود"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "التصنيف غير موجود"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "الألبوم غير موجود"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "الموضوع غير موجود"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "لم يتم العثور على الشخص"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "الوجه غير موجود"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "غير متاح في الوضع العام"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "غير متوفر في وضع القراءة فقط"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "يرجى تسجيل الدخول إلى حسابك"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "طلب الاذن مرفوض"
#: messages.go:128
msgid "Upload might be offensive"
msgstr "تحميل قد يكون مسيئا"
#: messages.go:129
msgid "Upload failed"
msgstr "التحميل فشل"
msgid "Payment required"
msgstr "الدفع مطلوب"
#: messages.go:130
msgid "No items selected"
msgstr "لم يتم تحديد الاختيار"
msgid "Upload might be offensive"
msgstr "المحتوى المرفوع قد يكون مسيئا"
#: messages.go:131
msgid "Failed creating file, please check permissions"
msgstr "فشل إنشاء الملف ، يرجى التحقق من الأذونات"
msgid "Upload failed"
msgstr "فشل التحميل"
#: messages.go:132
msgid "Failed creating folder, please check permissions"
msgstr "فشل إنشاء المجلد ، يرجى التحقق من الأذونات"
msgid "No items selected"
msgstr "لم يتم اختيار المحتوى"
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "فشل إنشاء الملف ، يرجى التحقق من الصلاحيات"
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "لم يتم إنشاء المجلد ، يرجى التحقق من الصلاحيات"
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "تعذر الاتصال ، يرجى المحاولة مرة أخرى"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "أدخل رمز التحقق"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "رمز التحقق غير صالح، يرجى المحاولة مرة أخرى"
#: messages.go:136
msgid "Invalid password, please try again"
msgstr "كلمة السر غير مطابقة، برجاء حاول مرة أخرى"
#: messages.go:137
msgid "Feature disabled"
msgstr "الخاصية معطلة"
#: messages.go:138
msgid "No labels selected"
msgstr "لم يتم تحديد تسميات"
msgid "Invalid password, please try again"
msgstr "كلمة السر غير مطابقة، يرجى المحاولة مرة أخرى"
#: messages.go:139
msgid "Feature disabled"
msgstr "الخاصية غير مفعلة"
#: messages.go:140
msgid "No labels selected"
msgstr "لم يتم تحديد المعرفات"
#: messages.go:141
msgid "No albums selected"
msgstr "لم يتم تحديد ألبومات"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "لا توجد ملفات متاحة للتنزيل"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "فشل إنشاء ملف مضغوط"
msgstr "فشل في إنشاء ملف مضغوط"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "بيانات الاعتماد غير صالحة"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "ارتباط غير صالح"
msgstr "رابط غير صالح"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "اسم غير صحيح"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "مشغول ، يرجى المحاولة مرة أخرى في وقت لاحق"
msgstr "مشغول، يرجى المحاولة مرة أخرى في وقت لاحق"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "فترة التنبيه هي %s ، لكن يجب أن تكون ساعة واحدة أو أقل"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "لا يمكن ربط حسابك"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "طلبات كثيرة جدا"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "مساحة تخزين غير كافية"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "تم تجاوز الحصة"
msgstr "تم تجاوز المساحة المخصصة"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "تم حفظ التغييرات بنجاح"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "تم إنشاء الألبوم"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "تم حفظ الألبوم"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "تم حذف الألبوم %s"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "تم نسخ محتويات الألبوم"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "تمت إزالة الملف من المكدس"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "تم حذف الملف"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "تمت إضافة التحديد إلى %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "تمت إضافة إدخال واحد إلى %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "تمت إضافة %d مدخلات إلى %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "تمت إزالة إدخال واحد من %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "تمت إزالة %d مدخلات من %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "تم إنشاء الحساب"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "تم حفظ الحساب"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "تم حذف الحساب"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "تم حفظ الإعدادات"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "تم تغيير كلمة السر"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "اكتمل الاستيراد في %d ثانية"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "تم إلغاء الاستيراد"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "اكتملت الفهرسة في %d ثانية"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "تتم فهرسة الصور الأصلية ..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "فهرسة الملفات في %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "تم إلغاء الفهرسة"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "تمت إزالة %d ملفات و %d صورة"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "نقل الملفات من %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "نسخ ملفات من %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "تم حذف التصنيفات"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "تم حفظ التصنيف"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "تم حفظ الموضوع"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "تم حذف الموضوع"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "حفظ الشخص"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "تم حذف الشخص"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "تم تحميل الملف"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "تم تحميل %d ملف في %d ثانية"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "جارٍ معالجة التحميل ..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "تمت معالجة التحميل"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "تمت الموافقة على الاختيار"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "تمت أرشفة الاختيار"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "تمت استعادة التحديد"
msgstr "تم استعادة المحتوى المحدد"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "تم تحديد الاختيار على أنه خاص"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "تم حذف الألبومات"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "إنشاء الملف المضغوط خلال %d ثوانٍ"
msgstr "تم إنشاء الملف المضغوط خلال %d ثوانٍ"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "تم الحذف بشكل نهائي"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "تمت استعادة %s"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "تم التحقق بنجاح"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "تم التنشيط بنجاح"
msgstr "تم التفعيل بنجاح"
#~ msgid "Storage is full"
#~ msgstr "التخزين ممتلئ"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: none\n"
@@ -13,398 +13,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Нешта пайшло не так, паўтарыце спробу"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Немагчыма зрабіць гэта"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Не ўдалося захаваць змены"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Немагчыма выдаліць"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s ужо існуе"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Не знойдзена"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Файл не знойдзены"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Файл занадта вялікі"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Не падтрымліваецца"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Тып не падтрымліваецца"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Фармат не падтрымліваецца"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Тэчка арыгіналаў пустая"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Выбар не знойдзены"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Аб'ект не знойдзены"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Уліковы запіс не знойдзены"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Карыстальнік не знойдзены"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Тэг не знойдзены"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Альбом не знойдзены"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Тэма не знойдзена"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Чалавек не знойдзены"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Твар не знойдзены"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Недаступна ў публічным рэжыме"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Недаступна ў рэжыме толькі для чытання"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Калі ласка, увайдзіце ў свой уліковы запіс"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "У доступе адмоўлена"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Патрабуецца аплата"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Запампоўка можа быць абразлівай"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Памылка загрузкі"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Элементы не выбраны"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Не ўдалося стварыць файл, праверце дазволы"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Не атрымалася стварыць папку, праверце дазволы"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Немагчыма падключыцца, паспрабуйце яшчэ раз"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Увядзіце праверачны код"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Няправільны код спраўджання, паўтарыце спробу"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Няправільны пароль, паспрабуйце яшчэ раз"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Функцыя адключана"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Меткі не выбраны"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Альбомы не выбраны"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Няма даступных файлаў для спампоўкі"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Не ўдалося стварыць zip-файл"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Няправільныя ўліковыя даныя"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Няправільная спасылка"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Няправільнае імя"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Заняты, паўтарыце спробу пазней"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Інтэрвал абуджэння складае %s, але павінен быць не больш за 1 гадзіну"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Ваш уліковы запіс не можа быць падключаны"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Занадта шмат запытаў"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Недастаткова месца для захоўвання"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Квота перавышана"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Змены паспяхова захаваны"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Альбом створаны"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Альбом захаваны"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Альбом %s выдалены"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Змест альбома кланаваны"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Файл выдалены са стэка"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Файл выдалены"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Выбар дададзены ў %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Адзін запіс дададзены ў %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d запісы дададзены ў %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Адзін запіс выдалены з %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "Запісы %d выдалены з %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Уліковы запіс створаны"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Уліковы запіс захаваны"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Уліковы запіс выдалены"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Налады захаваны"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Пароль зменены"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Імпарт завершаны праз %d с"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Імпарт адменены"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Індэксацыя завершана ў %d с"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Індэксаванне арыгіналаў..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Індэксацыя файлаў у %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Індэксацыя адменена"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Выдалена %d файлаў і %d фота"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Перамяшчэнне файлаў з %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Капіраванне файлаў з %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Меткі выдалены"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Цэтлік захаваны"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Тэма захавана"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Тэма выдалена"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Чалавек выратаваны"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Асоба выдалена"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Файл запампаваны"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d файлы, загружаныя ў %d с"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Апрацоўка запампоўкі..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Загрузка апрацавана"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Выбар ухвалены"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Выбранае заархівавана"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Выбар адноўлены"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Выбар пазначаны як прыватны"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Альбомы выдалены"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip створаны ў %d с"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Выдалены назаўсёды"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s быў адноўлены"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Паспяхова праверана"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Паспяхова актывавана"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: none\n"
"Language: bg\n"
@@ -11,398 +11,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Нещо се е объркало, опитайте отново"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Не можете да го направите"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Промените не могат да бъдат запазени"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Не може да бъде изтрит"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s вече съществува"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Не е намерен"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Файлът не е намерен"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Твърде голям файл"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Не се поддържа"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Неподдържан тип"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Неподдържан формат"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Папката с оригинали е празна"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Изборът не е намерен"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Субектът не е намерен"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Акаунтът не е намерен"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Потребителят не е намерен"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Етикетът не е намерен"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Албумът не е намерен"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Темата не е намерена"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Лицето не е намерено"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Лицето не е намерено"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Не е наличен в публичен режим"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Не е наличен в режим само за четене"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Моля, влезте в профила си"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Достъп отказан"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Изисква се плащане"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Качването може да е обидно"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Файловете не успяха да се качат"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Няма избрани елементи"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Неуспешно създаване на файл, моля, проверете разрешенията"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Неуспешно създаване на папка, моля, проверете разрешенията"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Не може да се свърже, опитайте отново"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Въведете код за верификация"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Невалиден код за потвърждение, моля опитайте отново"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Невалидна парола, моля, опитайте отново"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Функцията е деактивирана"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Няма избрани етикети"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Няма избрани албуми"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Няма налични файлове за изтегляне"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Неуспешно създаване на zip файл"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Невалидни креденции"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Невалидна връзка"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Невалидно име"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Заето, моля, опитайте отново по-късно"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Интервалът на събуждане е %s, но трябва да е 1 час или по-малко"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Вашият акаунт не може да бъде свързан"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Твърде много заявки"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Недостатъчно място за съхранение"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Превишаване на квотата"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Промените са успешно записани"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Създаден албум"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Запазен албум"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Албум %s изтрит"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Съдържанието на албума беше клонирано"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Премахване на файла от стека"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Изтрит файл"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Добавяне на селекция към %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Добавяне на един запис към %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d добавени записи към %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Отстранен е един запис от %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d премахнати записи от %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Създаден акаунт"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Акаунтът запазен"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Изтрит акаунт"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Запазени настройки"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Паролата е променена"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Импортът е завършен за %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Вносът е отменен"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Индексирането е завършено за %d сек"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Индексиране на оригинали..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Индексиране на файлове в %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Отменено индексиране"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Премахнати са %d файлове и %d снимки"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Преместване на файлове от %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Копиране на файлове от %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Изтрити етикети"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Запазен етикет"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Тема: запазени"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Изтрит предмет"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Запазено лице"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Изтрито лице"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Качен файл"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d файлове, качени за %d сек"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Обработка на качването..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Качването е обработено"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Одобрена селекция"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Архивирана селекция"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Възстановена селекция"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Селекция, отбелязана като частна"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Изтрити албуми"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip създаден за %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Постоянно изтрити"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s е възстановена"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Успешно потвърдено"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Успешно активиран"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: none\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "S'ha produït un error, torna-ho a provar"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Incapaç de fer-ho"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "No s'han pogut desar els canvis"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "No s'ha pogut suprimir"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s El nom ja existeix"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "No trobat"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "No s'ha trobat el fitxer"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Fitxer massa gran"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Sense suport"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Tipus no compatible"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Format no compatible"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "La carpeta d'originals està buida"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "No s'ha trobat la selecció"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "No s'ha trobat l'entitat"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Compte no trobat"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Usuari no trobat"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "No s'ha trobat l'etiqueta"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "No s'ha trobat l'àlbum"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "No s'ha trobat el tema"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Persona no trobada"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "No s'ha trobat la cara"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "No disponible en mode públic"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "No disponible en mode només de lectura"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Si us plau, inicieu sessió al vostre compte"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Permís denegat"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Pagament requerit"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "La càrrega pot ser ofensiva"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "La càrrega ha fallat"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "No s'ha seleccionat cap element"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "No s'ha pogut crear el fitxer, comproveu els permisos"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "No s'ha pogut crear la carpeta, comproveu els permisos"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "No s'ha pogut connectar, torna-ho a provar"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Introduïu el codi de verificació"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Codi de verificació no vàlid, torneu-ho a provar"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "La contrasenya no és vàlida, torneu-ho a provar"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funció desactivada"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "No s'ha seleccionat cap etiqueta"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "No s'ha seleccionat cap àlbum"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "No hi ha fitxers disponibles per a la baixada"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "No s'ha pogut crear el fitxer zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Credencials incorrectes"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Enllaç no vàlid"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nom no vàlid"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Ocupat, torna-ho a provar més tard"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "No s'ha pogut connectar el vostre compte"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Massa peticions"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Emmagatzematge insuficient"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "S'ha superat la quota"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Els canvis s'han desat correctament"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Àlbum creat"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Àlbum desat"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "S'ha suprimit l'àlbum %s"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Contingut de l'àlbum clonat"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "S'ha eliminat el fitxer de la pila"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "S'ha suprimit el fitxer"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "S'ha afegit una selecció a %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "S'ha afegit una entrada a %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d entrades afegides a %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "S'ha eliminat una entrada de %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "S'han eliminat %d entrades de %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Compte creat"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Compte desat"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Compte suprimit"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Configuració desada"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Sha canviat la contrasenya"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Importació completada en %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importació cancel·lada"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexació completada en %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "S'estan indexant els originals..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indexant fitxers a %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "S'ha cancel·lat la indexació"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "S'han eliminat %d fitxers i %d fotos"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "S'estan movent fitxers de %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "S'estan copiant fitxers de %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "S'han suprimit les etiquetes"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "S'ha desat l'etiqueta"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Assumpte desat"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "S'ha suprimit el tema"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Persona salvada"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "S'ha suprimit la persona"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Fitxer penjat"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fitxers penjats en %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "S'està processant la càrrega..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "S'ha processat la càrrega"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Selecció aprovada"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Selecció arxivada"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "S'ha restaurat la selecció"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "La selecció s'ha marcat com a privada"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Àlbums suprimits"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip creat en %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Esborrat permanentment"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s s'ha restaurat"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Verificat correctament"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "S'ha activat correctament"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Czech <https://translate.photoprism.app/projects/photoprism/"
"backend/cs/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Něco se pokazilo, zkuste to znovu"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Nelze to udělat"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Změny nemohly být uloženy"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Nemohlo být vymazáno"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s již existuje"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Nenalezeno"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Soubor nenalezen"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Příliš velký soubor"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Nepodporováno"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Nepodporovaný typ"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Nepodporovaný formát"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Složka Originály je prázdná"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Výběr nenalezen"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Subjekt nebyl nalezen"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Účet nenalezen"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Uživatel nenalezen"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Štítek nenalezen"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album nenalezeno"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Předmět nebyl nalezen"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Osoba nebyla nalezena"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Obličej nebyl nalezen"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Není k dispozici ve veřejném módu"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Není k dispozici v režimu pouze pro čtení"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Přihlaste se ke svému účtu"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Přístup zamítnut"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Požadovaná platba"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Nahrané soubory by mohly být urážlivé"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Nahrávání selhalo"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Nebyly vybrány žádné položky"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Vytváření souboru selhalo, zkontrolujte prosím oprávnění"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Vytváření složky selhalo, zkontrolujte prosím oprávnění"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Nemohlo být připojeno, zkuste to prosím znovu"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Vložte ověřovací kód"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Neplatný ověřovací kód, zkuste to prosím znovu"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Neplatné heslo, zkuste to prosím znovu"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funkce deaktivovaná"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Nebyly vybrány žádné štítky"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Nebyla vybrána žádná alba"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Žádné soubory ke stažení k dispozici"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Nebylo možné vytvořit soubor ZIP"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Neplatné údaje"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Neplatný odkaz"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Neplatný jméno"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Zaneprázdněn, zkuste to prosím později"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Váš účet se nepodařilo připojit"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Příliš mnoho požadavků"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Nedostatečné skladování"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Překročení kvóty"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Změny byly úspěšně uloženy"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album vytvořeno"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album uloženo"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s vymazáno"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Obsah alba naklonován"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Soubor odstraněn ze stohu"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Soubor vymazán"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Výběr přidán do %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Jeden záznam přidán do %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d záznamů přidáno do %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Jeden záznam odstraněn z %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d záznamů odstraněno z %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Účet vytvořen"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Účet uložen"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Účet vymazán"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Nastavení uloženo"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Heslo změněno"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Import dokončen za %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Import zrušen"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexování dokončeno za %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indexování originálů..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indexování souborů v %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexování zrušeno"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Odstraněno %d souborů a %d fotografií"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Přesouvání souborů z %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Kopírování souborů z %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Štítky vymazány"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Štítek uložen"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Předmět uložen"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Předmět smazán"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Uložená osoba"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Vymazaná osoba"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Soubor odeslán"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d souborů nahráno za %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Zpracování nahrávání..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Nahrávání bylo zpracováno"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Výběr potvrzen"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Výběr archivován"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Výběr obnoven"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Výběr označen jako Soukromý"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Alba vymazána"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "ZIP vytvořen za %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Trvale smazáno"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s bylo obnoveno"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Úspěšně ověřeno"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Úspěšně aktivováno"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Danish <https://translate.photoprism.app/projects/photoprism/"
"backend/da/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Der gik noget galt, prøv igen"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Det kan ikke lade sig gøre"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Ændringer kunne ikke gemmes"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Kunne ikke slettes"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s findes allerede"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Ikke fundet"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Fil ikke fundet"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Filen er for stor"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Ikke understøttet"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Ikke-understøttet type"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Ikke understøttet format"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Mappen Originaler er tom"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Valg ikke fundet"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Enhed ikke fundet"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Konto ikke fundet"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Bruger ikke fundet"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Etiket ikke fundet"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album ikke fundet"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Emne ikke fundet"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Person ikke fundet"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Ansigt ikke fundet"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Ikke tilgængelig i offentlig tilstand"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Ikke tilgængelig i skrivebeskyttet tilstand"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Log ind på din konto"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Tilladelse nægtet"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Betaling påkrævet"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Upload kan være stødende"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Upload mislykkedes"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Ingen emner valgt"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Oprettelse af fil mislykkedes, tjek venligst tilladelser"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Oprettelse af mappe mislykkedes, tjek venligst tilladelser"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Kunne ikke oprette forbindelse, prøv venligst igen"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Indtast verifikations kode"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Ugyldig bekræftelseskode. Prøv venligst igen"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Ugyldig adgangskode, prøv venligst igen"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funktion deaktiveret"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Ingen etiketter valgt"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Ingen album valgt"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Ingen filer til rådighed til download"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Det lykkedes ikke at oprette zip-fil"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Ugyldige legitimationsoplysninger"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Ugyldigt link"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Ugyldigt navn"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Optaget, prøv venligst igen senere"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Der kunne ikke oprettes forbindelse til din konto"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "For mange anmodninger"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Utilstrækkelig opbevaring"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kvote overskredet"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Ændringer gemt med succes"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album oprettet"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album gemt"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s slettet"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Albumindhold klonet"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Fil fjernet fra stakken"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Fil slettet"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Valg tilføjet til %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "En post tilføjet til %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d poster tilføjet til %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "En post fjernet fra %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d poster fjernet fra %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Konto oprettet"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Gemte konto"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Konto slettet"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Indstillinger gemt"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Adgangskode ændret"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Import afsluttet efter %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Import annulleret"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksering afsluttet efter %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indeksering af originaler..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indeksering af filer i %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indeksering annulleret"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Fjernede %d filer og %d fotos"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Flytter filer fra %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Kopierer filer fra %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Etiketter slettet"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Etikette gemt"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Emne gemt"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Emne slettet"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Person gemt"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Person slettet"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Fil uploadet"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d filer uploadet på %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Behandling af upload..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Upload er blevet behandlet"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Udvælgelse godkendt"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Udvælgelse arkiveret"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Udvalgte gendannet"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Udvalgte er markeret som privat"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albums slettet"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip filen blev lavet på %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Permanent slettet"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s er blevet genoprettet"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Verifikation lykkedes"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Aktivering lykkedes"

View File

@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"Last-Translator: Admin <hello@photoprism.app>\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: German <https://translate.photoprism.app/projects/photoprism/"
"backend/de/>\n"
"Language: de\n"
@@ -12,399 +12,403 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
"X-Poedit-Basepath: .\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Etwas ist schief gelaufen, versuche es noch einmal"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Dies ist nicht möglich"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Fehler beim Speichern der Daten"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Konnte nicht gelöscht werden"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s existiert bereits"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Nicht gefunden"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Datei konnte nicht gefunden werden"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Datei zu groß"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Wird nicht unterstützt"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Typ wird nicht unterstützt"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Nicht unterstütztes Format"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Originals-Verzeichnis ist leer"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Auswahl nicht gefunden"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Keine Daten gefunden"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Unbekannter Account"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Nutzer nicht gefunden"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Kategorie nicht gefunden"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album nicht gefunden"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Unbekanntes Motiv"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Unbekannte Person"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Unbekanntes Gesicht"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Im öffentlichen Modus nicht verfügbar"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Im Nur-Lese-Modus nicht verfügbar"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Bitte melde dich an"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Erlaubnis verweigert"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Zahlung erforderlich"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Inhalt könnte anstößig sein und wurde abgelehnt"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Upload fehlgeschlagen"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Nichts ausgewählt"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Datei konnte nicht erstellt werden"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Ordner konnte nicht erstellt werden"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Verbindung fehlgeschlagen"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Verifizierungscode eingeben"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Ungültiger Verifizierungscode, bitte erneut versuchen"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Ungültiges Passwort"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funktion deaktiviert"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Keine Kategorien ausgewählt"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Keine Alben ausgewählt"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Keine Dateien zum Download verfügbar"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Zip-Datei konnte nicht erstellt werden"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Ungültige Zugangsdaten"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Ungültiger Link"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Ungültiger Name"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Beschäftigt, bitte später erneut versuchen"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Das Konto konnte nicht verbunden werden"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Zu viele Anfragen"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Zu wenig Speicherplatz"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Maximale Anzahl erreicht"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Änderungen erfolgreich gespeichert"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album erstellt"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album gespeichert"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s gelöscht"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Album-Einträge kopiert"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Datei aus Stapel entfernt"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Datei gelöscht"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Auswahl zu %s hinzugefügt"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Ein Eintrag zu %s hinzugefügt"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d Einträge zu %s hinzugefügt"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Ein Eintrag aus %s entfernt"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d Einträge aus %s entfernt"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Konto hinzugefügt"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Konto gespeichert"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Konto gelöscht"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Einstellungen gespeichert"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Passwort geändert"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Import in %d s abgeschlossen"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Import abgebrochen"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexierung in %d s abgeschlossen"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indexiere Dateien…"
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indexiere Dateien in %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexierung abgebrochen"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d Dateien und %d Bilder wurden entfernt"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Verschiebe Dateien von %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Kopiere Dateien von %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Kategorien gelöscht"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Kategorie gespeichert"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Motiv gespeichert"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Motiv gelöscht"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Person gespeichert"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Person gelöscht"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Datei hochgeladen"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d Dateien hochgeladen in %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Verarbeitung des Uploads..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Der Upload wurde verarbeitet"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Auswahl übernommen"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Auswahl archiviert"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Auswahl wiederhergestellt"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Auswahl als privat markiert"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Alben gelöscht"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip-Datei erstellt in %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Endgültig gelöscht"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s wurde wiederhergestellt"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Erfolgreich verifiziert"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Erfolgreich aktiviert"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: none\n"
"Language: el\n"
@@ -11,398 +11,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Κάτι πήγε στραβά, δοκιμάστε ξανά"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Αυτό δεν είναι εφικτό"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Οι αλλαγές δεν μπόρεσαν να αποθηκευτούν"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Δεν μπόρεσε να διαγραφεί"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s υπάρχει ήδη"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Δεν βρέθηκε"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Το αρχείο δεν βρέθηκε"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Πολύ μεγάλο αρχείο"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Ανυποστήρικτος"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Μη υποστηριζόμενος τύπος"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Μη υποστηριζόμενη μορφή"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Ο φάκελος Πρωτότυπα είναι άδειος"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Η επιλογή δεν βρέθηκε"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Η οντότητα δεν βρέθηκε"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Ο λογαριασμός δεν βρέθηκε"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Ο χρήστης δεν βρέθηκε"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Η ετικέτα δεν βρέθηκε"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Η Συλλογή δεν βρέθηκε"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Το Θέμα δεν βρέθηκε"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Το Άτομο δεν βρέθηκε"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Το Πρόσωπο δεν βρέθηκε"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Μη διαθέσιμο κατά τη δημόσια λειτουργία"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "μη διαθέσιμο στην κατάσταση \"μόνο για ανάγνωση\""
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Παρακαλούμε συνδεθείτε και δοκιμάστε ξανά"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Το Άτομο διαγράφηκε"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Απαιτείται πληρωμή"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Η φόρτωση μπορεί να είναι προσβλητική"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Αποτυχία αποστολής"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Δεν έχουν επιλεγεί αντικείμενα"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Απέτυχε η δημιουργία αρχείου, παρακαλούμε ελέγξτε τα δικαιώματα"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Απέτυχε η δημιουργία φακέλου, παρακαλούμε ελέγξτε τα δικαιώματα"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Δεν ήταν δυνατή η σύνδεση, παρακαλώ δοκιμάστε ξανά"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "βάλτε κωδικό επιβεβαίωσης"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Μη έγκυρος κωδικός επαλήθευσης, δοκιμάστε ξανά"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Μη έγκυρος κωδικός πρόσβασης, παρακαλώ δοκιμάστε ξανά"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Λειτουργία απενεργοποιημένη"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Δεν έχουν επιλεγεί ετικέτες"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Δεν έχουν επιλεγεί συλλογές"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Δεν υπάρχουν διαθέσιμα αρχεία για λήψη"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Απέτυχε η δημιουργία αρχείου zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Μη έγκυρα διαπιστευτήρια"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Μη έγκυρος σύνδεσμος"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Μη έγκυρο όνομα"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Απασχολημένος, προσπαθήστε ξανά αργότερα"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Το διάστημα αφύπνισης είναι %s, αλλά πρέπει να είναι 1 ώρα ή λιγότερο"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Ο λογαριασμός σας δεν μπόρεσε να συνδεθεί"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Πάρα πολλά αιτήματα"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Ανεπαρκής αποθήκευση"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Υπέρβαση ποσόστωσης"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Οι αλλαγές αποθηκεύτηκαν επιτυχώς"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Η Συλλογή δημιουργήθηκε"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Η Συλλογή αποθηκεύθηκε"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Η Συλλογή %s διαγράφηκε"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Τα περιεχόμενα της Συλλογής αντιγράφηκαν"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Αφαίρεση αρχείου από τη στοίβα"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Το αρχείο διαγράφηκε"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Η επιλογή προστέθηκε στο %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Μία εγγραφή προστέθηκε στο %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d καταχωρήσεις προστέθηκαν στο %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Μία καταχώρηση αφαιρέθηκε από %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d καταχωρήσεις αφαιρέθηκαν από %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Ο Λογαριασμός δημιουργήθηκε"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Ο Λογαριασμός αποθηκεύθηκε"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Ο Λογαριασμός διαγράφηκε"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Οι ρυθμίσεις αποθηκεύτηκαν"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Ο κωδικός πρόσβασης άλλαξε"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Η εισαγωγή ολοκληρώθηκε σε %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Η εισαγωγή ακυρώθηκε"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Η δημιουργία ευρετηρίου σε %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Δημιουργία ευρετηρίου για τα πρωτότυπα..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Δημιουργία ευρετηρίου αρχείων σε %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Η δημιουργία ευρετηρίου ακυρώθηκε"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Αφαίρεση %d αρχείων και %d φωτογραφιών"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Μετακίνηση αρχείων από %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Αντιγραφή αρχείων από %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Οι Ετικέτες διαγράφηκαν"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Η Ετικέτα αποθηκεύτηκε"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Το Θέμα αποθηκεύθηκε"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Το Θέμα διαγράφηκε"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Το Άτομο αποθηκεύθηκε"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Το Άτομο διαγράφηκε"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Το αρχείο διαγράφηκε"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d αρχεία μεταφορτώθηκαν σε %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Επεξεργασία μεταφόρτωσης..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Η φόρτωση έχει ολοκληρωθεί"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Η επιλογή εγκρίθηκε"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Η επιλογή αρχειοθετήθηκε"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Η επιλογή αποκαταστάθηκε"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Η επιλογή χαρακτηρίστηκε ως ιδιωτική"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Οι Συλλογές διαγράφηκαν"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Το αρχείο συμπίεσης δημιουργήθηκε σε %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Διαγράφηκε μόνιμα"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s έχει αποκατασταθεί"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Επαληθεύτηκε με επιτυχία"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Ενεργοποιήθηκε με επιτυχία"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2022-10-31 16:44+0100\n"
"Last-Translator: Michael Mayer <michael@photoprism.org>\n"
"Language-Team: \n"
@@ -13,395 +13,399 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr ""
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr ""
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr ""
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr ""
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr ""
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr ""
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr ""
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr ""
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr ""
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr ""
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr ""
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr ""
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr ""
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr ""
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr ""
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr ""
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr ""
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr ""
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr ""
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr ""
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr ""
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr ""
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr ""
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr ""
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr ""
#: messages.go:128
msgid "Upload might be offensive"
msgstr ""
#: messages.go:129
msgid "Upload failed"
msgid "Payment required"
msgstr ""
#: messages.go:130
msgid "No items selected"
msgid "Upload might be offensive"
msgstr ""
#: messages.go:131
msgid "Failed creating file, please check permissions"
msgid "Upload failed"
msgstr ""
#: messages.go:132
msgid "Failed creating folder, please check permissions"
msgid "No items selected"
msgstr ""
#: messages.go:133
msgid "Could not connect, please try again"
msgid "Failed creating file, please check permissions"
msgstr ""
#: messages.go:134
msgid "Enter verification code"
msgid "Failed creating folder, please check permissions"
msgstr ""
#: messages.go:135
msgid "Invalid verification code, please try again"
msgid "Could not connect, please try again"
msgstr ""
#: messages.go:136
msgid "Invalid password, please try again"
msgid "Enter verification code"
msgstr ""
#: messages.go:137
msgid "Feature disabled"
msgid "Invalid verification code, please try again"
msgstr ""
#: messages.go:138
msgid "No labels selected"
msgid "Invalid password, please try again"
msgstr ""
#: messages.go:139
msgid "No albums selected"
msgid "Feature disabled"
msgstr ""
#: messages.go:140
msgid "No files available for download"
msgid "No labels selected"
msgstr ""
#: messages.go:141
msgid "Failed to create zip file"
msgid "No albums selected"
msgstr ""
#: messages.go:142
msgid "Invalid credentials"
msgid "No files available for download"
msgstr ""
#: messages.go:143
msgid "Invalid link"
msgid "Failed to create zip file"
msgstr ""
#: messages.go:144
msgid "Invalid name"
msgid "Invalid credentials"
msgstr ""
#: messages.go:145
msgid "Busy, please try again later"
msgid "Invalid link"
msgstr ""
#: messages.go:146
msgid "Invalid name"
msgstr ""
#: messages.go:147
msgid "Busy, please try again later"
msgstr ""
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr ""
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr ""
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr ""
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr ""
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr ""
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr ""
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr ""
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr ""
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr ""
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr ""
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr ""
#: messages.go:159
msgid "File deleted"
msgstr ""
#: messages.go:160
#, c-format
msgid "Selection added to %s"
msgstr ""
#: messages.go:161
#, c-format
msgid "One entry added to %s"
msgid "File deleted"
msgstr ""
#: messages.go:162
#, c-format
msgid "%d entries added to %s"
msgid "Selection added to %s"
msgstr ""
#: messages.go:163
#, c-format
msgid "One entry removed from %s"
msgid "One entry added to %s"
msgstr ""
#: messages.go:164
#, c-format
msgid "%d entries removed from %s"
msgid "%d entries added to %s"
msgstr ""
#: messages.go:165
msgid "Account created"
#, c-format
msgid "One entry removed from %s"
msgstr ""
#: messages.go:166
msgid "Account saved"
#, c-format
msgid "%d entries removed from %s"
msgstr ""
#: messages.go:167
msgid "Account deleted"
msgid "Account created"
msgstr ""
#: messages.go:168
msgid "Settings saved"
msgid "Account saved"
msgstr ""
#: messages.go:169
msgid "Password changed"
msgid "Account deleted"
msgstr ""
#: messages.go:170
#, c-format
msgid "Import completed in %d s"
msgid "Settings saved"
msgstr ""
#: messages.go:171
msgid "Import canceled"
msgid "Password changed"
msgstr ""
#: messages.go:172
#, c-format
msgid "Indexing completed in %d s"
msgid "Import completed in %d s"
msgstr ""
#: messages.go:173
msgid "Indexing originals..."
msgid "Import canceled"
msgstr ""
#: messages.go:174
#, c-format
msgid "Indexing files in %s"
msgid "Indexing completed in %d s"
msgstr ""
#: messages.go:175
msgid "Indexing canceled"
msgid "Indexing originals..."
msgstr ""
#: messages.go:176
#, c-format
msgid "Removed %d files and %d photos"
msgid "Indexing files in %s"
msgstr ""
#: messages.go:177
#, c-format
msgid "Moving files from %s"
msgid "Indexing canceled"
msgstr ""
#: messages.go:178
#, c-format
msgid "Copying files from %s"
msgid "Removed %d files and %d photos"
msgstr ""
#: messages.go:179
msgid "Labels deleted"
#, c-format
msgid "Moving files from %s"
msgstr ""
#: messages.go:180
msgid "Label saved"
#, c-format
msgid "Copying files from %s"
msgstr ""
#: messages.go:181
msgid "Subject saved"
msgid "Labels deleted"
msgstr ""
#: messages.go:182
msgid "Subject deleted"
msgid "Label saved"
msgstr ""
#: messages.go:183
msgid "Person saved"
msgid "Subject saved"
msgstr ""
#: messages.go:184
msgid "Person deleted"
msgid "Subject deleted"
msgstr ""
#: messages.go:185
msgid "File uploaded"
msgid "Person saved"
msgstr ""
#: messages.go:186
msgid "Person deleted"
msgstr ""
#: messages.go:187
msgid "File uploaded"
msgstr ""
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr ""
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr ""
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr ""
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr ""
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr ""
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr ""
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr ""
#: messages.go:193
msgid "Albums deleted"
msgstr ""
#: messages.go:194
#, c-format
msgid "Zip created in %d s"
msgstr ""
#: messages.go:195
msgid "Permanently deleted"
msgid "Albums deleted"
msgstr ""
#: messages.go:196
#, c-format
msgid "%s has been restored"
msgid "Zip created in %d s"
msgstr ""
#: messages.go:197
msgid "Successfully verified"
msgid "Permanently deleted"
msgstr ""
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr ""
#: messages.go:199
msgid "Successfully verified"
msgstr ""
#: messages.go:200
msgid "Successfully activated"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Spanish <https://translate.photoprism.app/projects/photoprism/"
"backend/es/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Algo ha ido mal, inténtalo de nuevo"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Incapaz de hacerlo"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "No se pudieron guardar los cambios"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "No se pudo borrar"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s ya existe"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "No encontrado"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "No se encuentra el archivo"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Archivo demasiado grande"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "No compatible"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Tipo no admitido"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Formato no admitido"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "La carpeta de originales está vacía"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Selección no encontrada"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entidad no encontrada"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Cuenta no encontrada"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Usuario no encontrado"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Etiqueta no encontrada"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Álbum no encontrado"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Asunto no encontrado"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Persona no encontrada"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Cara no encontrada"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "No disponible en modo público"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "No está disponible en modo de sólo lectura"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Por favor inicie sesión"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Permiso denegado"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Pago requerido"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "El archivo subido puede ser ofensivo"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Carga fallida"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Ningún elemento seleccionado"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Fallo al crear el archivo, por favor, compruebe los permisos"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Fallo al crear la carpeta, por favor, compruebe los permisos"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "No se pudo conectar, por favor vuelva a intentarlo"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Ingrese el código de verificación"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Código de verificación no válido, inténtalo de nuevo"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Contraseña inválida, por favor vuelva a intentarlo"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Característica desactivada"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Ninguna etiqueta seleccionada"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Ningún álbum seleccionado"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Ningún archivo disponible para descargar"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Fallo al crear el archivo zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Credenciales no válidas"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Enlace inválido"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nombre inválido"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Ocupado, por favor vuelva a intentarlo más tarde"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Su cuenta no pudo ser conectada"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Demasiadas peticiones"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Almacenamiento insuficiente"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Cuota superada"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Cambios guardados con éxito"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Álbum creado"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Álbum guardado"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Álbum %s borrado"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Contenidos del álbum clonados"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Archivo eliminado de la pila"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Archivo eliminado"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Selección añadida a %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Una entrada añadida a %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d entradas añadidas a %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Una entrada eliminada de %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entradas eliminadas de %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Cuenta creada"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Cuenta guardada"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Cuenta borrada"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Ajustes guardados"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Contraseña cambiada"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Importación completada en %d"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importación cancelada"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexación completada em %d"
msgstr "Indexación completada en %d"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indexando originales..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indexando archivos en %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexación cancelada"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Eliminados %d archivos y %d fotos"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Moviendo achivos desde %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Copiando archivos desde %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Etiquetas borradas"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Etiqueta guardada"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Asunto guardado"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Sujeto eliminado"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Persona salvada"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Persona eliminada"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Archivo cargado"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d archivos subidos en %d"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Procesando la carga..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "La carga ha sido procesada"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Selección aprobada"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Selección archivada"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Selección restaurada"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Selección marcada como privada"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Álbumes borrados"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip creado en %d"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Eliminado permanentemente"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s ha sido restaurado"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Verificado con éxito"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Activado exitosamente"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: none\n"
"Language: et\n"
@@ -11,398 +11,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Midagi läks valesti, proovige uuesti"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Seda ei ole võimalik teha"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Muudatuste salvestamine ebaõnnestus"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Kustutamine ebaõnnestus"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s on juba olemas"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Ei leitud"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Faili ei leitud"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Fail on liiga suur"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Toetamata"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Toetamata tüüp"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Mittetoetatud formaat"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Originaalide kaust on tühi"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Valikut ei leitud"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Olemit ei leitud"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Kontot ei leitud"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Kasutajat ei leitud"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Silti ei leitud"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Albumit ei leitud"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Teemat ei leitud"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Isikut ei leitud"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Nägu ei leitud"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Pole avalikus režiimis saadaval"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Pole kirjutuskaitstud režiimis saadaval"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Palun logi oma kontole sisse"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Õigused puuduvad"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Nõutav makse"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Fail võib olla solvav"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Üleslaadimine ebaõnnestus"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Midagi pole valitud"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Faili loomine ebaõnnestus, kontrolli õiguseid"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Kausta loomine ebaõnnestus, kontrolli õiguseid"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Ühendumine ebaõnnestus, palun proovi uuesti"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Sisesta kontrollkood"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Vale kinnituskood, proovige uuesti"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Vale parool, palun proovi uuesti"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funktsioon välja lülitatud"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Ühtegi silti pole valitud"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Ühtegi albumit pole valitud"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Ühtegi faili ei ole allalaadimiseks saadaval"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "ZIP-faili loomine ebaõnnestus"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Kehtetud ligipääsuandmed"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Vigane link"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Vigane nimi"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Hõivatud, palun proovi hiljem uuesti"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Konto ühendamine ebaõnnestus"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Liiga palju taotlusi"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Ebapiisav ladustamine"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kvoot ületatud"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Muudatused edukalt salvestatud"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album lisatud"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album salvestatud"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s kustutatud"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Albumi sisu kloonitud"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Fail virnast eemaldatud"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Fail kustutatud"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Valik lisatud albumisse %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Üks kirje lisatud albumisse %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d kirjet lisatud albumisse %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Üks kirje eemaldatud albumist %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d kirjet eemaldatud albumist %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Konto loodud"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Konto salvestatud"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Konto kustutatud"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Seaded salvestatud"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Parool muudetud"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Import tehtud %d sekundiga"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Import tühistatud"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indekseerimine lõpetatud %d sekundiga"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Originaalide indekseerimine..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Failide indekseerimine: %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indekseerimine tühistatud"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Eemaldatud %d faili ja %d fotot"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Failide liigutamine asukohast %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Failide kopeerimine asukohast %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Sildid kustutatud"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Silt salvestatud"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Teema salvestatud"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Teema kustutatud"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Isik salvestatud"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Isik kustutatud"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "File üles laaditud"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d faili üles laaditud %d sekundiga"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Üleslaaditud faili töötlemine..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Üleslaaditud fail on töödeldud"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Valik heaks kiidetud"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Valik arhiveeritud"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Valik taastatud"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Valik privaatseks märgitud"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albumid kustutatud"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "ZIP-fail loodud %d sekundiga"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Lõplikult kustutatud"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s on taastatud"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Edukalt kinnitatud"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Edukalt aktiveeritud"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: none\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Arazoren bat izan da. Saiatu berriro"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Hori egin ezinik"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Ezin izan dira aldaketak gorde"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Ezin izan da ezabatu"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s dagoeneko existitzen da"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Ez da aurkitu"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Fitxategia ez da aurkitu"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Fitxategi handiegia"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Onartu gabe"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Onartu gabeko mota"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Onartu gabeko formatua"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Jatorrizkoen karpeta hutsik dago"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Ez da hautapena aurkitu"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Ez da aurkitu entitatea"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Ez da kontua aurkitu"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Ez da erabiltzailea aurkitu"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Ez da etiketa aurkitu"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Ez da aurkitu albuma"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Ez da aurkitu gaia"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Pertsona ez da aurkitu"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Aurpegia ez da aurkitu"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Ez dago eskuragarri modu publikoan"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Ez dago erabilgarri irakurtzeko soilik moduan"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Mesedez, hasi saioa zure kontuan"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Baimena ukatu egin da"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Ordainketa beharrezkoa da"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Kargatzea iraingarria izan daiteke"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Ezin izan da kargatu"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Ez da elementurik hautatu"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Ezin izan da fitxategia sortzean. Egiaztatu baimenak"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Ezin izan da karpeta sortzean. Egiaztatu baimenak"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Ezin izan da konektatu. Saiatu berriro"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Sartu egiaztapen-kodea"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Egiaztapen-kode baliogabea. Saiatu berriro"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Pasahitz baliogabea, saiatu berriro"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Eginbidea desgaituta dago"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Ez da etiketarik hautatu"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Ez dago albumik hautatu"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Ez dago fitxategirik deskargatzeko erabilgarri"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Ezin izan da zip fitxategia sortu"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Kredentzialak baliogabeak"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Esteka baliogabea"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Izen baliogabea"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Lanpetuta, saiatu berriro geroago"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Ezin izan da zure kontua konektatu"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Eskaera gehiegi"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Biltegiratze nahikoa ez"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kuota gainditu da"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Aldaketak ongi gorde dira"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Sortu da albuma"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Albuma gorde da"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "%s albuma ezabatu da"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Albumen edukia klonatu da"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Fitxategia pilatik kendu da"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Fitxategia ezabatu da"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Aukeraketa gehitu da %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Sarrera bat gehitu da %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d sarrerak gehitu dira %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Sarrera bat kendu da %s-tik"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d sarrerak kendu dira %s-tik"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Kontua sortu da"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Kontua gorde da"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Kontua ezabatu da"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Ezarpenak gorde dira"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Pasahitza aldatu da"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Inportazioa %d s-an amaitu da"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Inportazioa bertan behera utzi da"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexatzea %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Jatorrizkoak indexatzen..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Fitxategiak indexatzen %s-n"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexazioa bertan behera utzi da"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d fitxategiak eta %d argazkiak kendu dira"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Fitxategiak mugitzen %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "%s fitxategiak kopiatzen"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Etiketak ezabatu dira"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Etiketa gorde da"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Gaia gorde da"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Gaia ezabatu da"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Pertsona gordeta"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Pertsona ezabatu da"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Kargatu da fitxategia"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fitxategiak %d s-etan kargatu dira"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Kargaketa prozesatzen..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Kargatzea prozesatu da"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Hautaketa onartu da"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Hautaketa artxibatuta dago"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Hautaketa leheneratu da"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Hautapena pribatu gisa markatu da"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albumak ezabatu dira"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip sortu zen %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Betiko ezabatu da"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s leheneratu da"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Behar bezala egiaztatu da"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Behar bezala aktibatu da"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: none\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "یه چیزی اشتباه شد دوباره تلاش کن"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "قادر به انجام آن نیست"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "تغییرات را نمی توان ذخیره کرد"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "نمی توان حذف کرد"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s از قبل وجود دارد"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "پیدا نشد"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "فایل پیدا نشد"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "فایل خیلی بزرگ است"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "پشتیبانی نمی شود"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "نوع پشتیبانی نشده"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "قالب پشتیبانی نشده"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "پوشه اصلی خالی است"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "انتخاب پیدا نشد"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "موجودیت پیدا نشد"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "حساب کاربری پیدا نشد"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "کاربر پیدا نشد"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "برچسب پیدا نشد"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "آلبوم پیدا نشد"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "موضوع پیدا نشد"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "فرد پیدا نشد"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "صورت پیدا نشد"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "در حالت عمومی در دسترس نیست"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "در حالت فقط خواندنی در دسترس نیست"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "لطفا وارد شوید و دوباره امتحان کنید"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "فرد حذف شد"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "پرداخت لازم است"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "آپلود ممکن است توهین آمیز باشد"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "آپلود انجام نشد"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "هیچ موردی انتخاب نشده است"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "فایل ایجاد نشد، لطفا مجوزها را بررسی کنید"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "پوشه ایجاد نشد، لطفا مجوزها را بررسی کنید"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "اتصال برقرار نشد، لطفاً دوباره امتحان کنید"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "کد تایید را وارد کنید"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "کد تأیید نامعتبر است، لطفاً دوباره امتحان کنید"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "رمز عبور نامعتبر است، لطفا دوباره امتحان کنید"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "ویژگی غیرفعال است"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "هیچ برچسبی انتخاب نشده است"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "هیچ آلبومی انتخاب نشده است"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "هیچ فایلی برای دانلود موجود نیست"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "فایل فشرده ایجاد نشد"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "گواهی نامه نامعتبر"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "لینک نامعتبر"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "نام نامعتبر"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "مشغول است، لطفاً بعداً دوباره امتحان کنید"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "فاصله بیداری %s است، اما باید 1 ساعت یا کمتر باشد"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "حساب شما متصل نشد"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "درخواست های خیلی زیاد"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "ذخیره سازی ناکافی"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "از سهمیه فراتر رفت"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "تغییرات با موفقیت ذخیره شد"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "آلبوم ایجاد شد"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "آلبوم ذخیره شد"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "آلبوم %s حذف شد"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "محتویات آلبوم کلون شد"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "فایل از پشته حذف شد"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "فایل حذف شد"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "مورد انتخابی به %s اضافه شد"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "یک مورد به %s اضافه شد"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d مورد به %s اضافه شد"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "یک مورد از %s حذف شد"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d مورد از %s حذف شد"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "حساب کاربری ایجاد شد"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "حساب کاربری ذخیره شد"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "حساب کاربری حذف شد"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "تنظیمات ذخیره شد"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "رمزعبور تغییر کرد"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "وارد کردن در %d ثانیه تکمیل شد"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "وارد کردن لغو شد"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "نمایه سازی در %d ثانیه تکمیل شد"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "نمایه سازی نسخه های اصلی ..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "نمایه سازی فایل ها در %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "نمایه سازی لغو شد"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d فایل و %d عکس حذف شد"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "انتقال فایل ها از %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "کپی کردن فایل ها از %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "برچسب ها حذف شدند"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "برچسب ذخیره شد"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "موضوع ذخیره شد"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "موضوع حذف شد"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "فرد ذخیره شد"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "فرد حذف شد"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "فایل حذف شد"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d فایل در %d ثانیه آپلود شد"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "در حال پردازش آپلود..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "%s بازیابی شده است"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "مورد انتخابی تایید شد"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "مورد انتخابی بایگانی شد"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "مورد انتخابی بازیابی شد"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "مورد انتخابی به‌عنوان خصوصی علامت‌گذاری شد"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "آلبوم حذف شد"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "فایل فشرده در %d ثانیه ایجاد شد"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "برای همیشه حذف شد"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s بازیابی شده است"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "با موفقیت تأیید شد"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "با موفقیت فعال شد"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: none\n"
"Language: fi\n"
@@ -11,398 +11,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Jokin meni pieleen, yritä uudelleen"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Se ei onnistu"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Muutoksia ei voitu tallentaa"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Ei voitu poistaa"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s on jo olemassa"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Ei löytynyt"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Tiedostoa ei löydy"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Tiedosto liian suuri"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Ei tuettu"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Tyyppiä ei tueta"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Ei tuettu muoto"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Originaalit-kansio on tyhjä"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Valintaa ei löydy"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entiteettiä ei löydy"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Tiliä ei löydy"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Käyttäjää ei löydy"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Tarraa ei löydy"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Albumia ei löydy"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Aihetta ei löydy"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Henkilöä ei löydy"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Kasvoja ei löydy"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Ei käytettävissä julkisessa tilassa"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Ei käytettävissä vain luku-tilassa"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Kirjaudu sisään tilillesi"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Lupa evätty"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Vaadittu maksu"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Upload saattaa olla loukkaava"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Lataus epäonnistui"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Kohdetta ei ole valittu"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Tiedoston luominen epäonnistui, tarkista käyttöoikeudet"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Kansion luominen epäonnistui, tarkista käyttöoikeudet"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Yhteyttä ei saatu muodostettua, yritä uudelleen"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "syötä vahvistus koodi"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Virheellinen vahvistuskoodi, yritä uudelleen"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Väärä salasana, yritä uudelleen"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Ominaisuus poistettu käytöstä"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Ei valittuja tarroja"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Ei valittuja albumeita"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Tiedostoja ei ole ladattavissa"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Zip-tiedoston luominen epäonnistui"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Virheelliset valtakirjat"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Virheellinen linkki"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Virheellinen nimi"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Varattu, yritä myöhemmin uudelleen"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Tiliäsi ei voitu yhdistää"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Liian monta pyyntöä"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Riittämätön varastointi"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kiintiö ylitetty"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Muutokset tallennettu onnistuneesti"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Albumi luotu"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Albumi tallennettu"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Albumi %s poistettu"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Albumin sisältö kloonattu"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Tiedosto poistettu pinosta"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Tiedosto poistettu"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Valinta lisätty %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Yksi merkintä lisätty kohtaan %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d merkintöjä lisätty %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Yksi merkintä poistettu kohdasta %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d merkinnät poistettu %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Tili luotu"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Tallennettu tili"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Tili poistettu"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Asetukset tallennettu"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Salasana vaihdettu"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Tuonti valmis %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Tuonti peruutettu"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksointi valmis %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Alkuperäiskappaleiden indeksointi..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Tiedostojen indeksointi osoitteessa %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indeksointi peruutettu"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Poistettiin %d tiedostoa ja %d valokuvaa"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Tiedostojen siirtäminen %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Tiedostojen kopiointi %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Tunnisteet poistettu"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Tarra tallennettu"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Aihe tallennettu"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Aihe poistettu"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Tallennettu henkilö"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Henkilö poistettu"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Ladattu tiedosto"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d tiedostoa ladattu %d s aikana"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Käsittelen latausta..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Lataus on käsitelty"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Valinta hyväksytty"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Valinta arkistoitu"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Valinta palautettu"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Valinta merkitty yksityiseksi"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albumit poistettu"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip luotu %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Poistettu pysyvästi"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s on palautettu"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Vahvistettu onnistuneesti"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Aktivointi onnistui"

View File

@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-12 19:30+0000\n"
"Last-Translator: jean-louis67 <jean-louis.frenkel@orange.fr>\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: French <https://translate.photoprism.app/projects/photoprism/"
"backend/fr/>\n"
"Language: fr\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Quelque chose s'est mal passé, réessayez"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Impossible de faire cela"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Les modifications n'ont pas pu être sauvegardées"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "N'a pas pu être supprimé"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s existe déjà"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Non trouvé"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Fichier non trouvé"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Fichier trop volumineux"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Non pris en charge"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Type non pris en charge"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Format non supporté"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Le dossier des originaux est vide"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Sélection non trouvée"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entité non trouvée"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Compte non trouvé"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Utilisateur non trouvé"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Étiquette non trouvée"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album introuvable"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Sujet non trouvé"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Personne non trouvée"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Visage non trouvé"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Non disponible en mode public"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Non disponible en mode lecture seule"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Veuillez vous connecter avec votre compte"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Permission refusée"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Paiement requis"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Le contenu chargé peut être choquant"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Échec du chargement"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Aucun élément sélectionné"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "La création du fichier a échoué, veuillez vérifier les permissions"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Échec de la création du dossier, veuillez vérifier les permissions"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Échec lors de la connexion, veuillez réessayer"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Entrer le code de vérification"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Code de vérification invalide, veuillez réessayer"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Mot de passe invalide, veuillez réessayer"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Fonctionnalité désactivée"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Aucune étiquette sélectionnée"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Aucun album sélectionné"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Aucun fichier disponible au téléchargement"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Échec de la création du fichier zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Les informations d'identification sont invalides"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Lien invalide"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nom invalide"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Occupé, veuillez réessayer plus tard"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Votre compte n'a pas pu être connecté"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Trop de demandes"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Espace de stockage insuffisant"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Quota dépassé"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Les modifications ont bien été enregistrées"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album créé"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album sauvegardé"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s supprimé"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Le contenu de l'album a été copié"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Le fichier a été retiré du groupe"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Fichier supprimé"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Sélection ajoutée à %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Une entrée a été ajoutée à %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d entrées ont été ajoutées à %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Une entrée a été supprimée de %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entrées ont été supprimées de %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Compte créé"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Compte sauvegardé"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Compte supprimé"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Paramètres sauvegardés"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Mot de passe modifié"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Importation terminée en %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importation annulée"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexation terminée en %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indexage des originaux…"
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indexation des fichiers de %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexation annulée"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Suppression de %d fichiers et %d photos"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Déplacement de fichiers depuis %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Copie de fichiers depuis %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Étiquettes supprimées"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Étiquettes sauvegardées"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Sujet sauvegardé"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Sujet supprimé"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Personne sauvegardée"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Personne supprimée"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Fichier téléchargé"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fichiers chargés en %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Traitement du téléchargement..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Le téléchargement a été traité"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Sélection approuvée"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Sélection archivée"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Sélection restaurée"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Sélection marquée comme privée"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albums supprimés"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Archive zip créée en %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Supprimé définitivement"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s a été restauré"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Vérifié avec succès"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Activation réussie"

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: none\n"
@@ -18,398 +18,402 @@ msgstr ""
"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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Chuaigh rud éigin mícheart, bain triail eile as"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Ní féidir é sin a dhéanamh"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Níorbh fhéidir na hathruithe a shábháil"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Níorbh fhéidir a scriosadh"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s ann cheana"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Ní bhfuarthas"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Comhad gan aimsiú"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Comhad ró-mhór"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Gan tacaíocht"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Cineál nach dtacaítear leis"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Formáid nach dtacaítear léi"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Tá fillteán bunghnéithe folamh"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Níor aimsíodh an rogha"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Aonán gan aimsiú"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Cuntas gan aimsiú"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Úsáideoir gan aimsiú"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Níor aimsíodh an lipéad"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Albam gan aimsiú"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Ní bhfuarthas an t-ábhar"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Ní bhfuarthas an duine"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Aghaidh gan aimsiú"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Níl sé ar fáil i mód poiblí"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Níl sé ar fáil i mód inléite amháin"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Logáil isteach i do chuntas le do thoil"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Cead diúltaithe"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Íocaíocht ag teastáil"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "D'fhéadfadh uaslódáil a bheith maslach"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Theip ar an uaslódáil"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Níl aon mhír roghnaithe"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Theip ar chruthú an chomhaid, seiceáil na ceadanna"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Theip ar chruthú fillteán, seiceáil na ceadanna"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Níorbh fhéidir ceangal a dhéanamh, bain triail eile as"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Cuir isteach cód fíorúcháin"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Cód fíoraithe neamhbhailí, bain triail eile as"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Pasfhocal neamhbhailí, bain triail eile as"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Gné díchumasaithe"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Níor roghnaíodh aon lipéid"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Níor roghnaíodh aon albam"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Níl aon chomhaid ar fáil le híoslódáil"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Theip ar chruthú an chomhaid zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Dintiúir neamhbhailí"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Nasc neamhbhailí"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Ainm neamhbhailí"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Gnóthach, bain triail eile as ar ball"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Níorbh fhéidir do chuntas a nascadh"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "An iomarca iarratas"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Stóráil neamhleor"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Sáraíodh an cuóta"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Sábháladh na hathruithe"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Albam cruthaithe"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Sábháilte albam"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Albam %s scriosta"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Clónáilte ábhar albam"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Baineadh an comhad den chruach"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Scriosadh an comhad"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Cuireadh an rogha le %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Cuireadh iontráil amháin le %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d iontráil curtha le %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Baineadh iontráil amháin de %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d iontráil bainte de %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Cuntas cruthaithe"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Cuntas sábháilte"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Scriosadh an cuntas"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Socruithe sábháilte"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Athraíodh an pasfhocal"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Iompórtáil críochnaithe i %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Cealaíodh an iompórtáil"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Innéacsú curtha i gcrích in %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Buntéacs á innéacsú..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Comhaid á innéacsú in %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Innéacsú cealaithe"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Baineadh %d comhaid agus %d grianghraif"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Comhaid á mbogadh ó %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Comhaid á gcóipeáil ó %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Scriosadh na lipéid"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Lipéad sábháilte"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Ábhar sábháilte"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Scriosadh an t-ábhar"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Sábháladh an duine"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Scriosadh an duine"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Comhad uaslódáilte"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d comhaid uaslódáilte i %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Uaslódáil á phróiseáil..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Próiseáladh an t-uaslódáil"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Faomhadh an roghnúcháin"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Roghnaithe sa chartlann"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Athchóiríodh an roghnúchán"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Roghnú marcáilte mar phríobháideach"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albaim scriosta"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip cruthaithe i %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Scriosta go buan"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s athchóirithe"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "D'éirigh leis a fhíorú"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Cuireadh i ngníomh go rathúil"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: Hebrew <https://translate.photoprism.app/projects/photoprism/"
@@ -14,398 +14,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "קרתה תקלה נסה שוב"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "לא מסוגל לעשות את זה"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "לא ניתן לשמור שינויים"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "לא ניתן למחיקה"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s כבר קיים"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "לא נמצא"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "הקובץ לא נמצא"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "קובץ גדול מדי"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "אינו נתמך"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "סוג לא נתמך"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "פורמט לא נתמך"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "תיקיית המקור ריקה"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "הבחירה לא נמצאה"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "הישות לא נמצאה"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "החשבון לא נמצא"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "המשתמש לא נמצא"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "התווית לא נמצאה"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "האלבום לא נמצא"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "הנושא לא נמצא"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "אדם לא נמצא"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "הפנים לא נמצאו"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "לא זמין במצב ציבורי"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "לא זמין במצב קריאה בלבד"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "אנא היכנס לחשבון שלך"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "גישה נדחתה"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "נדרש תשלום"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "ההעלאה עשויה להיות פוגענית"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "העלאה נכשלה"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "לא נבחרו פריטים"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "יצירת הקובץ נכשלה, אנא בדוק את ההרשאות"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "יצירת התיקיה נכשלה, אנא בדוק את ההרשאות"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "לא ניתן היה להתחבר, נסה שוב"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "הכנס קוד אימות"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "קוד אימות לא חוקי, אנא נסה שוב"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "סיסמה לא תקינה, נסה שוב"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "התכונה מושבתת"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "לא נבחרו תוויות"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "לא נבחרו אלבומים"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "אין קבצים זמינים להורדה"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "יצירת קובץ ה-zip נכשלה"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "אישורים לא תקינים"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "קישור לא תקין"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "מספר לא תקף"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "עסוק, אנא נסה שוב מאוחר יותר"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "מרווח ההשכמה הוא %s, אך חייב להיות שעה אחת או פחות"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "לא ניתן היה לחבר את החשבון שלך"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "יותר מדי בקשות"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "אחסון לא מספיק"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "חריגה מהמכסה"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "השינויים נשמרו בהצלחה"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "האלבום נוצר"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "האלבום נשמר"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "האלבום %s נמחק"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "תוכן האלבום שוכפל"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "הקובץ הוסר מהאיחוד"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "הקובץ נמחק"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "הבחירה נוספה ל-%s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "רשומה אחת נוספה ל-%s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d רשומות נוספו ל-%s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "רשומה אחת הוסרה מ-%s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d רשומות הוסרו מ-%s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "החשבון נוצר"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "החשבון נשמר"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "החשבון נמחק"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "ההגדרות נשמרו"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "סיסמא שונתה"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "הייבוא הושלם ב-%d שניות"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "הייבוא בוטל"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "האינדוקס הושלם ב-%d שניות"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "מאנדקס קבצי מקור..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "מאנדקס קבצים תוך %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "יצירת האינדקס בוטלה"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "הוסרו %d קבצים ו-%d תמונות"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "מעביר קבצים מ-%s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "מעתיק קבצים מ-%s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "תוויות נמחקו"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "התווית נשמרה"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "הנושא נשמר"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "הנושא נמחק"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "אדם נשמר"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "אדם נמחק"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "הקובץ הועלה"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d קבצים הועלו תוך %d שניות"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "מעבד העלאה..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "ההעלאה עובדה"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "הבחירה אושרה"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "הבחירה הועברה לארכיון"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "הבחירה שוחזרה"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "הבחירה סומנה כפרטית"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "אלבומים נמחקו"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "ה-ZIP נוצר תוך %d שניות"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "נמחק לצמיתות"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s שוחזר"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "אומת בהצלחה"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "הופעל בהצלחה"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: Hindi <https://translate.photoprism.app/projects/photoprism/"
@@ -13,398 +13,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "कुछ गलत हुआ है, दोबारा कोशिश करें"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "ऐसा करने में असमर्थ"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "परिवर्तन सहेजा नहीं जा सका"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "हटाया नहीं जा सका"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s पहले से मौजूद है"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "नहीं मिला"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "फाइल नहीं मिली"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "बहुत बड़ी फाइल"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "असमर्थित"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "असमर्थित प्रकार"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "असमर्थित प्रारूप"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "मूल फ़ोल्डर खाली है"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "चयन नहीं मिला"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "इकाई नहीं मिली"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "खता नहीं मिला"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "उपयोगकर्ता नहीं मिला"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "लेबल नहीं मिला"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "एल्बम नहीं मिला"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "विषय नहीं मिला"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "व्यक्ति नहीं मिला"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "चेहरा नहीं मिला"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "सार्वजनिक मोड में उपलब्ध नहीं है"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "रीड ओनली मोड में उपलब्ध नहीं है"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "कृपया अपने खाते लॉग इन करें"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "अनुमति नहीं मिली"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "भुगतान आवश्यक"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "अपलोड आपत्तिजनक हो सकता है"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "अपलोड विफल"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "कोई आइटम नहीं चुना गया"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "फ़ाइल बनाने में विफल, कृपया अनुमतियों की जाँच करें"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "फ़ोल्डर बनाने में विफल, कृपया अनुमतियों की जाँच करें"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "कनेक्ट नहीं हो सका, कृपया पुनः प्रयास करें"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "सत्यापन कोड दर्ज करें"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "सत्यापन कोड अमान्य है, कृपया पुनः प्रयास करें"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "अमान्य पासवर्ड, कृपया पुनः प्रयास करें"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "सुविधा अक्षम है"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "कोई लेबल नहीं चुना गया"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "कोई एल्बम नहीं चुना गया"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "डाउनलोड के लिए कोई फाइल उपलब्ध नहीं है"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "ज़िप फ़ाइल बनाने में विफल"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "अवैध प्रत्यय पत्र"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "अमान्य लिंक"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "अमान्य नाम"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "व्यस्त, कृपया बाद में पुन: प्रयास करें"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "वेकअप अंतराल %s है, लेकिन 1h या उससे कम होना चाहिए"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "आपका खाता कनेक्ट नहीं किया जा सका"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "बहुत अधिक अनुरोध"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "अपर्याप्त भंडारण"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "कोटा पूरा हो गया"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "परिवर्तन सफलतापूर्वक सहेजे गए"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "एल्बम बनाया गया"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "एल्बम सहेजा गया"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "एल्बम %s हटाया गया"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "एल्बम सामग्री को क्लोन किया गया"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "स्टैक से फ़ाइल को निकाला गया"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "फ़ाइल हटा दी गई"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "चयन %s में जोड़ा गया"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "एक प्रविष्टि %s में जोड़ी गई"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d प्रविष्टियों को %s में जोड़ा गया"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "%s से एक प्रविष्टि को हटाया गया"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d प्रविष्टियों को %s से हटा दिया गया"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "खाता बन गया"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "खाता सहेजा गया"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "खाता हटाया गया"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "सेटिंग्स को सहेजा गया"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "पासवर्ड बदला गया"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "%d s में आयात पूरा हुआ"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "आयात रद्द कर दिया गया"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "%d s में अनुक्रमण पूरा हुआ"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "अनुक्रमण मूल ..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "%s में फाइलों को अनुक्रमित करना"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "अनुक्रमण रद्द किया गया"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d फ़ाइलों और %d फ़ोटो को हटा दिया गया"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "%s से फाइल चल रही है"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "%s से फाइल कॉपी कर रहा है"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "लेबल हटा दिए गए"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "लेबल सहेजा गया"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "विषय सहेजा गया"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "विषय हटा दिया गया"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "व्यक्ति बचाया"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "व्यक्ति हटाया गया"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "फ़ाइल अपलोड की गई"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d फाइलों को %d में अपलोड किया गया"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "अपलोड संसाधित किया जा रहा है..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "अपलोड संसाधित हो गया है"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "चयन को संग्रहीत किया गया"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "चयन को संग्रहीत किया गया"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "चयन बहाल"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "चयन निजी के रूप में चिह्नित"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "एल्बम हटाए गए"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "%d s में बनाया गया ज़िप"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "स्थायी रूप से हटा दिया गया"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s बहाल कर दिया गया है"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "सफलतापूर्वक सत्यापित"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "सफलतापूर्वक सक्रिय किया गया"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: none\n"
@@ -13,398 +13,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Nešto nije u redu, pokušajte ponovno"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Nesposoban to učiniti"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Promjene se nisu mogle spremiti"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Nije moguće izbrisati"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s već postoji"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Nije pronađeno"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Datoteka nije pronađena"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Datoteka je prevelika"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Nepodržano"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Nepodržana vrsta"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Nepodržani format"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Originalna mapa je prazna"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Odabir nije pronađen"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entitet nije pronađen"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "račun nije pronađen"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Korisnik nije pronađen"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Oznaka nije pronađena"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album nije pronađen"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Predmet nije pronađen"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Osoba nije pronađena"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Lice nije pronađeno"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Nije dostupno u javnom načinu"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "nije dostupno u načinu samo za čitanje"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Molimo prijavite se i pokušajte ponovno"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Osoba je izbrisana"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Potrebno je plaćanje"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Prijenos bi mogao biti uvredljiv"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Prijenos nije uspio"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Nema odabranih stavki"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Izrada datoteke nije uspjela, provjerite dopuštenja"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Izrada mape nije uspjela, provjerite dopuštenja"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Povezivanje nije uspjelo, pokušajte ponovno"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Unesite kontrolni kod"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Nevažeći kontrolni kod, pokušajte ponovno"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Nevažeća lozinka, pokušajte ponovo"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Značajka je onemogućena"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Nije odabrana nijedna oznaka"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Nije odabran nijedan album"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Nema dostupnih datoteka za preuzimanje"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Izrada zip datoteke nije uspjela"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Nevažeće vjerodajnice"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Nevažeća veza"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nevažeći naziv"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Zauzeto, pokušajte ponovo kasnije"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Vaš račun nije bilo moguće povezati"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Previše zahtjeva"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Nedovoljno prostora za pohranu"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kvota premašena"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Promjene su uspješno spremljene"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album stvoren"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album je spremljen"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s je izbrisan"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Sadržaj albuma je kloniran"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Datoteka je uklonjena iz hrpe"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Datoteka je izbrisana"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Odabir je dodan u %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Jedan unos dodan u %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d unosi dodani u %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Jedan unos uklonjen iz %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d unosi uklonjeni iz %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Račun kreiran"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Račun spremljen"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Račun je izbrisan"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Postavke spremljene"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Lozinka je promijenjena"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Uvoz dovršen za %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Uvoz je otkazan"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksiranje dovršeno za %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indeksiranje originala..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indeksiranje datoteka u %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indeksiranje je otkazano"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Uklonjene %d datoteke i %d fotografije"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Premještanje datoteka iz %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Kopiranje datoteka s %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Oznake su izbrisane"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Oznaka je spremljena"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Predmet je spremljen"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Predmet je izbrisan"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Osoba je spremljena"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Osoba je izbrisana"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Datoteka je izbrisana"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d datoteke prenesene u %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Obrada prijenosa..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Prijenos bi mogao biti uvredljiv"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Odabir odobren"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Odabir je arhiviran"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Odabir je vraćen"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Odabir je označen kao privatan"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albumi su izbrisani"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip stvoren u %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Trajno izbrisano"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "Odabir je vraćen"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Uspješno potvrđeno"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Uspješno aktiviran"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Hungarian <https://translate.photoprism.app/projects/"
"photoprism/backend/hu/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Valami rosszul ment, próbálja újra"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Erre képtelen"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Módosításokat nem sikerült menteni"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Nem sikerült törölni"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s már létezik"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Nem található"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Fájl nem található"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Túl nagy fájl"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Nem támogatott"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Nem támogatott típus"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Nem támogatott formátum"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Az Originals mappa üres"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Kiválasztás nem található"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entitás nem található"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Fiók nem található"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Felhasználó nem található"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Címke nem található"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album nem található"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Tárgy nem található"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Személy nem található"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Arc nem található"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Nyilvános módban nem elérhető"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Nem elérhető olvasói módban"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Kérjük, jelentkezzen be fiókjába"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Engedély megtagadva"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Fizetés szükséges"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "A feltöltött fájl sértő lehet"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Feltöltés sikertelen"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Nincsenek kiválasztva elemek"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Sikertelen fájl létrehozás. Kérjük, ellenőrizze a jogosultságokat"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Sikertelen mappa létrehozás. Kérjük, ellenőrizze a jogosultságokat"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Nem sikerült csatlakozni, próbálja újra"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Adja meg a megerősítő kódot"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Érvénytelen ellenőrző kód. Kérjük, próbálja újra"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Érvénytelen jelszó, próbálkozzon újra"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funkció letiltva"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Nincsenek kiválasztva címkék"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Nincsenek kiválasztott albumok"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Nincsenek letölthető fájlok"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Nem sikerült létrehozni a zip fájlt"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Érvénytelen belépési adatok"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Érvénytelen hivatkozás"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Érvénytelen név"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Túl magas terhelés, próbálkozzon újra később"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "A fiókját nem lehetett csatlakoztatni"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Túl sok kérés"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Elégtelen tárolás"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "A kvóta túllépése"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Módosítások sikeresen mentve"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album létrehozva"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album mentve"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "%s album törölve"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Album tartalma klónozva"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Fájl eltávolítva a halomból"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Fájl törölve"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Választék hozzáadva a következőhöz: %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Egy bejegyzés hozzáadva a következőhöz: %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d bejegyzés hozzáadva a következőhöz: %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Egy bejegyzés eltávolítva innen: %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d bejegyzés eltávolítva innen: %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Fiók létrehozva"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Fiók mentve"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Fiók törölve"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Beállítások elmentve"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Jelszó megváltoztatva"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Importálás %d másodperc alatt befejeződött"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importálás megszakítva"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexelés %d másodperc alatt befejeződött"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Eredeti dokumentumok indexelése..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Fájlok indexelése itt: %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexelés megszakítva"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d fájl és %d fénykép eltávolítva"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Fájlok áthelyezése innen: %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Fájlok másolása innen: %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Címkék törölve"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Címkék mentve"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Tárgy mentve"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Tárgy törölve"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Személy mentve"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Személy törölve"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Fájl feltöltve"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fájl feltöltve %d másodperc alatt"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Feltöltött fájlok feldolgozása..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Feltöltött fájlok feldolgozva"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "A kijelölés jóváhagyva"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "A kijelölés archiválva"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "A kijelölés visszaállítva"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "A kijelölés privátként megjelölve"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albumok törölve"
#: messages.go:194
#: messages.go:196
#, 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:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Véglegesen törölve"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s visszaállítva"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Sikeresen ellenőrizve"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Sikeres aktiválás"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Indonesian <https://translate.photoprism.app/projects/"
"photoprism/backend/id/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Ada yang salah, coba lagi"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Tidak dapat melakukan itu"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Perubahan tidak dapat disimpan"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Tidak dapat dihapus"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s sudah ada"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Tidak ditemukan"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Berkas tidak ditemukan"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Berkas terlalu besar"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Tidak didukung"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Jenis tidak didukung"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Format yang tidak didukung"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Folder asli kosong"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Pilihan tidak ditemukan"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entitas tidak ditemukan"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Akun tidak ditemukan"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Pengguna tidak ditemukan"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Label tidak ditemukan"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album tidak ditemukan"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Subjek tidak ditemukan"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Orang tidak ditemukan"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Wajah tidak ditemukan"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Tidak tersedia dalam mode publik"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Tidak tersedia dalam mode hanya-baca"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Silakan masuk ke akun Anda"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Izin ditolak"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Diperlukan pembayaran"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Unggahan mungkin menyinggung"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Unggahan gagal"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Tidak ada item yang dipilih"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Gagal membuat file, silakan periksa izin"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Gagal membuat folder, harap periksa izin"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Tidak dapat terhubung, silakan coba lagi"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Masukkan kode verifikasi"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Kode verifikasi tidak valid, silakan coba lagi"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Kata sandi salah, silakan coba lagi"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Fitur dinonaktifkan"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Tidak ada label yang dipilih"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Tidak ada album yang dipilih"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Tidak ada file yang tersedia untuk diunduh"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Gagal membuat file zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Kredensial tidak valid"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Tautan tidak valid"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nama tidak valid"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Sibuk, silakan coba lagi nanti"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Akun Anda tidak dapat terhubung"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Terlalu banyak permintaan"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Penyimpanan yang tidak memadai"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kuota terlampaui"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Perubahan berhasil disimpan"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album dibuat"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album disimpan"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s dihapus"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Konten album dikloning"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "File dihapus dari tumpukan"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Berkas dihapus"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Pilihan ditambahkan ke %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Satu entri ditambahkan ke %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d entri ditambahkan ke %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Satu entri dihapus dari %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entri dihapus dari %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Akun dibuat"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Akun disimpan"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Akun dihapus"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Pengaturan disimpan"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Kata sandi diubah"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Impor selesai dalam %d detik"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Impor dibatalkan"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Pengindeksan selesai dalam %d detik"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Mengindeks dokumen asli..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Mengindeks file dalam %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Pengindeksan dibatalkan"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Menghapus %d file dan %d foto"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Memindahkan file dari %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Menyalin file dari %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Label dihapus"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Label disimpan"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Subjek disimpan"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Subjek dihapus"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Orang disimpan"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Orang dihapus"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "File diunggah"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d file diupload di %d detik"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Memproses unggahan..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Unggahan telah diproses"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Pilihan disetujui"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Pilihan diarsipkan"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Pilihan dipulihkan"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Pilihan ditandai sebagai pribadi"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Koleksi album dihapus"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip dibuat dalam %d detik"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Dihapus permanen"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s telah dipulihkan"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Berhasil diverifikasi"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Berhasil diaktifkan"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Italian <https://translate.photoprism.app/projects/photoprism/"
"backend/it/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Qualcosa è andato storto, riprova"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Impossibile farlo"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Le modifiche non possono essere salvate"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Impossibile eliminare"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s esiste già"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Non trovato"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "File non trovato"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "File troppo grande"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Non supportato"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Formato non supportato"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Formato non supportato"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "La cartella degli originali è vuota"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Selezione non trovata"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entità non trovata"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Account non trovato"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Utente non trovato"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Etichetta non trovata"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album non trovato"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Soggetto non trovato"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Persona non trovata"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Faccia non trovata"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Non disponibile in modalità pubblica"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Non disponibile in modalità di sola lettura"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Accedere al proprio account"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Permesso negato"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Pagamento obbligatorio"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "L'upload potrebbe essere offensivo"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Upload fallito"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Nessun elemento selezionato"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Impossibile creare il file, si prega di controllare i permessi"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Impossibile creare la cartella, si prega di controllare i permessi"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Impossibile connettersi, si prega di riprovare"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Inserisci codice di verifca"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Codice di verifica errato, prova di nuovo"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Password non valida, si prega di riprovare"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funzionalità disabilitata"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Nessuna etichetta selezionata"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Nessun album selezionato"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Nessun file è disponibile per il download"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Impossibile creare il file zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Credenziali non valide"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Link non valido"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nome non valido"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Occupato, si prega di riprovare più tardi"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Non è stato possibile collegare l'account"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Troppe richieste"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Stoccaggio insufficiente"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Quota superata"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Modifiche salvate con successo"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album creato"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album salvato"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s eliminato"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "I contenuti dell'album sono stati duplicati"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "File rimosso dallo stack"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "File eliminato"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Selezione aggiunta a %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Un elemento aggiunto a %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d elementi aggiunti a %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Un elemento rimosso da %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d elementi rimossi da %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Account creato"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Account salvato"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Account eliminato"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Impostazioni salvate"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Password cambiata"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Importazione completata in %d secondi"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importazione cancellata"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indicizzazione completata in %d secondi"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indicizzando gli originali..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indicizzazione dei file in %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indicizzazione cancellata"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Rimossi %d file e %d foto"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Spostamento dei file da %s in corso"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Copia dei file da %s in corso"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Etichette eliminate"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Etichetta salvata"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Soggetto salvato"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Soggetto cancellato"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Persona salvata"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Persona cancellata"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "File caricato"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d file caricati in %d secondi"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Elaborazione del caricamento..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Il caricamento è stato elaborato"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Selezione approvata"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Selezione archiviata"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Selezione ripristinata"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Selezione impostata come privata"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Album eliminati"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip creato in %d secondi"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Eliminato permanentemente"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s è stato ripristinato"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Verifica avvenuta con successo"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Attivazione avvenuta con successo"

View File

@@ -2,408 +2,412 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Japanese <https://translate.photoprism.app/projects/"
"photoprism/backend/ja/>\n"
"Language: ja_JP\n"
"Language: ja\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.9.2\n"
#: messages.go:103
msgid "Something went wrong, try again"
msgstr "問題が発生しました。もう一度やり直してください"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:104
msgid "Unable to do that"
msgstr "実行できませんでした"
msgid "Something went wrong, try again"
msgstr "何かが間違っています。もう一度やり直してください"
#: messages.go:105
msgid "Unable to do that"
msgstr "その操作はできません"
#: messages.go:106
msgid "Changes could not be saved"
msgstr "変更を保存できませんでした"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "削除できませんでした"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s は既に存在します"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "見つかりませんでした"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "ファイルが見つかりませんでした"
#: messages.go:110
msgid "File too large"
msgstr "ファイルサイズが大きすぎます"
#: messages.go:111
msgid "File too large"
msgstr "ファイルが大きすぎます"
#: messages.go:112
msgid "Unsupported"
msgstr "サポートされていません"
#: messages.go:112
msgid "Unsupported type"
msgstr "サポートされていないタイプ"
#: messages.go:113
msgid "Unsupported type"
msgstr "サポートされていない形式です"
#: messages.go:114
msgid "Unsupported format"
msgstr "非対応のフォーマットです"
#: messages.go:114
msgid "Originals folder is empty"
msgstr "Originalsフォルダーが空です"
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Originals フォルダーは空です"
#: messages.go:116
msgid "Selection not found"
msgstr "選択した項目は存在しません"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "エンティティが見つかりません"
#: messages.go:117
msgid "Account not found"
msgstr "アカウントは存在しません"
#: messages.go:118
msgid "User not found"
msgstr "ユーザは存在しません"
msgid "Account not found"
msgstr "アカウントが存在しません"
#: messages.go:119
msgid "Label not found"
msgstr "ラベルは存在しません"
msgid "User not found"
msgstr "ユーザーが存在しません"
#: messages.go:120
msgid "Album not found"
msgstr "アルバムは存在しません"
msgid "Label not found"
msgstr "ラベルが存在しません"
#: messages.go:121
msgid "Album not found"
msgstr "アルバムが存在しません"
#: messages.go:122
msgid "Subject not found"
msgstr "件名が見つかりません"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "人が見つかりません"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "顔を検出できませんでした"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "公開モードでは利用できません"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "読み込み専用モードでは利用できません"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "アカウントにログインしてください"
#: messages.go:127
msgid "Permission denied"
msgstr "アクセス拒否"
#: messages.go:128
msgid "Permission denied"
msgstr "アクセスが拒否されました"
#: messages.go:129
msgid "Payment required"
msgstr "要支払い"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "アップロードされた項目に過激なものが含まれている可能性があります"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "アップロード失敗"
msgstr "アップロード失敗しました"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "項目が選択されていません"
#: messages.go:131
msgid "Failed creating file, please check permissions"
msgstr "ファイルの作成に失敗しました、権限を確認してください"
#: messages.go:132
msgid "Failed creating folder, please check permissions"
msgstr "フォルダの作成に失敗しました、権限を確認してください"
#: messages.go:133
msgid "Could not connect, please try again"
msgstr "接続できませんでした、再度試してみてください"
msgid "Failed creating file, please check permissions"
msgstr "ファイルの作成に失敗しました。権限を確認してください"
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "フォルダの作成に失敗しました。権限を確認してください"
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "接続できませんでした。もう一度お試しください"
#: messages.go:136
msgid "Enter verification code"
msgstr "認証コードを入力してください"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "認証コードが無効です。もう一度お試しください"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "不正なパスワードです、再度試してみてください"
msgstr "不正なパスワードです。もう一度お試しください"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "機能が無効になりました"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "ラベルが選択されていません"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "アルバムが選択されていません"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "ダウンロードできるファイルはありません"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "zip ファイルの作成に失敗しました"
#: messages.go:142
msgid "Invalid credentials"
msgstr "不正な認証情報"
#: messages.go:143
msgid "Invalid link"
msgstr "不正なリンク"
#: messages.go:144
msgid "Invalid name"
msgstr "無効なバケット名"
msgid "Invalid credentials"
msgstr "正しくない認証情報です"
#: messages.go:145
msgid "Busy, please try again later"
msgstr "混雑しています、後で再試行してください"
msgid "Invalid link"
msgstr "正しくないリンクです"
#: messages.go:146
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "ウェイクアップ間隔は%sであるが、1h以下でなければならない"
msgid "Invalid name"
msgstr "無効な名前です"
#: messages.go:147
msgid "Your account could not be connected"
msgstr "お客様のアカウントに接続できませんでした"
msgid "Busy, please try again later"
msgstr "他の処理中です。後で再試行してください"
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "ウェイクアップ間隔は %s ですが、1時間以内で指定する必要があります"
#: messages.go:149
msgid "Your account could not be connected"
msgstr "アカウントに接続できませんでした"
#: messages.go:150
msgid "Too many requests"
msgstr "リクエストが多すぎます"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "ストレージ不足"
msgstr "ストレージ不足しています"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "ノルマ超過"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "変更が正常に保存されました"
#: messages.go:154
msgid "Album created"
msgstr "アルバムを作成しました"
#: messages.go:155
msgid "Album saved"
msgstr "アルバムを保存しました"
#: messages.go:156
#, c-format
msgid "Album %s deleted"
msgstr "アルバム %s を削除しました"
msgid "Album created"
msgstr "アルバムが作成されました"
#: messages.go:157
msgid "Album saved"
msgstr "アルバムが保存されました"
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "アルバム %s が削除されました"
#: messages.go:159
msgid "Album contents cloned"
msgstr "アルバムの内容が複製されました"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "スタックからファイルが削除されました"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "ファイルが削除されました"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "選択した項目が %s に追加されました"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "1 件の項目が %s に追加されました"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d 件の項目が %s に追加されました"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "1 件の項目が %s から削除されました"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d 件の項目が %s から削除されました"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "アカウントが作成されました"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "アカウントが保存されました"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "アカウントが削除されました"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "設定が保存されました"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "パスワードが変更されました"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "インポートが %d 秒で完了しました"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "インポートが取り消されました"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "インデックスが %d 秒で完了しました"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "オリジナルの項目をインデックスしています..."
msgstr "originals をインデックスしています..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "%s 内のファイルをインデックスしています"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "インデックスが取り消されました"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d 件のファイルと %d 件の写真が削除されました"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "%s からファイルを移動しています"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "%s からファイルをコピーしています"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "ラベルが削除されました"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "ラベルが保存されました"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "保存対象"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "件名 削除"
msgstr "件名削除しました"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "保存された人"
#: messages.go:184
msgid "Person deleted"
msgstr "削除された人"
#: messages.go:185
msgid "File uploaded"
msgstr "アップロードされたファイル"
#: messages.go:186
msgid "Person deleted"
msgstr "人を削除しました"
#: messages.go:187
msgid "File uploaded"
msgstr "ファイルがアップロードされました"
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d 件のファイルを %d 秒でアップロードしました"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "アップロードの処理..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "アップロードが処理されました"
msgstr "アップロードが完了しました"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "選択した項目が承認されました"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "選択した項目がアーカイブされました"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "選択した項目が復元されました"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "選択した項目プライベートにました"
msgstr "選択した項目プライベートに設定されました"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "アルバムが削除されました"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "%d 秒で zip ファイルを作成しました"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "永久に削除"
msgstr "完全に削除されました"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s が復元されました"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "検証に成功しました"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "正常に有効化されました"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Korean <https://translate.photoprism.app/projects/photoprism/"
"backend/ko/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "문제가 발생했습니다. 다시 시도하세요."
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "그렇게 할 수 없습니다."
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "변경 사항을 저장할 수 없음"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "삭제할 수 없음"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s가 이미 존재함"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "찾을 수 없음"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "파일을 찾을 수 없음"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "파일이 너무 큽니다"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "지원되지 않음"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "지원되지 않는 유형"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "지원되지 않는 형식"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "원본 폴더가 비어 있습니다"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "선택 항목을 찾을 수 없음"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "항목을 찾을 수 없음"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "계정을 찾을 수 없음"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "사용자를 찾을 수 없음"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "라벨을 찾을 수 없음"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "앨범을 찾을 수 없음"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "제목을 찾을 수 없음"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "사람을 찾을 수 없음"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "얼굴을 찾을 수 없음"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "공개 모드에서는 사용할 수 없음"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "읽기 전용 모드에서는 사용할 수 없음"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "귀하의 계정에 로그인하십시오"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "권한이 없음"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "결제 필요"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "업로드가 불쾌할 수 있습니다"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "업로드 실패"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "선택된 항목이 없습니다"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "파일 생성에 실패했습니다. 권한을 확인하세요"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "폴더를 만들지 못했습니다. 권한을 확인하세요"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "연결할 수 없습니다. 다시 시도해 주세요"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "인증코드를 입력하세요"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "잘못된 인증 코드입니다. 다시 시도해 주세요."
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "비밀번호가 잘못되었습니다. 다시 시도해 주세요"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "기능 비활성화됨"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "선택한 라벨이 없습니다"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "앨범이 선택되지 않았습니다"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "다운로드할 수 있는 파일이 없습니다"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "zip 파일 생성 실패"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "잘못된 자격 증명"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "유효하지 않은 링크입니다"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "잘못된 이름"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "바쁘니 나중에 다시 시도해 주세요"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "깨우기 간격은 %s이지만 1시간 이하여야 합니다"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "계정을 연결할 수 없습니다"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "너무 많은 요청"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "저장 공간 부족"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "할당량 초과"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "변경사항이 성공적으로 저장되었습니다"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "앨범 생성됨"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "앨범 저장됨"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "앨범 %s이(가) 삭제됨"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "복제된 앨범 콘텐츠"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "스택에서 제거된 파일"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "파일이 삭제됨"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "선택 항목이 %s에 추가됨"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "%s에 항목 1개 추가됨"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d 항목이 %s에 추가됨"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "%s에서 항목 1개 삭제됨"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d 항목이 %s에서 제거됨"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "계정 생성됨"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "계정이 저장됨"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "계정 삭제됨"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "설정 저장됨"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "비밀번호 변경됨"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "%d초 후에 가져오기 완료"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "가져오기 취소됨"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "%d초 후에 인덱싱 완료"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "원본 색인 생성 중..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "%s에서 파일 색인 생성"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "인덱싱 취소됨"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "파일 %d개와 사진 %d개를 삭제했습니다"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "%s에서 파일 이동"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "%s에서 파일 복사"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "라벨 삭제됨"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "라벨이 저장되었습니다"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "주제가 저장됨"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "제목 삭제됨"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "사람이 저장됨"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "삭제된 사람"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "업로드된 파일 1개"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d개의 파일이 %d초에 업로드됨"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "업로드 처리 중..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "업로드가 처리되었습니다"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "선택 항목 승인됨"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "선택 항목 보관됨"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "선택 항목 복원됨"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "비공개로 표시된 선택"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "앨범 삭제됨"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "%d초에 생성된 우편번호"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "영구 삭제됨"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s이(가) 복원되었습니다"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "성공적으로 확인되었습니다"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "성공적으로 활성화되었습니다"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: Kurdish <https://translate.photoprism.app/projects/photoprism/"
@@ -13,398 +13,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Tiştek xelet derket, dîsa biceribîne"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Nikarin vê yekê bikin"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "گۆڕانکاریەکان پاشەکەوت نەکراوە"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "نەتوانرا بسڕێتەوە"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s پێشتر هەیە"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "نەدۆزرایەوە"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "دۆسیەکە نەدۆزرایەوە"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Pelê pir mezin e"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Piştgirî nekirin"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Cureyê ne piştgirî"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Format nayê destek kirin"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Peldanka orjînal vala ye"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "هەڵبژاردەکان نەدۆزرایەوە"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "هیچ ئەلبومێکی نەدۆزیوەتەوە"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "هەژمارەکە نەدۆزرایەوە"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "بەکارهێنەرەکە نەدۆزرایەوە"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "پێناسەکە نەدۆزرایەوە"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "ئەلبومەکە نەدۆزرایەوە"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "ناونیشان"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "هیچ ئەلبومێکی نەدۆزیوەتەوە"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "نەدۆزرایەوە"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "بەردەست نیە بۆ دۆخی گشتی"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "بەردەست نییە لە دۆخی تەنها-خوێندنەوە"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "تکایە تێپەڕبە پاشان هەوڵبدەرەوە"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "ئەلبومەکان سڕانەوە"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Pêdivî bi dravdanê heye"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "بارکردن لەوانەیە سووکایەتی بێت"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "بارکردنەکە سەرکەوتوو نەبوو"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "هیچ ئایتمێک دەستنیشان نەکراوە"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "شکست لە دروستکردنی پەڕگە، تکایە مۆڵەتەکان بپشکنە"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "شکست لە دروستکردنی بوخچە، تکایە مۆڵەتەکان بپشکنە"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "نەیتوانی پەیوەندی بگرێت، تکایە دووبارە هەوڵ بدەوە"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Koda verastkirinê binivîse"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Koda verastkirinê nederbasdar e, ji kerema xwe dîsa biceribîne"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "تێپەرەوشە هەڵەیە، تکایە جارێکی تر هەوڵبدەوە"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "تایبەتمەندی ناچالاک کراوە"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "هیج لە پێناسەکان هەڵنەبژێردراوە"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "هیج لە ئەلبومەکان هەڵنەبژێردراوە"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "هیچ پەڕگەیەک ئامادە نیە بۆ داگرتن"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "دروستکردنی فایلی زیپ سەرکەوتوو نەبوو"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "زانیارییەکان نادروستە"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "بەستەرەکە نادروستە"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "بەروارێکی نادروست"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "تێپەرەوشە هەڵەیە، تکایە جارێکی تر هەوڵبدەوە"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Navbera hişyarbûnê %s ye, lê divê 1h an kêmtir be"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Hesabê te nehat girêdan"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Pir daxwazî"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Depo ne bes e"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kota derbas kir"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "گۆڕانکاریەکان سەرکەوتوانە پاشەکەوتکرا"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "ئەلبومەکە دروستکرا"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "ئەلبومەکە پاشەکەوتکرا"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "ئەلبومی %s سڕایەوە"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "ناوەڕۆکەکانی ئەلبومەکە هاووێنە کرا"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "دۆسیەکە کۆژاوەتەوە لە کەڵەکەکە"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "پەڕگە سڕایەوە"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "دەستنیشان کراو زیادکرایە %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "یەک تێکراو زیاد کرایە %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d تێکراو زیاد کرایە %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "یەک تێکراو لابرا لە %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d تێکراو لابرا لە %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "هەژمارەکە دروستکرا"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "هەژمارەکە پاشەکەوتکرا"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "هەژمارەکە سڕایەوە"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "ڕێکخستنەکان پاشەکەوتکرا"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "تێپەڕەوشە گۆڕدرا"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "هاوردن تەواو بوو بە %d چرکە"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "هاوردن هەڵوەشێنرایەوە"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "نیشانە کردن تەواو بوو بە %d چرکە"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "نیشانەکردنی ڕەسەنەکان..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "نیشانەکردنی پەڕگەکان لە %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "نیشانەکردن هەڵوەشێنرایەوە"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "لابردنی %d پەڕگە و %d وێنە"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "گواستنەوەی پەڕگە لە %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "کۆپی کردنی پەڕگە لە%s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "پێناسەکان سڕانەوە"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "پێناسەکە پاشەکەوتکرا"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "ناونیشان"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "ناونیشان"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "ڕێکخستنەکان پاشەکەوتکراو"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "ئەلبومەکان سڕانەوە"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "پەڕگە سڕایەوە"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d پەڕگە بارکرە بە %d چرکە"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Pêvajoya barkirinê..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "بارکردن لەوانەیە سووکایەتی بێت"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "دەستنیشان کراو پەسەند کرا"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "هەڵبژاردەکە ئەرشیفکرا"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "هەڵبژاردەکە دووبارەکۆگاکرایەوە"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "دەستنیشانکراوەکان کران بە تایبەتی"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "ئەلبومەکان سڕایەوە"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "زیپ بە %d چرکە دروستکرا"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "بە هەمیشەیی سڕاوەتەوە"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "هەڵبژاردەکە دووبارەکۆگاکرایەوە"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Bi serketî verast kirin"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Bi serketî hate aktîfkirin"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: none\n"
"Language: lt\n"
@@ -13,398 +13,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Kažkas nepavyko, bandykite dar kartą"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Nepavyksta to padaryti"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Pakeitimų nepavyko išsaugoti"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Negalima ištrinti"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s jau egzistuoja"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Nerasta"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Failo rasti nepavyko"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Per didelis failas"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Nepalaikoma"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Nepalaikomas tipas"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Nepalaikomas formatas"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Originalų aplankas tuščias"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Pasirinkimas nerastas"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Subjektas nerastas"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Paskyra nerasta"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Vartotojas nerastas"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Etiketė nerasta"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Albumas nerastas"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Tema nerasta"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Asmuo nerastas"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Veidas nerastas"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Negalima naudoti viešuoju režimu"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Negalima naudoti tik skaitymo režimu"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Prisijunkite prie savo paskyros"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Priėjimas neimanomas"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Reikalingas mokėjimas"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Įkėlimas gali būti įžeidžiantis"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Įkelti nepavyko"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Nėra pasirinktų elementų"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Nepavyko sukurti failo, patikrinkite leidimus"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Nepavyko sukurti aplanko, patikrinkite leidimus"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Nepavyko prisijungti, bandykite dar kartą"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Įveskite patvirtinimo kodą"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Neteisingas patvirtinimo kodas, bandykite dar kartą"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Netinkamas slaptažodis, bandykite dar kartą"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funkcija išjungta"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Nėra pasirinktų etikečių"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Nėra pasirinktų albumų"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Nėra parsisiunčiamų failų"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Nepavyko sukurti zip failo"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Neteisingi įgaliojimai"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Netinkama nuoroda"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Netinkamas pavadinimas"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Užimta, bandykite vėliau"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Nepavyko prisijungti prie jūsų paskyros"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Per daug prašymų"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Nepakankama saugykla"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Viršyta kvota"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Pakeitimai sėkmingai išsaugoti"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Sukurtas albumas"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Išsaugotas albumas"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Albumas %s pašalintas"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Klonuotas albumo turinys"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Failas pašalintas iš kamino"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Ištrintas failas"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Pasirinkimas pridėtas prie %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Vienas įrašas pridėtas prie %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d įrašai, įtraukti į %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Vienas įrašas pašalintas iš %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d įrašai pašalinti iš %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Sukurta paskyra"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Išsaugota paskyra"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Ištrinta paskyra"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Nustatymai išsaugoti"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Slaptažodis pakeistas"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Importas baigtas per %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importas atšauktas"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksavimas baigtas per %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Originalų indeksavimas..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Failų indeksavimas %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indeksavimas atšauktas"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Pašalinti %d failai ir %d nuotraukos"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Failų perkėlimas iš %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Failų kopijavimas iš %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Ištrintos etiketės"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Išsaugota etiketė"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Tema - išsaugotas"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Išbrauktas objektas"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Išsaugotas asmuo"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Išbrauktas asmuo"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Įkeltas failas"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d failai įkelti per %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Įkėlimo apdorojimas..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Įkėlimas apdorotas"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Patvirtinta atranka"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Atranka archyvuota"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Atkurta atranka"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Atranka pažymėta kaip privati"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Ištrinti albumai"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip sukurta %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Visam laikui ištrintas"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s buvo atkurta"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Sėkmingai patvirtinta"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Sėkmingai suaktyvinta"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-15 12:54+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,395 +17,399 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr ""
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr ""
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr ""
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr ""
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr ""
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr ""
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr ""
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr ""
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr ""
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr ""
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr ""
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr ""
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr ""
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr ""
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr ""
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr ""
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr ""
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr ""
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr ""
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr ""
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr ""
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr ""
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr ""
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr ""
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr ""
#: messages.go:128
msgid "Upload might be offensive"
msgstr ""
#: messages.go:129
msgid "Upload failed"
msgid "Payment required"
msgstr ""
#: messages.go:130
msgid "No items selected"
msgid "Upload might be offensive"
msgstr ""
#: messages.go:131
msgid "Failed creating file, please check permissions"
msgid "Upload failed"
msgstr ""
#: messages.go:132
msgid "Failed creating folder, please check permissions"
msgid "No items selected"
msgstr ""
#: messages.go:133
msgid "Could not connect, please try again"
msgid "Failed creating file, please check permissions"
msgstr ""
#: messages.go:134
msgid "Enter verification code"
msgid "Failed creating folder, please check permissions"
msgstr ""
#: messages.go:135
msgid "Invalid verification code, please try again"
msgid "Could not connect, please try again"
msgstr ""
#: messages.go:136
msgid "Invalid password, please try again"
msgid "Enter verification code"
msgstr ""
#: messages.go:137
msgid "Feature disabled"
msgid "Invalid verification code, please try again"
msgstr ""
#: messages.go:138
msgid "No labels selected"
msgid "Invalid password, please try again"
msgstr ""
#: messages.go:139
msgid "No albums selected"
msgid "Feature disabled"
msgstr ""
#: messages.go:140
msgid "No files available for download"
msgid "No labels selected"
msgstr ""
#: messages.go:141
msgid "Failed to create zip file"
msgid "No albums selected"
msgstr ""
#: messages.go:142
msgid "Invalid credentials"
msgid "No files available for download"
msgstr ""
#: messages.go:143
msgid "Invalid link"
msgid "Failed to create zip file"
msgstr ""
#: messages.go:144
msgid "Invalid name"
msgid "Invalid credentials"
msgstr ""
#: messages.go:145
msgid "Busy, please try again later"
msgid "Invalid link"
msgstr ""
#: messages.go:146
msgid "Invalid name"
msgstr ""
#: messages.go:147
msgid "Busy, please try again later"
msgstr ""
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr ""
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr ""
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr ""
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr ""
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr ""
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr ""
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr ""
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr ""
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr ""
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr ""
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr ""
#: messages.go:159
msgid "File deleted"
msgstr ""
#: messages.go:160
#, c-format
msgid "Selection added to %s"
msgstr ""
#: messages.go:161
#, c-format
msgid "One entry added to %s"
msgid "File deleted"
msgstr ""
#: messages.go:162
#, c-format
msgid "%d entries added to %s"
msgid "Selection added to %s"
msgstr ""
#: messages.go:163
#, c-format
msgid "One entry removed from %s"
msgid "One entry added to %s"
msgstr ""
#: messages.go:164
#, c-format
msgid "%d entries removed from %s"
msgid "%d entries added to %s"
msgstr ""
#: messages.go:165
msgid "Account created"
#, c-format
msgid "One entry removed from %s"
msgstr ""
#: messages.go:166
msgid "Account saved"
#, c-format
msgid "%d entries removed from %s"
msgstr ""
#: messages.go:167
msgid "Account deleted"
msgid "Account created"
msgstr ""
#: messages.go:168
msgid "Settings saved"
msgid "Account saved"
msgstr ""
#: messages.go:169
msgid "Password changed"
msgid "Account deleted"
msgstr ""
#: messages.go:170
#, c-format
msgid "Import completed in %d s"
msgid "Settings saved"
msgstr ""
#: messages.go:171
msgid "Import canceled"
msgid "Password changed"
msgstr ""
#: messages.go:172
#, c-format
msgid "Indexing completed in %d s"
msgid "Import completed in %d s"
msgstr ""
#: messages.go:173
msgid "Indexing originals..."
msgid "Import canceled"
msgstr ""
#: messages.go:174
#, c-format
msgid "Indexing files in %s"
msgid "Indexing completed in %d s"
msgstr ""
#: messages.go:175
msgid "Indexing canceled"
msgid "Indexing originals..."
msgstr ""
#: messages.go:176
#, c-format
msgid "Removed %d files and %d photos"
msgid "Indexing files in %s"
msgstr ""
#: messages.go:177
#, c-format
msgid "Moving files from %s"
msgid "Indexing canceled"
msgstr ""
#: messages.go:178
#, c-format
msgid "Copying files from %s"
msgid "Removed %d files and %d photos"
msgstr ""
#: messages.go:179
msgid "Labels deleted"
#, c-format
msgid "Moving files from %s"
msgstr ""
#: messages.go:180
msgid "Label saved"
#, c-format
msgid "Copying files from %s"
msgstr ""
#: messages.go:181
msgid "Subject saved"
msgid "Labels deleted"
msgstr ""
#: messages.go:182
msgid "Subject deleted"
msgid "Label saved"
msgstr ""
#: messages.go:183
msgid "Person saved"
msgid "Subject saved"
msgstr ""
#: messages.go:184
msgid "Person deleted"
msgid "Subject deleted"
msgstr ""
#: messages.go:185
msgid "File uploaded"
msgid "Person saved"
msgstr ""
#: messages.go:186
msgid "Person deleted"
msgstr ""
#: messages.go:187
msgid "File uploaded"
msgstr ""
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr ""
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr ""
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr ""
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr ""
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr ""
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr ""
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr ""
#: messages.go:193
msgid "Albums deleted"
msgstr ""
#: messages.go:194
#, c-format
msgid "Zip created in %d s"
msgstr ""
#: messages.go:195
msgid "Permanently deleted"
msgid "Albums deleted"
msgstr ""
#: messages.go:196
#, c-format
msgid "%s has been restored"
msgid "Zip created in %d s"
msgstr ""
#: messages.go:197
msgid "Successfully verified"
msgid "Permanently deleted"
msgstr ""
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr ""
#: messages.go:199
msgid "Successfully verified"
msgstr ""
#: messages.go:200
msgid "Successfully activated"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: none\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Kesilapan telah berlaku, cuba lagi"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Tidak mampu berbuat demikian"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Perubahan tidak dapat disimpan"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Tidak dapat dipadamkan"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s sudah wujud"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Tidak ditemui"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Fail tidak dijumpai"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Fail terlalu besar"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Tidak disokong"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Jenis tidak disokong"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Format yang tidak disokong"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Folder asal kosong"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Pilihan tidak ditemui"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entiti tidak ditemui"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "akaun tidak dijumpai"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Pengguna tidak dijumpai"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Label tidak ditemui"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album tidak ditemui"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Subjek tidak ditemui"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Orang tidak ditemui"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Wajah tidak ditemui"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Tidak tersedia dalam mod awam"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Tidak tersedia dalam mod baca sahaja"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Sila log masuk ke akaun anda"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Kebenaran ditolak"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Bayaran diperlukan"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Muat naik mungkin menyinggung perasaan"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Muat naik gagal"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Tiada item dipilih"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Gagal membuat fail, sila semak kebenaran"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Gagal membuat folder, sila semak kebenaran"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Tidak dapat menyambung, sila cuba lagi"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Masukkan kod pengesahan"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Kod pengesahan tidak sah, sila cuba lagi"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Kata laluan tidak sah, sila cuba lagi"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Ciri dilumpuhkan"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Tiada label dipilih"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Tiada album dipilih"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Tiada fail tersedia untuk dimuat turun"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Gagal membuat fail zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Bukti kelayakan tidak sah"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Pautan tidak sah"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nama tidak sah"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Sibuk, sila cuba lagi nanti"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Akaun anda tidak dapat disambungkan"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Terlalu banyak permintaan"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Storan tidak mencukupi"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kuota melebihi"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Perubahan berjaya disimpan"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album dibuat"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album disimpan"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s dipadamkan"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Kandungan album diklon"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Fail dialih keluar daripada timbunan"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Fail dipadamkan"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Pilihan ditambahkan pada %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Satu entri ditambahkan pada %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "Entri %d ditambahkan pada %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Satu entri dialih keluar daripada %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entri dialih keluar daripada %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Akaun dibuat"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Akaun disimpan"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Akaun dipadamkan"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Tetapan Disimpan"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Kata laluan ditukar"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Import selesai dalam %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Import dibatalkan"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Pengindeksan selesai dalam %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Mengindeks asal..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Mengindeks fail dalam %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Pengindeksan dibatalkan"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Mengalih keluar fail %d dan foto %d."
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Memindahkan fail dari %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Menyalin fail daripada %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Label dipadamkan"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Label disimpan"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Subjek disimpan"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Subjek dipadamkan"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Orang yang diselamatkan"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Orang dipadamkan"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Fail dimuat naik"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "Fail %d dimuat naik dalam %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Memproses muat naik..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Muat naik telah diproses"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Pemilihan diluluskan"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Pemilihan diarkibkan"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Pemilihan dipulihkan"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Pilihan ditandakan sebagai peribadi"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Album dipadamkan"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip dibuat dalam %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Dipadamkan secara kekal"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s telah dipulihkan"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Berjaya disahkan"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Berjaya diaktifkan"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Norwegian Bokmål <https://translate.photoprism.app/projects/"
"photoprism/backend/nb_NO/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Noe gikk galt, prøv igjen"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Ikke i stand til å gjøre det"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Kan ikke lagre endringer"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Kan ikke slettes"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s eksisterer allerede"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Ikke funnet"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Fil ikke funnet"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Filen er for stor"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Ustøttet"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Ikke støttet type"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Ikke støttet format"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Originaler-mappen er tom"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Finner ikke utvalg"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Enheten ble ikke funnet"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Konto ikke funnet"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Bruker ikke funnet"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Merkelapp ikke funnet"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album ikke funnet"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Emnet ble ikke funnet"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Person ikke funnet"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Ansikt ikke funnet"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Ikke tilgjengelig i offentlig modus"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "ikke tilgjengelig i skrivebeskyttet modus"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Logg inn på kontoen din"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Ingen tilgang"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Betaling kreves"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Opplastingen kan være støtende"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Opplasting mislyktes"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Ingen elementer valgt"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Kunne ikke opprette fil, vennligst sjekk tillatelser"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Kunne ikke opprette mappe, vennligst sjekk tillatelser"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Kunne ikke koble til, vennligst prøv igjen"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Angi verifikasjonskode"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Ugyldig bekreftelseskode. Prøv igjen"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Ugyldig passord, vennligst prøv igjen"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Tjeneste deaktivert"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Ingen merkelapper valgt"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Ingen albumer valgt"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Ingen filer tilgjengelig for nedlasting"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Kunne ikke opprette zip-arkiv"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Ugyldige innloggingsdetaljer"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Ugyldig lenke"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Ugyldig navn"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Opptatt. Prøv igjen senere"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Kontoen din kunne ikke kobles til"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "For mange forespørsler"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Utilstrekkelig lagringsplass"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kvote overskredet"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Endringene ble lagret"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album opprettet"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album lagret"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s slettet"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Albuminnhold duplisert"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Fil fjernet fra samling"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Fil slettet"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Utvalg lagt til %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "En oppføring lagt til %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d oppføringer lagt til %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "En oppføring fjernet fra %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d oppføringer fjernet fra %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Konto opprettet"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Konto lagret"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Konto slettet"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Innstillinger lagret"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Passord endret"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Import fullført på %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Import avbrutt"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksering fullført på %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indekserer originaler…"
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indekserer filer i %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indeksering avbrutt"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Fjernet %d filer og %d foto"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Flytter filer fra %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Kopierer filer fra %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Merkelapper slettet"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Merkelapper lagret"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Emnet er lagret"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Emnet er slettet"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Person reddet"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Person slettet"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Fil lastet opp"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d filer lastet opp på %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Behandler opplasting..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Opplastingen er behandlet"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Utvalg godkjent"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Utvalg arkivert"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Utvalg gjenopprettet"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Utvalg markert som privat"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Album slettet"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip opprettet på %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Permanent slettet"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s har blitt gjenopprettet"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Vellykket verifisert"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Vellykket aktivert"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Dutch <https://translate.photoprism.app/projects/photoprism/"
"backend/nl/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Er ging iets mis, probeer het opnieuw"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Dat kan niet"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Wijzigingen kunnen niet worden opgeslagen"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Kan niet verwijderd worden"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s bestaat al"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Niet gevonden"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Bestand niet gevonden"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Bestand te groot"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Niet ondersteund"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Niet-ondersteund type"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Niet ondersteund formaat"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "De map Originelen is leeg"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Selectie niet gevonden"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entiteit niet gevonden"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Account niet gevonden"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Gebruiker niet gevonden"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Label niet gevonden"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album niet gevonden"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Onderwerp niet gevonden"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Persoon niet gevonden"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Gezicht niet gevonden"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Niet beschikbaar in publieke modus"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Niet beschikbaar in alleen-lezen modus"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Log in op je account"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Toegang geweigerd"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Betaling vereist"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Upload kan aanstootgevend zijn"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Uploaden mislukt"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Geen items geselecteerd"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Bestand aanmaken mislukt, controleer alstublieft de rechten"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Folder aanmaken mislukt, controleer alstublieft de rechten"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Kan niet verbinden, probeer alstublieft opnieuw"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Verificatiecode invoeren"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Ongeldige verificatiecode. Probeer het opnieuw"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Fout wachtwoord, probeer alstublieft opnieuw"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Functie uitgeschakeld"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Geen labels geselecteerd"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Geen albums geselecteerd"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Geen bestanden beschikbaar om te downloaden"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Maken van zip-bestand is mislukt"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Ongeldige inloggegevens"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Ongeldige link"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Ongeldige mapnaam"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Bezet, probeer het later nog eens"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Uw account kon niet worden aangesloten"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Te veel verzoeken"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Onvoldoende opslag"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Quota overschreden"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Wijzigingen succesvol opgeslagen"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album aangemaakt"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album opgeslagen"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s verwijderd"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Albuminhoud gekopieerd"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Bestand uit stapel verwijderd"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Bestand verwijderd"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Selectie toegevoegd aan %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Eén item toegevoegd aan %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d items toegevoegd aan %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Eén item verwijderd uit %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d items verwijderd uit %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Account aangemaakt"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Account opgeslagen"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Account verwijderd"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Instellingen opgeslagen"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Wachtwoord gewijzigd"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Importeren voltooid in %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importeren geannuleerd"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexeren voltooid in %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Originelen indexeren…"
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Bestanden indexeren in %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexeren geannuleerd"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d bestanden en %d fotos verwijderd"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Bestanden verplaatsen uit %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Bestanden kopiëren uit %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Labels verwijderd"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Labels opgeslagen"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Onderwerp opgeslagen"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Onderwerp verwijderd"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Persoon gered"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Persoon verwijderd"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Bestand geüpload"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d bestanden geüpload in %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Verwerking upload..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Upload is verwerkt"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Selectie goedgekeurd"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Selectie gearchiveerd"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Selectie hersteld"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Selectie gemarkeerd als privé"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albums verwijderd"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip gemaakt in %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Permanent verwijderd"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s is hersteld"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Met succes geverifieerd"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Met succes geactiveerd"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Polish <https://translate.photoprism.app/projects/photoprism/"
"backend/pl/>\n"
@@ -13,400 +13,404 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Coś poszło nie tak, spróbuj jeszcze raz"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Nie da się tego zrobić"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Nie można zapisać zmian"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Nie można usunąć"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s już istnieje"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Nie znaleziono"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Plik nie został znaleziony"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Plik jest zbyt duży"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Nieobsługiwane"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Nieobsługiwany typ"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Nieobsługiwany format"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Folder oryginałów jest pusty"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Nie znaleziono wyboru"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Nie znaleziono podmiotu"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Konto nie znalezione"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Użytkownik nie znaleziony"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Etykieta nie została odnaleziona"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album nie został znaleziony"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Temat nie został znaleziony"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Osoba nie została znaleziona"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Twarz nie została znaleziona"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Niedostępne w trybie publicznym"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Niedostępne w trybie tylko do odczytu"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Proszę zalogować się na swoje konto"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Brak uprawnień"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Wymagana płatność"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Przesyłane dane mogą być obraźliwe"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Przesyłanie nie powiodło się"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Nie wybrano żadnych elementów"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Nie można utworzyć pliku, sprawdź uprawnienia"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Nie można utworzyć folderu, sprawdź uprawnienia"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Nie można się połączyć, spróbuj ponownie"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Wprowadź kod weryfikacyjny"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Nieprawidłowy kod weryfikacyjny. Spróbuj ponownie"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Nieprawidłowe hasło, spróbuj ponownie"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funkcja wyłączona"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Nie wybrano etykiet"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Nie wybrano albumów"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Brak plików do pobrania"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Nie udało się utworzyć pliku zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Nieprawidłowe dane logowania"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Nieprawidłowy link"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nieprawidłowa nazwa"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Zajęty, spróbuj ponownie później"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Twoje konto nie może być podłączone"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Zbyt wiele żądań"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Niewystarczająca pamięć"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Przekroczony limit"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Zmiany zostały pomyślnie zapisane"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album został utworzony"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album został zapisany"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s został usunięty"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Album został sklonowany"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Plik został rozgrupowany"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Plik został usunięty"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Wybór dodany do %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Dodano jeden wpis do %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d wpisy dodane do %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Usunięto jeden wpis z %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d wpisy usunięte z %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Konto utworzone"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Konto zapisane"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Konto usunięte"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Ustawienia zapisane"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Hasło zostało zmienione"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Import zakończony w %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Import został anulowany"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksowanie zakończone w %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indeksowanie oryginałów…"
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indeksowanie plików w %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indeksowanie anulowane"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Usunięto %d plików i %d zdjęć"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Przenoszenie plików z %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Kopiowanie plików z %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Usunięto etykiety"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Etykieta zapisana"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Przedmiot zapisany"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Przedmiot usunięty"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Osoba zapisana"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Osoba usunięta"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Przesłany plik"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d plików przesłano w %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Przetwarzanie uploadu..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Przesyłanie zostało przetworzone"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Wybór zatwierdzony"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Wybór zarchiwizowany"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Wybór został przywrócony"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Wybór oznaczony jako prywatny"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albumy zostały usunięte"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip utworzony w %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Trwale usunięty"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s zostało przywrócone"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Pomyślnie zweryfikowano"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Pomyślnie aktywowano"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Portuguese <https://translate.photoprism.app/projects/"
"photoprism/backend/pt/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Algo correu mal, tente novamente"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Incapaz de fazer isso"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "As mudanças não foram salvas"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Não foi possível excluir"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s já existe"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Não encontrado"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Arquivo não encontrado"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Arquivo muito grande"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Não compatível"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Tipo não suportado"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Formato sem suporte"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "A pasta dos originais está vazia"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Seleção não encontrada"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entidade não encontrada"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Conta não encontrada"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Usuário não encontrado"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Etiqueta não encontrada"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Álbum não encontrado"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Assunto não encontrado"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Pessoa não encontrada"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Rosto não encontrado"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Indisponível em modo público"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Não disponível no modo somente leitura"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Faça o login em sua conta"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Permissão negada"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Pagamento obrigatório"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Envio pode ser ofensivo"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Envio falhou"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Sem itens selecionados"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Falha ao criar arquivo, por favor cheque as permissões"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Falha ao criar pasta, por favor cheque as permissões"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Não foi possível conectar, por favor tente novamente"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Digite o código de verificação"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Código de verificação inválido, tente novamente"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Senha inválida, por favor tente novamente"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Recurso Desativado"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Sem etiquetas selecionadas"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Sem álbuns selecionados"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Sem arquivos disponíveis para baixar"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Falha ao criar arquivo zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Credenciais inválidas"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Link inválido"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nome inválido"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Em uso, por favor tente novamente mais tarde"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Sua conta não pôde ser conectada"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Demasiados pedidos"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Armazenamento insuficiente"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Quota excedida"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "As mudanças foram salvas com sucesso"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Álbum criado"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Álbum salvo"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Álbum %s excluído"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Conteúdo do álbum copiado"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Arquivo removido da pilha"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Arquivo excluído"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Seleção adicionada a %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Uma entrada adicionada a %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d entradas adicionadas a %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Uma entrada removida de %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entradas removidas de %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Conta criada"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Conta salva"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Conta excluída"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Configurações salvas"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Senha alterada"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Importação completa em %d"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importação cancelada"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexação completa em %d"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indexando originais..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indexando arquivos em %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexação cancelada"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Removidos %d arquivos e %d fotos"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Movendo arquivos de %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Copiando arquivos de %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Etiquetas excluídas"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Etiqueta salva"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Assunto salvo"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Assunto eliminado"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Pessoa salva"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Pessoa apagada"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Arquivo carregado"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d arquivos enviados em %d"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "A processar carregamento..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "O Upload foi processado"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Seleção aprovada"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Seleção arquivada"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Seleção restaurada"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Seleção marcada como privada"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Álbuns excluídos"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip criado em %d"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Permanentemente excluídas"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s foi restaurado"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Verificado com sucesso"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Ativado com sucesso"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Portuguese (Brazil) <https://translate.photoprism.app/"
"projects/photoprism/backend/pt_BR/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Algo deu errado, tente novamente"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Incapaz de fazer isso"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "As mudanças não foram salvas"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Não foi possível excluir"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s já existe"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Não encontrado"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Arquivo não encontrado"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Arquivo muito grande"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Não compatível"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Tipo não suportado"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Formato sem suporte"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "A pasta dos originais está vazia"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Seleção não encontrada"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entidade não encontrada"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Conta não encontrada"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Usuário não encontrado"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Etiqueta não encontrada"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Álbum não encontrado"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Assunto não encontrado"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Pessoa não encontrada"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Rosto não encontrado"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Indisponível em modo público"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Não disponível no modo somente leitura"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Faça o login em sua conta"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Permissão negada"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Pagamento obrigatório"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Envio pode ser ofensivo"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Envio falhou"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Sem itens selecionados"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Falha ao criar arquivo, por favor cheque as permissões"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Falha ao criar pasta, por favor cheque as permissões"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Não foi possível conectar, por favor tente novamente"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Digite o código de verificação"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Código de verificação inválido, tente novamente"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Senha inválida, por favor tente novamente"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Recurso Desativado"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Sem etiquetas selecionadas"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Sem álbuns selecionados"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Sem arquivos disponíveis para baixar"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Falha ao criar arquivo zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Credenciais inválidas"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Link inválido"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nome inválido"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Ocupado, por favor tente mais tarde"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Sua conta não pôde ser conectada"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Muitas solicitações"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Armazenamento insuficiente"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Cota excedida"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "As mudanças foram salvas com sucesso"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Álbum criado"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Álbum salvo"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Álbum %s excluído"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Conteúdo do álbum copiado"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Arquivo removido da pilha"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Arquivo excluído"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Seleção adicionada a %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Uma entrada adicionada a %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d entradas adicionadas a %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Uma entrada removida de %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entradas removidas de %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Conta criada"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Conta salva"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Conta excluída"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Configurações salvas"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Senha alterada"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Importação completa em %d"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importação cancelada"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexação completa em %d"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indexando originais..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indexando arquivos em %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexação cancelada"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Removidos %d arquivos e %d fotos"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Movendo arquivos de %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Copiando arquivos de %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Etiquetas excluídas"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Etiqueta salva"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Assunto salvo"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Assunto eliminado"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Pessoa salva"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Pessoa apagada"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Arquivo carregado"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d arquivos enviados em %d"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Processamento de upload..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "O Upload foi processado"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Seleção aprovada"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Seleção arquivada"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Seleção restaurada"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Seleção marcada como privada"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Álbuns excluídos"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip criado em %d"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Permanentemente excluídas"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s foi restaurado"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Verificado com sucesso"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Ativado com sucesso"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Romanian <https://translate.photoprism.app/projects/"
"photoprism/backend/ro/>\n"
@@ -13,398 +13,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Ceva nu a mers bine, încercați din nou"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Nu se poate face asta"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Modificările nu au putut fi salvate"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Nu a putut fi șters"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s deja există"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Nu a fost găsit"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Fișier nedescoperit"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Fișier prea mare"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Neacceptat"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Tip neacceptat"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Format neacceptat"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Dosarul Originals este gol"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Selecția nu a fost găsită"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entitatea nu a fost găsită"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Contul nu a fost găsit"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Utilizatorul nu a fost găsit"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Eticheta nu a fost găsită"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album nedescoperit"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Subiectul nu a fost găsit"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Persoana nu a fost găsită"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Fața nu a fost găsită"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Nu este disponibil în modul public"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Nu este disponibil în modul doar pentru citire"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Vă rugăm să vă conectați la contul dvs"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Permisiune refuzată"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Plata necesară"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Încărcarea poate fi ofensatoare"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Încărcarea a eșuat"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Niciun element selectat"
#: messages.go:131
#: messages.go:133
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:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Nu s-a reușit crearea dosarului, vă rugăm să verificați permisiunile"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Nu s-a putut conecta, vă rugăm să încercați din nou"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Introduceți codul de verificare"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Cod de verificare nevalid, încercați din nou"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Parolă invalidă, vă rugăm să încercați din nou"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Caracteristică dezactivată"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Nu sunt selectate etichete"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Nu sunt selectate albume"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Nu există fișiere disponibile pentru descărcare"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Nu a reușit să creeze fișierul zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Acreditări nevalabile"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Legătură invalidă"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Nume invalid"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Ocupat, vă rugăm să încercați din nou mai târziu"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Contul dvs. nu a putut fi conectat"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Prea multe cereri"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Depozitare insuficientă"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Cota depășită"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Modificări salvate cu succes"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album creat"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album salvat"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s șters"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Conținutul albumului a fost clonat"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Fișier eliminat din stivă"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Fișier șters"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Selecție adăugată la %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "O intrare adăugată la %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d intrări adăugate la %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "O intrare eliminată din %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d intrări eliminate din %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Cont creat"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Cont salvat"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Cont șters"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Setări salvate"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Parola a fost schimbată"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Import finalizat în %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importul a fost anulat"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexare finalizată în %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indexarea originalelor..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indexarea fișierelor în %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexare anulată"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Sau eliminat %d fișiere și %d fotografii"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Mutarea fișierelor din %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Copierea fișierelor din %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Etichete șterse"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Etichetă salvată"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Subiect salvat"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Subiect eliminat"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Persoană salvată"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Persoană eliminată"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Fișier încărcat"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fișiere încărcate în %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Procesarea încărcării..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Încărcarea a fost procesată"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Selecție aprobată"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Selecție arhivată"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Selecție restabilită"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Selecție marcată ca fiind privată"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albume șterse"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Fișierul Zip creat în %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Șterse definitiv"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s a fost restaurat"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Verificat cu succes"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Activat cu succes"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Russian <https://translate.photoprism.app/projects/photoprism/"
"backend/ru/>\n"
@@ -13,398 +13,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Что-то пошло не так, попробуйте еще раз"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Невозможно сделать это"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Изменения не будут сохранены"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Не будет удалено"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s уже существует"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Не найдено"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Файл не найден"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Слишком большой файл"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Не поддерживается"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Неподдерживаемый тип"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Неподдерживаемый формат"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Папка оригиналов пуста"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Выделение не найдено"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Сущность не найдена"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Учетная запись не найдена"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Пользователь не найден"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Метка не найдена"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Альбом не найден"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Объект не найден"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Человек не найден"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Лицо не найдено"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Не доступно в публичном режиме"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Недоступно в режиме только для чтения"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Пожалуйста, войдите в свой аккаунт"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Доступ запрещен"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Требуется оплата"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Загрузка может быть оскорбительной"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Загрузка не удалась"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Нет выделенных элементов"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Не удалось создать файл, проверьте права доступа"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Не удалось создать папку, проверьте права доступа"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Нет соединения, попробуйте еще раз"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "введите код подтверждения"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Неверный код подтверждения. Повторите попытку."
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Неверный пароль, пожалуйста попробуйте еще раз"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Данная возможность отключена"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Нет выделенных меток"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Нет выделенных альбомов"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Нет файлов, доступных для скачивания"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Не удалось создать zip-файл"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Неверные учетные данные"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Неверная ссылка"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Неприемлемое имя"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Занят, повторите попытку позже"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Интервал пробуждения составляет %s, но должен быть 1 час или меньше"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Ваш аккаунт не удалось подключить"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Слишком много запросов"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Недостаточно места для хранения"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Квота превышена"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Изменения сохранены"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Альбом создан"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "\\альбом сохранен"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Альбом %s удален"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Содержимое альбома скоприровано"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Файл удален из очереди"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Файл удалён"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Выделение добавлено к %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Один элемент добавлен к %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d элементов добавлено к %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Один элемент удален из %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d элементов удалено из %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Учетная запись создана"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Учетная запись сохранена"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Учетная запись удалена"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Настройки сохранены"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Пароль изменен"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Импортирование завершено за %d c"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Импортирование отменено"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Индексирование завершено за %d с"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Индексирование Оригиналов..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Индексирование файлов в %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Индексирование отменено"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Удаление %d файлов и %d фотографий"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Перемещение файлов из %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Копирование файлов из %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Метки удалены"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Метки сохранены"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Тема сохранена"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Тема удалена"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Человек спасен"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Лицо удалено"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Файл загружен"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d файлов загружено за %d с"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Обработка загрузки..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Загрузка была обработана"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Утвержденный выбор"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Выбранное помещено в архив"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Выбранное восстановлено"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Выбранное помечено как приватное"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Альбом удален"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip архив создан за %d с"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Постоянно удаляется"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s был восстановлен"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Успешно проверено"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Успешно активировано"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Slovak <https://translate.photoprism.app/projects/photoprism/"
"backend/sk/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Niečo sa pokazilo, skúste to znova"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Nemožno to urobiť"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Zmeny sa neuložili"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Nepodarilo sa odstrániť"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s už existuje"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Nenájdené"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Súbor nenájdený"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Príliš veľký súbor"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Nepodporované"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Nepodporovaný typ"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Nepodporovaný formát"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Priečinok Originály je prázdny"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Výber nenájdený"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Subjekt nenájdený"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Účet nenájdený"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Užívateľ nenájdený"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Štítok nenájdený"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album nenájdený"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Predmet nenájdený"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Osoba nenájdená"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Tvár nenájdená"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Nedostupné vo verejnom móde"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "nedostupné v móde len pre čítanie"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Prosím prihláste sa a skúste znova"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Osoba odstránená"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Požadovaná platba"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Nahrané súbory môžu byť urážlivé"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Odovzdávanie zlyhalo"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Neboli vybraté žiadne položky"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Vytváranie súboru zlyhalo, prosím skontrolujte oprávnenia"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Vytváranie zložky zlyhalo, prosím skontrolujte oprávnenia"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Nebolo možné sa pripojiť, skúste to znova"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Zadajte overovací kód"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Neplatný overovací kód, skúste to znova"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Nesprávne heslo, skúste to znova"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funkcia vypnutá"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Neboli vybraté žiadne štítky"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Neboli vybraté žiadne albumy"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Žiadne súbory na stiahnutie k dispozícií"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Nebolo možné vytvoriť súbor ZIP"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Neplatné údaje"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Neplatný odkaz"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Neplatné meno"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Systém zaneprázdnený, prosím skúste znovu neskôr"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Vaše konto sa nepodarilo pripojiť"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Príliš veľa požiadaviek"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Nedostatočné skladovanie"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Prekročenie kvóty"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Zmeny úspešne uložené"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album vytvorený"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album uložený"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s vymazaný"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Obsah albumu prekopírovaný"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Súbor odstránený zo stohu"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Súbor odstránený"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Výber pridaný do %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Jeden záznam pridaný do %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d záznamov pridaných do %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Jeden záznam odstránený z %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d záznamov odstránených z %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Účet vytvorený"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Účet uložený"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Účet odstránený"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Nastavenia uložené"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Heslo zmenené"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Import hotový za %d sekúnd"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Import zrušený"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexovanie hotové za %d sekúnd"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indexovanie originálov..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indexovanie súborov v %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexovanie zrušené"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Bolo odstránených %d súborov a %d fotiek"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Presúvanie súborov z %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Kopírovanie súborov z %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Štítky odstránené"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Štítok uložený"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Predmet uložený"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Predmet odstránený"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Osoba uložená"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Osoba odstránená"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Súbor odstránený"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d súborov nahraných za %d sekúnd"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Spracovanie nahrávania..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Nahrané súbory môžu byť urážlivé"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Označenie schválené"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Označenie archivované"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Označenie obnovené"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Označenie označené ako súkromné"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albumy odstránené"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Súbor ZIP vytvorený za %d sekúnd"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Trvalo odstránené"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s bolo obnovené"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Úspešne overené"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Úspešne aktivované"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: none\n"
"Language: sl\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Nekaj je šlo narobe, poskusite znova"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Tega ni mogoče storiti"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Sprememb ni bilo mogoče shraniti"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Ni bilo mogoče izbrisati"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s že obstaja"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Ga ni mogoče najti"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Datoteka ni najdena"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Prevelika datoteka"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Nepodprto"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Nepodprta vrsta"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Nepodprt format"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Mapa Originali je prazna"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Izbor ni najden"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entiteta ni bila najdena"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Račun ni najden"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Uporabnik ne obstaja"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Oznaka ni bila najdena"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Album ni najden"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Zadeva ni bila najdena"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Oseba ni bila najdena"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Obraza ni mogoče najti"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Ni na voljo v javnem načinu"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Ni na voljo v načinu samo za branje"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Prijavite se v svoj račun"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Dovoljenje Zavrnjeno"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Zahtevano plačilo"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Nalaganje je lahko žaljivo"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Nalaganje neuspešno"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Ni izbranih elementov"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Neuspešno ustvarjanje datoteke, preverite dovoljenja"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Neuspešno ustvarjanje mape, preverite dovoljenja"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Ne morem vzpostaviti povezave, poskusite znova"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "vnesi potrditveno kodo"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Neveljavna koda za preverjanje, poskusite znova"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Nepravilno geslo, poskusite znova"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funkcija je onemogočena"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Ni izbranih nalepk"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Ni izbranih albumov"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Za prenos ni na voljo nobenih datotek"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Ni uspelo ustvariti datoteke zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Neveljavne poverilnice"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Neveljavna povezava"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Neveljavno ime"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Zaseden, poskusite znova pozneje"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Vašega računa ni bilo mogoče povezati"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Preveč zahtev"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Nezadostno skladiščenje"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kvota je presežena"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Spremembe so bile uspešno shranjene"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Ustvarjen album"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Shranjen album"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s izbrisano"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Vsebina albuma klonirana"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Datoteka odstranjena iz sklada"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Izbrisana datoteka"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Izbor dodan v %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "En vnos dodan v %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d vnosi dodani v %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "En vnos odstranjen iz %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d vnosi odstranjeni iz %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Ustvarjen račun"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Shranjen račun"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Račun je izbrisan"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Nastavitve shranjene"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Geslo spremenjeno"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Uvoz se zaključi v %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Uvoz preklican"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksiranje je končano v %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indeksiranje izvirnikov..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indeksiranje datotek v %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indeksiranje preklicano"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Odstranjene %d datoteke in %d fotografije"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Premikanje datotek iz %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Kopiranje datotek iz %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Etikete izbrisane"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Shranjena nalepka"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Zadeva je shranjena"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Predmet izbrisanih"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Rešena oseba"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Izbrisana oseba"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Prenesena datoteka"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d datoteke, naložene v %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Obdelava nalaganja..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Prenos je bil obdelan"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Odobren izbor"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Arhiviran izbor"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Obnovljen izbor"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Izbor označen kot zasebni"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Izbrisani albumi"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip, ustvarjen v %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Trajno izbrisano"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s je bil obnovljen"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Uspešno preverjeno"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Uspešno aktiviran"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Swedish <https://translate.photoprism.app/projects/photoprism/"
"backend/sv/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Något gick fel, försök igen"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Det går inte att göra"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Ändringarna kunde inte sparas"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Kunde inte raderas"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s finns redan"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Hittades inte"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Filen kunde inte hittas"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Filen är för stor"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Stöds ej"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Denna typ stöds ej"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Format som inte stöds"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Mappen med originalen är tom"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Urvalet kunde inte hittas"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Entitet kunde inte hittas"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Kontot kunde inte hittas"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Användaren kunde inte hittas"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Etikett saknas"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Albumet finns inte"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Ämnet finns inte"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Personen kunde inte hittas"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Ansiktet kunde inte hittas"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Inte tillgängligt i offentligt läge"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Inte tillgänglig i skrivskyddsläge"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Logga in på ditt konto"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "Åtkomst nekades"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Betalning krävs"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Uppladdning kan vara stötande"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Uppladdning misslyckades"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Inga objekt har valts"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Det gick inte att skapa en fil, kontrollera behörigheter"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Det gick inte att skapa en mapp, kontrollera behörigheter"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Kunde inte ansluta, försök igen"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Ange verifieringskod"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Ogiltig verifieringskod, försök igen"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Felaktigt lösenord, försök igen"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Funktionen är inaktiverad"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Inga etiketter har valts"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Inga album har valts"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Inga filer finns tillgängliga för nedladdning"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Misslyckades med att skapa en zip-fil"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Ogiltiga autentiseringsuppgifter"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Ogiltig länk"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Felaktigt namn"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Upptagen, försök igen senare"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Ditt konto kunde inte anslutas"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "För många förfrågningar"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Otillräcklig lagring"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kvoten överskriden"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Ändringarna har sparats"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Album skapat"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Album sparat"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s raderat"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Innehållet i albumet kopieras"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Filen tas bort från stapeln"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Fil raderad"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Urval tillagt i %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "En post tillagd i %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d poster tillagda till %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "En post borttagen från %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d poster raderade från %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Kontot har skapats"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Kontot sparat"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Kontot raderat"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Inställningarna har sparats"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Lösenordet har ändrats"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Importen slutfördes på %d s"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Importen avbruten"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexering slutförd på %d s"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Indexering av original..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Indexering av filer i %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Indexering avbruten"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Tog bort %d filer och %d bilder"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Flyttar filer från %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Kopierar filer från %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Etiketter raderade"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Etikett sparad"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Ämne sparat"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Ämne raderat"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Person sparad"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Person raderad"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Uppladdad fil"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d filer uppladdade på %d s"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Behandling av uppladdning..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Uppladdningen har behandlats"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Urvalet är godkänt"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Urval arkiverat"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Urvalet har återställts"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Urval markerat som privat"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Album raderade"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip skapad på %d s"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Permanent borttagen"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s har återställts"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Verifierad"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Lyckades aktiverad"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: none\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "เกิดข้อผิดพลาด โปรดลองอีกครั้ง"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "ไม่สามารถทำเช่นนั้นได้"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "ไม่สามารถบันทึกการเปลี่ยนแปลง"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "ไม่สามารถลบได้"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s มีอยู่แล้ว"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "ไม่พบ"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "ไม่พบไฟล์"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "ไฟล์ใหญ่เกินไป"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "ไม่รองรับ"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "ประเภทที่ไม่รองรับ"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "รูปแบบที่ไม่สนับสนุน"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "โฟลเดอร์ต้นฉบับว่างเปล่า"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "ไม่พบสิ่งที่เลือก"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "ไม่พบเอนทิตี"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "ไม่พบบัญชี"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "ไม่พบผู้ใช้"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "ไม่พบป้ายกำกับ"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "ไม่พบอัลบั้ม"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "ไม่พบหัวเรื่อง"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "ไม่พบบุคคล"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "ไม่พบใบหน้า"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "ไม่พร้อมใช้งานในโหมดสาธารณะ"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "ไม่พร้อมใช้งานในโหมดอ่านอย่างเดียว"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "กรุณาเข้าสู่ระบบบัญชีของคุณ"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "ปฏิเสธการอนุญาต"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "ต้องชำระเงิน"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "การอัปโหลดอาจไม่เหมาะสม"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "การอัพโหลดล้มเหลว"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "ไม่มีรายการที่เลือก"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "สร้างไฟล์ไม่สำเร็จ โปรดตรวจสอบสิทธิ์"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "สร้างโฟลเดอร์ไม่สำเร็จ โปรดตรวจสอบสิทธิ์"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "ไม่สามารถเชื่อมต่อได้ โปรดลองอีกครั้ง"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "ระบุรหัสยืนยืน"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "รหัสยืนยันไม่ถูกต้อง โปรดลองอีกครั้ง"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "คุณลักษณะถูกปิดใช้งาน"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "ไม่ได้เลือกป้ายกำกับ"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "ไม่ได้เลือกอัลบั้ม"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "ไม่มีไฟล์สำหรับดาวน์โหลด"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "สร้างไฟล์ zip ไม่สำเร็จ"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "ข้อมูลประจำตัวที่ไม่ถูกต้อง"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "ลิงก์ไม่ถูกต้อง"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "ชื่อไม่ถูกต้อง"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "ไม่ว่าง โปรดลองอีกครั้งในภายหลัง"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "ช่วงเวลาปลุกคือ %s แต่ต้องเป็น 1 ชั่วโมงหรือน้อยกว่า"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "ไม่สามารถเชื่อมต่อบัญชีของคุณได้"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "คำขอมากเกินไป"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "พื้นที่เก็บข้อมูลไม่เพียงพอ"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "เกินโควตา"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "บันทึกการเปลี่ยนแปลงเรียบร้อยแล้ว"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "สร้างอัลบั้มแล้ว"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "บันทึกอัลบั้มแล้ว"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "ลบอัลบั้ม %s แล้ว"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "โคลนเนื้อหาในอัลบั้ม"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "ไฟล์ถูกลบออกจากสแต็ค"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "ลบไฟล์แล้ว"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "เพิ่มการเลือกใน %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "เพิ่มหนึ่งรายการใน %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d รายการที่เพิ่มใน %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "ลบหนึ่งรายการจาก %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "รายการ %d ถูกลบออกจาก %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "สร้างบัญชีแล้ว"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "บันทึกบัญชีแล้ว"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "ลบบัญชีแล้ว"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "การตั้งค่าที่บันทึกไว้"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "เปลี่ยนรหัสผ่านแล้ว"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "การนำเข้าเสร็จสมบูรณ์ใน %d วินาที"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "ยกเลิกการนำเข้าแล้ว"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "การสร้างดัชนีเสร็จสิ้นใน %d วินาที"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "กำลังจัดทำดัชนีต้นฉบับ..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "การทำดัชนีไฟล์ใน %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "ยกเลิกการทำดัชนีแล้ว"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "ลบไฟล์ %d และภาพถ่าย %d"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "การย้ายไฟล์จาก %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "การคัดลอกไฟล์จาก %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "ลบป้ายกำกับแล้ว"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "บันทึกป้ายกำกับแล้ว"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "บันทึกหัวเรื่องแล้ว"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "ลบหัวเรื่องแล้ว"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "บุคคลที่บันทึกไว้"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "ลบบุคคลแล้ว"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "อัปโหลดไฟล์แล้ว"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "ไฟล์ %d ที่อัปโหลดใน %d วินาที"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "กำลังประมวลผลการอัปโหลด..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "อัปโหลดได้รับการดำเนินการ"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "การเลือกได้รับการอนุมัติ"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "เก็บถาวรการเลือกแล้ว"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "คืนค่าการเลือกแล้ว"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "การเลือกถูกทำเครื่องหมายเป็นส่วนตัว"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "ลบอัลบั้มแล้ว"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip สร้างใน %d วินาที"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "ลบอย่างถาวร"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s ได้รับการกู้คืนแล้ว"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "ตรวจสอบเรียบร้อยแล้ว"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "เปิดใช้งานสำเร็จแล้ว"

View File

@@ -2,407 +2,411 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-15 12:54+0000\n"
"PO-Revision-Date: 2025-03-17 18:17+0000\n"
"Last-Translator: Omer Duran <me@omerduran.dev>\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Bir şeyler ters gitti, tekrar deneyin"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Bunu yapmak mümkün değil"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Değişiklikler kaydedilemedi"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Silinemedi"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s zaten var"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Bulunamadı"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Dosya bulunamadı"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Dosya çok büyük"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Desteklenmiyor"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Desteklenmeyen tür"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Desteklenmeyen format"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Orijinaller klasörü boş"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Seçim bulunamadı"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Varlık bulunamadı"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Hesap bulunamadı"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Kullanıcı bulunamadı"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Etiket bulunamadı"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Albüm bulunamadı"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Özne bulunamadı"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Kişi bulunamadı"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Yüz bulunamadı"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Genel modda mevcut değil"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Salt okunur modda kullanılamaz"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Lütfen hesabınıza giriş yapın"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "İzin reddedildi"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Ödeme gerekli"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Yükleme rahatsız edici olabilir"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Yükleme başarısız"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Seçili öğe yok"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Dosya oluşturulamadı, lütfen izinleri kontrol edin"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Klasör oluşturulamadı, lütfen izinleri kontrol edin"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Bağlanılamadı, lütfen tekrar deneyin"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Doğrulama kodunu giriniz"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Geçersiz doğrulama kodu, lütfen tekrar deneyin"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Geçersiz şifre, lütfen tekrar deneyin"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Özellik devre dışı"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Seçili etiket yok"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Seçili albüm yok"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "İndirilebilecek dosya yok"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Zip dosyası oluşturulamadı"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Geçersiz kimlik bilgileri"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Geçersiz link"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Geçersiz isim"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Meşgul, lütfen daha sonra tekrar deneyin"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Hesabınız bağlanamadı"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Çok fazla talep var"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Yetersiz depolama"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Kota aşıldı"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Değişiklikler başarıyla kaydedildi"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Albüm oluşturuldu"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Albüm kaydedildi"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Albüm %s silindi"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Albüm içeriği klonlandı"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Dosya yığından kaldırıldı"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Silinmiş dosya"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Seçim %s'a eklendi"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Bir giriş %s'a eklendi"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d girişleri %s'e eklendi"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Bir giriş %s'dan kaldırıldı"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d girişleri %s'den kaldırıldı"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Hesap eklendi"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Hesap kaydedildi"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Hesap silindi"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Ayarlar kaydedildi"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Şifre Değiştirildi"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "İçe aktarma %d s içinde tamamlandı"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "İçe aktarma iptal edildi"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "İndeksleme %d s içinde tamamlandı"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Orijinalleri dizinliyor..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "%s dosya yüklendi"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "İndeksleme iptal edildi"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d dosya ve %d fotoğraf kaldırıldı"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Dosyaları %s'dan taşıma"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Dosyaları %s'dan kopyalama"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Etiketler silindi"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Etiket kaydedildi"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Konu kaydedildi"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Konu silindi"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Kurtarılan kişi"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Kişi silindi"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Dosya yüklendi"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d dosyalar %d s içinde yüklendi"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Yükleme işlemi..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Yükleme işlemi tamamlandı"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Seçim onaylandı"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Seçim arşivlendi"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Seçim geri yüklendi"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Özel olarak işaretlenmiş seçim"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Albümler silindi"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip %d s içinde oluşturuldu"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Kalıcı olarak silindi"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s geri yüklendi"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Başarıyla doğrulandı"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Başarıyla etkinleştirildi"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: none\n"
"Language: uk\n"
@@ -12,399 +12,403 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Щось пішло не так, спробуйте ще раз"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Неможливо це зробити"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Зміни не можливо зберегти"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Не можливо видалити"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s вже існує"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Не знайдено"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Файл не знайдено"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Файл занадто великий"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Не підтримується"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Непідтримуваний тип"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Непідтримуваний формат"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Папка з оригіналами порожня"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Вибір не знайдено"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Об'єкт не знайдено"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Обліковий запис не знайдено"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Користувача не знайдено"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Мітку не знайдено"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Альбом не знайдено"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Тема не знайдена"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Особистість не знайдена"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Обличчя не знайдено"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Недоступно в публічному режимі"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "не доступно в режимі \"тільки читання\""
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "Будь ласка, увійдіть до свого облікового запису"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "В доступі відмовлено"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Потрібна оплата"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Завантаження може бути образливим"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Помилка вивантаження"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Нічого не вибрано"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "Помилка створення файла, перевірте дозволи"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "Не вдалося створити папку, перевірте права доступу"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Не можливо підключитися, спробуйте знову"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Введіть код верифікації"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "Невірний код верифікації, спробуйте знову"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "Невірний пароль, спробуйте знову"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Функцію вимкнено"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Мітки не вибрано"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Альбоми не вибрано"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Немає доступних файлів для завантаження"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Не вдалося створити zip-файл"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Недійсні облікові дані"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Невірне посилання"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Невірне ім'я"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Зайнято, спробуйте пізніше"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr ""
"Інтервал пробудження становить %s, але має становити 1 годину або менше"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "Ваш обліковий запис не вдалося підключити"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "Занадто багато запитів"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Недостатнє зберігання"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Перевищено квоту"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Зміни успішно збережено"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Альбом створено"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Альбом збережено"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Альбом %s видалено"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Вміст альбому клоновано"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Файл видалено з стеку"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Файл видалено"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Вибір додано до %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Один запис додано до %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d записів додано до %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Один запис видалено з %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d записів видалено з %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Обліковий запис створено"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Обліковий запис збережено"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Обліковий запис видалено"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Налаштування збережено"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "Пароль змінено"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Імпортування тривало %d с"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Імпортування скасовано"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "Індексування тривало %d с"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Індексуємо оригінали..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Індексуємо файли в %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Індексування скасовано"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Видалено %d файлів та %d фотографій"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Переносимо файли з %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Копіюємо файли з %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Мітки видалено"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Мітку збережено"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Тема збережена"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Тема видалена"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Людина збережена"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Людина видалена"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "Файл завантажено"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d файлів вивантажено за %d с"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Обробка завантаження..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Завантаження оброблено"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Вибір затверджено"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Вибране заархівовано"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Вибране відновлено"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Вибіране позначено як приватне"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Альбом видалено"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip створено за %d с"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Остаточно видалено"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s було відновлено"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Верифікація успішна"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Активація успішна"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: none\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "Đã xảy ra lỗi, hãy thử lại"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "Không thể làm điều đó"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "Không thể lưu các thay đổi"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "Không thể xóa được"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s đã tồn tại"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "Không tìm thấy"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "Không tìm thấy tập tin"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "Tệp quá lớn"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "Không được hỗ trợ"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "Loại không được hỗ trợ"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "Định dạng không được hỗ trợ"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "Thư mục gốc trống"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "Không tìm thấy lựa chọn"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "Không tìm thấy thực thể"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "Tài khoản không được tìm thấy"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "Không tìm thấy người dùng"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "Không tìm thấy nhãn"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "Không tìm thấy album"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "Không tìm thấy chủ đề"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "Không tìm thấy người"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "Không tìm thấy khuôn mặt"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "Không khả dụng ở chế độ công khai"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "Không khả dụng ở chế độ chỉ đọc"
#: messages.go:126
#: messages.go:127
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:127
#: messages.go:128
msgid "Permission denied"
msgstr "Quyền bị từ chối"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "Yêu cầu thanh toán"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "Tải lên có thể gây khó chịu"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "Tải lên không thành công"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "Không có mục nào được chọn"
#: messages.go:131
#: messages.go:133
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:132
#: messages.go:134
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:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "Không thể kết nối, vui lòng thử lại"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "Nhập mã xác nhận"
#: messages.go:135
#: messages.go:137
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:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "mật mã không hợp lệ, vui lòng thử lại"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "Tính năng bị tắt"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "Không có nhãn nào được chọn"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "Không có album nào được chọn"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "Không có tập tin nào để tải xuống"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "Không tạo được tệp zip"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "Thông tin không hợp lệ"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "Liên kết không hợp lệ"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "Tên không hợp lệ"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "Đang bận, vui lòng thử lại sau"
#: messages.go:146
#: messages.go:148
#, 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:147
#: messages.go:149
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:148
#: messages.go:150
msgid "Too many requests"
msgstr "quá nhiều yêu cầu"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "Không đủ dung lượng lưu trữ"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "Vượt quá hạn ngạch"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "Đã lưu thay đổi thành công"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "Đã tạo album"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "Đã lưu album"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "Album %s đã bị xóa"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "Nội dung album được sao chép"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "Đã xóa tệp khỏi ngăn xếp"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "Đã xóa tệp"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "Đã thêm lựa chọn vào %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "Đã thêm một mục vào %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "Các mục %d được thêm vào %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "Đã xóa một mục khỏi %s"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "Các mục %d đã bị xóa khỏi %s"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "Tài khoản đã được tạo"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "Đã lưu tài khoản"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "Tài khoản đã bị xóa"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "Đã lưu cài đặt"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "mật khẩu đã được thay đổi"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "Quá trình nhập hoàn tất sau %d giây"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "Đã hủy nhập"
#: messages.go:172
#: messages.go:174
#, 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:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "Lập chỉ mục bản gốc..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "Lập chỉ mục các tệp trong %s"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "Đã hủy lập chỉ mục"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Đã xóa tệp %d và ảnh %d"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "Di chuyển tệp từ %s"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "Sao chép tập tin từ %s"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "Đã xóa nhãn"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "Đã lưu nhãn"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "Đã lưu chủ đề"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "Chủ đề đã bị xóa"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "Người đã được cứu"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "Người đã bị xóa"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "File đã được tải lên"
#: messages.go:186
#: messages.go:188
#, 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:187
#: messages.go:189
msgid "Processing upload..."
msgstr "Đang xử lý tải lên..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "Tải lên đã được xử lý"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "Lựa chọn đã được phê duyệt"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "Đã lưu trữ lựa chọn"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "Đã khôi phục lựa chọn"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "Lựa chọn được đánh dấu là riêng tư"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "Album đã bị xóa"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip được tạo trong %d giây"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "Đã xóa vĩnh viễn"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s đã được khôi phục"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "Đã xác minh thành công"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "Đã kích hoạt thành công"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"POT-Creation-Date: 2025-10-17 17:32+0000\n"
"PO-Revision-Date: 2025-10-22 08:25+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"Language-Team: Chinese (Simplified) <https://translate.photoprism.app/"
"projects/photoprism/backend/zh_Hans/>\n"
@@ -12,398 +12,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "出错了,再试一次"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "无法做到这一点"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "无法保存变更"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "无法删除"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s 已存在"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "未找到"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "未找到文件"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "文件过大"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "不支持"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "不支持的类型"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "不支持的格式"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "原件文件夹是空的"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "未找到所选内容"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "未找到实体"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "未找到账户"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "未找到用户"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "未找到标签"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "未找到相册"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "未找到主题"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "未找到人物"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "未找到面孔"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "在公开模式下不可用"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "在只读模式下不可用"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "请登录你的账户"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "没有权限"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "需要付款"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "上传内容可能具有冒犯性"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "上传失败"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "未选择任何项目"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "创建文件失败,请检查权限"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "创建目录失败,请检查权限"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "无法连接,请重试"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "输入验证码"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "验证码无效,请重试"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "无效密码,请重试"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "功能已禁用"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "未选择标签"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "未选择相册"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "没有可供下载的文件"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "创建压缩文件失败"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "无效凭证"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "无效链接"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "无效名称"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "忙碌中,请稍后重试"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "唤醒间隔为 %s但必须小于等于 1 小时"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "你的账户无法连接"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "请求太多"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "存储不足"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "超出配额"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "更改成功保存"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "相册已创建"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "相册已保存"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "相册 %s 已删除"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "相册内容已复制"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "文件已从堆中移除"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "文件已删除"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "所选项目已加入 %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "条目已添加到 %s"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d 个条目已添加到 %s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "条目已从 %s 移除"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d 个条目已从 %s 移除"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "账户已创建"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "账户已保存"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "账户已删除"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "设置已保存"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "密码已更改"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "导入成功,耗时 %d 秒"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "导入已取消"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "索引成功,耗时 %d 秒"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "索引源文件..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "索引 %s 中的文件"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "索引已取消"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "移除了 %d 个文件和 %d 张照片"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "正在从 %s 中移动文件"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "正在从 %s 中复制文件"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "标签已移除"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "标签已保存"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "主题已保存"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "主题已删除"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "人物已保存"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "人物已删除"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "已上传文件"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "已上传 %d 个文件,耗时 %d 秒"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "处理上传..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "上传已被处理"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "所选项已批准"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "所选项已归档"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "所选项已恢复"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "所选项已设为私有"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "相册已删除"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip 文件创建成功,耗时 %d 秒"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "已永久删除"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s 已恢复"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "验证成功"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "已成功激活"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\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 <noreply-mt-google-"
"translate@weblate.org>\n"
"Language-Team: Chinese (Traditional) <https://translate.photoprism.app/"
@@ -13,398 +13,402 @@ 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.9.2\n"
"X-Generator: Weblate 5.13.3\n"
#: messages.go:103
#: messages.go:104
msgid "Something went wrong, try again"
msgstr "出错了,再试一次"
#: messages.go:104
#: messages.go:105
msgid "Unable to do that"
msgstr "无法做到这一点"
#: messages.go:105
#: messages.go:106
msgid "Changes could not be saved"
msgstr "無法儲存更改項目"
#: messages.go:106
#: messages.go:107
msgid "Could not be deleted"
msgstr "無法刪除"
#: messages.go:107
#: messages.go:108
#, c-format
msgid "%s already exists"
msgstr "%s 已存在"
#: messages.go:108
#: messages.go:109
msgid "Not found"
msgstr "未找到"
#: messages.go:109
#: messages.go:110
msgid "File not found"
msgstr "未找到檔案"
#: messages.go:110
#: messages.go:111
msgid "File too large"
msgstr "文件過大"
#: messages.go:111
#: messages.go:112
msgid "Unsupported"
msgstr "不支援"
#: messages.go:112
#: messages.go:113
msgid "Unsupported type"
msgstr "不支援的類型"
#: messages.go:113
#: messages.go:114
msgid "Unsupported format"
msgstr "不支持的格式"
#: messages.go:114
#: messages.go:115
msgid "Originals folder is empty"
msgstr "原稿文件夾是空的"
#: messages.go:115
#: messages.go:116
msgid "Selection not found"
msgstr "未找到選取項目"
#: messages.go:116
#: messages.go:117
msgid "Entity not found"
msgstr "未找到實體"
#: messages.go:117
#: messages.go:118
msgid "Account not found"
msgstr "未找到帳號"
#: messages.go:118
#: messages.go:119
msgid "User not found"
msgstr "未找到使用者"
#: messages.go:119
#: messages.go:120
msgid "Label not found"
msgstr "未找到標籤"
#: messages.go:120
#: messages.go:121
msgid "Album not found"
msgstr "未找到相簿"
#: messages.go:121
#: messages.go:122
msgid "Subject not found"
msgstr "未找到主體"
#: messages.go:122
#: messages.go:123
msgid "Person not found"
msgstr "找不到人"
#: messages.go:123
#: messages.go:124
msgid "Face not found"
msgstr "找不到面貌"
#: messages.go:124
#: messages.go:125
msgid "Not available in public mode"
msgstr "不適用於公開模式"
#: messages.go:125
#: messages.go:126
msgid "Not available in read-only mode"
msgstr "不適用於唯讀模式"
#: messages.go:126
#: messages.go:127
msgid "Please log in to your account"
msgstr "請登入您的帳戶"
#: messages.go:127
#: messages.go:128
msgid "Permission denied"
msgstr "權限遭拒"
#: messages.go:128
#: messages.go:129
msgid "Payment required"
msgstr "需要付款"
#: messages.go:130
msgid "Upload might be offensive"
msgstr "所上傳檔案可能會冒犯其他人"
#: messages.go:129
#: messages.go:131
msgid "Upload failed"
msgstr "上傳失敗"
#: messages.go:130
#: messages.go:132
msgid "No items selected"
msgstr "未選取任何項目"
#: messages.go:131
#: messages.go:133
msgid "Failed creating file, please check permissions"
msgstr "建立文件失敗,請檢查權限"
#: messages.go:132
#: messages.go:134
msgid "Failed creating folder, please check permissions"
msgstr "建立目錄失敗,請檢查權限"
#: messages.go:133
#: messages.go:135
msgid "Could not connect, please try again"
msgstr "無法連線,請重試"
#: messages.go:134
#: messages.go:136
msgid "Enter verification code"
msgstr "輸入驗證碼"
#: messages.go:135
#: messages.go:137
msgid "Invalid verification code, please try again"
msgstr "驗證碼無效,請重試"
#: messages.go:136
#: messages.go:138
msgid "Invalid password, please try again"
msgstr "密碼無效,請重試"
#: messages.go:137
#: messages.go:139
msgid "Feature disabled"
msgstr "功能未開啟"
#: messages.go:138
#: messages.go:140
msgid "No labels selected"
msgstr "未選擇標籤"
#: messages.go:139
#: messages.go:141
msgid "No albums selected"
msgstr "未選取相簿"
#: messages.go:140
#: messages.go:142
msgid "No files available for download"
msgstr "没有可以下載的檔案"
#: messages.go:141
#: messages.go:143
msgid "Failed to create zip file"
msgstr "建立 zip 檔失敗"
#: messages.go:142
#: messages.go:144
msgid "Invalid credentials"
msgstr "認證無效"
#: messages.go:143
#: messages.go:145
msgid "Invalid link"
msgstr "超連結無效"
#: messages.go:144
#: messages.go:146
msgid "Invalid name"
msgstr "無效名稱"
#: messages.go:145
#: messages.go:147
msgid "Busy, please try again later"
msgstr "忙碌中,請稍候再試"
#: messages.go:146
#: messages.go:148
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "喚醒間隔為 %s但必須少於1 小時"
#: messages.go:147
#: messages.go:149
msgid "Your account could not be connected"
msgstr "您的賬戶無法連接"
#: messages.go:148
#: messages.go:150
msgid "Too many requests"
msgstr "请求太多"
#: messages.go:149
#: messages.go:151
msgid "Insufficient storage"
msgstr "儲存空間不足"
#: messages.go:150
#: messages.go:152
msgid "Quota exceeded"
msgstr "超過配額"
#: messages.go:153
#: messages.go:155
msgid "Changes successfully saved"
msgstr "成功儲存變更"
#: messages.go:154
#: messages.go:156
msgid "Album created"
msgstr "相簿已建立"
#: messages.go:155
#: messages.go:157
msgid "Album saved"
msgstr "相簿已儲存"
#: messages.go:156
#: messages.go:158
#, c-format
msgid "Album %s deleted"
msgstr "相簿 %s 已刪除"
#: messages.go:157
#: messages.go:159
msgid "Album contents cloned"
msgstr "相簿内容已被複製"
#: messages.go:158
#: messages.go:160
msgid "File removed from stack"
msgstr "檔案已從堆疊中移除"
#: messages.go:159
#: messages.go:161
msgid "File deleted"
msgstr "檔案已刪除"
#: messages.go:160
#: messages.go:162
#, c-format
msgid "Selection added to %s"
msgstr "選取項目已加入 %s"
#: messages.go:161
#: messages.go:163
#, c-format
msgid "One entry added to %s"
msgstr "已在 %s 增加一個項目"
#: messages.go:162
#: messages.go:164
#, c-format
msgid "%d entries added to %s"
msgstr "%d個項目已加入%s"
#: messages.go:163
#: messages.go:165
#, c-format
msgid "One entry removed from %s"
msgstr "已從 %s 移除一個項目"
#: messages.go:164
#: messages.go:166
#, c-format
msgid "%d entries removed from %s"
msgstr "%d 個項目已從 %s 移除"
#: messages.go:165
#: messages.go:167
msgid "Account created"
msgstr "帳號已建立"
#: messages.go:166
#: messages.go:168
msgid "Account saved"
msgstr "帳號已儲存"
#: messages.go:167
#: messages.go:169
msgid "Account deleted"
msgstr "帳號已刪除"
#: messages.go:168
#: messages.go:170
msgid "Settings saved"
msgstr "設定已儲存"
#: messages.go:169
#: messages.go:171
msgid "Password changed"
msgstr "密碼已更改"
#: messages.go:170
#: messages.go:172
#, c-format
msgid "Import completed in %d s"
msgstr "匯入成功, 共用 %d 秒"
#: messages.go:171
#: messages.go:173
msgid "Import canceled"
msgstr "匯入取消"
#: messages.go:172
#: messages.go:174
#, c-format
msgid "Indexing completed in %d s"
msgstr "索引建立成功, 共用 %d 秒"
#: messages.go:173
#: messages.go:175
msgid "Indexing originals..."
msgstr "索引原始檔案..."
#: messages.go:174
#: messages.go:176
#, c-format
msgid "Indexing files in %s"
msgstr "建立 %s 中的檔案索引"
#: messages.go:175
#: messages.go:177
msgid "Indexing canceled"
msgstr "建立索引取消"
#: messages.go:176
#: messages.go:178
#, c-format
msgid "Removed %d files and %d photos"
msgstr "刪除了 %d 個檔案和 %d 張照片"
#: messages.go:177
#: messages.go:179
#, c-format
msgid "Moving files from %s"
msgstr "正在從 %s 中移動檔案"
#: messages.go:178
#: messages.go:180
#, c-format
msgid "Copying files from %s"
msgstr "正在從 %s 中複製檔案"
#: messages.go:179
#: messages.go:181
msgid "Labels deleted"
msgstr "已刪除標籤"
#: messages.go:180
#: messages.go:182
msgid "Label saved"
msgstr "標籤已儲存"
#: messages.go:181
#: messages.go:183
msgid "Subject saved"
msgstr "主題已儲存"
#: messages.go:182
#: messages.go:184
msgid "Subject deleted"
msgstr "主題已刪除"
#: messages.go:183
#: messages.go:185
msgid "Person saved"
msgstr "人物已儲存"
#: messages.go:184
#: messages.go:186
msgid "Person deleted"
msgstr "人物已刪除"
#: messages.go:185
#: messages.go:187
msgid "File uploaded"
msgstr "檔案上傳成功"
#: messages.go:186
#: messages.go:188
#, c-format
msgid "%d files uploaded in %d s"
msgstr "已上傳 %d 個檔案, 共用 %d 秒"
#: messages.go:187
#: messages.go:189
msgid "Processing upload..."
msgstr "正在處理上傳..."
#: messages.go:188
#: messages.go:190
msgid "Upload has been processed"
msgstr "上傳已處理完畢"
#: messages.go:189
#: messages.go:191
msgid "Selection approved"
msgstr "選取項目已認可"
#: messages.go:190
#: messages.go:192
msgid "Selection archived"
msgstr "選取項目已封存"
#: messages.go:191
#: messages.go:193
msgid "Selection restored"
msgstr "選取項目已被復原"
#: messages.go:192
#: messages.go:194
msgid "Selection marked as private"
msgstr "選取項目已設為私人"
#: messages.go:193
#: messages.go:195
msgid "Albums deleted"
msgstr "相簿已刪除"
#: messages.go:194
#: messages.go:196
#, c-format
msgid "Zip created in %d s"
msgstr "Zip檔建立成功, 共用 %d 秒"
#: messages.go:195
#: messages.go:197
msgid "Permanently deleted"
msgstr "永久刪除"
#: messages.go:196
#: messages.go:198
#, c-format
msgid "%s has been restored"
msgstr "%s 已被回復"
#: messages.go:197
#: messages.go:199
msgid "Successfully verified"
msgstr "驗證成功"
#: messages.go:198
#: messages.go:200
msgid "Successfully activated"
msgstr "激活成功"

2
assets/models/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -0,0 +1,66 @@
'use strict';
(function () {
function supportsModernJs() {
var checks = [
{ ok: function () { return typeof window.Promise === 'function'; }, reason: 'Promise' },
{ ok: function () { return typeof window.Symbol === 'function'; }, reason: 'Symbol' },
{ ok: function () { return typeof window.fetch === 'function'; }, reason: 'fetch' },
{ ok: function () { return typeof window.URL === 'function'; }, reason: 'URL' },
{ ok: function () { return typeof window.URLSearchParams === 'function'; }, reason: 'URLSearchParams' },
{ ok: function () { return typeof window.AbortController === 'function'; }, reason: 'AbortController' },
{ ok: function () { return typeof Object.assign === 'function'; }, reason: 'Object.assign' },
{ ok: function () { return typeof Array.from === 'function'; }, reason: 'Array.from' },
{ ok: function () { return typeof Array.prototype.flat === 'function'; }, reason: 'Array.prototype.flat' },
{
ok: function () {
var script = document.createElement('script');
return 'noModule' in script;
},
reason: 'script.noModule'
}
];
for (var i = 0; i < checks.length; i++) {
if (!checks[i].ok()) {
return { ok: false, reason: checks[i].reason };
}
}
return { ok: true };
}
function showUnsupportedMessage(message) {
var body = document.body;
if (body && body.className.indexOf('unsupported-browser') === -1) {
body.className += ' unsupported-browser';
}
var progress = document.getElementById('progress');
if (progress) {
progress.style.display = 'none';
}
var busy = document.getElementById('busy-overlay');
if (busy) {
busy.style.display = 'none';
}
var splashInfo = document.getElementById('splash-info');
if (splashInfo) {
splashInfo.innerHTML = '';
var info = document.createElement('div');
info.className = 'splash-warning';
info.textContent = message;
splashInfo.appendChild(info);
}
}
var support = supportsModernJs();
window.__PHOTOPRISM_SUPPORTS__ = support.ok;
if (!support.ok) {
window.__PHOTOPRISM_SUPPORTS_REASON__ = support.reason;
showUnsupportedMessage('PhotoPrism requires a current version of Chrome, Safari, Edge, or Firefox. Please update your browser or switch to a supported device.');
}
})();

View File

@@ -28,8 +28,8 @@
<div class="splash-logo">
{{template "logo.gohtml" .}}
</div>
<progress id="progress" class="html-progress" max="100"></progress>
<progress id="progress" class="html-progress" role="progressbar" max="100"></progress>
</div>
</div>
</div>
<div id="busy-overlay"><div class="splash-center"><progress id="busy-progress" class="html-progress" max="100"></progress></div></div>
<div id="busy-overlay"><div class="splash-center"><progress id="busy-progress" class="html-progress" role="progressbar" max="100"></progress></div></div>

View File

@@ -0,0 +1,2 @@
<script src="{{ .config.StaticUri }}/js/browser-check.js"></script>
<script src="{{ .config.JsUri }}"></script>

View File

@@ -36,6 +36,6 @@
<body class="{{ .config.Flags }} nojs">
{{template "app.gohtml" .}}
<script src="{{ .config.JsUri }}"></script>
{{template "app.js.gohtml" .}}
</body>
</html>

View File

@@ -19,6 +19,6 @@
<body class="{{ .config.Flags }} nojs">
{{template "app.gohtml" .}}
<script src="{{ .config.JsUri }}"></script>
{{template "app.js.gohtml" .}}
</body>
</html>

View File

@@ -32,6 +32,6 @@
<body class="{{ .config.Flags }} nojs">
{{template "app.gohtml" .}}
<script src="{{ .config.JsUri }}"></script>
{{template "app.js.gohtml" .}}
</body>
</html>

View File

@@ -55,6 +55,8 @@ services:
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # Don't use TensorFlow for image classification
PHOTOPRISM_DETECT_NSFW: "false" # Flag photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # Allows uploads that may be offensive
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_DARKTABLE_PRESETS: "false" # Enables Darktable presets and disables concurrent RAW conversion
PHOTOPRISM_THUMB_FILTER: "lanczos" # Resample filter, best to worst: blackman, lanczos, cubic, linear
PHOTOPRISM_THUMB_UNCACHED: "true" # Enables on-demand thumbnail rendering (high memory and cpu usage)
@@ -62,12 +64,12 @@ services:
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # On-demand rendering size limit (default 7680, min 720, max 7680)
PHOTOPRISM_JPEG_SIZE: 7680 # Size limit for converted image files in pixels (720-30000)
TF_CPP_MIN_LOG_LEVEL: 0 # Show TensorFlow log messages for development
TF_CPP_MIN_LOG_LEVEL: 1 # Show TensorFlow log messages for development
## Enable TensorFlow AVX2 support for modern Intel CPUs (requires starting the container as root):
# PHOTOPRISM_INIT: "tensorflow-amd64-avx2"
## Hardware video transcoding config (optional):
# PHOTOPRISM_FFMPEG_BUFFERS: "64" # FFmpeg capture buffers (default: 32)
# PHOTOPRISM_FFMPEG_BITRATE: "32" # FFmpeg encoding bitrate limit in Mbit/s (default: 50)
# PHOTOPRISM_FFMPEG_BITRATE: "32" # FFmpeg encoding bitrate limit in Mbps (default: 60)
# PHOTOPRISM_FFMPEG_ENCODER: "h264_v4l2m2m" # Use Video4Linux for AVC transcoding (default: libx264)
# PHOTOPRISM_FFMPEG_ENCODER: "h264_qsv" # Use Intel Quick Sync Video for AVC transcoding (default: libx264)
# PHOTOPRISM_INIT: "intel-graphics tensorflow-amd64-avx2" # Enable TensorFlow AVX2 & Intel Graphics support
@@ -120,8 +122,8 @@ volumes:
go-mod:
driver: local
## Create shared "photoprism-develop" network for connecting with services in other compose.yaml files
## Create shared "photoprism" network for connecting with services in other compose.yaml files
networks:
default:
name: shared
name: photoprism
driver: bridge

190
compose.intel.yaml Normal file
View File

@@ -0,0 +1,190 @@
services:
## PhotoPrism (Development Environment for Intel QSV hardware transcoding)
photoprism:
build: .
image: photoprism/photoprism:develop
depends_on:
- mariadb
- dummy-webdav
- dummy-oidc
stop_grace_period: 15s
privileged: true
security_opt:
- seccomp:unconfined
- apparmor:unconfined
## Expose HTTP and debug ports
ports:
- "2342:2342" # Default HTTP port (host:container)
- "2443:2443" # Default TLS port (host:container)
- "2343:2343" # Acceptance Test HTTP port (host:container)
- "40000:40000" # Go Debugger (host:container)
shm_size: "2gb"
## Set links and labels for use with Traefik reverse proxy
links:
- "traefik:localssl.dev"
- "traefik:app.localssl.dev"
- "traefik:keycloak.localssl.dev"
- "traefik:dummy-oidc.localssl.dev"
- "traefik:dummy-webdav.localssl.dev"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.photoprism.loadbalancer.server.port=2342"
- "traefik.http.services.photoprism.loadbalancer.server.scheme=http"
- "traefik.http.routers.photoprism.entrypoints=websecure"
- "traefik.http.routers.photoprism.rule=Host(`localssl.dev`) || HostRegexp(`^.+\\.localssl\\.dev`)"
- "traefik.http.routers.photoprism.priority=2"
- "traefik.http.routers.photoprism.tls.domains[0].main=localssl.dev"
- "traefik.http.routers.photoprism.tls.domains[0].sans=*.localssl.dev"
- "traefik.http.routers.photoprism.tls=true"
## Configure development environment
environment:
## Run as a non-root user after initialization (supported: 0, 33, 50-99, 500-600, and 900-1200):
PHOTOPRISM_UID: ${UID:-1000} # user id, should match your host user id
PHOTOPRISM_GID: ${GID:-1000} # group id
## Access Management:
PHOTOPRISM_ADMIN_USER: "admin" # admin login username
PHOTOPRISM_ADMIN_PASSWORD: "photoprism" # initial admin password (8-72 characters)
PHOTOPRISM_AUTH_MODE: "password" # authentication mode (public, password)
PHOTOPRISM_REGISTER_URI: "https://keycloak.localssl.dev/admin/"
PHOTOPRISM_PASSWORD_RESET_URI: "https://keycloak.localssl.dev/realms/master/login-actions/reset-credentials"
PHOTOPRISM_USAGE_INFO: "true"
PHOTOPRISM_FILES_QUOTA: "100"
## Customization:
PHOTOPRISM_DEFAULT_LOCALE: "en" # default user interface language, e.g. "en" or "de"
PHOTOPRISM_PLACES_LOCALE: "local" # location details language, e.g. "local", "en", or
## OpenID Connect (pre-configured for local tests):
## see https://keycloak.localssl.dev/realms/master/.well-known/openid-configuration
PHOTOPRISM_OIDC_URI: "https://keycloak.localssl.dev/realms/master"
PHOTOPRISM_OIDC_CLIENT: "photoprism-develop"
PHOTOPRISM_OIDC_SECRET: "9d8351a0-ca01-4556-9c37-85eb634869b9"
PHOTOPRISM_OIDC_PROVIDER: "Keycloak"
PHOTOPRISM_OIDC_REGISTER: "true"
PHOTOPRISM_OIDC_WEBDAV: "true"
PHOTOPRISM_DISABLE_OIDC: "false"
## LDAP Authentication (pre-configured for local tests):
PHOTOPRISM_LDAP_URI: "ldap://dummy-ldap:389"
PHOTOPRISM_LDAP_INSECURE: "true"
PHOTOPRISM_LDAP_SYNC: "true"
PHOTOPRISM_LDAP_BIND: "simple"
PHOTOPRISM_LDAP_BIND_DN: "cn"
PHOTOPRISM_LDAP_BASE_DN: "dc=localssl,dc=dev"
PHOTOPRISM_LDAP_ROLE: ""
PHOTOPRISM_LDAP_ROLE_DN: "ou=photoprism-*,ou=groups,dc=localssl,dc=dev"
PHOTOPRISM_LDAP_WEBDAV_DN: "ou=photoprism-webdav,ou=groups,dc=localssl,dc=dev"
## HTTPS/TLS Options:
## see https://docs.photoprism.app/getting-started/using-https/
PHOTOPRISM_DISABLE_TLS: "true"
PHOTOPRISM_DEFAULT_TLS: "true"
## Site Information:
PHOTOPRISM_SITE_URL: "https://app.localssl.dev/" # server URL in the format "http(s)://domain.name(:port)/(path)"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: "Tags and finds pictures without getting in your way!"
PHOTOPRISM_SITE_AUTHOR: "@photoprism_app"
PHOTOPRISM_DEBUG: "true"
PHOTOPRISM_READONLY: "false"
PHOTOPRISM_EXPERIMENTAL: "true"
PHOTOPRISM_HTTP_MODE: "debug"
PHOTOPRISM_HTTP_HOST: "0.0.0.0"
PHOTOPRISM_HTTP_PORT: 2342
PHOTOPRISM_HTTP_COMPRESSION: "gzip" # improves transfer speed and bandwidth utilization (none or gzip)
PHOTOPRISM_DATABASE_DRIVER: "mysql"
PHOTOPRISM_DATABASE_SERVER: "mariadb:4001"
PHOTOPRISM_DATABASE_NAME: "photoprism"
PHOTOPRISM_DATABASE_USER: "root"
PHOTOPRISM_DATABASE_PASSWORD: "photoprism"
PHOTOPRISM_TEST_DRIVER: "sqlite"
# PHOTOPRISM_TEST_DSN_MYSQL8: "root:photoprism@tcp(mysql:4001)/photoprism?charset=utf8mb4,utf8&collation=utf8mb4_unicode_ci&parseTime=true&timeout=15s"
PHOTOPRISM_ASSETS_PATH: "/go/src/github.com/photoprism/photoprism/assets"
PHOTOPRISM_STORAGE_PATH: "/go/src/github.com/photoprism/photoprism/storage"
PHOTOPRISM_ORIGINALS_PATH: "/go/src/github.com/photoprism/photoprism/storage/originals"
PHOTOPRISM_ORIGINALS_LIMIT: 128000 # sets originals file size limit to 128 GB
PHOTOPRISM_IMPORT_PATH: "/go/src/github.com/photoprism/photoprism/storage/import"
PHOTOPRISM_DISABLE_CHOWN: "false" # disables updating storage permissions via chmod and chown on startup
PHOTOPRISM_DISABLE_BACKUPS: "false" # disables backing up albums and photo metadata to YAML files
PHOTOPRISM_DISABLE_WEBDAV: "false" # disables built-in WebDAV server
PHOTOPRISM_DISABLE_SETTINGS: "false" # disables settings UI and API
PHOTOPRISM_DISABLE_PLACES: "false" # disables reverse geocoding and maps
PHOTOPRISM_DISABLE_EXIFTOOL: "false" # disables creating JSON metadata sidecar files with ExifTool
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DISABLE_RAW: "false" # disables indexing and conversion of RAW images
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_THUMB_LIBRARY: "auto" # image processing library to be used for generating thumbnails (auto, imaging, vips)
PHOTOPRISM_THUMB_FILTER: "auto" # downscaling filter (imaging best to worst: blackman, lanczos, cubic, linear, nearest)
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
## Intel Quick Sync Video (QSV) (https://docs.photoprism.app/getting-started/advanced/transcoding/#intel-quick-sync):
PHOTOPRISM_FFMPEG_ENCODER: "intel" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
# PHOTOPRISM_FFMPEG_BITRATE: "64" # video bitrate limit in Mbps (default: 60)
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
PHOTOPRISM_INIT: "https intel tensorflow"
## External dependencies and tools:
TF_CPP_MIN_LOG_LEVEL: 1
GOCACHE: "/go/src/github.com/photoprism/photoprism/.local/gocache"
CODEX_HOME: "/go/src/github.com/photoprism/photoprism/.local/codex"
## Share hardware devices with FFmpeg for hardware video transcoding:
devices:
- "/dev/dri:/dev/dri"
working_dir: "/go/src/github.com/photoprism/photoprism"
volumes:
- ".:/go/src/github.com/photoprism/photoprism"
- "./storage:/photoprism"
- "go-mod:/go/pkg/mod"
mariadb:
extends:
file: ./compose.yaml
service: mariadb
qdrant:
extends:
file: ./compose.yaml
service: qdrant
photoprism-vision:
extends:
file: ./compose.yaml
service: photoprism-vision
ollama:
extends:
file: ./compose.yaml
service: ollama
traefik:
extends:
file: ./compose.yaml
service: traefik
dummy-webdav:
extends:
file: ./compose.yaml
service: dummy-webdav
dummy-oidc:
extends:
file: ./compose.yaml
service: dummy-oidc
dummy-ldap:
extends:
file: ./compose.yaml
service: dummy-ldap
keycloak:
extends:
file: ./compose.yaml
service: keycloak
prometheus:
extends:
file: ./compose.yaml
service: prometheus
## Create named volume for Go module cache
volumes:
go-mod:
driver: local
mariadb:
driver: local
## Create shared "photoprism" network for connecting with services in other compose.yaml files
networks:
default:
name: photoprism
driver: bridge

View File

@@ -12,6 +12,7 @@ services:
- "2344:2342" # HTTP port (host:container)
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.latest.loadbalancer.server.port=2342"
- "traefik.http.routers.latest.entrypoints=websecure"
- "traefik.http.routers.latest.rule=Host(`latest.localssl.dev`)"
@@ -50,6 +51,8 @@ services:
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_THUMB_FILTER: "lanczos" # resample filter, best to worst: blackman, lanczos, cubic, linear
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
@@ -57,13 +60,13 @@ services:
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
working_dir: "/photoprism"
volumes:
- "./storage:/photoprism/storage"
- "./storage/originals:/photoprism/originals"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism

View File

@@ -6,7 +6,7 @@ services:
## Docs: https://docs.photoprism.org/
photoprism-local:
image: photoprism/photoprism:local
stop_grace_period: 10s
stop_grace_period: 15s
security_opt:
- seccomp:unconfined
- apparmor:unconfined
@@ -14,6 +14,7 @@ services:
- "2345:2342" # HTTP port (host:container)
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.latest.loadbalancer.server.port=2342"
- "traefik.http.routers.latest.entrypoints=websecure"
- "traefik.http.routers.latest.rule=Host(`local.localssl.dev`)"
@@ -51,6 +52,8 @@ services:
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_THUMB_FILTER: "lanczos" # resample filter, best to worst: blackman, lanczos, cubic, linear
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
@@ -58,8 +61,8 @@ services:
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
# PHOTOPRISM_INIT: "http gpu tensorflow" # Options: "update https gpu tensorflow davfs clitools clean"
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
# PHOTOPRISM_INIT: "http gpu tensorflow yt-dlp" # Options: "update https gpu tensorflow davfs clitools clean"
PHOTOPRISM_FFMPEG_ENCODER: "nvidia" # Options: "software", "intel", "nvidia", "apple", "raspberry"
PHOTOPRISM_STORAGE_PATH: "/photoprism/storage"
PHOTOPRISM_ORIGINALS_PATH: "/photoprism/storage/originals"
@@ -70,7 +73,7 @@ services:
volumes:
- "./storage:/photoprism/storage"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism

View File

@@ -145,7 +145,7 @@ services:
MYSQL_PASSWORD: "photoprism"
MYSQL_ROOT_PASSWORD: "photoprism"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism

View File

@@ -15,7 +15,7 @@ services:
MYSQL_PASSWORD: "photoprism"
MYSQL_ROOT_PASSWORD: "photoprism"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism

View File

@@ -3,11 +3,13 @@ services:
photoprism:
build: .
image: photoprism/photoprism:develop
runtime: nvidia
depends_on:
- mariadb
- dummy-webdav
- dummy-oidc
stop_grace_period: 10s
stop_grace_period: 15s
privileged: true
security_opt:
- seccomp:unconfined
- apparmor:unconfined
@@ -22,11 +24,14 @@ services:
links:
- "traefik:localssl.dev"
- "traefik:app.localssl.dev"
- "traefik:vision.localssl.dev"
- "traefik:qdrant.localssl.dev"
- "traefik:keycloak.localssl.dev"
- "traefik:dummy-oidc.localssl.dev"
- "traefik:dummy-webdav.localssl.dev"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.photoprism.loadbalancer.server.port=2342"
- "traefik.http.services.photoprism.loadbalancer.server.scheme=http"
- "traefik.http.routers.photoprism.entrypoints=websecure"
@@ -48,6 +53,9 @@ services:
PHOTOPRISM_PASSWORD_RESET_URI: "https://keycloak.localssl.dev/realms/master/login-actions/reset-credentials"
PHOTOPRISM_USAGE_INFO: "true"
PHOTOPRISM_FILES_QUOTA: "100"
## Customization:
PHOTOPRISM_DEFAULT_LOCALE: "en" # default user interface language, e.g. "en" or "de"
PHOTOPRISM_PLACES_LOCALE: "local" # location details language, e.g. "local", "en", or
## OpenID Connect (pre-configured for local tests):
## see https://keycloak.localssl.dev/realms/master/.well-known/openid-configuration
PHOTOPRISM_OIDC_URI: "https://keycloak.localssl.dev/realms/master"
@@ -106,44 +114,115 @@ services:
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_THUMB_LIBRARY: "auto" # image processing library to be used for generating thumbnails (auto, imaging, vips)
PHOTOPRISM_THUMB_FILTER: "auto" # downscaling filter (imaging best to worst: blackman, lanczos, cubic, linear, nearest)
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
## Nvidia Video Transcoding (https://docs.photoprism.app/getting-started/advanced/transcoding/#nvidia-container-toolkit):
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
PHOTOPRISM_INIT: "https tensorflow-gpu"
## Computer Vision API (https://docs.photoprism.app/getting-started/config-options/#computer-vision):
PHOTOPRISM_VISION_API: "true" # server: enables service API endpoints under /api/v1/vision (requires access token)
PHOTOPRISM_VISION_URI: "" # client: service URI, e.g. http://hostname/api/v1/vision (leave blank to disable)
PHOTOPRISM_VISION_KEY: "" # client: service access token (for authentication)
## NVIDIA GPU Hardware Acceleration (see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html):
NVIDIA_VISIBLE_DEVICES: "all"
NVIDIA_DRIVER_CAPABILITIES: "compute,video,utility"
NVIDIA_DRIVER_CAPABILITIES: "all"
PHOTOPRISM_FFMPEG_ENCODER: "nvidia" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
PHOTOPRISM_FFMPEG_BITRATE: "50" # video bitrate limit in Mbit/s (default: 50)
## Run/install on first startup (options: update https gpu ffmpeg tensorflow davfs clitools clean):
PHOTOPRISM_INIT: "https tensorflow"
## Share hardware devices with FFmpeg and TensorFlow (optional):
PHOTOPRISM_FFMPEG_BITRATE: "64" # video bitrate limit in Mbps (default: 60)
## External dependencies and tools:
TF_CPP_MIN_LOG_LEVEL: 1
GOCACHE: "/go/src/github.com/photoprism/photoprism/.local/gocache"
CODEX_HOME: "/go/src/github.com/photoprism/photoprism/.local/codex"
## Shared devices for video hardware transcoding (optional):
# devices:
# - "/dev/dri:/dev/dri" # Intel QSV (Broadwell and later) or VAAPI (Haswell and earlier)
# - "/dev/nvidia0:/dev/nvidia0" # Nvidia CUDA
# - "/dev/nvidiactl:/dev/nvidiactl"
# - "/dev/nvidia-modeset:/dev/nvidia-modeset"
# - "/dev/nvidia-nvswitchctl:/dev/nvidia-nvswitchctl"
# - "/dev/nvidia-uvm:/dev/nvidia-uvm"
# - "/dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools"
# - "/dev/dri:/dev/dri" # Required Intel QSV or VAAPI hardware transcoding
# - "/dev/video11:/dev/video11" # Video4Linux Video Encode Device (h264_v4l2m2m)
working_dir: "/go/src/github.com/photoprism/photoprism"
volumes:
- ".:/go/src/github.com/photoprism/photoprism"
- "./storage:/photoprism"
- "go-mod:/go/pkg/mod"
## NVIDIA GPU Hardware Acceleration (see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html):
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
capabilities: [gpu]
count: "all"
## Ollama Large-Language Model Runner
## run "ollama pull [name]:[version]" to download a vision model
## listed at <https://ollama.com/search?c=vision>, for example:
## docker compose exec ollama ollama pull gemma3:latest
ollama:
image: ollama/ollama:latest
stop_grace_period: 15s
## Only starts this service if the "all", "ollama", or "vision" profile is specified::
## docker compose --profile ollama up -d
profiles: ["all", "ollama", "vision"]
## Insecurely exposes the Ollama service on port 11434
## without authentication (for private networks only):
# ports:
# - "11434:11434"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.ollama.loadbalancer.server.port=11434"
- "traefik.http.routers.ollama.rule=Host(`ollama.localssl.dev`)"
- "traefik.http.routers.ollama.entrypoints=websecure"
- "traefik.http.routers.ollama.tls=true"
environment:
## Ollama Configuration Options:
OLLAMA_HOST: "0.0.0.0:11434"
OLLAMA_MODELS: "/root/.ollama" # model storage path (see volumes section below)
OLLAMA_MAX_QUEUE: "100" # maximum number of queued requests
OLLAMA_NUM_PARALLEL: "1" # maximum number of parallel requests
OLLAMA_MAX_LOADED_MODELS: "1" # maximum number of loaded models per GPU
OLLAMA_LOAD_TIMEOUT: "5m" # maximum time for loading models (default "5m")
OLLAMA_KEEP_ALIVE: "5m" # duration that models stay loaded in memory (default "5m")
OLLAMA_CONTEXT_LENGTH: "4096" # maximum input context length
OLLAMA_MULTIUSER_CACHE: "false" # optimize prompt caching for multi-user scenarios
OLLAMA_NOPRUNE: "false" # disables pruning of model blobs at startup
OLLAMA_NOHISTORY: "true" # disables readline history
OLLAMA_FLASH_ATTENTION: "false" # enables the experimental flash attention feature
OLLAMA_KV_CACHE_TYPE: "f16" # cache quantization (f16, q8_0, or q4_0)
OLLAMA_SCHED_SPREAD: "false" # allows scheduling models across all GPUs.
OLLAMA_NEW_ENGINE: "true" # enables the new Ollama engine
# OLLAMA_DEBUG: "true" # shows additional debug information
# OLLAMA_INTEL_GPU: "true" # enables experimental Intel GPU detection
## NVIDIA GPU Hardware Acceleration (see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html):
NVIDIA_VISIBLE_DEVICES: "all"
NVIDIA_DRIVER_CAPABILITIES: "compute,utility"
volumes:
- "./storage/services/ollama:/root/.ollama"
## NVIDIA GPU Hardware Acceleration (see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html):
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
count: 1
capabilities: [ gpu ]
count: "all"
mariadb:
extends:
file: ./compose.yaml
service: mariadb
qdrant:
extends:
file: ./compose.yaml
service: qdrant
open-webui:
extends:
file: ./compose.yaml
service: open-webui
photoprism-vision:
extends:
file: ./compose.yaml
service: photoprism-vision
traefik:
extends:
file: ./compose.yaml
@@ -176,7 +255,7 @@ volumes:
mariadb:
driver: local
## Create shared "photoprism-develop" network for connecting with services in other compose.yaml files
## Create shared "photoprism" network for connecting with services in other compose.yaml files
networks:
default:
name: photoprism

View File

@@ -24,7 +24,6 @@ services:
- "go-mod:/go/pkg/mod"
shm_size: "2gb"
environment:
PHOTOPRISM_INIT: "https"
PHOTOPRISM_ADMIN_USER: "admin" # admin login username
PHOTOPRISM_ADMIN_PASSWORD: "photoprism" # initial admin password (8-72 characters)
PHOTOPRISM_AUTH_MODE: "password" # authentication mode (public, password)
@@ -58,6 +57,8 @@ services:
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_THUMB_FILTER: "lanczos" # resample filter, best to worst: blackman, lanczos, cubic, linear
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
@@ -65,8 +66,12 @@ services:
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
PHOTOPRISM_INIT: "https"
## External dependencies and tools:
TF_CPP_MIN_LOG_LEVEL: 1
GOCACHE: "/go/src/github.com/photoprism/photoprism/.local/gocache"
CODEX_HOME: "/go/src/github.com/photoprism/photoprism/.local/codex"
## PostgreSQL Database Server
## Docs: https://www.postgresql.org/docs/
postgres:

View File

@@ -12,6 +12,7 @@ services:
- "2344:2342" # HTTP port (host:container)
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.preview.loadbalancer.server.port=2342"
- "traefik.http.routers.preview.entrypoints=websecure"
- "traefik.http.routers.preview.rule=Host(`preview.localssl.dev`)"
@@ -50,6 +51,8 @@ services:
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_THUMB_FILTER: "lanczos" # resample filter, best to worst: blackman, lanczos, cubic, linear
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
@@ -57,13 +60,13 @@ services:
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
working_dir: "/photoprism"
volumes:
- "./storage:/photoprism/storage"
- "./storage/originals:/photoprism/originals"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism

View File

@@ -10,7 +10,7 @@ services:
- mariadb
- dummy-webdav
- dummy-oidc
stop_grace_period: 10s
stop_grace_period: 15s
security_opt:
- seccomp:unconfined
- apparmor:unconfined
@@ -25,11 +25,14 @@ services:
links:
- "traefik:localssl.dev"
- "traefik:app.localssl.dev"
- "traefik:vision.localssl.dev"
- "traefik:qdrant.localssl.dev"
- "traefik:keycloak.localssl.dev"
- "traefik:dummy-oidc.localssl.dev"
- "traefik:dummy-webdav.localssl.dev"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.photoprism.loadbalancer.server.port=2342"
- "traefik.http.services.photoprism.loadbalancer.server.scheme=http"
- "traefik.http.routers.photoprism.entrypoints=websecure"
@@ -55,6 +58,9 @@ services:
PHOTOPRISM_PASSWORD_RESET_URI: "https://keycloak.localssl.dev/realms/master/login-actions/reset-credentials"
PHOTOPRISM_USAGE_INFO: "true"
PHOTOPRISM_FILES_QUOTA: "100"
## Customization:
PHOTOPRISM_DEFAULT_LOCALE: "en" # default user interface language, e.g. "en" or "de"
PHOTOPRISM_PLACES_LOCALE: "local" # location details language, e.g. "local", "en", or "de"
## OpenID Connect (pre-configured for local tests):
## see https://keycloak.localssl.dev/realms/master/.well-known/openid-configuration
PHOTOPRISM_OIDC_URI: "https://keycloak.localssl.dev/realms/master"
@@ -113,26 +119,29 @@ services:
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_THUMB_LIBRARY: "auto" # image processing library to be used for generating thumbnails (auto, imaging, vips)
PHOTOPRISM_THUMB_FILTER: "auto" # downscaling filter (imaging best to worst: blackman, lanczos, cubic, linear, nearest)
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
## Video Transcoding (https://docs.photoprism.app/getting-started/advanced/transcoding/):
# PHOTOPRISM_FFMPEG_ENCODER: "software" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
# PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
# PHOTOPRISM_FFMPEG_BITRATE: "32" # video bitrate limit in Mbit/s (default: 50)
# LIBVA_DRIVER_NAME: "i965" # For Intel architectures Haswell and older which do not support QSV yet but use VAAPI instead
## Run/install on first startup (options: update https gpu ffmpeg tensorflow davfs clitools clean):
PHOTOPRISM_INIT: "https tensorflow"
## Share hardware devices with FFmpeg and TensorFlow (optional):
PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
# PHOTOPRISM_FFMPEG_BITRATE: "64" # video bitrate limit in Mbps (default: 60)
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
PHOTOPRISM_INIT: "https"
## Computer Vision API (https://docs.photoprism.app/getting-started/config-options/#computer-vision):
PHOTOPRISM_VISION_API: "true" # server: enables service API endpoints under /api/v1/vision (requires access token)
PHOTOPRISM_VISION_URI: "" # client: service URI, e.g. http://hostname/api/v1/vision (leave blank to disable)
PHOTOPRISM_VISION_KEY: "" # client: service access token (for authentication)
## External dependencies and tools:
TF_CPP_MIN_LOG_LEVEL: 1
GOCACHE: "/go/src/github.com/photoprism/photoprism/.local/gocache"
CODEX_HOME: "/go/src/github.com/photoprism/photoprism/.local/codex"
## Shared devices for video hardware transcoding (optional):
# devices:
# - "/dev/dri:/dev/dri" # Intel QSV (Broadwell and later) or VAAPI (Haswell and earlier)
# - "/dev/nvidia0:/dev/nvidia0" # Nvidia CUDA
# - "/dev/nvidiactl:/dev/nvidiactl"
# - "/dev/nvidia-modeset:/dev/nvidia-modeset"
# - "/dev/nvidia-nvswitchctl:/dev/nvidia-nvswitchctl"
# - "/dev/nvidia-uvm:/dev/nvidia-uvm"
# - "/dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools"
# - "/dev/dri:/dev/dri" # Required Intel QSV or VAAPI hardware transcoding
# - "/dev/video11:/dev/video11" # Video4Linux Video Encode Device (h264_v4l2m2m)
working_dir: "/go/src/github.com/photoprism/photoprism"
volumes:
@@ -145,6 +154,7 @@ services:
## Release Notes: https://mariadb.com/kb/en/changes-improvements-in-mariadb-1011/
mariadb:
image: mariadb:11
stop_grace_period: 15s
security_opt: # see https://github.com/MariaDB/mariadb-docker/issues/434#issuecomment-1136151239
- seccomp:unconfined
- apparmor:unconfined
@@ -164,11 +174,155 @@ services:
MARIADB_PASSWORD: "photoprism"
MARIADB_ROOT_PASSWORD: "photoprism"
## Qdrant (Vector Database)
## Docs: https://qdrant.tech/documentation/guides/installation/#docker-compose
## Release Notes: https://github.com/qdrant/qdrant/releases
## Web UI: https://qdrant.localssl.dev/dashboard
qdrant:
image: qdrant/qdrant:latest
profiles: [ "all", "qdrant" ]
stop_grace_period: 15s
links:
- "traefik:localssl.dev"
- "traefik:app.localssl.dev"
- "traefik:vision.localssl.dev"
labels:
- "traefik.enable=true"
- "traefik.http.services.qdrant.loadbalancer.server.port=6333"
- "traefik.http.services.qdrant.loadbalancer.server.scheme=http"
- "traefik.http.routers.qdrant.entrypoints=websecure"
- "traefik.http.routers.qdrant.rule=Host(`qdrant.localssl.dev`)"
- "traefik.http.routers.qdrant.priority=3"
- "traefik.http.routers.qdrant.tls.domains[0].main=localssl.dev"
- "traefik.http.routers.qdrant.tls.domains[0].sans=*.localssl.dev"
- "traefik.http.routers.qdrant.tls=true"
expose:
- 6333
- 6334
- 6335
volumes:
- "./.qdrant.yaml:/qdrant/config/production.yaml"
- "./storage/services/qdrant:/qdrant/storage"
## Ollama Large-Language Model Runner
## run "ollama pull [name]:[version]" to download a vision model
## listed at <https://ollama.com/search?c=vision>, for example:
## docker compose exec ollama ollama pull gemma3:latest
ollama:
image: ollama/ollama:latest
stop_grace_period: 10s
## Only starts this service if the "all", "ollama", or "vision" profile is specified::
## docker compose --profile ollama up -d
profiles: [ "all", "ollama", "vision" ]
## Insecurely exposes the Ollama service on port 11434
## without authentication (for private networks only):
# ports:
# - "11434:11434"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.ollama.loadbalancer.server.port=11434"
- "traefik.http.routers.ollama.rule=Host(`ollama.localssl.dev`)"
- "traefik.http.routers.ollama.entrypoints=websecure"
- "traefik.http.routers.ollama.tls=true"
environment:
## Ollama Configuration Options:
OLLAMA_HOST: "0.0.0.0:11434"
OLLAMA_MODELS: "/root/.ollama" # model storage path (see volumes section below)
OLLAMA_MAX_QUEUE: "100" # maximum number of queued requests
OLLAMA_NUM_PARALLEL: "1" # maximum number of parallel requests
OLLAMA_MAX_LOADED_MODELS: "1" # maximum number of loaded models per GPU
OLLAMA_LOAD_TIMEOUT: "5m" # maximum time for loading models (default "5m")
OLLAMA_KEEP_ALIVE: "5m" # duration that models stay loaded in memory (default "5m")
OLLAMA_CONTEXT_LENGTH: "4096" # maximum input context length
OLLAMA_MULTIUSER_CACHE: "false" # optimize prompt caching for multi-user scenarios
OLLAMA_NOPRUNE: "false" # disables pruning of model blobs at startup
OLLAMA_NOHISTORY: "true" # disables readline history
OLLAMA_FLASH_ATTENTION: "false" # enables the experimental flash attention feature
OLLAMA_KV_CACHE_TYPE: "f16" # cache quantization (f16, q8_0, or q4_0)
OLLAMA_SCHED_SPREAD: "false" # allows scheduling models across all GPUs.
OLLAMA_NEW_ENGINE: "true" # enables the new Ollama engine
# OLLAMA_DEBUG: "true" # shows additional debug information
# OLLAMA_INTEL_GPU: "true" # enables experimental Intel GPU detection
## NVIDIA GPU Hardware Acceleration (optional):
# NVIDIA_VISIBLE_DEVICES: "all"
# NVIDIA_DRIVER_CAPABILITIES: "compute,utility"
volumes:
- "./storage/services/ollama:/root/.ollama"
## NVIDIA GPU Hardware Acceleration (optional):
# deploy:
# resources:
# reservations:
# devices:
# - driver: "nvidia"
# capabilities: [ gpu ]
# count: "all"
## Open WebUI, a Web Interface for Ollama
## see https://github.com/open-webui/open-webui
open-webui:
image: ghcr.io/open-webui/open-webui:main
stop_grace_period: 10s
## Only starts this service if the "all", "ollama", "open-webui", or "vision" profile is specified::
## docker compose --profile ollama up -d
profiles: [ "all", "ollama", "open-webui", "vision" ]
## Exposes Open WebUI at http://localhost:8080 (use https://chat.localssl.dev/ to access it through Traefik):
ports:
- "127.0.0.1:8080:8080"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.open-webui.loadbalancer.server.port=8080"
- "traefik.http.routers.open-webui.rule=Host(`chat.localssl.dev`) || Host(`open-webui.localssl.dev`) || Host(`ollama-ui.localssl.dev`)"
- "traefik.http.routers.open-webui.entrypoints=websecure"
- "traefik.http.routers.open-webui.tls=true"
environment:
WEBUI_URL: "https://chat.localssl.dev"
# WEBUI_SECRET_KEY: ""
OLLAMA_BASE_URL: "http://ollama:11434"
ANONYMIZED_TELEMETRY: "false" # disable Chroma telemetry
HF_HUB_DISABLE_TELEMETRY: "1" # disable Hugging Face telemetry
# HUGGING_FACE_HUB_TOKEN: "" # see https://huggingface.co/docs/hub/en/security-tokens
volumes:
- "./storage/services/open-webui:/app/backend/data"
## PhotoPrism® Computer Vision API
## see https://github.com/photoprism/photoprism-vision
photoprism-vision:
image: photoprism/vision:latest
stop_grace_period: 15s
## Only starts this service if the "all" or "vision" profile is specified::
## docker compose --profile vision up -d
profiles: [ "all", "vision" ]
working_dir: "/app"
links:
- "traefik:localssl.dev"
- "traefik:app.localssl.dev"
- "traefik:qdrant.localssl.dev"
labels:
- "traefik.enable=true"
- "traefik.http.services.qdrant.loadbalancer.server.port=5000"
- "traefik.http.services.qdrant.loadbalancer.server.scheme=http"
- "traefik.http.routers.qdrant.entrypoints=websecure"
- "traefik.http.routers.qdrant.rule=Host(`vision.localssl.dev`)"
- "traefik.http.routers.qdrant.priority=3"
- "traefik.http.routers.qdrant.tls.domains[0].main=localssl.dev"
- "traefik.http.routers.qdrant.tls.domains[0].sans=*.localssl.dev"
- "traefik.http.routers.qdrant.tls=true"
expose:
- 5000
environment:
TF_CPP_MIN_LOG_LEVEL: 2
## Ollama client configuration (for the service, see below):
OLLAMA_ENABLED: "true"
OLLAMA_HOST: "http://ollama:11434"
## Traefik v3 (Reverse Proxy)
## includes "*.localssl.dev" SSL certificate for test environments
## Docs: https://doc.traefik.io/traefik/
traefik:
image: photoprism/traefik:latest
stop_grace_period: 15s
security_opt:
- no-new-privileges:true
ports:
@@ -182,6 +336,7 @@ services:
## Dummy WebDAV Server
dummy-webdav:
image: photoprism/dummy-webdav:240627
stop_grace_period: 30s
environment:
WEBDAV_USERNAME: admin
WEBDAV_PASSWORD: photoprism
@@ -198,6 +353,7 @@ services:
## Dummy OIDC Identity Provider
dummy-oidc:
image: photoprism/dummy-oidc:240627
stop_grace_period: 30s
labels:
- "traefik.enable=true"
- "traefik.http.services.dummy-oidc.loadbalancer.server.port=9998"
@@ -212,6 +368,7 @@ services:
## Docs: https://glauth.github.io/docs/
dummy-ldap:
image: glauth/glauth-plugins:latest
stop_grace_period: 15s
ports:
- "127.0.0.1:389:389"
labels:
@@ -231,6 +388,7 @@ services:
## Login with "user / photoprism" and "admin / photoprism".
keycloak:
image: quay.io/keycloak/keycloak:25.0
stop_grace_period: 30s
command: "start-dev" # development mode, do not use this in production!
links:
- "traefik:localssl.dev"
@@ -262,7 +420,8 @@ services:
## ./photoprism client add --id=cs5cpu17n6gj2qo5 --secret=xcCbOrw6I0vcoXzhnOmXhjpVSyFq0l0e -s metrics -n Prometheus -e 60 -t 1
prometheus:
image: prom/prometheus:latest
profiles: ["all", "auth", "prometheus"]
stop_grace_period: 15s
profiles: [ "all", "auth", "prometheus" ]
labels:
- "traefik.enable=true"
- "traefik.http.services.prometheus.loadbalancer.server.port=9090"
@@ -282,7 +441,7 @@ volumes:
mariadb:
driver: local
## Create shared "photoprism-develop" network for connecting with services in other compose.yaml files
## Create shared "photoprism" network for connecting with services in other compose.yaml files
networks:
default:
name: photoprism

View File

@@ -1,8 +1,9 @@
FROM photoprism/photoprism:preview-ce AS build
# Set environment variables
ENV TF_CPP_MIN_LOG_LEVEL=2 \
MALLOC_ARENA_MAX="4" \
ENV TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
PHOTOPRISM_DEBUG="false" \
PHOTOPRISM_READONLY="false" \

View File

@@ -1,7 +1,6 @@
services:
demo:
restart: always
command: photoprism --public start
image: photoprism/demo:latest
container_name: demo
depends_on:
@@ -14,6 +13,8 @@ services:
volumes:
- "./config:/photoprism/storage/config"
environment:
PHOTOPRISM_DEMO: "true"
PHOTOPRISM_PUBLIC: "true"
PHOTOPRISM_SITE_URL: "https://demo.yourdomain.com/"
# PHOTOPRISM_CDN_URL: "https://demo-cdn.yourdomain.com/"
PHOTOPRISM_SITE_TITLE: "PhotoPrism"
@@ -26,7 +27,7 @@ services:
traefik:
restart: always
image: traefik:v3.1
image: traefik:v3.5
container_name: traefik
ports:
- "80:80"

View File

@@ -1,8 +1,9 @@
FROM photoprism/photoprism:preview-ce-debian AS build
# Set environment variables
ENV TF_CPP_MIN_LOG_LEVEL=2 \
MALLOC_ARENA_MAX="4" \
ENV TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
PHOTOPRISM_DEBUG="false" \
PHOTOPRISM_READONLY="false" \

View File

@@ -6,7 +6,7 @@ serversTransport:
# Required to proxy services with self-signed HTTPS certificates:
insecureSkipVerify: true
# Open ports ond protocols (HTTP will be redirected to HTTPS):
# Open ports and protocols (HTTP will be redirected to HTTPS):
entryPoints:
web:
address: ":80"

View File

@@ -1,8 +1,9 @@
FROM photoprism/photoprism:preview-ce-ubuntu AS build
# Set environment variables
ENV TF_CPP_MIN_LOG_LEVEL=2 \
MALLOC_ARENA_MAX="4" \
ENV TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
PHOTOPRISM_DEBUG="false" \
PHOTOPRISM_READONLY="false" \

View File

@@ -1,8 +1,9 @@
FROM photoprism/photoprism:unstable-ce AS build
# Set environment variables
ENV TF_CPP_MIN_LOG_LEVEL=2 \
MALLOC_ARENA_MAX="4" \
ENV TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
PHOTOPRISM_DEBUG="false" \
PHOTOPRISM_READONLY="false" \

View File

@@ -30,14 +30,16 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
NODE_ENV="production" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_VERSION=1.15.2 \
TF_CPP_MIN_LOG_LEVEL=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" \
PROG="photoprism" \
S6_KEEP_ENV=1 \
S6_VERBOSITY=0 \
S6_LOGGING=0
# Copy scripts and package sources config.
@@ -62,6 +64,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
iputils-ping dnsutils \
&& \
/scripts/install-nodejs.sh && \
/scripts/install-yt-dlp.sh && \
/scripts/install-libheif.sh && \
/scripts/install-tensorflow.sh && \
echo "ALL ALL=(ALL) NOPASSWD:SETENV: ALL" >> /etc/sudoers.d/all && \

View File

@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism"
# Copy scripts and package sources config.

View File

@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
@@ -70,6 +71,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
&& \
/scripts/install-nodejs.sh && \
/scripts/install-tensorflow.sh && \
/scripts/install-onnx.sh && \
/scripts/install-darktable.sh && \
echo "ALL ALL=(ALL) NOPASSWD:SETENV: ALL" >> /etc/sudoers.d/all && \
mkdir -p /etc/skel/.config/go/telemetry && \

View File

@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism"
# copy scripts and debian backports sources list

View File

@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
@@ -53,6 +54,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
apt-utils \
ripgrep \
gpg \
pkg-config \
software-properties-common \
@@ -111,6 +113,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
/scripts/install-nodejs.sh && \
/scripts/install-mariadb.sh mariadb-client && \
/scripts/install-tensorflow.sh && \
/scripts/install-onnx.sh && \
/scripts/install-darktable.sh && \
/scripts/install-go-tools.sh && \
echo "ALL ALL=(ALL) NOPASSWD:SETENV: ALL" >> /etc/sudoers.d/all && \

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