Compare commits

...

1952 Commits

Author SHA1 Message Date
Michael Mayer
bd3de03c79 Merge branch 'develop' into feature/batch-edit 2025-09-21 13:53:34 +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
Ömer Duran
64182a9b8a Frontend: Refactor batch test mocks 2025-09-18 12:51:54 +03:00
Ömer Duran
1736701fe5 Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-09-18 12:20:08 +03:00
Ömer Duran
1003f649e2 Frontend: Clean up unused component mocks in batch tests #271 2025-09-18 12:19:12 +03: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
8fc0227b73 Merge branch 'develop' into feature/batch-edit 2025-09-18 09:53:40 +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
Ömer Duran
7664ee7556 Frontend: Remove original states tracking from chip-selector and update batch component logic 2025-09-17 15:48:43 +03: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
Ömer Duran
1342b1d1a2 Frontend: Improve code readability in chip-selector and batch component #271 2025-09-17 11:42:48 +03: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
graciousgrey
0277419f3b Merge branch 'develop' into feature/batch-edit 2025-09-16 10:08:22 +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
Ömer Duran
2d690afe21 Tests: Add tests for ChipSelector and BatchEdit components #271 2025-09-15 14:32:02 +03: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
Ömer Duran
5c75f6b035 Tests: Add unit tests for album and labels functionality #271 2025-09-15 08:58:02 +03: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
Ömer Duran
716e856110 Frontend: Refactor batch editing logic to improve selection handling and add unit tests #271 2025-09-15 07:11:42 +03: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
3283941ba0 Merge branch 'develop' into feature/batch-edit 2025-09-14 20:14:09 +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
Ömer Duran
7ca6b45217 Backend: Refactor photo conversion and date logic tests for clarity and structure 2025-09-12 10:46:22 +03:00
Ömer Duran
a920e10b7d Backend: Refactor date logic tests to ensure year value is preserved when month is unknown 2025-09-11 17:33:48 +03:00
Ömer Duran
46b8913ca4 Backend: Add date logic and conversion tests for photo metadata updates 2025-09-11 17:13:43 +03: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
7032a071e5 Merge branch 'develop' into feature/batch-edit 2025-09-09 13:08:14 +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
ffba22034a Merge branch 'develop' into feature/batch-edit 2025-09-09 11:34:14 +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
52beb0580c Merge branch 'develop' into feature/batch-edit 2025-09-09 09:56:21 +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
Ömer Duran
30609fbd17 Batch Edit: Ensured PhotoDay remains consistent with computed values when only Month and/or Year are updated. 2025-09-08 11:50:32 +03: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
2b850b42b7 Merge branch 'develop' into feature/batch-edit 2025-09-07 16:26:37 +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
74982c8d75 Merge branch 'develop' into feature/batch-edit 2025-09-07 16:05:29 +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
Ömer Duran
933606873a Tests: Adapt batch/photos_test 2025-09-06 10:41:14 +03: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
graciousgrey
db9e9e8624 Tests: Add tests #271 2025-09-04 15:39:48 +02:00
graciousgrey
ad925ded45 Tests: Improve unit tests #271 2025-09-04 10:16:34 +02:00
Michael Mayer
4f326faeea Merge branch 'develop' into feature/batch-edit 2025-09-03 16:38:05 +02: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
d932f6f49f Merge branch 'develop' into feature/batch-edit 2025-09-03 16:19:21 +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
07dd5a1b8b Merge branch 'develop' into feature/batch-edit 2025-09-03 11:48:17 +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
1a738c936a Merge branch 'develop' into feature/batch-edit 2025-09-03 11:44:40 +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
Ömer Duran
21e48a1876 Metadata: Clamp Day to valid month/year in details and batch editor and recompute TakenAtLocal with clamped day in backend batch conversion. 2025-09-02 17:25:17 +03:00
Michael Mayer
7a7a7353f0 Merge branch 'develop' into feature/batch-edit 2025-09-02 12:17:57 +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
f8f94ad814 Merge branch 'develop' into feature/batch-edit 2025-09-02 11:02:20 +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
b7c6ab1c90 Merge branch 'develop' into feature/batch-edit 2025-09-01 18:18:50 +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
b5fdbf7c5e Merge branch 'develop' into feature/batch-edit 2025-09-01 16:03:53 +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
Michael Mayer
44a2d902c2 Merge branch 'develop' into feature/batch-edit 2025-09-01 14:13:31 +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
1c8450d94c Merge branch 'develop' into feature/batch-edit 2025-09-01 13:07:45 +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
406ef8b645 Merge branch 'develop' into feature/batch-edit 2025-09-01 12:28:48 +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
14241c4d25 Merge branch 'develop' into feature/batch-edit 2025-08-28 19:36:21 +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
fc781b5647 Merge branch 'develop' into feature/batch-edit 2025-08-28 19:29:38 +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
01cd1c32c9 Merge branch 'develop' into feature/batch-edit 2025-08-28 19:13:23 +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
b096361d51 Merge branch 'develop' into feature/batch-edit 2025-08-27 10:32:13 +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
Ömer Duran
b0b03ef631 Batch Edit: Sync photo selection state between fullscreen viewer and batch edit sidebar 2025-08-26 23:08:36 +03:00
Michael Mayer
55fbb474bb Merge branch 'develop' into feature/batch-edit 2025-08-26 08:58:51 +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
Ömer Duran
9160bb2fea Batch Edit: Enhance save button with loading state and disable functionality during save operation 2025-08-25 21:12:50 +03:00
graciousgrey
39391e94a2 Tests: Add tests #271 2025-08-25 17:38:18 +02:00
graciousgrey
c05e892ad4 Tests: Add tests #271 2025-08-25 17:09:09 +02:00
Ömer Duran
72fa563edc Batch Edit: Change logic todelete or block labels based on source and uncertainty levels 2025-08-25 14:58:14 +03: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
Ömer Duran
e3e624b4b4 Batch Edit: Check for unsaved changes before closing. Refactor save method to handle async operations and notify users of success or failure. 2025-08-23 10:06:07 +03:00
Ömer Duran
53703c5eb2 Batch Edit: move batch logic to internal/photoprism/batch; refactor API 2025-08-23 09:12:52 +03:00
Michael Mayer
5e6c5d4b9f Merge branch 'develop' into feature/batch-edit 2025-08-22 15:28:49 +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
b0b74db258 Merge branch 'develop' into feature/batch-edit 2025-08-22 15:08:40 +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
graciousgrey
7380244f6d Tests: Add tests #271 2025-08-22 14:57:10 +02:00
graciousgrey
f04a84fd40 Tests: Skip test until related function is refactored #271 2025-08-22 12:23:01 +02:00
graciousgrey
0ad7ed4021 Tests: Adapt tests to updated fixtures #271 2025-08-22 12:21:51 +02:00
Michael Mayer
41ecea6360 Merge branch 'develop' into feature/batch-edit 2025-08-22 11:02:49 +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
Ömer Duran
f0667dab83 Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-08-21 20:18:31 +03:00
Michael Mayer
c9e7fc51b6 Merge branch 'develop' into feature/batch-edit 2025-08-21 11:58:27 +02:00
Ömer Duran
3c5eaeb1df Batch Edit: Refresh available label options 2025-08-21 11:45:12 +03: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
Ömer Duran
bd4f8a2582 Labels: Standardize label editing across dialogs for consistent source/probability handling and actions 2025-08-20 11:35:15 +03:00
graciousgrey
597593f4ee Tests: Adapt fixtures to have valid slugs 2025-08-19 19:44:23 +02:00
Ömer Duran
c9e306274c Batch Edit: Refactor batch photo editing logic and introduce new batch form handling without import cycle 2025-08-19 17:40:00 +03: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
d1f9f681c8 Merge branch 'develop' into feature/batch-edit 2025-08-19 09:58:55 +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
Ömer Duran
4f86c04ebe Batch Edit: Update label removal logic 2025-08-18 09:46:21 +03:00
Michael Mayer
ecb9d6c9dc Merge branch 'develop' into feature/batch-edit 2025-08-16 16:47:40 +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
9e747aa72d Merge branch 'develop' into feature/batch-edit 2025-08-15 22:47:53 +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
graciousgrey
3056623934 Tests: Adapt acceptance tests to changes #271 2025-08-14 11:30:16 +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
0b74d21e58 Merge branch 'develop' into feature/batch-edit 2025-08-13 16:00:03 +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
graciousgrey
3ef0f1a646 Tests: Add fixtures and update tests #271 2025-08-12 15:13:28 +02:00
Michael Mayer
6eb85d9419 Merge branch 'develop' into feature/batch-edit 2025-08-11 18:11:53 +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
Michael Mayer
3996c165d1 Merge branch 'develop' into feature/batch-edit 2025-08-11 18:10:28 +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
Ömer Duran
b6d3af9c58 Backend: Update Location logic to support batch source in SavePhotoForm 2025-08-11 16:12:59 +03:00
Ömer Duran
0ea64c68ea Batch Edit: Refactor getData method to avoid duplicates 2025-08-11 14:30:11 +03:00
Ömer Duran
9fc72f3178 Backend: Photo date field updates to exclude batch source 2025-08-11 13:48:20 +03:00
Ömer Duran
5d5ed13cf5 Batch Edit: Updating label and album methods 2025-08-11 12:48:06 +03: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
40b5b938f5 Merge branch 'develop' into feature/batch-edit 2025-08-10 17:24:07 +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
28ed71988f Merge branch 'develop' into feature/batch-edit 2025-08-10 17:14:07 +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
fde47ebd3a Merge branch 'develop' into feature/batch-edit 2025-08-08 19:26:37 +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
Ömer Duran
6f6d985848 Batch Edit: refresh form after apply 2025-08-08 12:55:24 +03:00
Ömer Duran
0d10020eba Batch Edit: Implement fetching and updating of albums and labels in batch processing 2025-08-08 12:18:41 +03:00
Weblate
ca8490d048 Weblate: Update frontend translations 2025-08-08 10:32:43 +02:00
Michael Mayer
12ed1ab507 Merge branch 'develop' into feature/batch-edit 2025-08-06 20:13:20 +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
e5cd2f1ceb Merge branch 'develop' into feature/batch-edit 2025-08-06 10:00:11 +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
Ömer Duran
95dc2e9a10 Batch Edit: Update source tracking for photo fields to use SrcBatch instead of SrcManual 2025-08-05 19:02:22 +03:00
graciousgrey
bbd7759d3b Tests: Add fixtures and update tests #271 2025-08-05 15:16:46 +02:00
Michael Mayer
51f877aef2 Merge branch 'develop' into feature/batch-edit 2025-08-05 12:47:23 +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
b8cd22d14b Merge branch 'develop' into feature/batch-edit 2025-08-05 10:10:04 +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
8e91f077b8 Merge branch 'develop' into feature/batch-edit 2025-08-04 13:25:07 +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
Ömer Duran
cdb13c9711 Backend: Implement batch photo proof of concept metadata updates 2025-08-04 07:14:27 +03:00
Michael Mayer
3a07e7049f Merge branch 'develop' into feature/batch-edit 2025-08-02 11:10:18 +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
8a82b10d23 Merge branch 'develop' into feature/batch-edit 2025-08-02 10:48:00 +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
3d030601ea Merge branch 'develop' into feature/batch-edit 2025-08-02 10:20:03 +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
Ömer Duran
423d232bf2 Frontend: Refactor location input component placement 2025-07-30 11:38:35 +03:00
Ömer Duran
939e912f2d Frontend: Add readonly state to country field and update country on location change 2025-07-30 11:20:59 +03:00
Ömer Duran
b83dbf1cb5 Frontend: Move mixed to the middle 2025-07-30 10:43:02 +03:00
Ömer Duran
31916ef7ae Frontend: Replace "<mixed>" with "mixed" in batch dialog options 2025-07-30 10:33:39 +03: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
Ömer Duran
583777f065 Frontend: Remove outlined variant from v-combobox and title prop from ChipSelector 2025-07-29 14:10:21 +03:00
Ömer Duran
44d2a6e771 Frontend: Clear input and restore placeholder after selection 2025-07-29 13:52:33 +03:00
Ömer Duran
4c16b8d9c5 Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-07-29 13:37:51 +03:00
Ömer Duran
8f417febb4 Frontend: Remove title prop from BatchChipSelector and add section headers for Albums and Labels 2025-07-29 13:37:38 +03:00
Michael Mayer
fca60eb816 Merge branch 'develop' into feature/batch-edit 2025-07-29 12:11:24 +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
Ömer Duran
0b5f9a783f Frontend: Update batch edit to use photo ID instead of UID for selected photos 2025-07-25 16:31:44 +03:00
Ömer Duran
f2b2697da0 Frontend: Remove unused variable 2025-07-25 14:34:40 +03:00
Ömer Duran
5813e8dbba Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-07-25 14:33:06 +03:00
Ömer Duran
00bf7ad680 Frontend: Fix batch edit save functionality to use currently selected photo UIDs 2025-07-25 14:33:04 +03:00
Ömer Duran
b9a1282f8e Frontend: Fix batch edit save functionality to use currently selected photo UIDs 2025-07-25 14:31:23 +03:00
Ömer Duran
6e8575840e Frontend: Fix action handling, delete field display, and undo functionality for position changes 2025-07-25 01:45:14 +03: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
18799b1481 Merge branch 'develop' into feature/batch-edit 2025-07-24 15:46:57 +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
bdec8e25ce Merge branch 'develop' into feature/batch-edit 2025-07-24 15:40:37 +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
2e229d8a98 Merge branch 'develop' into feature/batch-edit 2025-07-24 14:55:50 +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
9c24a30126 Merge branch 'develop' into feature/batch-edit 2025-07-24 13:07:30 +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
Ömer Duran
204c944804 Frontend: Remove options text in batch edit dialog 2025-07-24 01:02:41 +03:00
Ömer Duran
61f85604c6 Frontend: Refactor chip-selector component for improved item handling and placeholder logic 2025-07-24 00:59:44 +03:00
Ömer Duran
d23c3b10a1 Frontend: Enhance chip-selector component with tooltips and improved item removal logic 2025-07-23 20:36:06 +03:00
Ömer Duran
3656cefb23 Frontend: Update chip-selector component to use persistent placeholder and clear label 2025-07-23 20:13:04 +03:00
Michael Mayer
811d359343 Merge branch 'develop' into feature/batch-edit 2025-07-23 02:33:08 +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
7ba6171ff9 Merge branch 'develop' into feature/batch-edit 2025-07-22 22:09:39 +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
1809c12d9d Merge branch 'develop' into feature/batch-edit 2025-07-21 12:22:42 +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
db16a9d546 Merge branch 'develop' into feature/batch-edit 2025-07-21 10:51:25 +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
Ömer Duran
910aac9545 Frontend: Update batch edit logic to ensure actions are only updated when changes occur; update chip styles for better theming 2025-07-20 19:19:34 +03:00
graciousgey
f67ba0e634 Tests: Adapt acceptance tests #465 2025-07-18 18:27:01 +02:00
Ömer Duran
822dc87d8e Frontend: Update computedInputLabel to return an empty string if no label is provided 2025-07-18 10:39:07 +03:00
Ömer Duran
58ce717004 Frontend: Remove input labels for album and label name in batch edit 2025-07-18 10:37:40 +03:00
Ömer Duran
718ed254b8 Frontend: Delete useless comments 2025-07-18 10:19:59 +03:00
Ömer Duran
f96b49d5a3 Frontend: Add reusable ChipSelector component and integrate into batch edit 2025-07-18 10:12:45 +03:00
raystlin
1912f17aaf Changed InputOrder to ColorChannelOrder
The previous name was not clear enough.
2025-07-17 21:26:50 +00:00
Michael Mayer
9f11c2c773 Merge branch 'develop' into feature/batch-edit 2025-07-17 12:27:22 +02: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
96cf07dd94 Merge branch 'develop' into feature/batch-edit 2025-07-17 12:15:21 +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
c71c1db568 Merge branch 'develop' into feature/batch-edit 2025-07-17 12:03:55 +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
61c34713d8 Merge branch 'develop' into feature/batch-edit 2025-07-16 18:35:53 +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
ae0162c8d8 Merge branch 'develop' into feature/batch-edit 2025-07-16 18:29:52 +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
4fccb0ff6c Merge branch 'develop' into feature/batch-edit 2025-07-16 14:59:24 +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
Ömer Duran
3561f3fcc9 Frontend: Update form data handling for date and type fields in batch edit component 2025-07-16 09:51:59 +03:00
Ömer Duran
458ac57ce3 Frontend: Simplify checkbox event handling in batch edit component 2025-07-16 08:58:08 +03:00
Ömer Duran
49ab48a5a1 Frontend: Update label for title field in photo details 2025-07-16 01:43:07 +03: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
4341bb2fb4 Merge branch 'develop' into feature/batch-edit 2025-07-15 18:03:43 +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
cd3be44a3c Merge branch 'develop' into feature/batch-edit 2025-07-15 12:52:26 +02: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
f1b59fd01c Merge branch 'develop' into feature/batch-edit 2025-07-15 11:23:28 +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
889fc20fc1 Merge branch 'develop' into feature/batch-edit 2025-07-15 10:25:32 +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
Ömer Duran
45914d1eac Frontend: Improve location input component with undo/delete functionality 2025-07-15 07:44:56 +03:00
Ömer Duran
c26573eb5b Frontend: Adjust column layout for boolean flags in batch edit component 2025-07-15 06:35:11 +03:00
Ömer Duran
9a19a71551 Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-07-15 06:20:41 +03:00
Ömer Duran
d553508449 Frontend: Update click handling for photo selection in batch edit and enhance cursor style for thumbnails 2025-07-15 06:20:19 +03:00
Michael Mayer
3f2022f693 Merge branch 'develop' into feature/batch-edit 2025-07-15 05:13:55 +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
Ömer Duran
e98889b09e Frontend: Simplify label for photo title input in details form 2025-07-15 06:07:00 +03:00
Ömer Duran
04630f25f1 Frontend: Better select-field handling in batch edit, update Type field logic 2025-07-15 05:56:39 +03: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
26a80227b9 Merge branch 'develop' into feature/batch-edit 2025-07-14 23:36:05 +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
e75bb20027 Merge branch 'develop' into feature/batch-edit 2025-07-14 20:12:02 +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
b24631244c Merge branch 'develop' into feature/batch-edit 2025-07-14 19:32:59 +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
b6b260fa36 Merge branch 'develop' into feature/batch-edit 2025-07-14 19:30:46 +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
1269668edd Merge branch 'develop' into feature/batch-edit 2025-07-14 11:14:20 +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
829bc180a9 Merge branch 'develop' into feature/batch-edit 2025-07-14 10:42:47 +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
d14097f335 Merge branch 'develop' into feature/batch-edit 2025-07-14 09:33:45 +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
ba67081c56 Merge branch 'develop' into feature/batch-edit 2025-07-14 09:27:25 +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
Ömer Duran
b3d839de49 Frontend: Adjust column width in batch editing component 2025-07-14 08:57:16 +02:00
Ömer Duran
acdfde36c8 Frontend: Wrapping form controls in v-row 2025-07-14 08:55:29 +02:00
Ömer Duran
b0781b6451 Frontend: Improving toggle button layout 2025-07-14 08:50:24 +02:00
Ömer Duran
76eaaa812c Frontend: Refactor batch editing component to use v-data-table for better performance and usability in both desktop and mobile views 2025-07-14 08:30:21 +02:00
Ömer Duran
2996d64600 Frontend: Improve batch editing functionality by adding support for albums and labels selection, updated form data structure #271 2025-07-14 02:48:59 +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
b8469d6ced Merge branch 'develop' into feature/batch-edit 2025-07-11 16:31:17 +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
2b85d47d3b Merge branch 'develop' into feature/batch-edit 2025-07-11 12:20:18 +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
2b511e87ca Merge branch 'develop' into feature/batch-edit 2025-07-11 06:02:02 +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
de2e322a4e Merge branch 'develop' into feature/batch-edit 2025-07-11 03:34:13 +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
11d0cc3d26 Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-07-10 18:05:19 +02:00
Ömer Duran
d61dd9c16e Places: Added location input and dialog components for better location selection. 2025-07-10 18:05:11 +02:00
Michael Mayer
1f53458111 Merge branch 'develop' into feature/batch-edit 2025-07-10 16:50:08 +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
66ae99e486 Merge branch 'develop' into feature/batch-edit 2025-07-10 11:16:46 +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
1469b5ae78 Merge branch 'develop' into feature/batch-edit 2025-07-10 11:08:42 +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
0d6fba0f62 Merge branch 'develop' into feature/batch-edit 2025-07-10 10:29:00 +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
05113217e4 Merge branch 'develop' into feature/batch-edit 2025-07-10 10:18:13 +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
2531616b53 Merge branch 'develop' into feature/batch-edit 2025-07-10 09:39:07 +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
a2880be47d Merge branch 'develop' into feature/batch-edit 2025-07-10 09:06:23 +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
5bfa14702b Merge branch 'develop' into feature/batch-edit 2025-07-09 16:53:04 +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
Michael Mayer
ed005962bd Merge branch 'develop' into feature/batch-edit 2025-07-09 15:35:25 +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
Michael Mayer
940533c59e Merge branch 'develop' into feature/batch-edit 2025-07-09 13:31:02 +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
c6cdcb6b1f Merge branch 'develop' into feature/batch-edit 2025-07-08 10:41:28 +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
Anastasiia
2a044832be Frontend: unblock Apply btn and send request with error #271" 2025-07-08 09:51:22 +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
f06c65c217 Merge branch 'develop' into feature/batch-edit 2025-07-07 12:45:51 +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
ca9bac63e6 Merge branch 'develop' into feature/batch-edit 2025-07-07 11:15:30 +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
2a4627cc47 Merge branch 'develop' into feature/batch-edit 2025-07-06 14:07: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
efa57f417c Merge branch 'develop' into feature/batch-edit 2025-07-06 11:33:47 +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
96356caaa6 Merge branch 'develop' into feature/batch-edit 2025-07-04 10:58:43 +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
568fd0d62a Merge branch 'develop' into feature/batch-edit 2025-07-03 20:45:47 +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
5b139b5c9e Merge branch 'develop' into feature/batch-edit 2025-07-03 19:47:05 +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
f57792511e Merge branch 'develop' into feature/batch-edit 2025-07-03 12:58:57 +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
5c57d23990 Merge branch 'develop' into feature/batch-edit 2025-07-02 20:45:52 +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
aba5faa870 CSS: Move embedded map styles to css/places.css #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 12:21:40 +02:00
Michael Mayer
915e9b4b6c Merge branch 'develop' into feature/batch-edit 2025-07-02 12:10:53 +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
Anastasiia
70665e6c24 Frontend: add new select-field Type #271" 2025-07-01 17:12:57 +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
Anastasiia
a62fb24d8d Frontend: add action logic for toggle fields #271" 2025-06-24 16:25:09 +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
Anastasiia
efcfafd5b1 Frontend: fix select-field actions #271" 2025-06-24 10:21:37 +02:00
Anastasiia
57f08d5b30 Frontend: add setting action values for text and input fields #271" 2025-06-23 20:18: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
Anastasiia
2b77e5f929 Frontend: fix the name of image in the images list #271" 2025-06-17 12:26:10 +02:00
Anastasiia
402f674618 Frontend: fix mobile images list view #271" 2025-06-17 12:13:04 +02:00
Anastasiia
92440bcb75 Frontend: fix mobile images list view #271" 2025-06-17 12:06:26 +02:00
Anastasiia
e025e5a077 Frontend: fix white border for dark theme #271" 2025-06-16 17:58:42 +02:00
Anastasiia
011b3c0c77 Frontend: change logic for icons, fix batch edit model #271" 2025-06-16 17:32:03 +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
Anastasiia
0227d495e7 Frontend: add delete/undo button when input-field has value #271" 2025-05-28 16:30:19 +02:00
Anastasiia
7d74d58a98 Frontend: add toggle-fields functionality #271" 2025-05-27 23:10:59 +02:00
Anastasiia
a2e9eae388 Frontend: add delete/undo buttons functionality for input-fields #271" 2025-05-27 20:47:07 +02:00
Anastasiia
78143a08ee Frontend: add delete/undo buttons functionality for text-fields #271" 2025-05-27 14:54:03 +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
Anastasiia
15b6a3331d Frontend: add the placeholder/value checking for select-fields #271" 2025-05-19 21:02:27 +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
d691f59594 Merge branch 'develop' into feature/batch-edit 2025-05-15 16:37:46 +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
Anastasiia
d01823d130 Frontend: add the placeholder/value checking for input-fields #271" 2025-05-15 13:39:49 +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
Anastasiia
6240d2e31e Frontend: add the placeholder/value checking #271" 2025-05-14 22:19:16 +02: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
Anastasiia
91d65a9b07 Merge remote-tracking branch 'origin/feature/batch-edit' into feature/batch-edit 2025-05-13 19:38:47 +02:00
Anastasiia
9230b585c1 Frontend: fix gettext in details.vue #271" 2025-05-13 19:38:30 +02:00
Anastasiia
86bf05293b Frontend: add toggle functionality, fix title, add form logic #271" 2025-05-13 19:38:10 +02:00
Michael Mayer
f840efd90e Merge branch 'develop' into feature/batch-edit 2025-05-13 14:37:29 +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
e17bd03a14 Merge branch 'develop' into feature/batch-edit 2025-05-13 11:34:35 +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
1b87d57442 Merge branch 'develop' into feature/batch-edit 2025-05-13 10:25:19 +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
Anastasiia
ff8a5308d2 Frontend: add getting data from the request with images #271" 2025-05-09 23:32:53 +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
graciousgrey
832ae90652 Frontend: Open thumb fromPhotos on the batch edit dialog #271 2025-05-09 12:17:54 +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
bf2ece0023 Merge branch 'develop' into feature/batch-edit 2025-05-08 01:39:21 +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
9c16aa6227 Merge branch 'develop' into feature/batch-edit 2025-05-08 01:22:52 +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
e0034ec1b0 Merge branch 'develop' into feature/batch-edit 2025-05-06 16:24:20 +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
de9ee0a04d Merge branch 'develop' into feature/batch-edit 2025-05-05 09:26:22 +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
d44233d811 Merge branch 'develop' into feature/batch-edit 2025-05-05 09:08:29 +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
a9d87aa8c8 Merge branch 'develop' into feature/batch-edit 2025-05-04 16:00:33 +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
6462ddc628 Merge branch 'develop' into feature/batch-edit 2025-05-04 15:29:54 +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
576d6c1201 Merge branch 'develop' into feature/batch-edit 2025-05-04 14:34:37 +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
6e999eb2cc Merge branch 'develop' into feature/batch-edit 2025-05-04 14:09:48 +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
8264cd090f Merge branch 'develop' into feature/batch-edit 2025-05-03 12:44:10 +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
Anastasiia
275e6b62ea Frontend: add search request to load selected photos #271" 2025-04-29 21:57:26 +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
Anastasiia
1d9dbbef2f Frontend: add max height to images on mobile, optimize layout #271" 2025-04-28 18:47:11 +02: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
Anastasiia
b64202aefd Frontend: photo viewer hide edit button #271" 2025-04-25 18:11:53 +02:00
Anastasiia
4b8191a308 Frontend: Fix dialog width, icons position, mobile view, renamed label and add two scroll #271" 2025-04-25 16:45:07 +02:00
Anastasiia
1ec4adf44f Frontend: Center the checkbox of the selected photos in the column #271" 2025-04-25 16:41:04 +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
Anastasiia
9c0a5d4101 Merge develop into feature/batch-edit #271" 2025-04-24 16:37:44 +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
Anastasiia
97ad4710b4 Frontend: Add expansion panel for the photos list on mobile view #271" 2025-04-14 22:31:13 +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
Anastasiia
2672f23bbf Frontend: add opening photo viewer when click to photo #271" 2025-04-14 19:47:59 +02: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
Anastasiia
19cf3e4b38 Frontend: add left side form view with mocked data 2025-04-08 22:59:23 +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
Anastasiia
f4e94f4e9f Frontend: add right side form view 2025-04-07 23:03:56 +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
Anastasiia
159d097383 Frontend: add new edit batch dialog logic 2025-04-03 17:37:27 +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
Michael Mayer
b321c1f2c4 UX: Apply values returned by the server when changing content settings
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-20 12:56:07 +01:00
Michael Mayer
2bf60529cc UX: Block user interface while saving content and advanced settings
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-20 12:03:37 +01:00
Michael Mayer
e7df0c2125 Docs: Update config.yml section titles in config/report_sections.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-20 11:23:14 +01:00
Michael Mayer
f51969f0b7 Places: Prevent background flicker when route changes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-20 08:52:32 +01:00
Michael Mayer
c7548e43e8 UX: Disable teleporting for snackbar notifications
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-20 08:29:07 +01:00
Michael Mayer
f3aa4e7e05 Frontend: Prevent replacing new auth data with restored values
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 16:51:41 +01:00
Michael Mayer
33577a1a2b Auth: Improve fallback for data stored under the previously used keys
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 16:46:26 +01:00
Michael Mayer
87ccc96181 Search: Allow searching for labels that only have an emoji as name #4761
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 16:14:30 +01:00
Michael Mayer
b2aee3a184 UX: Prevent notifications from blocking navigation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 16:11:24 +01:00
Michael Mayer
86d5c13bce Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 15:11:01 +01:00
Michael Mayer
8b327b4ae9 Dependencies: Update NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 15:03:36 +01:00
Michael Mayer
60358da03a Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 15:01:45 +01:00
Michael Mayer
5abe0299e2 UX: Switch position of Upload and Download button in album action menu
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 14:59:34 +01:00
Michael Mayer
9d9bc43b03 Auth: Add fallback for tokens stored under the previously used key
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 14:51:51 +01:00
Michael Mayer
ba83fcedfb Albums: Prevent the same albums from being created twice #4849
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 12:00:30 +01:00
Michael Mayer
34f3d9eac1 Slugs: Use base32 encoding for slugs that don't contain text #4761
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 11:57:53 +01:00
Michael Mayer
f1d9e85a8f Sharing: Don't use the album UID twice in the redirect URL
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 11:52:46 +01:00
Michael Mayer
7489dbbed5 UX: Brighten "selected" color of Nordic theme in options/themes.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 11:51:19 +01:00
Michael Mayer
08b550143e UX: Increase background opacity of warning notifications in vuetify.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 11:50:33 +01:00
Michael Mayer
e621c0237a UX: Set contain styles for list and cards view results
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 11:49:49 +01:00
Michael Mayer
37a27b2957 UX: Use overlay when mobile navigation drawer is open
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 11:48:38 +01:00
Michael Mayer
5fa02a723a Frontend: Use canonical key for localStorage
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 11:46:15 +01:00
Michael Mayer
eee392cf08 UX: Scroll to the top instantly to avoid rendering issues
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-19 11:10:54 +01:00
Michael Mayer
4589c0de28 UX: Adjust .p-page__loading styles for cluster view im Places
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 18:12:26 +01:00
Michael Mayer
efe2fd502a Albums: Apply default sort order when uploading to a new album #405
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 16:48:00 +01:00
graciousgey
e09a166b64 Tests: Adapt acceptance tests to changes 2025-03-18 15:46:11 +01:00
graciousgrey
f4af470894 Tests: Add unit tests 2025-03-18 15:20:51 +01:00
graciousgrey
e7bed76656 Tests: Add unit tests 2025-03-18 14:49:49 +01:00
Michael Mayer
8c4bd1f3ed API: Add unit tests for DownloadName() and AlbumDownloadName() #4344
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 14:48:06 +01:00
Michael Mayer
56790b4183 Albums: Always update album contents when an album is updated
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 14:00:39 +01:00
Michael Mayer
dd18401d82 WebDAV: Add "failed" state for files that cannot be synchronized #4827
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 11:53:56 +01:00
rubyisrust
6dce52643c chore: make function comment match function name
Signed-off-by: rubyisrust <rustrover@icloud.com>
2025-03-18 10:00:49 +01:00
Michael Mayer
dfe8c2e14b Dependencies: Update NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 09:11:29 +01:00
Michael Mayer
231a046c6b Backend: Upgrade "github.com/golang/geo" in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 09:08:54 +01:00
Michael Mayer
28032d9d2b Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 09:08:54 +01:00
Michael Mayer
f9bb349bbb Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 09:08:54 +01:00
Weblate
b288d02dc2 Weblate: Update frontend translations 2025-03-18 09:05:59 +01:00
Michael Mayer
042438eed0 Frontend: Regenerate *.po files in /src/locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 09:01:40 +01:00
Michael Mayer
57060844ba Auth: Improve user model and search in backend and frontend
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 09:00:50 +01:00
Michael Mayer
772a850e1a UX: Update categories available in feedback form
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 08:56:48 +01:00
Michael Mayer
6128bf4e47 Config: Require MariaDB v11.4 to use SSL for backups #4837
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 08:55:27 +01:00
Michael Mayer
8aa0cc95ea Config: Fix and improve database version detection #4837
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 08:38:18 +01:00
Michael Mayer
b7874a9880 UX: Improve input validation in feedback form
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 08:36:02 +01:00
Michael Mayer
9ab5ff91e4 UX: Add utility class to detect, request, and exit fullscreen mode #4839
This will also exit fullscreen mode in Places before unmount.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-18 06:28:04 +01:00
Michael Mayer
4ba17f36d1 Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 19:29:30 +01:00
Weblate
76b8690b96 Weblate: Update backend translations 2025-03-17 19:28:17 +01:00
Weblate
b560f0deab Weblate: Update frontend translations 2025-03-17 19:28:00 +01:00
Michael Mayer
6d8c704979 Viewer: Exit fullscreen mode only if it was not previously enabled #4839
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 18:38:43 +01:00
Michael Mayer
1291944e11 Viewer: Improve full screen toggle and browser detection #4839
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 18:32:32 +01:00
Michael Mayer
f81a945e74 Albums: Add settings to set a default sort order for each type #405
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 17:53:33 +01:00
Michael Mayer
17c7765f6a Cards View: Don't use filename as title if showTitles is true #1164
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 16:56:29 +01:00
Michael Mayer
d0239ba209 UX: Improve quota calculation and checks in config and api #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 16:12:47 +01:00
Michael Mayer
3a5fc5c512 Backups: Remove empty lines from photoprism/backup/database.go #4837
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 13:26:49 +01:00
Michael Mayer
898224a4c1 Frontend: Regenerate *.po files in src/locales #577
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 13:25:33 +01:00
Michael Mayer
940194ab1c Backups: Detect server version to determine SSL support #4837
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 13:23:43 +01:00
Michael Mayer
9af3478f71 Albums: Reload pictures when the album sort order has changed #405
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 11:25:06 +01:00
Michael Mayer
8187182c4a Develop: Upgrade base image from 250310-oracular to 250317-oracular
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-17 11:10:11 +01:00
Michael Mayer
fc6513ad21 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-16 17:02:48 +01:00
Michael Mayer
5e8d7c1e01 Frontend: Regenerate *.po files in src/locales #577
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-16 17:02:38 +01:00
Weblate
32572ed38c Weblate: Update frontend translations 2025-03-16 17:00:44 +01:00
Michael Mayer
5887479f49 UX: Reorder UI settings in page/settings/general.vue #577
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-16 16:59:58 +01:00
Michael Mayer
cb24de4fc8 Frontend: Update tests/unit/model/photo_test.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-16 16:23:34 +01:00
Michael Mayer
328d51ee41 Albums: Add settings for downloading album archives #4344 #405
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-16 16:10:47 +01:00
Michael Mayer
23a66d52f9 UX: Remove unused td.meta-data button style in views.css #4727
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-16 14:36:55 +01:00
Michael Mayer
9178c37930 UX: Hide list view table header on very small screens #1164 #4727
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-16 13:23:03 +01:00
Michael Mayer
35b42a116d UX: Improve result selection in list view #1164 #4727
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-16 13:13:46 +01:00
Michael Mayer
cf428e3245 UX: Allow display of disk usage information in demo mode #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 18:46:40 +01:00
Michael Mayer
79e6ebaf4f UX: Update icon for PDF documents in search results #4600
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 16:31:18 +01:00
Michael Mayer
5b300d6764 UX: Update browse route handling in common/config.js #577
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 16:06:46 +01:00
Michael Mayer
5496cd06a3 UX: Allow guests to choose a start page as well #577
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 16:01:55 +01:00
Michael Mayer
4a6d3a9bd8 UX: Redirect users accessing /library/ to the default route #577
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 15:44:20 +01:00
Michael Mayer
6275539412 Frontend: Update src/locales/translations.json #577
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 14:52:36 +01:00
Michael Mayer
0350e5d572 UX: Add UI settings for selecting start page and time zone #577
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 14:51:44 +01:00
Weblate
32cbd1ade9 Weblate: Update frontend translations 2025-03-15 14:48:00 +01:00
Michael Mayer
aef8f4e8ce Frontend: Regenerate *.po files in src/locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 14:43:16 +01:00
graciousgey
599e3683c1 Tests: Add classes for testing 2025-03-15 13:39:37 +01:00
Weblate
8c551d2871 Weblate: Update frontend translations 2025-03-15 12:54:00 +01:00
Michael Mayer
faaf541979 Frontend: Regenerate *.po files in src/locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 12:49:06 +01:00
Michael Mayer
4c30f6fd2f Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 11:26:58 +01:00
Michael Mayer
ea90be0ce9 Settings: Update frontend/src/locales/translations.json #1164
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-15 11:26:48 +01:00
Weblate
867a2653ce Weblate: Update frontend translations 2025-03-15 11:24:12 +01:00
Michael Mayer
47f99ea2b6 Settings: Update frontend/src/locales/translations.json #1164
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 16:16:20 +01:00
Weblate
62c6578a16 Weblate: Update frontend translations 2025-03-14 16:15:11 +01:00
Michael Mayer
4537fc6129 Settings: Update frontend/src/locales/translations.json #1164
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 16:13:35 +01:00
Weblate
a5b41dbf84 Weblate: Update frontend translations 2025-03-14 16:13:07 +01:00
Michael Mayer
4af1ab6a76 UX: Update usage hint texts in Settings > Content #1164
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 16:09:42 +01:00
Michael Mayer
012f579305 Settings: Update frontend/src/locales/translations.json #1164
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 16:04:54 +01:00
Weblate
46475678ad Weblate: Update frontend translations 2025-03-14 16:03:57 +01:00
Michael Mayer
4357f8e732 UX: Make information shown on cards view configurable #1164
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 16:01:05 +01:00
Michael Mayer
72a8a9f801 Settings: Update icons for "Content" and "Disable ExifTool" #405 #4344
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 12:55:51 +01:00
Michael Mayer
88a7a31cbf Settings: Update frontend/src/locales/translations.json #405 #4344
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 12:38:55 +01:00
Weblate
0b65e8491b Weblate: Update frontend translations 2025-03-14 12:38:29 +01:00
Michael Mayer
994b30ad49 Settings: Update frontend/src/locales/translations.json #405 #4344
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 12:34:28 +01:00
Weblate
bf409c2c20 Weblate: Update frontend translations 2025-03-14 12:33:05 +01:00
Michael Mayer
8d049155ca Settings: Rename "Library" tab to "Content" and add redirect #405 #4344
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 12:30:04 +01:00
Michael Mayer
eae5d97a43 Frontend: Regenerate *.po files in src/locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 12:25:44 +01:00
Michael Mayer
a2b5bd8a14 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 12:11:09 +01:00
Michael Mayer
982e5ae1c8 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 12:10:50 +01:00
Michael Mayer
646beba018 Frontend: Regenerate *.po files in src/locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 12:10:30 +01:00
Michael Mayer
23c7d22d23 Frontend: Add additional link URLs to common/links.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 11:09:26 +01:00
Michael Mayer
86a7d21c6b Frontend: Add documentation link URLs to common/links.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 10:44:39 +01:00
Michael Mayer
2a9d9f1584 UX: Remove Settings from the action menu in component/photo/toolbar.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-14 10:09:00 +01:00
NinaLua
b3ad0e5b92 refactor: using slices.Contains to simplify the code
Signed-off-by: NinaLua <iturf@sina.cn>
2025-03-14 10:06:09 +01:00
Michael Mayer
2440c5424d Frontend: Refactor album toolbar styles in toolbar.vue and pages.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 15:57:32 +01:00
Michael Mayer
262f2abc9e Frontend: Optimize page toolbar title styles in src/css/pages.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 12:21:06 +01:00
Michael Mayer
6020b3158c Frontend: Update locale dir tests in unit/common/config_test.js #4778
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 11:31:19 +01:00
Michael Mayer
e2054f3d62 Backend: Upgrade github.com/zitadel/oidc/v3 in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 11:08:41 +01:00
Michael Mayer
4cb60f156c Frontend: Add reusable <p-action-menu> component #4830 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 10:25:52 +01:00
Michael Mayer
85c079caba Frontend: Replace PPhotoDeleteDialog with standard PConfirmDialog #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 08:27:33 +01:00
Michael Mayer
762a9978bc Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 08:11:35 +01:00
Michael Mayer
b90c946811 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 08:03:08 +01:00
Michael Mayer
c2f8a642d7 Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 08:01:25 +01:00
Weblate
e2aa6362fb Weblate: Update frontend translations 2025-03-13 08:00:41 +01:00
Michael Mayer
ea8d2a1f5f Frontend: Rename component/confirm/action.vue to dialog.vue #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 07:59:36 +01:00
Michael Mayer
e5c67a0563 UX: Increase font size of .v-table footer in css/vuetify.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 07:57:56 +01:00
Michael Mayer
a5f15a7116 Frontend: Apply locale settings only once during initialization #4778
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-13 07:38:46 +01:00
Weblate
088ef815ce Weblate: Update backend translations 2025-03-12 20:31:21 +01:00
Michael Mayer
b4e082f56b UX: Refactor toolbar inputs and buttons with a three-dot menu #4830
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-12 20:12:39 +01:00
Weblate
e9e0d3ff3f Weblate: Update frontend translations 2025-03-12 20:09:32 +01:00
Michael Mayer
376099a0d0 Frontend: Regenerate *.po files in src/locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-12 20:03:27 +01:00
graciousgrey
a3067a8887 Tests: Add unit tests 2025-03-12 16:34:28 +01:00
Michael Mayer
9936c21aeb Documents: Update search queries and filter documentation #4600
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-12 04:48:15 +01:00
Michael Mayer
f747211017 Library: Add support for indexing PDF documents #4600
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-12 04:26:04 +01:00
Weblate
a3914d6098 Weblate: Update frontend translations 2025-03-12 04:19:37 +01:00
Michael Mayer
5ad5f7447f Frontend: Regenerate *.po files in src/locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-12 04:03:10 +01:00
Michael Mayer
7f0717e9a0 Auth: Prevent login if additional accounts may not be created #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-12 01:08:16 +01:00
Michael Mayer
bfc6cb2351 Frontend: Update .map-background gradient in src/css/places.css #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-12 00:36:02 +01:00
Michael Mayer
99eae989d0 Frontend: Update .map-background styles in src/css/places.css #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-12 00:21:06 +01:00
Michael Mayer
eb489d420a Frontend: Simplify styles in src/css/places.css #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-12 00:01:57 +01:00
Michael Mayer
56f1c06300 Places: Adjust brightness of small stars in 3D Earth view #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 23:59:32 +01:00
Michael Mayer
bcea7ac078 Places: Increase brightness of small stars in 3D Earth view #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 23:55:15 +01:00
Michael Mayer
eb9371d089 WebDAV: Skip download sync if storage is full or quota is exceeded #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 23:45:41 +01:00
Michael Mayer
c3d22c157c Places: Add night sky background with stars for 3D Earth view #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 23:09:06 +01:00
Michael Mayer
bed5ed2760 Frontend: Regenerate src/locales/translations.json #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 21:00:43 +01:00
Weblate
70651b29b1 Weblate: Update frontend translations 2025-03-11 21:00:06 +01:00
Michael Mayer
de5072a73d Frontend: Improve error messages for exceeded storage size #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 20:57:11 +01:00
Weblate
bf5b70e8b9 Weblate: Update backend translations 2025-03-11 20:37:30 +01:00
Michael Mayer
a66d3278ab API: Prevent file imports/uploads if there is no free storage #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 20:35:07 +01:00
Michael Mayer
0e3c365cac UX: Improve lavender theme notification colors
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 19:40:22 +01:00
Michael Mayer
94a4d17f49 UX: Improve snackbar notification styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 19:22:59 +01:00
Michael Mayer
ea428f8f20 Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 18:11:53 +01:00
Weblate
4ec95ca6ca Weblate: Update frontend translations 2025-03-11 18:11:19 +01:00
Weblate
3fa937f489 Weblate: Update backend translations 2025-03-11 18:10:28 +01:00
Michael Mayer
44fc11b537 UX: Improve alert and notification styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 18:06:24 +01:00
Michael Mayer
7a97b38cb3 UX: Specify files quota in GB instead of MB #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 18:04:10 +01:00
Michael Mayer
6eec12c8c9 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 18:00:27 +01:00
Michael Mayer
71c89ce407 CI: Upgrade TestCafe to v3.7.2 in scripts/dist/install-nodejs.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 17:59:54 +01:00
Michael Mayer
2f2915451e Frontend: Regenerate *.po files in src/locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 17:59:05 +01:00
Michael Mayer
f0eb7828e3 Backend: Regenerate *.po files in /assets/locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 17:58:12 +01:00
Michael Mayer
08b3cabad6 UX: Improve data table and pagination styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-11 10:45:31 +01:00
graciousgrey
006ed32838 Tests: Add unit tests #4848 2025-03-10 19:03:59 +01:00
Michael Mayer
8f6880b034 UX: Show lens details after camera information in Cards results view
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 18:04:31 +01:00
Michael Mayer
c35567d1c7 Backend: Regenerate assets/locales/*/*.po files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 17:38:13 +01:00
Michael Mayer
114a51ccae UX: Enable disk usage information in development environment #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 17:36:39 +01:00
Michael Mayer
ed9a14b609 Search: Use component v-progress-circular for loading animation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 17:35:48 +01:00
graciousgrey
ad3b00f009 Tests: Add unit tests #4266 2025-03-10 17:33:00 +01:00
Michael Mayer
de734148d2 UX: Improve camera information in Cards results view
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 16:31:04 +01:00
Michael Mayer
df09c78ee1 Videos: Add "codec" search filter and auto-enable nvidia encoder #4848
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 14:30:25 +01:00
Michael Mayer
587867a41a Backend: Regenerate assets/locales/*/*.po
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 13:16:09 +01:00
graciousgrey
6532054950 Frontend: Add show new faces button to no-result view 2025-03-10 13:11:13 +01:00
Michael Mayer
bf5c66b660 UX: Always show image size information in Cards results view
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 12:51:15 +01:00
Michael Mayer
478ba483d2 Develop: Upgrade base image from 250221-oracular to 250310-oracular
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 11:24:52 +01:00
Michael Mayer
d08eab37e9 Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 11:23:06 +01:00
Weblate
368dc135e5 Weblate: Update frontend translations 2025-03-10 11:22:21 +01:00
Michael Mayer
5c4c7011e5 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 11:20:39 +01:00
Michael Mayer
38a921d14a Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-10 11:20:04 +01:00
Weblate
f652159522 Weblate: Update frontend translations 2025-03-05 22:08:06 +01:00
Weblate
05a88780f7 Weblate: Update backend translations 2025-03-04 08:35:27 +01:00
Michael Mayer
b1de2b70f4 Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-04 08:34:11 +01:00
Michael Mayer
8f914e293e Backend: Regenerate assets/locales/*/*.po #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-04 08:34:01 +01:00
Weblate
b3e6656893 Weblate: Update frontend translations 2025-03-04 08:32:17 +01:00
Michael Mayer
e298cb42b6 Backend: Regenerate assets/locales/messages.pot #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-04 08:30:35 +01:00
Michael Mayer
b1d9f24fc5 Config: Disable uploads and imports when storage is full #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-04 08:28:28 +01:00
graciousgey
580cfbe078 Tests: Improve acceptance test to be stable 2025-03-04 08:00:54 +01:00
Michael Mayer
ace90d95a4 Config: Refactor filesystem usage detection and add tests #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-03 21:05:08 +01:00
Michael Mayer
fbdd621111 Config: Fix total disk space calculation in config_usage.go #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-03 20:28:20 +01:00
Michael Mayer
2dba0fdeab Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-03 20:12:57 +01:00
Michael Mayer
3d63ea3586 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-03 20:12:30 +01:00
Weblate
062739ed77 Weblate: Update frontend translations 2025-03-03 20:11:24 +01:00
Michael Mayer
c2cc50b670 Config: Add option to show filesystem usage in sidebar navigation #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-03 20:05:56 +01:00
Michael Mayer
abfb19bd63 UX: Improve "Nordic" theme colors in frontend/src/options/themes.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-03 19:58:52 +01:00
graciousgrey
81c025442a Tests: Add acceptance tests 2025-03-03 18:56:28 +01:00
Michael Mayer
59bb5e0bdb UX: Add box-shadow to page navigation in css/pages.css #4830
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-03 13:44:20 +01:00
Michael Mayer
e1a9a68b29 FS: Add /pkg/fs/duf to determine mount points and disk usage #4266
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-03 11:24:30 +01:00
Michael Mayer
5c1b0ba96b Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-02 19:15:21 +01:00
Weblate
219ccfe8dd Weblate: Update frontend translations 2025-03-02 19:13:05 +01:00
Michael Mayer
a146e2ed99 Frontend: Update src/locales/*.po files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-02 19:11:32 +01:00
Michael Mayer
71a4376565 Frontend: Regenerate src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-02 14:28:04 +01:00
Weblate
a4d149c64c Weblate: Update frontend translations 2025-03-02 14:26:58 +01:00
Michael Mayer
c42f88ace0 UX: Dynamically set position of scroll-to-top button #4830
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-02 14:22:00 +01:00
Michael Mayer
e0e422e8f1 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-02 13:49:29 +01:00
Michael Mayer
1574a4e16f UX: Make page tabs and toolbars sticky so they remain visible #4830
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-02 13:49:12 +01:00
Michael Mayer
43447fa381 Places: Improve search map control styles in css/places.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-27 23:50:41 +01:00
Michael Mayer
26e69210e9 Frontend: Perform all redirects via $view.redirect()
This allows for centralized logging and better validation.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-27 23:49:57 +01:00
graciousgrey
5dcadf1028 Tests: Add unit tests #4820 2025-02-27 17:24:45 +01:00
Michael Mayer
e9160117a3 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-27 09:46:37 +01:00
Michael Mayer
258642b9ac Videos: Assume that .m4v files are compatible with MP4 #4820
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-27 09:37:57 +01:00
Michael Mayer
4a4e45eb59 Docs: Fix broken link in docker/README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-26 09:45:46 +01:00
Michael Mayer
bc9c1205ee UX: Show fullscreen toggle on mobile devices in experimental mode #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-25 16:51:40 +01:00
Michael Mayer
04ca62dd70 UX: Allow pictures to be removed and archived from albums #3442
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-25 15:32:44 +01:00
Michael Mayer
9ff4face56 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-25 13:20:03 +01:00
Weblate
413ad74611 Weblate: Update backend translations 2025-02-25 13:18:34 +01:00
Michael Mayer
69290b1ab1 Lightbox: Make content preloading less eager #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-25 12:57:41 +01:00
Michael Mayer
cb9826de96 UX: Disable upload to WebDav button if sharing is disabled
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-25 11:48:32 +01:00
Michael Mayer
78f5104020 Thumbs: Add "fit_5120" size suitable for Retina 5K displays #4810
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-25 11:21:38 +01:00
Michael Mayer
220b914ae0 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-25 11:08:26 +01:00
Michael Mayer
1b0c3c804e Places: Keep scrollbar hidden when opening the cluster view #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-25 11:06:35 +01:00
Michael Mayer
834c16bc76 Lightbox: Show zoom-in cursor only if content is zoomable #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-24 10:42:33 +01:00
Michael Mayer
971f39d4ae Demo: Increase the size limit for pre-rendered thumbs from 2560 to 4096
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-24 10:30:23 +01:00
Michael Mayer
f68cbbbb5c Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-24 09:47:14 +01:00
Michael Mayer
36f17da07f Docs: Regenerate license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-24 09:45:21 +01:00
Michael Mayer
19134f4db7 Frontend: Regenerate src/locales/*.po files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-24 09:43:31 +01:00
Michael Mayer
79c00fbb8d Merge branch 'preview' into develop 2025-02-24 09:39:46 +01:00
Michael Mayer
ea32ef6970 UX: Change thumbnail size calculation for improved performance #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-24 09:39:13 +01:00
Michael Mayer
cb659dd54e Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-24 09:35:10 +01:00
Weblate
69a4979816 Weblate: Update frontend translations 2025-02-23 13:31:09 +01:00
Michael Mayer
b79d219079 Frontend: Update test assertions in uni/model/rest_test.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 19:46:40 +01:00
Michael Mayer
0322d7c911 Frontend: Increase result count limit to 100000 in model/rest.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 15:50:20 +01:00
Michael Mayer
0b6dbe4e3e Services: Fix upload dialog and permission checks #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 15:40:05 +01:00
Michael Mayer
5e4357c02d Albums: Refactor permission check in internal/api/albums.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 14:49:58 +01:00
Michael Mayer
fa487ed64a Albums: Fix GET /albums/{uid} and GET /photos API permission checks
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 14:40:35 +01:00
Michael Mayer
102ca2e28f UX: Increase input placeholder opacity to 0.6 in vuetify.css #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 14:10:37 +01:00
Michael Mayer
5f7338afad Session: Reduce default redirect delay from 100ms to 50ms #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 14:06:12 +01:00
Michael Mayer
0a1321bda2 UX: Improve Lavender theme colors #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 14:02:42 +01:00
Michael Mayer
a383f2c69b Frontend: Fix permission check for /archive route #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 11:48:27 +01:00
Michael Mayer
7248e7e44c UX: Improve Lavender theme colors #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 11:47:45 +01:00
Michael Mayer
07760fd36b Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 11:36:56 +01:00
Michael Mayer
407c366b28 UX: Improve Lavender and Places theme colors #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 11:36:28 +01:00
graciousgey
994e3fe5e1 Tests: Adapt acceptance tests 2025-02-22 10:11:34 +01:00
Michael Mayer
595cb18f42 Places: Increase control opacity in src/css/places.css #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 00:38:56 +01:00
Michael Mayer
104ca09f33 Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 00:29:45 +01:00
Weblate
d43cadc4ca Weblate: Update frontend translations 2025-02-22 00:29:01 +01:00
Michael Mayer
a0854443de Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 00:25:44 +01:00
Michael Mayer
070e98f88c Frontend: Regenerate src/locales/*.po files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 00:24:34 +01:00
Michael Mayer
20efb55a22 UX: Improve login redirects and route permission checks #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-22 00:19:01 +01:00
Michael Mayer
20bf524a52 UX: Improve input element focus and keyboard event handling #1131 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 22:06:34 +01:00
Michael Mayer
548368be0d Frontend: Set tabindex and fix autofocus in page/auth/login.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 09:53:43 +01:00
Michael Mayer
c9a0392922 Frontend: Refactor Set() function in src/options/themes.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 09:29:18 +01:00
Michael Mayer
a220370a90 Develop: Update license NOTICE files for Go and frontend dependencies
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 07:04:57 +01:00
Michael Mayer
3145697543 Develop: Upgrade base image from 250217-oracular to 250221-oracular
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 06:24:14 +01:00
Michael Mayer
394c0438fe Lightbox: Improve display of elapsed and remaining video duration #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 05:47:06 +01:00
Michael Mayer
76be526860 Build: Update scripts/dist/install-s6.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 02:45:42 +01:00
Michael Mayer
97e6e83e41 Build: Replace "wget" with "curl" in dist scripts
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 02:32:13 +01:00
Michael Mayer
69b91606ca Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 02:25:15 +01:00
Weblate
0d5af1244f Weblate: Update frontend translations 2025-02-21 02:24:40 +01:00
Michael Mayer
186dd19c7c Frontend: Regenerate src/locales/*.po files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 02:23:17 +01:00
Michael Mayer
8f49536afa Config: Refactor theme initialization in frontend/src/options/themes.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 02:22:29 +01:00
Michael Mayer
99d515a6e5 Docker: Add "xz-utils" package as required to install from GitHub
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 01:40:59 +01:00
Michael Mayer
bf543232d6 CI: Update scripts/dist/install-s6.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 01:30:54 +01:00
Michael Mayer
a4255da6eb CI: Remove --entrypoint flag from package build commands
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-21 01:21:06 +01:00
Michael Mayer
18621ede1b UX: Improve "Chrome" and "Gemstone" theme colors #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 21:42:37 +01:00
Michael Mayer
43c35a5dbe UX: Reduce avatar image size in account.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 21:42:04 +01:00
Michael Mayer
eb214b832f UX: Improve theme colors #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 19:00:43 +01:00
Michael Mayer
9bf587ba45 Server: Remove IdleTimeout from default server configuration #4799
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 16:35:30 +01:00
Michael Mayer
0075c73d06 Docker: Increase Traefik read timeout from 1h to 3h
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 16:34:17 +01:00
Michael Mayer
cbd42e4212 UX: Improve slider control style defaults #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 15:47:18 +01:00
Michael Mayer
e6bde2d3d3 Frontend: Regenerate src/locales/*.po
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 14:59:51 +01:00
Michael Mayer
567853f3eb UX: Add titles to lightbox controls and improve video time display #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 14:58:52 +01:00
Michael Mayer
640f951e00 UX: Refactor search result view button available in selection mode #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 13:15:46 +01:00
Michael Mayer
8e2da9c510 UX: Adjust private and shared icon styles for LTR/RTL languages #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 12:18:04 +01:00
Michael Mayer
e479f1b5ef UX: Improve styles and metadata for cards and mosaic view #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 11:59:54 +01:00
Michael Mayer
ba8b90b9e1 Frontend: Regenerate src/locales/*.po and translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 11:57:30 +01:00
Michael Mayer
549a92a0ac Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-20 11:56:58 +01:00
Michael Mayer
213c86ceca Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 18:24:46 +01:00
Michael Mayer
2576f7b397 Config: Update information about facial recognition options
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 18:12:05 +01:00
Michael Mayer
a501530bbe Config: Update information about facial recognition options
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 18:07:31 +01:00
Michael Mayer
9273803dc2 Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 18:00:15 +01:00
Weblate
c2f056924e Weblate: Update frontend translations 2025-02-19 17:59:44 +01:00
Michael Mayer
814b4fb28b Config: Update information about facial recognition options
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 17:57:09 +01:00
Michael Mayer
cde8d86260 Config: Update information about facial recognition options
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 16:07:21 +01:00
Michael Mayer
b0733f5f7c Lightbox: Increase .p-lightbox__controls padding #1307 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 16:01:35 +01:00
Michael Mayer
5e0070e780 Frontend: Regenerate src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 13:55:50 +01:00
Michael Mayer
7c0285a9f4 Frontend: Regenerate src/locales/*.po files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 13:53:54 +01:00
Michael Mayer
4b3df6dbae UX: Refactor copy-to-clipboard functionality #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 13:53:13 +01:00
Michael Mayer
6b8fd031f7 Frontend: Update src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 12:45:03 +01:00
Weblate
01c06d1828 Weblate: Update frontend translations 2025-02-19 12:44:05 +01:00
Michael Mayer
88ead8c5b8 Lightbox: Improve error handling for video playback #1307 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 12:41:16 +01:00
Michael Mayer
5087451847 Frontend: Refactor reload in src/component/update.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 11:11:13 +01:00
Michael Mayer
3220834e92 Server: Ensure that there is no default read or write timeout #4799
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 10:37:59 +01:00
Michael Mayer
688b1586eb Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 10:14:07 +01:00
Michael Mayer
bd88452715 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 10:13:43 +01:00
Michael Mayer
7ef7f4b73c Lightbox: Improve image loading and preloading #1307 #4704
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 10:07:48 +01:00
Michael Mayer
7a5301c2f9 Upload: Update search results after uploading files #4799
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-19 08:00:36 +01:00
graciousgrey
343260b10d Docs: Add info about face parameters 2025-02-18 15:12:00 +01:00
Michael Mayer
913a25dfa6 Frontend: Update translation files in src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-18 13:05:28 +01:00
Michael Mayer
aea77e66f6 UX: Prevent update dialog from opening behind lightbox #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-18 12:58:11 +01:00
Michael Mayer
a0e391de0a Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-18 11:19:46 +01:00
Michael Mayer
3aa4af9ea6 Windows: Fix generated HTTPS resource string in WebDAV dialog #4798
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-18 11:18:10 +01:00
Michael Mayer
c171a43a43 UX: Refactor touch support and RTL language detection #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-18 11:07:43 +01:00
Michael Mayer
fc1fb9f8b9 UX: Let PhotoSwipe handle the left and right 30% of the screen #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-18 10:07:08 +01:00
Michael Mayer
8bd03710aa Backend: Regenerate assets/locales/*.po
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 21:18:23 +01:00
Michael Mayer
a5edb921da Frontend: Update translation files in src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 21:17:58 +01:00
Michael Mayer
9dc7b789ac Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 21:17:19 +01:00
Michael Mayer
00718891c4 Frontend: Move webpack-bundle-analyzer to dependencies #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 21:15:58 +01:00
Michael Mayer
86da0c084a Frontend: Refactor pub/sub library import #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 21:11:11 +01:00
Michael Mayer
0ef4694cd2 Frontend: Add "build-analyze" script to package.json #4778
see https://www.npmjs.com/package/webpack-bundle-analyzer

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 20:01:52 +01:00
Michael Mayer
a92a80a2fc Frontend: Add "build-dev" script to package.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 18:54:42 +01:00
Michael Mayer
424ac2080d Lightbox: Fix slide direction reversal for RTL languages #1307 #4702
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 17:02:05 +01:00
Michael Mayer
3717016fc7 Docker: Fix typo in develop/bookworm-slim/Dockerfile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 16:35:59 +01:00
Michael Mayer
c3cf502366 Lightbox: Reverse slide direction if right-to-left language #1307 #4702
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 16:34:09 +01:00
Michael Mayer
b782137a71 Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 15:57:14 +01:00
Michael Mayer
5d2e2d1339 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 15:55:59 +01:00
Michael Mayer
d357643b6c Docker: Add install-dircolors.sh script to customize terminal colors
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 14:58:50 +01:00
Michael Mayer
eab93cb4a6 Frontend: Reformat test files with eslint #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 13:39:20 +01:00
Michael Mayer
fc9f877bab Frontend: Add .eslintignore and reformat .vue files with eslint #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 13:35:02 +01:00
Michael Mayer
89e716839e Develop: Upgrade base image from 250204-oracular to 250217-oracular
The new base image comes with Go v1.24.0 instead of v1.23.x.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 12:04:40 +01:00
Michael Mayer
8f6ce848eb Traefik: Set explicit read and write timeouts #3168
see https://github.com/photoprism/photoprism-docs/pull/193

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 12:03:17 +01:00
Michael Mayer
981a719ad7 Frontend: Update src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-17 11:17:29 +01:00
Weblate
39f719fa7b Weblate: Update backend translations 2025-02-15 20:37:50 +01:00
Weblate
fdb937403c Weblate: Update frontend translations 2025-02-15 20:34:16 +01:00
Michael Mayer
5ca2be372e UX: Let PhotoSwipe handle the left and right 20% of the screen #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-13 18:45:13 +01:00
Michael Mayer
e8307a35ea Lightbox: Flag videos remote playback as experimental #1307 #3372 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-13 17:08:41 +01:00
Michael Mayer
1458a761e7 Frontend: Update translations.json and package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-13 16:42:11 +01:00
Weblate
2b60a9017f Weblate: Update frontend translations 2025-02-13 16:38:15 +01:00
Michael Mayer
8db4189230 Config: Update PWA manifest #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-13 16:36:28 +01:00
Michael Mayer
4bf386d425 Frontend: Regenerate translation .po files #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-13 16:35:16 +01:00
Michael Mayer
b743191240 Lightbox: Add remote playback control for videos #1307 #3372 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-13 16:34:18 +01:00
Michael Mayer
d8061da96c Frontend: Refactor dialog initialization and focus #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-13 16:30:24 +01:00
Michael Mayer
7b4d897a3c Frontend: Fix "show password" button in settings dialogs #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-13 11:11:01 +01:00
Michael Mayer
c332a4ad5f Lightbox: Fix live photo position for RTL languages #1307 #3372 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-12 22:15:50 +01:00
Michael Mayer
b6cd4b765e Lightbox: Prevent flickering when playing animations #1307 #3372 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-12 18:32:46 +01:00
Michael Mayer
11bbbe764e UX: Refactor lightbox and view.js to make navigation more robust #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-12 18:02:49 +01:00
Michael Mayer
7e7ce6bddd Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-12 16:45:00 +01:00
Michael Mayer
1f3e573329 UX: Decrease the size of the mobile navigation logo #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-12 16:43:37 +01:00
Michael Mayer
a651bdf25d UX: Don't scroll when page gets initial focus #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-12 16:43:07 +01:00
Michael Mayer
0104317036 Lightbox: Add zoom support for live photos #1307 #3372 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-12 16:42:01 +01:00
Michael Mayer
a6fe894b10 Lightbox: Refactor image size change callback #1307 #3372 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-12 01:06:49 +01:00
Michael Mayer
3da4d12eb1 UX: Play current video when starting a slideshow #1307 #3372 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-12 01:03:09 +01:00
Michael Mayer
a3040502f5 UX: Improve playback of videos and live photos #1307 #3372 #4698
These changes add custom video controls (including an overlay play
button) and make live photos end with the image that belongs to the
video, rather than looping the video as before.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-12 00:12:07 +01:00
Michael Mayer
40b4ab8020 UX: Add Ctrl-F and Ctrl-R keyboard shortcuts for search and reload #1131
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-11 14:35:18 +01:00
Michael Mayer
2351133b80 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-11 13:52:11 +01:00
Michael Mayer
294ed82236 UX: Automatically give focus to the currently active component #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-11 13:51:53 +01:00
Michael Mayer
7ca2f80544 Update .gitignore file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-11 10:42:22 +01:00
Michael Mayer
2d8a3a53c7 Frontend: Reformat .js files with "npm run fmt" #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-11 10:20:35 +01:00
Michael Mayer
fb04b0e25d Frontend: Refactor dialogs and lightbox #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-10 19:06:04 +01:00
graciousgrey
341dfca4df Tests: Adapt acceptance test to run with native automation as this is required to test the updated places view 2025-02-10 18:57:18 +01:00
Michael Mayer
a402ac038d Frontend: Refactor console logs #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-10 11:54:05 +01:00
Michael Mayer
e312b35924 UX: Refactor webkit scrollbar styles to depend on theme #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-10 11:41:17 +01:00
Michael Mayer
14a5cdb668 UX: Refactor lightbox open and close event handling #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-10 11:40:27 +01:00
Michael Mayer
11174bc2c2 Frontend: Change :model-value to v-model in lightbox.vue #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 20:18:26 +01:00
Michael Mayer
9188f01663 Lightbox: Add afterLeave action to open edit dialog #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 19:55:50 +01:00
Michael Mayer
d3e8a67227 UX: Use event to close dialog in lightbox #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 19:43:42 +01:00
Michael Mayer
2a0914c696 UX: Remove focused and autofocus from labels.vue and people.vue #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 19:22:26 +01:00
Michael Mayer
75726c3a9d UX: Disable dialog and overlay transitions in vuetify.css #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 19:10:05 +01:00
Michael Mayer
3696885a98 UX: Disable VDialog and VImg transitions in defaults.js #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 18:42:44 +01:00
Michael Mayer
a6c591f5ba UX: Remove computed markers property from edit/people.vue #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 18:29:30 +01:00
Michael Mayer
8e532a17ab UX: Revert watch changes in component/photo/edit/dialog.vue #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 18:20:12 +01:00
Michael Mayer
394012c9bc UX: Remove computed properties in photo edit dialog #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 18:02:08 +01:00
Michael Mayer
97b948946f UX: Refactor modal dialog styles #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 17:40:20 +01:00
Michael Mayer
7760347e5b Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 14:27:30 +01:00
Michael Mayer
e6c881cc72 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 14:27:07 +01:00
Michael Mayer
a2958b8532 UX: Fix overlay scroll behavior #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 14:26:46 +01:00
Michael Mayer
9cccb9951c UX: Increase size of "Back to top" button #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-09 11:30:32 +01:00
Michael Mayer
de81c14715 UX: Prevent touch start events in 30px distance to the left #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 23:09:47 +01:00
Michael Mayer
3a24d88458 Frontend: Disable navigation gestures in PLightbox only #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 23:01:34 +01:00
Michael Mayer
308950048f Frontend: Regenerate translations in src/locales/*.po #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 20:34:05 +01:00
Michael Mayer
829c5479c1 Metadata: Update pkg/txt/specialwords.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 20:29:16 +01:00
Michael Mayer
23086364bf Frontend: Rename PViewer to PLightbox #1307 #3168 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 20:26:12 +01:00
Michael Mayer
abf6530288 Frontend: Update form input styles in src/css/vuetify.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 19:53:12 +01:00
Michael Mayer
98978c79ff UX: Prevent text in the sidebar navigation from getting selected #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 19:39:29 +01:00
Michael Mayer
9b2cc02904 Frontend: Change <a :title to v-tooltip in about/footer.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 19:36:41 +01:00
Michael Mayer
37330896bc Frontend: Reformat .vue files with eslint #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 19:35:18 +01:00
Michael Mayer
f94de5513d Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 19:23:27 +01:00
Michael Mayer
505f07c015 Frontend: Refactor photo edit dialog components #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 19:23:17 +01:00
Michael Mayer
86692d3970 Frontend: Refactor component/photo/preview.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 19:22:43 +01:00
Michael Mayer
e1f206916d Frontend: Refactor page/library/errors.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 19:15:26 +01:00
Michael Mayer
b2bdd6a567 Frontend: Refactor settings/password.vue and webdav.vue #4763 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 19:14:46 +01:00
Michael Mayer
8f2218cc55 UX: Improve list styles in /frontend/src/page/library/errors.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 19:11:53 +01:00
Michael Mayer
d5acaad1f5 UX: Use common/view.js to refactor component/photo/edit/*.vue #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 18:56:36 +01:00
Michael Mayer
c470328a2e UX: Add common/view.js to track app context and UI state #4763 #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-08 18:13:21 +01:00
Michael Mayer
abfd9d6a97 Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 18:15:25 +01:00
Michael Mayer
082d633ff0 UX: Increase max-width of arrow navigation buttons in viewer.css #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 15:37:58 +01:00
Michael Mayer
7fb18afa28 UX: Reduce .v-input--density-comfortable padding from 16 to 12px #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 15:37:11 +01:00
Michael Mayer
6cddc7cc63 UX: Refactor window event listeners in src/component/scroll.vue #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 15:36:07 +01:00
Michael Mayer
0ce487b7bf UX: Disable current "pull to refresh" implementation #4777
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 15:35:02 +01:00
graciousgrey
d7995aefa9 Frontend: Update terminal theme color for light themes #3168 2025-02-07 11:32:34 +01:00
Michael Mayer
54eef916bb UX: Check controlsShown to determine visibility of viewer controls #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 04:55:44 +01:00
Michael Mayer
b3360b53f4 Frontend: Update src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 04:41:49 +01:00
Weblate
14b72dfc1a Weblate: Update frontend translations 2025-02-07 04:40:41 +01:00
Michael Mayer
0c50d7be63 Frontend: Regenerate translations in src/locales/*.po #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 04:39:14 +01:00
Michael Mayer
0cc7640f4c Viewer: Change label for sound control from "Sound" to "Mute" #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 04:38:51 +01:00
Michael Mayer
2ff13b97d1 Frontend: Regenerate translations in src/locales/*.po #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 04:33:46 +01:00
Michael Mayer
14c6563923 Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 04:28:16 +01:00
Michael Mayer
d9f03c0113 Frontend: Fix detection of manual changes in src/model/photo.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 04:16:12 +01:00
Michael Mayer
66506cff54 UX: Improve colors and font size in Library > Logs and Errors #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 03:55:00 +01:00
Michael Mayer
e5d42465ce Frontend: Prevent guest users from expanding the navigation drawer #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 03:36:31 +01:00
Michael Mayer
b0d0c159a1 Frontend: Fix broken mobile menu link in component/navigation.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 03:26:38 +01:00
Michael Mayer
5bf4ea61f9 Places: Hide fullscreen toggle control on mobile devices #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 03:19:17 +01:00
Michael Mayer
7233f3f883 UX: Fix and improve service dialog components #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 03:13:06 +01:00
Michael Mayer
a94a170207 Frontend: Reformat code in src/page/settings/general.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 02:44:25 +01:00
Michael Mayer
443ffb4780 UX: Fix slider control behaviour in Settings > Advanced #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 02:41:00 +01:00
Michael Mayer
a3c055a58f UX: Reveal viewer controls when user touches the top of the screen #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 02:30:21 +01:00
Michael Mayer
32885afb50 Frontend: Improve footer component UX for mobile screens #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 00:54:30 +01:00
Michael Mayer
b408a5a6b0 Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 00:04:29 +01:00
Michael Mayer
3ec63efa81 Frontend: Update src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 00:03:38 +01:00
Weblate
8376392b51 Weblate: Update frontend translations 2025-02-07 00:02:34 +01:00
Michael Mayer
87e66fe23d Viewer: Add sound mute/unmute toggle control for videos #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-07 00:01:14 +01:00
Michael Mayer
50d014fe3c UX: Improve usability of birthdate inputs in settings/account.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 23:16:16 +01:00
Michael Mayer
974d59377b UX: Allow navigation drawer to be toggled by clicking at the top #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 22:37:15 +01:00
Michael Mayer
b63c78bc89 UX: Prepend icon in day and time fields of photo edit dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 22:15:56 +01:00
Michael Mayer
bbe93b3167 UX: Improve date input validation in photo edit dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 22:05:51 +01:00
Michael Mayer
828218ad0f Viewer: Hide navigation arrows when a slideshow is playing #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 21:09:10 +01:00
Michael Mayer
cc45c9e4b4 Frontend: Remove old todo comments from component/viewer.vue #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 20:50:17 +01:00
Michael Mayer
f53b7e89d9 Frontend: Update code comment in component/viewer.vue #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 20:47:33 +01:00
Michael Mayer
0c530fa1da Viewer: Reduce playControlHideDelay to 2s #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 20:44:34 +01:00
Michael Mayer
b642ab2062 Viewer: Improve slideshow and video playback controls UX #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 20:34:23 +01:00
Michael Mayer
3ebb940c7b Viewer: Improve captions and prevent defaults on player controls #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 17:08:40 +01:00
Michael Mayer
66df457fbf Develop: Shorten network name in compose.yaml config files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 14:28:27 +01:00
Michael Mayer
501ef56c97 Videos: Support for detection and streaming of additional formats #4770
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-06 14:27:47 +01:00
Michael Mayer
7cfd09cd6a UX: Increase scroll-to-top button size #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 20:29:36 +01:00
Michael Mayer
6d2429a645 UX: Improve media preload behaviour in component/viewer.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 20:29:20 +01:00
Michael Mayer
da98087a10 Frontend: Update src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 19:54:38 +01:00
Weblate
40e4b6381a Weblate: Update frontend translations 2025-02-05 19:53:46 +01:00
Michael Mayer
1b47721227 Frontend: Regenerate translations in src/locales/*.po #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 19:52:14 +01:00
Michael Mayer
b9c1728120 UX: Refactor event handling for modal dialogs #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 19:50:26 +01:00
Michael Mayer
6edc86e9ff UX: Improve time format input validation rule #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 19:41:11 +01:00
Michael Mayer
2ad0894bf9 UX: Improve form validation rules #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 17:39:35 +01:00
Michael Mayer
23051dd257 Frontend: Update dependencies in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 12:39:55 +01:00
Michael Mayer
b2cef94f07 Videos: Assume 10-bit codec variants in content type for HDR #4770
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 12:39:46 +01:00
Michael Mayer
b4f57dc992 API: Fix glitch in video.Compatible() and add tests for it #4770
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 04:17:03 +01:00
Michael Mayer
ef66ddbb8c API: Compare video formats by content type for better matching #4770
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 03:42:40 +01:00
Michael Mayer
d5ef7bf1bc Media: Refactor video content type constants #4770
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 01:23:22 +01:00
Michael Mayer
6a89519e63 Videos: Refactor codec, content and file type specifications #4770
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-05 00:30:45 +01:00
Michael Mayer
30a6ff248b Frontend: Update dependencies in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 21:35:44 +01:00
Michael Mayer
0be3fdd784 Translations: Update /frontend/src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 21:35:18 +01:00
Michael Mayer
c24f41d713 Backend: Upgrade Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 21:34:54 +01:00
Weblate
617a203e1a Weblate: Update frontend translations 2025-02-04 21:18:08 +01:00
Michael Mayer
5ef3b5af27 Docker: Remove duplicate ENTRYPOINT declaration from ARMv7 image #4767
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 20:56:23 +01:00
Michael Mayer
df0c0e01a9 Docker: Add s6-overlay to ARMv7 and Ubuntu Jammy based images #4767
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 20:54:03 +01:00
Michael Mayer
0709e94e65 Develop: Upgrade base image from 250124 to 250204-oracular #4767
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 20:19:37 +01:00
Michael Mayer
fb0e37f350 Scripts: Add documentation link to dist/install-s6.sh #4767
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 20:12:17 +01:00
Michael Mayer
717ba722bb Build: Add s6-overlay binaries to develop base image #4767
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 20:02:14 +01:00
Michael Mayer
83c039dd9a Docker: Add s6-overlay documentation links #4767
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 20:01:21 +01:00
Michael Mayer
ae5f35259c Server: Move process handling and shutdown to separate package #4767
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 19:05:26 +01:00
Michael Mayer
8e16a7a67e CI: Add compose.preview.yaml config for testing preview builds #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 18:32:42 +01:00
Michael Mayer
b80b41b30f Docker: Update Dockerfiles and init scripts to run with s6-overlay #4767
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 18:31:26 +01:00
Michael Mayer
7ff6b384a2 Docker: Add S6 overlay to base images for process supervision #4767
see https://skarnet.org/software/s6/

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 18:21:35 +01:00
Michael Mayer
8b41d67ec0 Archive: Don't hide "Delete All" toolbar button on mobile screens #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 13:07:26 +01:00
Michael Mayer
1f4f65e988 Server: Add "force" and "mode" flags for sockets #4673 #4767 #4765 #4467
These changes allow you to force the re-creation of existing Unix domain
sockets and set the permissions of sockets after they have been created.

The flag or variable value for this must be formatted as follows:
--http-host="unix:/var/run/photoprism.sock?force=true&mode=660"

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 12:03:00 +01:00
Michael Mayer
03fcc5d606 Translations: Update .po files in /frontend/src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 04:08:02 +01:00
Michael Mayer
a359ebc9ce Viewer: Improve caption positioning for right-to-left languages #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 04:04:05 +01:00
Michael Mayer
7c8a194bce UX: Show filename in Cards View, even if downloads are disabled #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 03:40:46 +01:00
Michael Mayer
60cf71ac47 UX: Show filename in Cards View, even if downloads are disabled #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 03:40:23 +01:00
Michael Mayer
c60c0ce3a6 API: Ensure slugs are not empty before saving/creating labels #4761
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 03:35:01 +01:00
Michael Mayer
5d0d1729b7 UX: Open folder in same window from Files tab on mobile devices #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 02:17:15 +01:00
Michael Mayer
d9b1e8a901 UX: Ensure the original file is sorted first in the Files tab #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 01:15:47 +01:00
Michael Mayer
0a59e036c7 UX: Ensure that main file is sorted first in the files tab #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 01:14:05 +01:00
Weblate
a79bbe5ab2 Weblate: Update frontend translations 2025-02-04 01:14:00 +01:00
Michael Mayer
ed86410230 Translations: Update .po files in /frontend/src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 00:18:33 +01:00
Michael Mayer
1716353b17 Frontend: Rename "File Browser" button to "Open Folder" #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 00:17:54 +01:00
Michael Mayer
879f70bea3 Frontend: Update deps in package.json and package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 00:12:49 +01:00
Michael Mayer
3bf1e21dc5 Frontend: Adjust mobile UI styles in css/app.css and results.css #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-04 00:08:09 +01:00
Michael Mayer
e7c48492b8 Auth: Refactor ACL event and rule registration
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-03 21:02:41 +01:00
Michael Mayer
0541017731 Frontend: Update src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-03 17:00:55 +01:00
Weblate
fc8ff56bea Weblate: Update frontend translations 2025-02-03 17:00:06 +01:00
Michael Mayer
5738d838e5 Faces: Add dedicated vector algebra package #4691 #4669 #4328
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-03 16:48:46 +01:00
Michael Mayer
163db703d1 Config: Add "develop" feature flag to disable new viewer sidebar #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-03 12:29:02 +01:00
Weblate
e23fe42717 Weblate: Update frontend translations 2025-02-03 10:26:25 +01:00
Michael Mayer
34d0657902 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-03 10:07:22 +01:00
Michael Mayer
6456cda812 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-02-03 10:06:02 +01:00
Michael Mayer
978ef660e4 Frontend: Remove v-mask attributes due to errors #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 21:53:11 +01:00
Michael Mayer
a1242a47fe Metadata: Improve media type detection in pkg/fs/mime.go #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 21:45:35 +01:00
Michael Mayer
d797a1cedb Merge branch 'develop' into upgrade/vuetify-3 2025-01-29 21:37:21 +01:00
Michael Mayer
775d6cb76d Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 21:36:37 +01:00
Michael Mayer
06e59d9993 API: Improve content type string generation #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 21:35:07 +01:00
Michael Mayer
933cc5031f API: Fix content type header for transcoded videos #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 20:16:27 +01:00
Michael Mayer
ce29e95611 Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 20:15:22 +01:00
Anastasiia
8356caa30a Frontend: delete TODO #3168 2025-01-29 18:03:13 +01:00
graciousgey
3b1761c36e Tests: Adapt acceptance tests to changes #3168 2025-01-29 16:16:55 +01:00
Michael Mayer
bbd7d9af14 Videos: Refactor VP8 and VP9 codec types and add codec aliases #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 15:58:34 +01:00
graciousgrey
51a4c68568 Frontend: Update language string in options.js 2025-01-29 15:39:34 +01:00
Michael Mayer
679c96e87e Viewer: Reduce preloading to one slide in each direction #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 15:32:38 +01:00
Michael Mayer
7043cb4098 Viewer: Adjust UI styles for right-to-left languages #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 15:02:21 +01:00
Michael Mayer
790de0b146 Videos: Improve MP4 AVC browser playback compatibility #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 14:17:52 +01:00
Michael Mayer
a20f12f3e7 Videos: Enhance support for direct streaming of HEVC / H.265 #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 13:14:38 +01:00
Anastasiia
ea52ed5508 Frontend: change mask property #3168 2025-01-29 10:54:52 +01:00
Anastasiia
a4e5030f1a Frontend: delete not necessary TODOs #3168 2025-01-29 10:53:48 +01:00
Michael Mayer
be13714991 ACL: Update test assertions in /internal/auth/acl/acl_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 09:32:55 +01:00
Michael Mayer
042ba996d4 Frontend: Update /src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 09:03:36 +01:00
Michael Mayer
bd7d3f44eb Merge branch 'develop' into upgrade/vuetify-3 2025-01-29 09:03:14 +01:00
Weblate
a8b17d04ba Weblate: Update frontend translations 2025-01-29 09:02:54 +01:00
Michael Mayer
94d30cf648 Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 08:57:18 +01:00
Michael Mayer
621593c7d7 Frontend: Improve form validation in user add and edit dialogs #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 08:55:30 +01:00
Michael Mayer
ad21680d3c Frontend: Update /src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 07:19:08 +01:00
Michael Mayer
f89265646c Merge branch 'develop' into upgrade/vuetify-3 2025-01-29 07:18:33 +01:00
Weblate
0cc014c1fb Weblate: Update frontend translations 2025-01-29 07:18:20 +01:00
Michael Mayer
02ad6157f6 Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 07:16:45 +01:00
Michael Mayer
820e13aa25 Gettext: Replace %{name} with %{s} to avoid translation errors #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 07:16:16 +01:00
Michael Mayer
a18274c062 Merge branch 'develop' into upgrade/vuetify-3 2025-01-29 07:11:08 +01:00
Weblate
ed2e1e2e90 Weblate: Update frontend translations 2025-01-29 07:10:56 +01:00
Michael Mayer
2cb591aae6 Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 07:08:41 +01:00
Michael Mayer
c4977c5132 Forms: Move field validation rules to /frontend/src/common/form.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 07:01:29 +01:00
Michael Mayer
bfcad36b83 Frontend: Update /src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 05:15:35 +01:00
Michael Mayer
6454e034d9 Merge branch 'develop' into upgrade/vuetify-3 2025-01-29 05:15:01 +01:00
Michael Mayer
af2aed38ba Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 05:13:56 +01:00
Michael Mayer
1bd3b6e437 Merge branch 'develop' into upgrade/vuetify-3 2025-01-29 05:12:04 +01:00
Weblate
b5f2277ffd Weblate: Update frontend translations 2025-01-29 05:11:48 +01:00
Michael Mayer
23415807c4 Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 05:06:07 +01:00
Michael Mayer
b2d62ca4aa UX: Improve form validation in page/settings/account.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 05:05:11 +01:00
Michael Mayer
dc2167dbe0 ACL: Update checks and presets #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 02:49:28 +01:00
Michael Mayer
e8ffa2f441 UX: Improve mobile layout of Details and Labels in the edit dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 01:17:54 +01:00
Michael Mayer
d1fde00dfa Metadata: Add "Etc/GMT" time zone test cases to entity_time_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 01:10:57 +01:00
Michael Mayer
08b253e85f UX: Improve tooltips in the photo edit dialog #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-29 00:58:21 +01:00
Michael Mayer
6b3cb0eca8 UX: Refactor video formats and codecs in front and backend #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-28 23:26:52 +01:00
Michael Mayer
e42049bc89 UX: Improve touch navigation behavior on mobile devices #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-28 19:36:50 +01:00
Michael Mayer
1c33f4bcff Viewer: Toggle controls if not a video and space is pressed #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-28 13:36:45 +01:00
Michael Mayer
fbf0ac8a90 Viewer: Improve playback of videos on mobile devices #3168 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-28 11:12:14 +01:00
graciousgey
b95e5b7a7d Tests: Adapt acceptance tests to changes #3168 2025-01-27 16:35:40 +01:00
graciousgey
fee4432bb0 Tests: Adapt acceptance tests to changes #3168 2025-01-27 16:34:57 +01:00
graciousgey
ee74176928 Tests: Adapt acceptance tests to changes #3168 2025-01-27 16:33:04 +01:00
Michael Mayer
d177895eac UX: Improve mobile device detection #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-27 16:26:45 +01:00
Michael Mayer
c48030be1d Viewer: Disable fullscreen mode toggle on mobile devices #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-27 16:21:53 +01:00
Michael Mayer
3eaaf5fdef Viewer: Resize lightbox after toggling fullscreen mode #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-27 16:14:05 +01:00
Michael Mayer
ec6aa95514 Viewer: Optimize styles for video playback on mobile devices #4698 #4738
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-27 15:41:38 +01:00
Michael Mayer
4a7ba36dfd Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-27 14:35:02 +01:00
Michael Mayer
608732ed80 Metadata: Update special words list in /pkg/text/specialwords.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-27 14:34:01 +01:00
Michael Mayer
5c57ea871a Frontend: Rename @cancel events to @close in dialog components #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-27 14:12:08 +01:00
Michael Mayer
2752fc2141 UX: Prevent duplicate albums from being created #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-27 14:11:44 +01:00
Michael Mayer
534ad8cb25 UX: Activate Approve button in edit dialog if photo is in review #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-27 13:21:47 +01:00
Michael Mayer
420fa9946c Viewer: Set native video stream src based on mimetype #1307 #3168 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-27 13:21:05 +01:00
Michael Mayer
8c3ec7435e Frontend: Update /src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 22:01:03 +01:00
Michael Mayer
dc5311921e Merge branch 'develop' into upgrade/vuetify-3 2025-01-26 22:00:35 +01:00
Michael Mayer
d762febd53 Frontend: Fix name placeholders in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 21:59:57 +01:00
Weblate
9b6e0995b6 Weblate: Update frontend translations 2025-01-26 21:52:47 +01:00
Michael Mayer
8892129da7 Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 21:47:34 +01:00
Michael Mayer
2422c48dfd UX: Improve setting and updating names in page/people/new.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 21:46:25 +01:00
Michael Mayer
a39851815e UX: Refactor callback names in photo/edit/dialog.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 20:30:55 +01:00
Michael Mayer
c50b0b0506 UX: Improve adding names to people in photo/edit/dialog.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 20:22:31 +01:00
Michael Mayer
5f4e10beee UX: Disable album combobox while data is not yet loaded #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 17:09:39 +01:00
Michael Mayer
40f17ab30b Frontend: Update /src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 16:46:35 +01:00
Michael Mayer
b991b4c9ce Merge branch 'develop' into upgrade/vuetify-3 2025-01-26 16:45:58 +01:00
Weblate
146a260cb9 Weblate: Update frontend translations 2025-01-26 16:45:39 +01:00
Michael Mayer
e74be0e04e Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 16:40:14 +01:00
Michael Mayer
0bb8a51afa UX: Shorten text in page/library/index.vue and import.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 16:39:17 +01:00
Michael Mayer
ccdb836248 Frontend: Upgrade deps in package.json and package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 16:23:37 +01:00
Michael Mayer
3b958f6b83 Frontend: Update src/component/defaults.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 16:22:36 +01:00
Michael Mayer
058fbef87c Frontend: Refactor component names and directory structure #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 16:04:02 +01:00
Michael Mayer
02c2f73c19 UX: Use click to close edit dialog if the model data is unchanged #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-26 14:13:37 +01:00
Michael Mayer
eed565cacf Live Photos: Set matching type for video source element #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-25 13:28:55 +01:00
Michael Mayer
436be01232 Viewer: Check support before adding "nodownload" crtl #1307 #3168 #4704
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-25 13:23:27 +01:00
Michael Mayer
246e6f0cbd Viewer: Set matching type for video source element #1307 #3168 #4704
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-25 13:13:47 +01:00
Michael Mayer
20d9615878 UX: Automatically expand first link in dialog/share.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-25 10:37:36 +01:00
Michael Mayer
b8da62dceb UX: Change icon in photo/album/dialog.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-25 10:24:42 +01:00
Michael Mayer
7931e6ccf2 UX: Use icons for country, camera & lens in photo/edit/details.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-25 10:20:18 +01:00
Michael Mayer
5482e5675b Frontend: Update /src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-25 10:19:20 +01:00
Michael Mayer
30cb4bbc3e Merge branch 'develop' into upgrade/vuetify-3 2025-01-25 10:12:03 +01:00
Weblate
5fd43e2542 Weblate: Update frontend translations 2025-01-25 10:11:48 +01:00
Michael Mayer
baa95335be Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-25 10:08:30 +01:00
Michael Mayer
da06a46901 UX: Shorten input placeholder in upload.vue and album/dialog.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-25 10:07:24 +01:00
Michael Mayer
1f16692611 UX: Remove "Done" action button from photo/edit/details.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-25 10:06:15 +01:00
Michael Mayer
eb16e61e9c UX: Fix album chip styles in dialog/upload.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 18:02:47 +01:00
Michael Mayer
2c99598bc9 Frontend: Update /src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 17:46:09 +01:00
Michael Mayer
db7f6662b6 Merge branch 'develop' into upgrade/vuetify-3 2025-01-24 17:45:39 +01:00
Weblate
ef4d5c7968 Weblate: Update frontend translations 2025-01-24 17:45:21 +01:00
Michael Mayer
38cfd6bce5 Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 17:42:59 +01:00
Michael Mayer
4b136282a6 UX: Shorten info text in dialog/upload.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 17:42:00 +01:00
Michael Mayer
07a77ac95a Develop: Upgrade base image from 250118 to 250124-oracular #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 17:35:32 +01:00
Michael Mayer
72ae7f0849 UX: Improve layout of photo edit dialog tabs #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 17:31:36 +01:00
Michael Mayer
761183d12c UX: Improve layout of upload dialog and library pages #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 17:29:33 +01:00
Michael Mayer
2f16927a59 UX: Change icon on import button in page/library/import.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 16:01:30 +01:00
Michael Mayer
2a8c3e6c42 Develop: Update NodeJS deps in /scripts/dist/install-nodejs.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 15:57:58 +01:00
Michael Mayer
0766046fa1 Backend: Change test URL in internal/form/service_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 12:21:16 +01:00
Michael Mayer
1a594b75fe Backend: Upgrade "github.com/go-co-op/gocron" in go.mod and go.sum #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 12:06:45 +01:00
Michael Mayer
236359be50 Frontend: Update dependencies in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-24 12:04:59 +01:00
Michael Mayer
03558fcf92 Frontend: Fix states navigation link in share view #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 19:41:51 +01:00
Michael Mayer
3787f87ca2 UX: Increase <v-badge> padding in vuetify.css #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 19:36:25 +01:00
Michael Mayer
45a39cd43a Frontend: Update assertions in tests/unit/options/options_test.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 19:08:04 +01:00
Michael Mayer
2e72da9d19 Frontend: Update dependencies in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 19:05:35 +01:00
Michael Mayer
c3b0c00384 Frontend: Update src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 19:04:43 +01:00
Michael Mayer
2e5fc3d6c2 Merge branch 'develop' into upgrade/vuetify-3 2025-01-23 19:04:03 +01:00
Weblate
516ddb9729 Weblate: Update frontend translations 2025-01-23 19:03:42 +01:00
Michael Mayer
b5c0404f61 Frontend: Update .po translation files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 19:00:37 +01:00
Michael Mayer
c19e7b0695 UX: Improve usability of index page, upload page and upload dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 18:58:22 +01:00
Anastasiia
5e0acbb8e7 Frontend: delete prop required #3168 2025-01-23 18:18:58 +01:00
Michael Mayer
4e1ad9cedb UX: Stretch Title and Caption input fields in photo edit dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 15:09:21 +01:00
Michael Mayer
62af32be19 UX: Improve usability and mobile friendliness of photo edit dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 14:49:48 +01:00
Michael Mayer
1012c52e72 Frontend: Set htmlWhitespaceSensitivity to "css" in .eslintrc.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 14:47:41 +01:00
Michael Mayer
84deda74ae Frontend: Update dependencies in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-23 14:45:18 +01:00
Michael Mayer
a14dd592e4 Frontend: Refactor tabs and reformat .vue templates with eslint #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-22 12:42:41 +01:00
Michael Mayer
461b309ba9 Frontend: Refactor form fields in page/settings/account.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-22 12:40:23 +01:00
Michael Mayer
11905f765f Assets: Add mobile-web-app-capable meta tag to HTML templates #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-22 12:38:21 +01:00
Michael Mayer
04c3e98073 Frontend: Ensure that ESLint is installed and works as intended #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-22 12:34:49 +01:00
Michael Mayer
67aee33d6c Frontend: Update dependencies in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-22 12:16:30 +01:00
graciousgrey
b301abae33 Frontend: Add default value for feedback form 2025-01-22 11:32:55 +01:00
graciousgrey
bb4eba137b Annotations: Improve swagger annotations 2025-01-21 16:50:24 +01:00
Michael Mayer
41d974191d Frontend: Replace <v-container> with plain <div> elements #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 15:23:01 +01:00
Michael Mayer
58d0747ecc Frontend: Replace inline style attributes with ".not-selectable" #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 14:51:13 +01:00
Michael Mayer
c36073b3de UX: Reformat and improve footer component and about page #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 12:40:41 +01:00
Michael Mayer
3e2a0f9569 UX: Improve .v-dialog--sidepanel styles in src/css/vuetify.css #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 08:03:24 +01:00
Michael Mayer
74ead32d3b UX: Remove elevation from photo edit dialog tabs #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 07:55:41 +01:00
Michael Mayer
072b9cfb4c UX: Improve table button and photo edit dialog styles #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 07:53:22 +01:00
Michael Mayer
b20033117f Frontend: Update src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 06:47:36 +01:00
Michael Mayer
d9af48467d Merge branch 'develop' into upgrade/vuetify-3 2025-01-21 06:47:06 +01:00
Weblate
81f91fc2bd Weblate: Update frontend translations 2025-01-21 06:46:51 +01:00
Michael Mayer
a5d4a1fe10 Frontend: Update .po files in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 06:45:11 +01:00
Michael Mayer
096b5983a1 UX: Rename "States" to "Regions" in component/navigation.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 06:43:26 +01:00
Michael Mayer
c9287aa53d UX: Ensure new face count is displayed on load in page/people.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 06:18:16 +01:00
Michael Mayer
1e562b17a9 UX: Fix styles and simplify grid view in photo/edit/people.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 06:00:32 +01:00
Michael Mayer
90222278f8 UX: Set lg column width in photo/edit/people.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 05:08:51 +01:00
Michael Mayer
0f6fdfecb7 UX: Increase minimum column size in photo/edit/people.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 05:07:24 +01:00
Michael Mayer
9b907c1007 UX: Change label and icon of upload button in dialog/upload.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 05:02:55 +01:00
Michael Mayer
cc87538c37 UX: Don't show upload dialog in full-screen mode on large screens #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 04:38:36 +01:00
Michael Mayer
c4545ccae3 Frontend: Update src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 04:02:26 +01:00
Michael Mayer
56ecced64e Merge branch 'develop' into upgrade/vuetify-3 2025-01-21 04:01:43 +01:00
Weblate
1449b5a230 Weblate: Update frontend translations 2025-01-21 04:01:10 +01:00
Michael Mayer
3d2351b21a UX: Show Title and Caption inputs first in photo/edit/details.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 03:56:29 +01:00
Michael Mayer
296db66574 Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 03:38:42 +01:00
Michael Mayer
511f9c3354 UX: Display photo edit dialog as side panel on large screens #3168
This will also open the Files tab when users click on a filename in the
cards view.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 03:37:32 +01:00
Michael Mayer
0a42b63fa8 Forms UX: Change validate-on="blur" to validate-on="invalid-input" #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 01:08:32 +01:00
Michael Mayer
b0c8d92f48 Scans: Detect Reflecta DigitDia 7000 as film scanner #4581
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-21 00:26:52 +01:00
Michael Mayer
7487cb7b3c Places: Update map background color in css/places.css #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 23:43:37 +01:00
Michael Mayer
d4e03f5e34 Places: Update map background color in css/places.css #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 23:42:04 +01:00
Michael Mayer
3f995eca39 Places: Enable 3D GlobeControl for all maps #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 23:36:56 +01:00
Michael Mayer
a528578f7b Places: Add GlobeControl #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 19:41:40 +01:00
Michael Mayer
1cd0ec7c62 Metadata: Add backward compatibility for Description field #4603
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 19:20:12 +01:00
Michael Mayer
633ae039dc Frontend: Upgrade deps in package.json and package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 19:12:49 +01:00
graciousgrey
b656915e2d Update SPONSORS.md 2025-01-20 18:14:54 +01:00
Michael Mayer
9fb17375ea Sharing: Fix "states" link in sidebar navigation #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 17:56:10 +01:00
Michael Mayer
974e93518b UX: Update dialog styles in src/css/vuetify.css 2025-01-20 13:44:35 +01:00
Michael Mayer
6bfafd46cb UX: Automatically update people tab in photo edit dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 13:23:21 +01:00
Michael Mayer
9d5acb4163 Frontend: Reformat .vue templates in /src/component/album #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 11:10:32 +01:00
Michael Mayer
2e4b78016a Frontend: Reformat .vue templates in /src/component/account #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 11:09:47 +01:00
Michael Mayer
b291e7c9b6 Frontend: Reformat .vue templates in /src/component/file #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 11:09:11 +01:00
Michael Mayer
93666bb687 Frontend: Reformat .vue templates in /src/component/label #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 11:08:38 +01:00
Michael Mayer
4f3d2420f2 Frontend: Reformat .vue templates in /src/component/photo #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 11:07:47 +01:00
Michael Mayer
8f1d70f00e Frontend: Reformat .vue templates in /src/component/people #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 11:06:18 +01:00
Michael Mayer
5a5f5905ef UX: Use v-expand-transition for expanded search toolbar #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 10:19:55 +01:00
Michael Mayer
e20f94b617 Frontend: Update dependencies in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-20 09:48:41 +01:00
Michael Mayer
2d81a144f7 Frontend: Update src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 17:28:42 +01:00
Michael Mayer
78e6436a31 Merge branch 'develop' into upgrade/vuetify-3 2025-01-19 17:26:42 +01:00
Weblate
6ad7fc9bc7 Weblate: Update frontend translations 2025-01-19 17:26:16 +01:00
Michael Mayer
6006f43881 Frontend: Update src/locales/translations.pot
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 17:21:49 +01:00
Michael Mayer
35be599fbd UX: Translate label sources in photo edit dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 17:20:51 +01:00
Michael Mayer
a2c8c889d6 UX: Improve label table and input styles in photo edit dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 16:32:36 +01:00
Michael Mayer
941d7c154f UX: Enlarge edit dialog tabs and display badges on small screens #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 15:42:45 +01:00
Michael Mayer
beef2e0c63 API: Add "@Accept json" Swagger doc annotations where applicable
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 15:26:18 +01:00
Michael Mayer
8c8e5c9f52 Sharing: Fix copy to clipboard functionality in dialog/share.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 15:02:03 +01:00
Michael Mayer
530d5f7ea6 Places: Add documentation link to frontend/src/page/places.vue #4733
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 14:21:04 +01:00
Michael Mayer
4f54d6e111 Places: Show error message if browser does not support WebGL #4733
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 14:18:01 +01:00
Michael Mayer
73ae88cd4d API: Add Swagger annotations to /api/v1/services endpoints
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 13:00:50 +01:00
Michael Mayer
53c22ba06a Backend: Upgrade Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 12:58:58 +01:00
Michael Mayer
7f13581265 Entity: Add json annotations to Service struct in service.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 12:58:31 +01:00
Michael Mayer
9b461f5207 Develop: Upgrade base image from 250103-oracular to 250118-oracular
Includes the latest stable version of Go.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-19 11:10:11 +01:00
Michael Mayer
cb2f492b99 Merge branch 'develop' into upgrade/vuetify-3 2025-01-18 11:40:37 +01:00
Keith Martin
6c98df501e Metadata: Add and improve MediaFile location info tests #4714 #4725
* Address Issue #4714 with change to existing iphone_7.heic test and new iphone_xr.heic test
* Resize image and change to jpg so that GPS information can be read by GO.
2025-01-17 16:06:18 +01:00
Michael Mayer
a9645b532b People: Fix edit dialog save button in people/dialog/edit.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 09:27:34 +01:00
Michael Mayer
aeb51eb5fa Settings: Refactor services.vue and service add/edit dialogs #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 08:46:45 +01:00
Michael Mayer
300de493ad Viewer: Don't loop videos when a slideshow is playing #1307 #4698 #4702
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 07:54:33 +01:00
Michael Mayer
8da446a351 Metadata: Increase probability of keywords extracted from captions #4603
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 06:34:57 +01:00
Michael Mayer
ebeaaf568b Metadata: Set labels based on matching keywords in the caption #4603
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 06:24:29 +01:00
Michael Mayer
f24149fd49 Labels: Refactor label entity and cache in label.go and label_cache.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 05:36:25 +01:00
Ömer Duran
f1bfa4a0ec fix: enable pointer events for caption text while keeping overlay non-interactive 2025-01-17 05:32:16 +01:00
Michael Mayer
0ada8d1095 API: Add additional fields to label and subject edit forms #383 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 02:55:07 +01:00
Michael Mayer
d786a8225d Frontend: Replace "number" output filter with $util.formatNs() #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 01:09:30 +01:00
Michael Mayer
54e6283e30 Frontend: Remove obsolete theme stylesheets in /src/css/themes #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 00:43:51 +01:00
Michael Mayer
c2d6d60810 Frontend: Improve readability of text links e.g. on about page #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 00:39:47 +01:00
Michael Mayer
cf3941b4cf Commands: Fix config options report in config/cli_flags_report.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 00:20:05 +01:00
Michael Mayer
d4a4690707 Commands: Remove unused faceFlagsInfo var from show_config_options.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 00:14:21 +01:00
Michael Mayer
26e36ef594 Router: Fix requiresAuth check in frontend/src/app.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-17 00:11:23 +01:00
Michael Mayer
73d97f03bd Frontend: Reformat component/navigation.vue and viewer.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 23:48:21 +01:00
Michael Mayer
9f30b0dd91 Frontend: Reduce eslint prettier printWidth to 120 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 23:46:29 +01:00
Michael Mayer
85c347b077 Frontend: Update dependencies in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 23:34:34 +01:00
Michael Mayer
3fcea333d7 Frontend: Update src/locales/translations.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 23:33:26 +01:00
Michael Mayer
62b15421a9 Merge branch 'develop' into upgrade/vuetify-3 2025-01-16 23:31:56 +01:00
Weblate
d35bd7d797 Weblate: Update frontend translations 2025-01-16 23:29:46 +01:00
Michael Mayer
5bf0c609c5 Frontend: Update src/locales/translations.pot #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 23:27:28 +01:00
Michael Mayer
647e6e0dc8 Merge branch 'develop' into upgrade/vuetify-3
# Conflicts:
#	frontend/src/locales/af.po
#	frontend/src/locales/ar.po
#	frontend/src/locales/be.po
#	frontend/src/locales/bg.po
#	frontend/src/locales/ca.po
#	frontend/src/locales/cs.po
#	frontend/src/locales/da.po
#	frontend/src/locales/de.po
#	frontend/src/locales/el.po
#	frontend/src/locales/en.po
#	frontend/src/locales/es.po
#	frontend/src/locales/et.po
#	frontend/src/locales/eu.po
#	frontend/src/locales/fa.po
#	frontend/src/locales/fi.po
#	frontend/src/locales/fr.po
#	frontend/src/locales/ga.po
#	frontend/src/locales/he.po
#	frontend/src/locales/hr.po
#	frontend/src/locales/hu.po
#	frontend/src/locales/id.po
#	frontend/src/locales/it.po
#	frontend/src/locales/ja.po
#	frontend/src/locales/ko.po
#	frontend/src/locales/ku.po
#	frontend/src/locales/lt.po
#	frontend/src/locales/ms.po
#	frontend/src/locales/nb.po
#	frontend/src/locales/nl.po
#	frontend/src/locales/pl.po
#	frontend/src/locales/pt.po
#	frontend/src/locales/pt_BR.po
#	frontend/src/locales/ro.po
#	frontend/src/locales/ru.po
#	frontend/src/locales/sk.po
#	frontend/src/locales/sl.po
#	frontend/src/locales/sv.po
#	frontend/src/locales/th.po
#	frontend/src/locales/tr.po
#	frontend/src/locales/translations.pot
#	frontend/src/locales/uk.po
#	frontend/src/locales/vi.po
#	frontend/src/locales/zh.po
#	frontend/src/locales/zh_TW.po
2025-01-16 23:25:52 +01:00
Weblate
1ce34cab42 Weblate: Update frontend translations 2025-01-16 23:20:35 +01:00
Michael Mayer
c9d30493cd Frontend: Update src/locales/translations.pot #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 23:16:11 +01:00
Michael Mayer
15795db124 Frontend: Replace deprecated <translate> tags with $gettext() #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 23:12:22 +01:00
Michael Mayer
64222ae72b Frontend: Replace <translate> tags in page/about/about.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 22:56:21 +01:00
Michael Mayer
6a524986a1 Frontend: Fix category input in src/album/dialog/edit.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 22:55:30 +01:00
Michael Mayer
7a061ceb30 Backend: Update "github.com/davidbyttow/govips/v2" in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 20:39:23 +01:00
Michael Mayer
d119daebb4 Viewer: Refactor handleZoomLevelChange() function #3168 #4704
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 20:32:17 +01:00
Michael Mayer
42089e9301 Frontend: Change import order in component/components.js imports #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 19:59:27 +01:00
Michael Mayer
b6a27929c3 Frontend: Refactor src/app.js and components.js imports #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 19:54:44 +01:00
Ömer Duran
0c7991b4b4 Viewer: simplifying URL size comparison logic 2025-01-16 19:25:32 +01:00
Michael Mayer
31091f5c60 Frontend: Update dependencies in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 16:52:33 +01:00
Michael Mayer
eb169228d4 Frontend: Change import order in src/app.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 16:52:02 +01:00
Michael Mayer
69cded6600 Frontend: Refactor import of src/component/about/footer.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 16:31:46 +01:00
graciousgrey
ac3f883690 Frontend: Improve theme colors #3168 2025-01-16 12:35:07 +01:00
Michael Mayer
b16f78af44 Frontend: Refactor imports in src/app.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 12:28:08 +01:00
Michael Mayer
0b7beda4a1 Viewer: Refactor handleZoomLevelChange() function #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 11:12:37 +01:00
Michael Mayer
e10923f3c6 Viewer: Only open as stack if there are multiple JPEG files #1307 #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 10:47:00 +01:00
Michael Mayer
3f40a5be60 Frontend: Show all rows in the app passwords dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 10:11:07 +01:00
Michael Mayer
438a7ed4c4 Frontend: Reformat options/themes.js #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-16 10:11:07 +01:00
Ömer Duran
f70184b1bd Viewer: Optimizing URL checks for loading higher quality images 2025-01-16 06:39:50 +01:00
Michael Mayer
eb594edea4 UX: Add theme color variable for switch input elements #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-15 19:54:41 +01:00
Ömer Duran
58989f1fc1 Merge remote-tracking branch 'origin/upgrade/vuetify-3' into feature/Dynamically-set-image-src,-width-and-height-to-match-current-zoom-level-and-viewport-#4704 2025-01-15 19:16:34 +01:00
Michael Mayer
8f593593b2 Viewer: Refactor thumb URL generation in the backend API #4704 #4722
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-15 19:13:13 +01:00
Michael Mayer
8cfac1b9cc Backend: Upgrade "github.com/abema/go-mp4" in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-15 19:13:13 +01:00
Weblate
665705180e Weblate: Update frontend translations 2025-01-15 19:13:13 +01:00
Michael Mayer
0101f6f9b9 UX: Add "fill-opacity" theme variable #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-15 19:13:13 +01:00
graciousgrey
682e608371 Frontend: Improve theme colors #3168 2025-01-15 19:13:13 +01:00
Ömer Duran
0af4bdfe15 fix: remove duplicate hash in Yellowstone theme button color 2025-01-15 19:13:13 +01:00
Michael Mayer
96bb255fe0 Viewer: Refactor thumb URL generation in the backend API #4704 #4722
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-15 19:05:50 +01:00
Michael Mayer
0a8a7425a0 Backend: Upgrade "github.com/abema/go-mp4" in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-15 18:59:52 +01:00
Michael Mayer
a49437b900 Merge branch 'develop' into upgrade/vuetify-3 2025-01-15 08:39:57 +01:00
Weblate
9b263e4893 Weblate: Update frontend translations 2025-01-15 08:39:06 +01:00
Ömer Duran
19f6fe7e3b Viewer: Refactor slide content update 2025-01-15 08:32:54 +01:00
Anastasiia
16f6c74cc6 Viewer: delete unused console.logs #4704 2025-01-15 00:01:26 +01:00
Ömer Duran
979b632667 fix: resolve linting error 2025-01-14 23:54:19 +01:00
Anastasiia
3c3d9fb831 Viewer: add checking of actual width/height and next thumbnail #4704 2025-01-14 23:27:20 +01:00
Ömer Duran
0bae2f9d5a fix: Resolve unresolved pswp variable 2025-01-14 23:11:40 +01:00
Michael Mayer
c0fb207f2d UX: Add "fill-opacity" theme variable #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-14 17:22:36 +01:00
graciousgrey
2d01348ce9 Frontend: Improve theme colors #3168 2025-01-14 17:21:05 +01:00
Ömer Duran
3da7cf117a Viewer: Implement dynamic thumbnail loading on zoom level change 2025-01-14 08:57:07 +01:00
Ömer Duran
c2757360f4 fix: remove duplicate hash in Yellowstone theme button color 2025-01-14 08:00:54 +01:00
Anastasiia
ea012aed49 Viewer: fix console log with image source when change size #4704 2025-01-13 21:52:52 +01:00
Anastasiia
b75ae07935 Viewer: add generating srcset and checking data on imageSizeChange #4704 2025-01-13 21:27:31 +01:00
graciousgrey
19033ca573 Frontend: Improve theme colors #3168 2025-01-13 17:28:49 +01:00
Michael Mayer
960ccdc3b4 Backend: Upgrade "github.com/gin-contrib/gzip" in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-13 16:30:40 +01:00
Michael Mayer
53267271d5 UX: Allow file/photo metadata to be wrapped in photo edit dialog #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-13 11:48:25 +01:00
Michael Mayer
8a11e0412f UX: Refactor service edit dialog in service/dialog/edit.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-13 11:26:12 +01:00
Michael Mayer
e0bcd33670 UX: Append "content-copy" icons in dialog/webdav.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-13 10:58:36 +01:00
Michael Mayer
d6f345b8c4 UX: Reduce spacing in delete and remove dialogs #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-13 10:49:25 +01:00
Michael Mayer
104d42eace Viewer: Remove .pswp__dynamic-caption transition #1307 #3168 #4702 #4703
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-13 10:43:25 +01:00
Michael Mayer
4dfde920ed Frontend: Update translations.json in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-13 10:15:21 +01:00
Michael Mayer
9f50ee6c71 Merge branch 'develop' into upgrade/vuetify-3
# Conflicts:
#	frontend/src/locales/hi.po
2025-01-13 10:14:30 +01:00
Weblate
8204150b3c Weblate: Update frontend translations 2025-01-13 10:13:26 +01:00
Michael Mayer
39a862cb65 Frontend: Update translations.pot in /src/locales #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-13 10:11:09 +01:00
Michael Mayer
f7b44341ee UX: Remove "v-col-xxl-1" break point in view/cards.vue #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-13 09:41:14 +01:00
Michael Mayer
58903198d4 Viewer: Improve padding based on image size and screen resolution #4704
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-13 09:15:29 +01:00
Michael Mayer
e027d3c8f9 Merge branch 'develop' into upgrade/vuetify-3 2025-01-12 16:38:03 +01:00
Michael Mayer
cc2e01f580 Tests: Update assertions in /internal/photoprism/location_test.go #4714
see https://github.com/photoprism/photoprism/issues/678#issuecomment-2585274415

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-12 16:31:52 +01:00
Michael Mayer
d286e43174 Viewer: Add slideshow toggle control #1307 #3168 #4702 #4703
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-12 14:49:16 +01:00
Michael Mayer
d645fc1cf4 Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-12 14:46:20 +01:00
Michael Mayer
1a2fc11fa8 Viewer: Add fullscreen mode toggle control #1307 #3168 #4703
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-11 22:32:02 +01:00
Michael Mayer
de5b966316 Viewer: Fix double </use> tag in component/viewer.vue #4699 #4700 #4709
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-11 21:17:06 +01:00
Michael Mayer
738a0f48de Viewer: Fix toggle icon shadow in Apple Safari #4699 #4700 #4709
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-11 20:06:58 +01:00
Michael Mayer
63108ec4d3 Viewer: Update dynamic caption styles in viewer.css #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-11 19:55:03 +01:00
Michael Mayer
5be7602861 Viewer: Refactor loading of playable content #1307 #4698 #4708
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-11 18:54:42 +01:00
Ömer Duran
def3bc45b8 Viewer: Improve loading of videos, animations, and live photos #1307 #3372 #4698 #4702 #4708
* Frontend: Refactor video element creation #4698

* Frontend: Enable autoplay for Live Photos and GIFs with looping functionality #4698

* Viewer: Media type checks  #4698

* Viewer: Removed unnecessary API call
2025-01-11 18:23:19 +01:00
Michael Mayer
8a8cb4e7f7 Viewer: Add pswp__icn-shadow to improve icon contrast #4699 #4700 #4709
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-11 17:45:57 +01:00
Michael Mayer
cfeb836d07 Viewer: Add Toggle to Select/Unselect Pictures #4699 #4700 #4709
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-11 17:27:19 +01:00
Anastasiia
eb5290b778 Viewer: Add toggle to flag/unflag pictures as favorite #4700 #4709 2025-01-11 16:43:22 +01:00
Michael Mayer
d524a1306e Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-11 16:15:21 +01:00
Michael Mayer
5ba51b0e9a Backend: Update Go dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-11 16:14:54 +01:00
Michael Mayer
9b61b443c0 Backend: Fix typo in photo search result structs #1307 #4698 #4708
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-10 18:59:09 +01:00
Michael Mayer
1a938a387f Viewer: Add media codec to API response data #1307 #4698 #4708
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-10 15:20:43 +01:00
Michael Mayer
6c5099ca8c Frontend: Update deps in package-lock.json #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-10 13:31:38 +01:00
Michael Mayer
cedb306929 Viewer: Add Type, Lat, Lng, and Duration to model data #1307 #4698 #4708
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-10 13:31:08 +01:00
graciousgrey
d293c56815 Frontend: Fix icon #3168 2025-01-09 18:07:54 +01:00
Michael Mayer
43398f7eec Server: Add link to documentation for unix domain sockets #4673 #4684
see https://github.com/photoprism/photoprism/discussions/4710

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-09 15:17:45 +01:00
Michael Mayer
b1f60c3d37 Merge branch 'develop' into upgrade/vuetify-3 2025-01-09 14:24:45 +01:00
Ömer Duran
b3e756dbb7 Refactor Unix socket cleanup in server startup process 2025-01-09 14:23:46 +01:00
Ömer Duran
1e69ce926a Backend: Clean up Unix socket file 2025-01-09 14:23:46 +01:00
Ömer Duran
b880377ae1 Backend: Clean up Unix socket file on startup 2025-01-09 14:23:46 +01:00
Ömer Duran
b00eeb3f20 Backend: Clean up Unix socket file on shutdown 2025-01-09 14:23:46 +01:00
Michael Mayer
52b4a5f3b9 About: Update copyright notices
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-09 10:41:37 +01:00
Michael Mayer
9d1c97425c FFmpeg: Refactor internal/ffmpeg/transcode_cmd.go #4604
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-09 10:38:56 +01:00
Michael Mayer
2e175e3ed3 Backend: Upgrade Go dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-09 10:30:37 +01:00
Michael Mayer
543bc8b20d Frontend: Update copyright notices #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-09 10:29:03 +01:00
Michael Mayer
01f15fa406 Backend: Update copyright notices
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-09 10:28:17 +01:00
Michael Mayer
e2195d535e FFmpeg: Refactor extraction of JPEG and PNG images from videos #4604
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-09 10:24:53 +01:00
Michael Mayer
8b7871fc02 Frontend: Shorten UI translation string for login with 2FA #3168
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-01-09 08:30:08 +01:00
Anastasiia
7ae3921d93 Merge pull request #4706 from photoprism/feature/add-a-Button-to-Open-the-Edit-Dialog-#4701
Viewer: Add a Button to Open the Edit Dialog #4701
2025-01-08 23:45:19 +01:00
1754 changed files with 170973 additions and 91038 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,31 +7,61 @@
/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/
# 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?
._*
@@ -41,10 +71,12 @@ ehthumbs.db
Thumbs.db
.heartbeat
.idea
.glide
.codex
.local
*~
.goutputstream*
.c9revisions
.settings
.swp
.tmp
.glide
/tmp/

View File

@@ -1,18 +1,18 @@
---
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
title: 'PLEASE DO NOT OPEN AN ISSUE FOR YOUR QUESTION, AND USE GITHUB DISCUSSIONS OR OUR COMMUNITY CHAT INSTEAD'
labels: question
assignees: ''
---
FOR GENERAL QUESTIONS, TECHNICAL SUPPORT, AND TO GET TO KNOW OTHER COMMUNITY MEMBERS:
<https://github.com/photoprism/photoprism/discussions>
<https://github.com/photoprism/photoprism/discussions>
OUR TROUBLESHOOTING CHECKLISTS HELP YOU QUICKLY DIAGNOSE AND FIX COMMON PROBLEMS:
<https://docs.photoprism.app/getting-started/troubleshooting/>
<https://docs.photoprism.app/getting-started/troubleshooting/>
DO NOT PROCEED, THANK YOU!
PLEASE DO NOT OPEN AN ISSUE FOR YOUR QUESTION, AND USE GITHUB DISCUSSIONS OR OUR COMMUNITY CHAT INSTEAD. THANK YOU VERY MUCH!

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.

105
.gitignore vendored
View File

@@ -1,4 +1,51 @@
# Local build files and directories
# Ignore temporary build files, dependencies, logs, and test output:
*.socket
*.lock
*.sock
*.pid
*.log
*.jsonl
*.db
*.db-journal
*.sqlite
*.override.yml
*.tmp.yml
*.override.yaml
*.tmp.yaml
*.out
*.test
*.exe
*.dll
*.so
*.dylib
*.tmp
*.img
*.img.xz
*.img.gz
/*.zip
/coverage.*
__pycache__
venv
.venv
.env
.tmp
.nv
.eslintcache
.gocache
/pro
/plus
/tmp/
/test/
*-lock.json
/node_modules
/frontend/node_modules/*
/frontend/tests/*.html
/frontend/tests/*.log
/frontend/tests/screenshots
/frontend/src/locales/*.mo
/frontend/tests_output
frontend/coverage/
**/__screenshots__/
/photoprism
/photoprism-*
/photos/originals/*
@@ -10,49 +57,12 @@
/assets/nasnet
/assets/nsfw
/assets/static/build/
/pro
/plus
*.exe
*.dll
*.so
*.dylib
/*.zip
/assets/static/maps/
/assets/*net
/assets/vision
/specs/
# Test output and coverage files
*.out
*.test
/coverage.*
frontend/coverage/
# Frontend cache and dependencies
/node_modules
/frontend/node_modules/*
/frontend/tests/*.html
/frontend/tests/*.log
/frontend/tests/screenshots
/frontend/src/locales/*.mo
/frontend/tests_output
/frontend/.eslintcache
/package-lock.json
# Python cache and dependencies
venv
.venv
__pycache__
# Custom config, database, log, and temporary files
/tmp/
*.log
*.jsonl
*.pid
*.db
*.db-journal
*.override.yml
*.tmp.yml
*.override.yaml
*.tmp.yaml
# Automatically generated files, e.g. by editors and operating systems
# Files created automatically by editors and/or operating systems:
.DS_Store
.DS_Store?
._*
@@ -61,12 +71,15 @@ __pycache__
ehthumbs.db
Thumbs.db
.heartbeat
.idea
.glide
.idea
.codex
.local
.project
.vscode
*.tmproj
*~
.goutputstream*
.c9revisions
.settings
.swp
.tmp
.env

View File

@@ -3,3 +3,4 @@ user=root
password=photoprism
host=mariadb
port=4001
skip-ssl=true

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

355
AGENTS.md Normal file
View File

@@ -0,0 +1,355 @@
# PhotoPrism® Repository Guidelines
## 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)
- Backend CODEMAP: CODEMAP.md
- Frontend CODEMAP: frontend/CODEMAP.md
### Specifications (Versioning & Usage)
- Always use the latest spec version for a topic (highest `-vN`), as linked from `specs/README.md` and the portal cheatsheet (`specs/portal/README.md`).
- 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).
- When adding or updating specs, publish changes under a new file with an incremented version suffix (e.g., `*-v3.md`) instead of overwriting. Refer to the Change Management section of each document for specific instructions.
- Developer Cheatsheet Portal & Cluster: specs/portal/README.md
- Backend (Go) Testing Guide: specs/dev/backend-testing.md
## 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/`.
- Frontend: Vue 3 + Vuetify 3 (`frontend/`)
- Docker/compose for dev/CI; Traefik is used for local TLS (`*.localssl.dev`)
## 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
- 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)
- Frontend unit tests are driven by 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`
### 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.
- For short examples inside comments, indent code rather than using backticks; godoc treats indented blocks as preformatted.
- 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.
## 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.
- 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
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.
## Agent Quick Tips (Do This)
### Testing
- Prefer targeted runs for speed:
- Unit/subpackage: `go test ./internal/<pkg> -run <Name> -count=1`
- Commands: `go test ./internal/commands -run <Name> -count=1`
- Avoid `./...` unless you intend to run the whole suite.
- Heavy tests (migrations/fixtures): internal/entity and internal/photoprism run DB migrations and load fixtures; expect 30120s on first run. Narrow with `-run` and keep iterations low.
- PhotoPrism config in tests: inside `internal/photoprism`, use the package global `photoprism.Config()` for runtimeaccurate behavior. Only construct a new config if you replace it via `photoprism.SetConfig`.
- CLI command tests: use `RunWithTestContext(cmd, args)` to capture output and avoid `os.Exit`; assert `cli.ExitCoder` codes when you need them.
- Reports are quoted: strings in CLI "show" output are rendered with quotes by the report helpers. Prefer `assert.Contains`/regex over strict, fully formatted equality when validating content.
#### Test Data & Fixtures (storage/testdata)
- Shared test files live under `storage/testdata`. The lifecycle is managed by `internal/config/test.go`.
- `NewTestConfig("<pkg>")` now calls `InitializeTestData()` so required directories exist (originals, import, cache, temp) before tests run.
- If you build a custom `*config.Config`, call `c.InitializeTestData()` (and optionally `c.AssertTestData(t)`) before asserting on filesystem paths.
- `InitializeTestData()` deletes existing testdata (`RemoveTestData()`), downloads/unzips fixtures if needed, and then calls `CreateDirectories()` to ensure required directories exist.
### Roles & ACL
- Always map roles via the central tables:
- Users: `acl.ParseRole(s)` or `acl.UserRoles[clean.Role(s)]`.
- Clients: `acl.ClientRoles[clean.Role(s)]`.
- Aliases: `RoleAliasNone` ("none") and the empty string both map to `RoleNone`; do not specialcase them in callers.
- Defaults:
- Client roles: if input is unknown, default to `RoleClient`.
- User roles: `acl.ParseRole` handles special tokens like `0/false/nil` as none.
- CLI usage strings: build flag help from `Roles.CliUsageString()` (e.g., `acl.ClientRoles.CliUsageString()`), not from hardcoded lists.
### 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.
### CLI Usage & Assertions
- Capture output with `RunWithTestContext`; usage and report values may be quoted and reordered (e.g., set semantics). Use substring checks or regex for the final ", or <last>" rule from `CliUsageString`.
- Prefer JSON output (`--json`) for stable machine assertions when commands offer it.
### API Development & Config Options
The following conventions summarize the insights gained when adding new configuration options, API endpoints, and related tests. Follow these conventions unless a maintainer requests an exception.
- Config precedence and new options
- Global precedence: If present, values in `options.yml` override CLI flags and environment variables; all override config defaults in `defaults.yml`. Dont specialcase a single option.
- Adding a new option:
- Add a field to `internal/config/options.go` with `yaml:"…"` and a `flag:"…"` tag.
- Register a CLI flag and env mapping in `internal/config/flags.go` (use `EnvVars(...)`).
- Expose a getter on `*config.Config` in the relevant file (e.g., cluster options in `config_cluster.go`).
- Add name/value to `rows` in `*config.Report()`, after the same option as in `internal/config/options.go` for `photoprism show config` to report it (obfuscate passwords with `*`).
- If the value must persist (e.g., a generated UUID), write it back to `options.yml` using a focused helper that merges keys.
- Tests: cover CLI/env/file precedence and persistence. When tests need a new flag, add it to `CliTestContext` in `internal/config/test.go`.
- Example: `ClusterUUID` precedence = `options.yml` → CLI/env (`--cluster-uuid` / `PHOTOPRISM_CLUSTER_UUID`) → generate UUIDv4 and persist.
- CLI flag precedence: when you need to favor an explicit CLI flag over defaults, check `c.cliCtx.IsSet("<flag>")` before applying additional precedence logic.
- Persisting generated options: when writing to `options.yml`, set `c.options.OptionsYaml = filepath.Join(c.ConfigPath(), "options.yml")` and reload the file to keep inmemory
- Database access
- The app uses GORM v1. Dont use `WithContext`; for executing raw SQL, prefer `db.Raw(stmt).Scan(&nop)`.
- When provisioning MariaDB/MySQL objects, quote identifiers with backticks and limit the character set; avoid building identifiers from untrusted input.
- Reuse `conf.Db()` and `conf.Database*()` getters; reject unsupported drivers early with a clear error.
- Rate limiting
- Reuse the existing limiter in `internal/server/limiter` (e.g., `limiter.Auth` / `limiter.Login`).
- For 429s, use `limiter.AbortJSON(c)` when applicable; avoid creating new limiter stacks.
- API handlers
- Use existing helpers: `api.ClientIP(c)`, `header.BearerToken(c)`, `Abort*` functions for errors.
- Compare secrets/tokens using constanttime compare; dont log secrets.
- Set `Cache-Control: no-store` on responses containing secrets.
- Register new routes in `internal/server/routes.go`. Dont edit `swagger.json` directly—run `make swag` to regenerate.
- Portal mode: set `PHOTOPRISM_NODE_ROLE=portal` and `PHOTOPRISM_JOIN_TOKEN`.
- Pagination defaults: for new list endpoints, prefer `count` default 100 (max 1000) and `offset` ≥ 0; document both in Swagger and validate bounds in handlers.
- Document parameters explicitly in Swagger annotations (path, query, and body) so `make swag` produces accurate docs.
- Swagger: `make fmt-go swag-fmt && make swag` after adding or changing API annotations.
- Focused tests: `go test ./internal/api -run Cluster -count=1` (or limit to the package you changed).
- Registry & secrets
- Store portal/node registry data under `conf.PortalConfigPath()/nodes/` as YAML with file mode `0600`.
- Keep node secrets out of logs and omit them from JSON responses unless explicitly returned on creation/rotation.
- Testing patterns
- Use `t.TempDir()` for isolated config paths and files. After changing `ConfigPath` postconstruction, reload `options.yml` into `c.options` if needed.
- Prefer small, focused unit tests; use existing test helpers (`NewConfig`, `CliTestContext`, etc.).
- API tests: use `NewApiTest()`, `PerformRequest*`, `AuthenticateAdmin` / `AuthenticateUser`, and `OAuthToken` for client-scope scenarios.
- Permissions: cover public=false (401), CDN headers (403), admin access (200), and client tokens with insufficient scope (403).
- Auth mode in tests: use `conf.SetAuthMode(config.AuthModePasswd)` (and defer restore) instead of flipping `Options().Public`; this toggles related internals used by tests.
- Fixtures caveat: user fixtures often have admin role; for negative permission tests, prefer OAuth client tokens with limited scope rather than relying on a nonadmin user.
### 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.
### Cluster Registry (Source of Truth)
- Use the clientbacked registry (`NewClientRegistryWithConfig`).
- The filebacked registry is historical; do not add new references to it.
- Migration “done” checklist: swap callsites → build → API tests → CLI tests → remove legacy references.
### 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).
- Testing
- Prefer targeted runs before the full suite:
- `go test ./internal/<pkg> -run <Name> -count=1`
- Avoid `./...` unless you intend to run everything.
- Importer duplicates: When reusing names/paths across tests, the importer may dedupe; vary file bytes via `YTDLP_DUMMY_CONTENT` or adjust `dest` to ensure assertions see the new file.
- Long-running packages: `internal/photoprism` is heavy; validate CLI/dl changes first in their packages, then run broader suites.
### 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`
- Known tooling constraints
- Python may not be available in the dev container; prefer `apply_patch`, Go, or Make targets over adhoc scripts.
- `make swag` may fetch modules; ensure network availability in CI before running.
### Cluster Config & Bootstrap
- Import rules (avoid cycles):
- Do not import `internal/service/cluster/instance/*` from `internal/config` or the cluster root package.
- Instance/service bootstraps talk to the Portal via HTTP(S); do not import Portal internals such as `internal/api` or `internal/service/cluster/registry`/`provisioner`.
- Prefer constants from `internal/service/cluster/const.go` (e.g., `cluster.RoleInstance`, `cluster.RolePortal`) over string literals.
- Early extension lifecycle (config.Init sequence):
1) Load `options.yml` and settings (`c.initSettings()`)
2) Run early hooks: `EarlyExt().InitEarly(c)` (may adjust DB settings)
3) Connect DB: `connectDb()` and `RegisterDb()`
4) Run regular extensions: `Ext().Init(c)`
- Theme endpoint usage:
- Server: `GET /api/v1/cluster/theme` generates a zip from `conf.ThemePath()`; returns 200 with a valid (possibly empty) zip or 404 if missing.
- Client/CLI: install only if `ThemePath()` is missing or lacks `app.js`; do not overwrite unless explicitly allowed.
- Use header helpers/constants from `pkg/service/http/header` (e.g., `header.Accept`, `header.ContentTypeZip`, `header.SetAuthorization`).
- Registration (instance bootstrap):
- Send `rotate=true` only if driver is MySQL/MariaDB and no DSN/name/user/password is configured (including *_FILE for password); never for SQLite.
- Treat 401/403/404 as terminal; apply bounded retries with delay for transient/network/429.
- Persist only missing `NodeSecret` and DB settings when rotation was requested.
- Testing patterns:
- Use `httptest` for Portal endpoints and `pkg/fs.Unzip` with size caps for extraction tests.

190
CODEMAP.md Normal file
View File

@@ -0,0 +1,190 @@
PhotoPrism — Backend CODEMAP
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`)
- 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/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
- `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/fs`, `pkg/log`, `pkg/service/http/header`
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.
- 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`
- YAML options mapping: `internal/config/options_report.go` + `internal/config/report_sections.go` → surfaced by `photoprism show config-yaml --md`
- Report current values: `internal/config/report.go` → surfaced by `photoprism show config` (alias `photoprism config --md`).
- 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.
- OIDC: `internal/auth/oidc/*`.
Media Processing
- Thumbnails: `internal/thumb/*` and helpers in `internal/photoprism/mediafile_thumbs.go`.
- Metadata: `internal/meta/*`.
- FFmpeg integration: `internal/ffmpeg/*`.
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`).
- Instance bootstrap & registration: `internal/service/cluster/instance/*` (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/service/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`.
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/service/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`.
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/*`
- Headers: `pkg/service/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/portal/README.md`

View File

@@ -1,8 +1,12 @@
# Ubuntu 24.10 (Oracular Oriole)
FROM photoprism/develop:250103-oracular
# Ubuntu 25.04 (Plucky Puffin)
FROM photoprism/develop:250912-plucky
# Harden npm usage by default (applies to npm ci / install in dev container)
ENV NPM_CONFIG_IGNORE_SCRIPTS=true
## Alternative Environments:
# FROM photoprism/develop:armv7 # ARMv7 (32bit)
# FROM photoprism/develop:plucky # Ubuntu 25.04 (Plucky Puffin)
# FROM photoprism/develop:oracular # Ubuntu 24.10 (Oracular Oriole)
# FROM photoprism/develop:noble # Ubuntu 24.04 LTS (Noble Numbat)
# FROM photoprism/develop:mantic # Ubuntu 23.10 (Mantic Minotaur)
@@ -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

292
Makefile
View File

@@ -1,23 +1,26 @@
# Copyright © 2018 - 2024 PhotoPrism UG. All rights reserved.
# Copyright © 2018 - 2025 PhotoPrism UG. All rights reserved.
#
# Questions? Email us at hello@photoprism.app or visit our website to learn
# 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)
@@ -68,7 +74,9 @@ pull: docker-pull
test: test-js test-go
test-go: reset-sqlite run-test-go
test-pkg: reset-sqlite run-test-pkg
test-ai: reset-sqlite run-test-ai
test-api: reset-sqlite run-test-api
test-video: reset-sqlite run-test-video
test-entity: reset-sqlite run-test-entity
test-commands: reset-sqlite run-test-commands
test-photoprism: reset-sqlite run-test-photoprism
@@ -78,6 +86,9 @@ acceptance-run-chromium: storage/acceptance acceptance-auth-sqlite-restart wait
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,8 +105,11 @@ 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
codex: dep-codex codex-version
codex-version:
codex --version
docs: swag
swag: swag-json
swag-json:
@@ -146,16 +160,18 @@ 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" --entrypoint "" photoprism/develop:jammy make all install tar.gz
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:
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" --entrypoint "" photoprism/develop:jammy make all install tar.gz
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" photoprism/develop:jammy make all install tar.gz
pkg-armv7:
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" --entrypoint "" photoprism/develop:jammy make all install tar.gz
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" photoprism/develop:jammy make all install tar.gz
install:
$(info Installing in "$(DESTDIR)"...)
@[ ! -d "$(DESTDIR)" ] || (echo "ERROR: Install path '$(DESTDIR)' already exists!"; exit 1)
@@ -188,15 +204,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:
@@ -231,13 +247,24 @@ dep-list:
dep-npm:
sudo npm install -g npm
dep-js:
(cd frontend && npm ci --no-update-notifier --no-audit)
(cd frontend && npm ci --ignore-scripts --no-update-notifier --no-audit)
# TODO: If in the future we want to test in a real browser environment, add this (Playwright)
# (cd frontend && npx playwright install chromium)
dep-codex:
@echo "Installing latest 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
@@ -271,59 +298,83 @@ 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 --entrypoint "" 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 --entrypoint "" 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 --entrypoint "" 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 --entrypoint "" 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:plucky ./scripts/dist/build-libheif.sh v1.19.7
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.7
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.7
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.7
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.7
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 --entrypoint "" 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 --entrypoint "" 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 --entrypoint "" 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 --entrypoint "" 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:plucky ./scripts/dist/build-libheif.sh v1.19.7
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.7
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.7
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.7
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.7
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 --entrypoint "" 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 --entrypoint "" 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.19.7
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.7
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 --entrypoint "" 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 --entrypoint "" 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 --entrypoint "" photoprism/develop:jammy ./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: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: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 --entrypoint "" 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 --entrypoint "" 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 --entrypoint "" photoprism/develop:jammy ./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: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: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 --entrypoint "" 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 --entrypoint "" 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
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-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 "^(Common|Core)\:*" --test-meta mode=public --config-file ./testcaferc.json "tests/acceptance")
(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 "^(Common|Core)\:*" --test-meta mode=public,type=short --config-file ./testcaferc.json "tests/acceptance")
(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 "tests/acceptance")
(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 "^(Common|Core)\:*" --test-meta mode=auth --config-file ./testcaferc.json "tests/acceptance")
(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 "^(Common|Core)\:*" --test-meta mode=auth,type=short --config-file ./testcaferc.json "tests/acceptance")
(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 "tests/acceptance")
(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
@@ -347,61 +398,96 @@ run-test-short:
$(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 -timeout 20m ./pkg/... ./internal/...
$(GOTEST) -parallel 1 -count 1 -cpu 1 -tags="slow,develop" -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 -timeout 20m ./pkg/... ./internal/...
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 -timeout 20m ./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 -timeout 20m ./internal/api/...
$(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 -timeout 20m ./internal/entity/...
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/entity/...
run-test-commands:
$(info Running all CLI command tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./internal/commands/...
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/commands/...
run-test-photoprism:
$(info Running all Go tests in "/internal/photoprism"...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./internal/photoprism/...
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/photoprism/...
test-parallel:
$(info Running all Go tests in parallel mode...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./pkg/... ./internal/...
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./pkg/... ./internal/...
test-verbose:
$(info Running all Go tests in verbose mode...)
$(GOTEST) -parallel 1 -count 1 -cpu 1 -tags slow -timeout 20m -v ./pkg/... ./internal/...
$(GOTEST) -parallel 1 -count 1 -cpu 1 -tags="slow,develop" -timeout 20m -v ./pkg/... ./internal/...
test-race:
$(info Running all Go tests with race detection in verbose mode...)
$(GOTEST) -tags slow -race -timeout 60m -v ./pkg/... ./internal/...
$(GOTEST) -tags="slow,develop" -race -timeout 60m -v ./pkg/... ./internal/...
test-coverage:
$(info Running all Go tests with code coverage report...)
go test -parallel 1 -count 1 -cpu 1 -failfast -tags slow -timeout 30m -coverprofile coverage.txt -covermode atomic ./pkg/... ./internal/...
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
docker-build:
$(DOCKER_COMPOSE) --profile=all pull --ignore-pull-failures
$(DOCKER_COMPOSE) down --remove-orphans
$(DOCKER_COMPOSE) build --pull
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-plucky docker-develop-plucky-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
@@ -410,7 +496,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
@@ -430,8 +516,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
@@ -463,11 +548,19 @@ 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 "-t photoprism/develop:latest -t photoprism/develop:ubuntu"
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
unstable: docker-unstable
docker-unstable: docker-unstable-mantic
docker-unstable-jammy:
@@ -485,10 +578,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-plucky
docker-preview-latest: docker-preview-ubuntu
docker-preview-debian: docker-preview-bookworm
docker-preview-ubuntu: docker-preview-oracular
docker-preview-ubuntu: docker-preview-plucky
docker-preview-other: docker-preview-debian docker-preview-bullseye
docker-preview-arm: docker-preview-arm64 docker-preview-armv7
docker-preview-bookworm:
@@ -553,12 +646,18 @@ 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-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-plucky
docker-release-other: docker-release-debian docker-release-bullseye
docker-release-arm: docker-release-arm64 docker-release-armv7
docker-release-bookworm:
@@ -623,6 +722,16 @@ 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-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:
@@ -637,20 +746,40 @@ stop-mysql:
$(DOCKER_COMPOSE) -f compose.mysql.yaml stop mysql
logs-mysql:
$(DOCKER_COMPOSE) -f compose.mysql.yaml logs -f mysql
latest:
test-latest:
$(DOCKER_COMPOSE) -f compose.latest.yaml pull photoprism-latest
$(DOCKER_COMPOSE) -f compose.latest.yaml stop photoprism-latest
$(DOCKER_COMPOSE) -f compose.latest.yaml up -d --wait photoprism-latest
start-latest:
$(DOCKER_COMPOSE) -f compose.latest.yaml up photoprism-latest
stop-latest:
$(DOCKER_COMPOSE) -f compose.latest.yaml stop photoprism-latest
$(DOCKER_COMPOSE) -f compose.latest.yaml stop -t 30 photoprism-latest
down-latest:
$(DOCKER_COMPOSE) -f compose.latest.yaml down -t 30 photoprism-latest
terminal-latest:
$(DOCKER_COMPOSE) -f compose.latest.yaml exec photoprism-latest bash
logs-latest:
$(DOCKER_COMPOSE) -f compose.latest.yaml logs -f photoprism-latest
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
test-preview:
$(DOCKER_COMPOSE) -f compose.preview.yaml pull photoprism-preview
$(DOCKER_COMPOSE) -f compose.preview.yaml stop photoprism-preview
$(DOCKER_COMPOSE) -f compose.preview.yaml up -d --wait photoprism-preview
start-preview:
$(DOCKER_COMPOSE) -f compose.preview.yaml up photoprism-preview
stop-preview:
$(DOCKER_COMPOSE) -f compose.preview.yaml stop -t 30 photoprism-preview
down-preview:
$(DOCKER_COMPOSE) -f compose.preview.yaml down -t 30 photoprism-preview
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-plucky
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-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
@@ -687,6 +816,10 @@ 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-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
@@ -717,6 +850,9 @@ docker-local-develop-noble:
docker-local-develop-oracular:
docker pull ubuntu:oracular
scripts/docker/build.sh develop oracular /oracular
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)
@@ -764,7 +900,7 @@ fmt-js:
fmt-go:
go fmt ./pkg/... ./internal/... ./cmd/...
gofmt -w -s pkg internal cmd
goimports -w pkg internal cmd
goimports -w -local "github.com/photoprism" pkg internal cmd
tidy:
go mod tidy
users:

1755
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

@@ -28,6 +28,10 @@ You are [welcome to contact us](https://www.photoprism.app/contact) for change r
**Joseph Hobbs** (November 2024)
**[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)

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
assets/examples/m2ts.mp4 Normal file

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="overflow-y-hidden">
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="loading">
<head>
<meta charset="utf-8">
{{if .redirect }}<meta http-equiv="refresh" content="3; url={{ .redirect }}">{{end}}

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

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="overflow-y-hidden">
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="loading">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
@@ -15,19 +15,19 @@
{{template "app.gohtml" .}}
<script>{{ if eq .status "success" }}
window.localStorage.setItem("sessionId", {{ .session_id }});
window.localStorage.setItem("authToken", {{ .access_token }});
window.localStorage.setItem("provider", {{ .provider }});
window.localStorage.setItem("user", JSON.stringify({{ .user }}));
window.localStorage.removeItem("authError");
window.localStorage.setItem("session.id", {{ .session_id }});
window.localStorage.setItem("session.token", {{ .access_token }});
window.localStorage.setItem("session.provider", {{ .provider }});
window.localStorage.setItem("session.user", JSON.stringify({{ .user }}));
window.localStorage.removeItem("session.error");
{{ else if eq .status "failed" }}
window.localStorage.setItem("authError", {{ .error }});
window.localStorage.setItem("session.error", {{ .error }});
{{ else }}
window.localStorage.removeItem("sessionId");
window.localStorage.removeItem("authToken");
window.localStorage.removeItem("provider");
window.localStorage.removeItem("user");
window.localStorage.removeItem("authError");
window.localStorage.removeItem("session.id");
window.localStorage.removeItem("session.token");
window.localStorage.removeItem("session.provider");
window.localStorage.removeItem("session.user");
window.localStorage.removeItem("session.error");
{{ end }}
window.location.href = {{ .config.LoginUri }};
</script>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="overflow-y-hidden">
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="loading">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
@@ -19,6 +19,7 @@
<meta name="twitter:description" content="{{ .config.SiteDescription }}">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="{{ .config.SiteTitle }}">
@@ -35,7 +36,6 @@
<body class="{{ .config.Flags }} nojs">
{{template "app.gohtml" .}}
<script src="{{ .config.JsUri }}"></script>
</body>
</html>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="overflow-y-hidden">
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="loading">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
@@ -19,7 +19,6 @@
<body class="{{ .config.Flags }} nojs">
{{template "app.gohtml" .}}
<script src="{{ .config.JsUri }}"></script>
</body>
</html>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="overflow-y-hidden">
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="loading">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="overflow-y-hidden">
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="loading">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
@@ -22,10 +22,8 @@
{{if .config.SiteDescription}}<meta name="description" content="{{ .config.SiteDescription }}"/>{{end}}
{{template "favicons.gohtml" .}}
<link rel="stylesheet" href="{{ .config.CssUri }}">
<link rel="manifest" href="{{ .config.ManifestUri }}" crossorigin="use-credentials">
{{template "styles.gohtml" .}}
{{template "manifest.gohtml" .}}
<script>
window.__SHARED__ = {{ .shared }};
window.__CONFIG__ = {{ .config }};
@@ -34,7 +32,6 @@
<body class="{{ .config.Flags }} nojs">
{{template "app.gohtml" .}}
<script src="{{ .config.JsUri }}"></script>
</body>
</html>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="overflow-y-hidden">
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="loading">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2018 - 2024 PhotoPrism UG. All rights reserved.
Copyright (c) 2018 - 2025 PhotoPrism UG. All rights reserved.
This program is free software: you can redistribute it and/or modify
it under Version 3 of the GNU Affero General Public License (the "AGPL"):
@@ -41,7 +41,7 @@ const appEdition = "ce"
const appDescription = "PhotoPrism® is an AI-Powered Photos App for the Decentralized Web." +
" 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."
const appCopyright = "(c) 2018-2024 PhotoPrism UG. All rights reserved."
const appCopyright = "(c) 2018-2025 PhotoPrism UG. All rights reserved."
// Metadata contains build specific information.
var Metadata = map[string]interface{}{

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,14 +60,14 @@ 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-develop
name: photoprism
external: true

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,8 +73,8 @@ services:
volumes:
- "./storage:/photoprism/storage"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism-develop
name: photoprism
external: true

View File

@@ -2,6 +2,48 @@
## Setup: https://docs.photoprism.app/developer-guide/setup/ ##
services:
## MariaDB 11.4 Database Server
## Docs: https://mariadb.com/docs/reference/
## Release Notes: https://mariadb.com/kb/en/release-notes-mariadb-11-4-series/
mariadb-11-4:
image: mariadb:11.4
security_opt: # see https://github.com/MariaDB/mariadb-docker/issues/434#issuecomment-1136151239
- seccomp:unconfined
- apparmor:unconfined
command: --port=4001 --innodb-strict-mode=1 --innodb-buffer-pool-size=256M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120
expose:
- "4001"
volumes:
- "./scripts/sql/mariadb-init.sql:/docker-entrypoint-initdb.d/init.sql"
environment:
MARIADB_AUTO_UPGRADE: "1"
MARIADB_INITDB_SKIP_TZINFO: "1"
MARIADB_DATABASE: "photoprism"
MARIADB_USER: "photoprism"
MARIADB_PASSWORD: "photoprism"
MARIADB_ROOT_PASSWORD: "photoprism"
## MariaDB 11.3 Database Server
## Docs: https://mariadb.com/docs/reference/
## Release Notes: https://mariadb.com/kb/en/release-notes-mariadb-11-3-series/
mariadb-11-3:
image: mariadb:11.3
security_opt: # see https://github.com/MariaDB/mariadb-docker/issues/434#issuecomment-1136151239
- seccomp:unconfined
- apparmor:unconfined
command: --port=4001 --innodb-strict-mode=1 --innodb-buffer-pool-size=256M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120
expose:
- "4001"
volumes:
- "./scripts/sql/mariadb-init.sql:/docker-entrypoint-initdb.d/init.sql"
environment:
MARIADB_AUTO_UPGRADE: "1"
MARIADB_INITDB_SKIP_TZINFO: "1"
MARIADB_DATABASE: "photoprism"
MARIADB_USER: "photoprism"
MARIADB_PASSWORD: "photoprism"
MARIADB_ROOT_PASSWORD: "photoprism"
## MariaDB 11.2 Database Server
## Docs: https://mariadb.com/docs/reference/
## Release Notes: https://mariadb.com/kb/en/release-notes-mariadb-11-2-series/
@@ -13,8 +55,6 @@ services:
command: --port=4001 --innodb-strict-mode=1 --innodb-buffer-pool-size=256M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120
expose:
- "4001"
ports:
- "4003:4001" # database port (host:container)
volumes:
- "./scripts/sql/mariadb-init.sql:/docker-entrypoint-initdb.d/init.sql"
environment:
@@ -35,8 +75,6 @@ services:
command: --port=4001 --innodb-buffer-pool-size=256M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120
expose:
- "4001"
ports:
- "4002:4001" # database port (host:container)
volumes:
- "./scripts/sql/mariadb-init.sql:/docker-entrypoint-initdb.d/init.sql"
environment:
@@ -107,8 +145,8 @@ services:
MYSQL_PASSWORD: "photoprism"
MYSQL_ROOT_PASSWORD: "photoprism"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism-develop
name: photoprism
external: true

View File

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

263
compose.nvidia.yaml Normal file
View File

@@ -0,0 +1,263 @@
services:
## PhotoPrism (Development Environment for Nvidia)
photoprism:
build: .
image: photoprism/photoprism:develop
runtime: nvidia
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: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"
- "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)
## 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: "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: "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" # 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
restart: unless-stopped
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"
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
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

@@ -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:

73
compose.preview.yaml Normal file
View File

@@ -0,0 +1,73 @@
## FOR TEST AND DEVELOPMENT ONLY, DO NOT USE IN PRODUCTION ##
## Setup: https://docs.photoprism.app/developer-guide/setup/ ##
services:
## Development Preview Build
photoprism-preview:
image: photoprism/photoprism:preview
security_opt:
- seccomp:unconfined
- apparmor:unconfined
ports:
- "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`)"
- "traefik.http.routers.preview.tls.domains[0].main=localssl.dev"
- "traefik.http.routers.preview.tls.domains[0].sans=*.localssl.dev"
- "traefik.http.routers.preview.tls=true"
environment:
PHOTOPRISM_INIT: "https"
PHOTOPRISM_UID: ${UID:-1000} # user id, should match your host user id
PHOTOPRISM_GID: ${GID:-1000} # group id
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_SITE_URL: "https://preview.localssl.dev/" # server URL in the format "http(s)://domain.name(:port)/(path)"
PHOTOPRISM_SITE_CAPTION: "Preview"
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: "false"
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_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_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)
PHOTOPRISM_THUMB_SIZE: 1920 # pre-rendered thumbnail size limit (default 1920, min 720, max 7680)
# 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: 1 # show TensorFlow log messages for development
working_dir: "/photoprism"
volumes:
- "./storage:/photoprism/storage"
- "./storage/originals:/photoprism/originals"
## Join shared "photoprism" network
networks:
default:
name: photoprism
external: true

View File

@@ -10,24 +10,29 @@ services:
- mariadb
- dummy-webdav
- dummy-oidc
stop_grace_period: 10s
stop_grace_period: 15s
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: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"
@@ -36,6 +41,11 @@ services:
- "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"
## Override variables with optional env file, see https://docs.docker.com/reference/compose-file/services/#required
env_file:
- path: ".env"
required: false
## 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
@@ -46,6 +56,11 @@ services:
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 "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"
@@ -91,6 +106,7 @@ services:
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
@@ -103,30 +119,34 @@ 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:
- ".:/go/src/github.com/photoprism/photoprism"
- "./storage:/photoprism"
- "go-mod:/go/pkg/mod"
## MariaDB (Database Server)
@@ -153,6 +173,150 @@ 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" ]
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
restart: unless-stopped
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
restart: unless-stopped
stop_grace_period: 5s
## 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
## Only starts this service if the "all" or "vision" profile is specified::
## docker compose --profile vision up -d
profiles: [ "all", "vision" ]
stop_grace_period: 15s
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/
@@ -251,7 +415,7 @@ 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"]
profiles: [ "all", "auth", "prometheus" ]
labels:
- "traefik.enable=true"
- "traefik.http.services.prometheus.loadbalancer.server.port=9090"
@@ -271,8 +435,8 @@ 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-develop
name: photoprism
driver: bridge

View File

@@ -12,7 +12,7 @@ See our [Getting Started FAQ](https://docs.photoprism.app/getting-started/faq/#h
**(2) Docker saves time through simplified deployment and testing.** A main advantage of Docker is that application images can be [easily made available](https://hub.docker.com/r/photoprism/photoprism) to users via Internet. It provides a common standard across most operating systems and devices, which saves our team a lot of time that we can then spend [more effectively](https://docs.photoprism.app/developer-guide/code-quality/#effectiveness-efficiency), for example, providing support and developing one of the many features that users are waiting for.
**(3) Dockerfiles are part of the source code repository.** [Human-readable](https://docs.docker.com/engine/reference/builder/) and [versioned Dockerfiles](https://github.com/photoprism/photoprism/tree/develop/docker) that are part of our public source code help avoid "works for me" moments and other unwelcome surprises by enabling us to have the exact [same environment](http://localhost:8000/developer-guide/setup/) everywhere in [development](https://github.com/photoprism/photoprism/tree/develop/docker/develop), [staging, and production](https://github.com/photoprism/photoprism/tree/develop/docker/photoprism).
**(3) Dockerfiles are part of the source code repository.** [Human-readable](https://docs.docker.com/engine/reference/builder/) and [versioned Dockerfiles](https://github.com/photoprism/photoprism/tree/develop/docker) that are part of our public source code help avoid "works for me" moments and other unwelcome surprises by enabling us to have the exact [same environment](https://docs.photoprism.app/developer-guide/setup/) everywhere in [development](https://github.com/photoprism/photoprism/tree/develop/docker/develop), [staging, and production](https://github.com/photoprism/photoprism/tree/develop/docker/photoprism).
**(4) Running applications in containers is more secure.** Last but not least, virtually all file format parsers have vulnerabilities that just haven't been discovered yet. This is a known risk that can affect you even if your computer is not directly connected to the Internet. Running apps in a container with limited host access is an easy way to improve security without compromising performance and usability.

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" \
@@ -14,10 +15,10 @@ ENV TF_CPP_MIN_LOG_LEVEL=2 \
PHOTOPRISM_THUMB_LIBRARY="auto" \
PHOTOPRISM_THUMB_FILTER="auto" \
PHOTOPRISM_THUMB_COLOR="auto" \
PHOTOPRISM_THUMB_SIZE=2560 \
PHOTOPRISM_THUMB_SIZE=4096 \
PHOTOPRISM_THUMB_SIZE_UNCACHED=4096 \
PHOTOPRISM_THUMB_UNCACHED="true" \
PHOTOPRISM_JPEG_QUALITY=87 \
PHOTOPRISM_JPEG_QUALITY=83 \
PHOTOPRISM_JPEG_SIZE=4096 \
PHOTOPRISM_PNG_SIZE=4096 \
PHOTOPRISM_APP_NAME="Demo" \

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" \
@@ -14,10 +15,10 @@ ENV TF_CPP_MIN_LOG_LEVEL=2 \
PHOTOPRISM_THUMB_LIBRARY="auto" \
PHOTOPRISM_THUMB_FILTER="auto" \
PHOTOPRISM_THUMB_COLOR="auto" \
PHOTOPRISM_THUMB_SIZE=2560 \
PHOTOPRISM_THUMB_SIZE=4096 \
PHOTOPRISM_THUMB_SIZE_UNCACHED=4096 \
PHOTOPRISM_THUMB_UNCACHED="true" \
PHOTOPRISM_JPEG_QUALITY=87 \
PHOTOPRISM_JPEG_QUALITY=83 \
PHOTOPRISM_JPEG_SIZE=4096 \
PHOTOPRISM_PNG_SIZE=4096 \
PHOTOPRISM_APP_NAME="Demo" \

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="overflow-y-hidden">
<html lang="en" dir="auto" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" class="loading">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
@@ -20,6 +20,7 @@
<meta name="twitter:description" content="{{ .config.SiteDescription }}">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="{{ .config.SiteTitle }}">
@@ -27,20 +28,16 @@
{{if .config.SiteDescription}}<meta name="description" content="{{ .config.SiteDescription }}"/>{{end}}
{{template "favicons.gohtml" .}}
<link rel="stylesheet" href="{{ .config.CssUri }}">
<link rel="manifest" href="{{ .config.ManifestUri }}" crossorigin="use-credentials">
{{template "styles.gohtml" .}}
{{template "manifest.gohtml" .}}
<script>
window.__CONFIG__ = {{ .config }};
</script>
<script async defer data-domain="{{ .config.SiteDomain }}" src="https://a.photoprism.app/js/s.js"></script>
</head>
<body class="{{ .config.Flags }} nojs">
{{template "app.gohtml" .}}
<script src="{{ .config.JsUri }}"></script>
</body>
</html>

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"
@@ -17,6 +17,10 @@ entryPoints:
scheme: https
websecure:
address: ":443"
transport:
respondingTimeouts:
readTimeout: "3h"
writeTimeout: "0s"
certificatesResolvers:
myresolver:

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" \
@@ -14,10 +15,10 @@ ENV TF_CPP_MIN_LOG_LEVEL=2 \
PHOTOPRISM_THUMB_LIBRARY="auto" \
PHOTOPRISM_THUMB_FILTER="auto" \
PHOTOPRISM_THUMB_COLOR="auto" \
PHOTOPRISM_THUMB_SIZE=2560 \
PHOTOPRISM_THUMB_SIZE=4096 \
PHOTOPRISM_THUMB_SIZE_UNCACHED=4096 \
PHOTOPRISM_THUMB_UNCACHED="true" \
PHOTOPRISM_JPEG_QUALITY=87 \
PHOTOPRISM_JPEG_QUALITY=83 \
PHOTOPRISM_JPEG_SIZE=4096 \
PHOTOPRISM_PNG_SIZE=4096 \
PHOTOPRISM_APP_NAME="Demo" \

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" \
@@ -14,10 +15,10 @@ ENV TF_CPP_MIN_LOG_LEVEL=2 \
PHOTOPRISM_THUMB_LIBRARY="auto" \
PHOTOPRISM_THUMB_FILTER="auto" \
PHOTOPRISM_THUMB_COLOR="auto" \
PHOTOPRISM_THUMB_SIZE=2560 \
PHOTOPRISM_THUMB_SIZE=4096 \
PHOTOPRISM_THUMB_SIZE_UNCACHED=4096 \
PHOTOPRISM_THUMB_UNCACHED="true" \
PHOTOPRISM_JPEG_QUALITY=87 \
PHOTOPRISM_JPEG_QUALITY=83 \
PHOTOPRISM_JPEG_SIZE=4096 \
PHOTOPRISM_PNG_SIZE=4096 \
PHOTOPRISM_APP_NAME="Demo" \

View File

@@ -1,7 +1,7 @@
#### Base Image: Ubuntu 24.04 LTS (Noble Numbat)
FROM ubuntu:noble
# Copyright © 2018 - 2024 PhotoPrism UG. All rights reserved.
# Copyright © 2018 - 2025 PhotoPrism UG. All rights reserved.
#
# Questions? Email us at hello@photoprism.app or visit our website to learn
# more about our team, products and services: https://www.photoprism.app/
@@ -30,13 +30,17 @@ 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"
PROG="photoprism" \
S6_KEEP_ENV=1 \
S6_VERBOSITY=0 \
S6_LOGGING=0
# Copy scripts and package sources config.
COPY --chown=root:root --chmod=755 /scripts/dist/ /scripts/
@@ -60,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 && \
@@ -70,6 +75,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
/scripts/install-go-tools.sh && \
echo 'alias go=richgo ll="ls -alh"' >> /etc/skel/.bashrc && \
echo 'export PS1="\u@$DOCKER_TAG:\w\$ "' >> /etc/skel/.bashrc && \
/scripts/install-dircolors.sh && \
cp /etc/skel/.bashrc /root/.bashrc && \
cp /scripts/convert/policy.xml /etc/ImageMagick-6/policy.xml && \
/scripts/create-users.sh && \
@@ -82,16 +88,17 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
/photoprism/storage/backups \
/photoprism/storage/config \
/photoprism/storage/cache && \
/scripts/install-s6.sh && \
/scripts/cleanup.sh
# Download models and testdata.
# Download machine learning models and test data.
RUN mkdir /tmp/photoprism && \
wget "https://dl.photoprism.app/tensorflow/nsfw.zip?${BUILD_TAG}" -O /tmp/photoprism/nsfw.zip && \
wget "https://dl.photoprism.app/tensorflow/nasnet.zip?${BUILD_TAG}" -O /tmp/photoprism/nasnet.zip && \
wget "https://dl.photoprism.app/tensorflow/facenet.zip?${BUILD_TAG}" -O /tmp/photoprism/facenet.zip && \
wget "https://dl.photoprism.app/qa/testdata.zip?${BUILD_TAG}" -O /tmp/photoprism/testdata.zip
# Default working directory.
# Set default working directory.
WORKDIR "/go/src/github.com/photoprism/photoprism"
# Expose the following container ports:
@@ -103,9 +110,6 @@ WORKDIR "/go/src/github.com/photoprism/photoprism"
# - 40000 (Go Debugger)
EXPOSE 2342 2343 2442 2443 9515 40000
# Declare container entrypoint script.
ENTRYPOINT ["/scripts/entrypoint.sh"]
# Keep container running.
CMD ["tail", "-f", "/dev/null"]
# Set default entrypoint and command.
ENTRYPOINT ["/init"]
CMD ["/scripts/cmd.sh", "tail", "-f", "/dev/null"]

View File

@@ -1,7 +1,7 @@
#### Base Image: Debian 12 (Bookworm)
FROM debian:bookworm-slim
# Copyright © 2018 - 2024 PhotoPrism UG. All rights reserved.
# Copyright © 2018 - 2025 PhotoPrism UG. All rights reserved.
#
# Questions? Email us at hello@photoprism.app or visit our website to learn
# more about our team, products and services: https://www.photoprism.app/
@@ -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.
@@ -47,9 +48,9 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
libc6 ca-certificates sudo bash tzdata \
gpg zip unzip wget curl rsync make nano \
xz-utils gpg zip unzip wget curl rsync make nano \
jq lsof lshw sqlite3 mariadb-client imagemagick libvips-dev libyuv0 \
exiftool darktable rawtherapee libheif-examples librsvg2-bin ibrav1e-dev \
exiftool darktable rawtherapee libheif-examples librsvg2-bin librav1e-dev \
ffmpeg libavcodec-extra libdav1d-dev x264 x265 libvpx-dev libwebm-dev \
libmatroska-dev libdvdread-dev libebml5 libgav1-bin libatomic1 \
iputils-ping dnsutils \
@@ -57,6 +58,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
echo 'alias ll="ls -alh"' >> /etc/skel/.bashrc && \
echo 'export PS1="\u@$DOCKER_TAG:\w\$ "' >> /etc/skel/.bashrc && \
echo "ALL ALL=(ALL) NOPASSWD:SETENV: /scripts/entrypoint-init.sh" >> /etc/sudoers.d/init && \
/scripts/install-dircolors.sh && \
cp /etc/skel/.bashrc /root/.bashrc && \
/scripts/create-users.sh && \
install -d -m 0777 -o 1000 -g 1000 \
@@ -70,7 +72,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
/photoprism/storage/cache && \
/scripts/cleanup.sh
# Default working directory.
# Set default working directory.
WORKDIR /photoprism
# Expose HTTP and HTTPS ports.

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