Compare commits

..

1 commit

Author SHA1 Message Date
Michael Mayer
8b79aa375a Frontend: Add slideshow button to photo viewer #269
Signed-off-by: Michael Mayer <michael@liquidbytes.net>
2020-05-19 16:50:21 +02:00
4390 changed files with 71061 additions and 463149 deletions

View file

@ -1,5 +0,0 @@
{
"contributors": "https://api.github.com/repos/photoprism/photoprism/contributors",
"message": "Thank you very much for your contribution! As with many open-source projects, we ask that you sign our contributor license agreement so your pull request can be safely merged.",
"label": "cla-signed"
}

View file

@ -1,22 +1,18 @@
/photos/*
/assets/photos/*
/assets/cache/*
/frontend/node_modules/*
/node_modules
/assets/static/build/*
/assets/facenet
/assets/nasnet
/assets/nsfw
/storage
/build
/assets/resources/database/*
/assets/resources/static/build/*
/assets/resources/nasnet
/assets/resources/nsfw
/assets/testdata
/assets/backups
Dockerfile
/photoprism
/photoprism-*
docker-compose*
/coverage.*
/frontend/tests/acceptance/screenshots
/tmp/
.dockerignore
.idea
.DS_Store
.env
*.db
*.db-journal
Dockerfile
docker-compose*
/frontend/tests/acceptance/screenshots

View file

@ -1,182 +0,0 @@
---
kind: pipeline
type: exec
name: linux-amd64
platform:
arch: amd64
os: linux
trigger:
event:
exclude:
- pull_request
- tag
steps:
- name: up
environment:
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
CODECOV_TOKEN:
from_secret: codecov_token
commands:
- scripts/login.sh
- docker compose -f docker-compose.ci.yml pull
- docker compose -f docker-compose.ci.yml stop
- docker compose -f docker-compose.ci.yml up -d --build --force-recreate
- name: test-develop
environment:
CODECOV_TOKEN:
from_secret: codecov_token
commands:
- docker compose -f docker-compose.ci.yml exec -e CODECOV_TOKEN=$${CODECOV_TOKEN} -T photoprism make all test-js test-codecov install migrate
when:
branch:
- develop
- name: test
commands:
- docker compose -f docker-compose.ci.yml exec -T photoprism make all test install migrate
when:
branch:
- preview
- release
- name: down
commands:
- docker compose -f docker-compose.ci.yml down
when:
status:
- failure
- success
- name: deploy-preview
environment:
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
commands:
- scripts/login.sh
- scripts/install-qemu.sh
- make docker-preview
when:
status:
- success
branch:
- preview
- name: deploy-demo
environment:
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
commands:
- scripts/login.sh
- docker pull photoprism/photoprism:preview
- make docker-demo
when:
status:
- success
branch:
- preview
- name: deploy-release
environment:
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
commands:
- scripts/login.sh
- scripts/install-qemu.sh
- make docker-release
when:
status:
- success
branch:
- release
---
kind: pipeline
type: exec
name: pull-request
platform:
arch: amd64
os: linux
trigger:
event:
include:
- pull_request
steps:
- name: up
commands:
- docker-compose -f docker-compose.ci.yml up -d --build --force-recreate
- name: test
commands:
- docker-compose -f docker-compose.ci.yml exec -T photoprism make all test install migrate
- name: down
commands:
- docker-compose -f docker-compose.ci.yml down
when:
status:
- failure
- success
---
kind: pipeline
type: exec
name: linux-arm64
trigger:
branch:
- preview
event:
exclude:
- pull_request
- tag
platform:
arch: arm64
os: linux
steps:
- name: up
environment:
DOCKER_USERNAME:
from_secret: docker_username
DOCKER_PASSWORD:
from_secret: docker_password
commands:
- scripts/login.sh
- docker-compose -f docker-compose.ci.yml stop
- docker-compose -f docker-compose.ci.yml up -d --build --force-recreate
- name: test
commands:
- docker-compose -f docker-compose.ci.yml exec -T photoprism make all test-go install migrate
- name: down
commands:
- docker-compose -f docker-compose.ci.yml down
- docker system prune -f
when:
status:
- failure
- success
---
kind: signature
hmac: 61a27b3c3142a9a1d1972f0fe00a8aa19d99623e6fea6e1d5ad44b6b20cd5cd1
...

40
.fossa.yml Normal file → Executable file
View file

@ -1,24 +1,18 @@
version: 3
# Generated by FOSSA CLI (https://github.com/fossas/fossa-cli)
# Visit https://fossa.com to learn more
project:
name: "PhotoPrism"
id: "github.com/photoprism/photoprism"
url: "https://github.com/photoprism/photoprism"
link: "https://www.photoprism.app/"
revision:
branch: "develop"
paths:
exclude:
- ./.github
- ./assets
- ./build
- ./docker
- ./frontend/tests
- ./storage
- ./scripts
- ./test
telemetry:
scope: "off"
version: 2
cli:
server: https://app.fossa.com
fetcher: custom
project: git@github.com:photoprism/photoprism.git
analyze:
modules:
- name: github.com/photoprism/photoprism/cmd/photoprism
type: go
target: github.com/photoprism/photoprism/cmd/photoprism
path: cmd/photoprism
- name: frontend
type: npm
target: frontend
path: frontend

View file

@ -1,81 +0,0 @@
---
name: Bug Report
about: Report a new and clearly identified bug that must be fixed directly in the application
title: 'SHORT DESCRIPTION OF THE PROBLEM YOU ARE REPORTING'
labels: bug
assignees: ''
---
PLEASE PROCEED ONLY IF YOU ARE ABSOLUTELY SURE THAT THIS IS NOT A TECHNICAL SUPPORT INCIDENT AND/OR POSSIBLY A PROBLEM WITH SOME OTHER SOFTWARE YOU ARE USING. VISIT <https://www.photoprism.app/kb/getting-support> TO LEARN MORE ABOUT OUR SUPPORT OPTIONS. THANK YOU FOR YOUR CAREFUL CONSIDERATION!
---------------------------------------------------------------------------
#### 1. What is not working as documented?
Please be as specific as possible and explain what part of the software is not [working as documented](https://docs.photoprism.app/). "No photos found" would not be detailed enough. Also, never report [known issues](https://docs.photoprism.app/known-issues/) or [features not yet implemented](https://github.com/photoprism/photoprism/issues) as bugs. Thank you!
#### 2. How can we reproduce it?
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
When reporting an import, indexing, or performance issue, please include the number and type of pictures in your library, as well as any configuration options you have changed, such as for thumbnail quality.
#### 3. What behavior do you expect?
Give us a clear and concise description of what you expect.
#### 4. What could be the cause of your problem?
Always try to determine the cause of your problem using the checklists at <https://docs.photoprism.app/getting-started/troubleshooting/> before submitting a bug report.
#### 5. Can you provide us with example files for testing, error logs, or screenshots?
Please include sample files or screenshots that help to reproduce your problem. You can also email files or share a download link, see <https://www.photoprism.app/contact> for details.
Visit <https://docs.photoprism.app/getting-started/troubleshooting/browsers/> to learn how to diagnose frontend issues.
**Important: If it is an import, indexing or metadata issue, we require sample files and logs from you.** Otherwise, we will not be able to process your report. If it is an import problem specifically, please always provide us with an archive of the files before you imported them so we can reproduce the behavior.
#### 6. Which software versions do you use?
(a) PhotoPrism Architecture & Build Number: AMD64, ARM64, ARMv7,...
(b) Database Type & Version: MariaDB, MySQL, SQLite,...
(c) Operating System Types & Versions: Linux, Windows, Android,...
(d) Browser Types & Versions: Firefox, Chrome, Safari on iPhone,...
(e) Ad Blockers, Browser Plugins, and/or Firewall Software?
You can find the version/build number of the app in *Settings* by scrolling to the bottom. Note that MySQL 8 support has been discontinued, see system requirements at <https://docs.photoprism.app/getting-started/#system-requirements>.
*Always provide database and operating system details if it is a backend, import, or indexing issue. Should it be a frontend issue, at a minimum we require you to provide web browser and operating system details. When reporting a performance problem, we ask that you provide us with complete information about your environment, as there may be more than one cause.*
#### 7. On what kind of device is PhotoPrism installed?
This is especially important if you are reporting a performance, import, or indexing issue. You can skip this if you're reporting a problem you found in our public demo, or if it's a completely unrelated issue, such as incorrect page layout.
(a) Device / Processor Type: Raspberry Pi 4, Intel Core i7-3770, AMD Ryzen 7 3800X,...
(b) Physical Memory & Swap Space in GB
(c) Storage Type: HDD, SSD, RAID, USB, Network Storage,...
(d) Anything else that might be helpful to know?
*Always provide device, memory, and storage details if you have a backend, performance, import, or indexing issue.*
#### 8. Do you use a Reverse Proxy, Firewall, VPN, or CDN?
If yes, please specify type and version. You can skip this if you are reporting a completely unrelated issue.
*Always provide this information when you have a reliability, performance, or frontend problem, such as failed uploads, connection errors, broken thumbnails, or video playback issues.*
**Using NGINX?** Please also provide the configuration and/or consider asking the NGINX community for advice as we do not specialize in supporting their product. Docs can be found at <https://docs.photoprism.app/getting-started/proxies/nginx/>.

View file

@ -1,33 +0,0 @@
---
name: Feature Request
about: Suggest a new feature or enhancement
title: 'Category: Short Description (PLEASE CHANGE)'
labels: idea
assignees: ''
---
PLEASE ONLY PROCEED IF YOU ARE ABSOLUTELY SURE THAT THIS IS NOT A TECHNICAL SUPPORT INCIDENT AND/OR A PROBLEM WITH OTHER SOFTWARE YOU ARE USING. PLEASE ALSO CHECK OUR PUBLIC ROADMAP AND TRY TO FIND EXISTING FEATURE REQUESTS FIRST:
- <https://link.photoprism.app/roadmap>
- <https://github.com/photoprism/photoprism/issues>
VISIT <https://www.photoprism.app/kb/getting-support> TO LEARN MORE ABOUT OUR SUPPORT OPTIONS. THANK YOU FOR YOUR CAREFUL CONSIDERATION!
===============================================================================
**Describe what problem this solves and why this would be valuable to many users**
A clear and concise description of what the problem is and why it is important to solve it.
**Describe the solution you'd like**
A clear and concise description of what you suggest to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

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

View file

@ -1,33 +0,0 @@
<!--
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+
<!--
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! :)
-->

View file

@ -1,31 +0,0 @@
name: "CodeQL"
on:
push:
branches: [ develop, release, master ]
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'go', 'javascript' ]
steps:
- name: Checkout repo
uses: actions/checkout@v2
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
- name: CodeQL Analysis
uses: github/codeql-action/analyze@v2

29
.gitignore vendored
View file

@ -1,32 +1,22 @@
# Application files and directories
/photoprism
/photoprism-*
/photos/originals/*
/photos/import/*
/storage/*
/build/*
/assets/photos/originals/*
/assets/photos/import/*
/assets/photos/export/*
/assets/resources/database/*
!/assets/resources/database/.gitignore
/node_modules
/pro
/plus
/frontend/.eslintcache
/frontend/node_modules/*
/frontend/tests/*.html
/frontend/tests/*.log
/frontend/tests/screenshots
/frontend/src/locales/*.mo
/assets/facenet
/assets/nasnet
/assets/nsfw
/assets/static/build/
/assets/testdata
/assets/backups
/assets/resources/nasnet
/assets/resources/nsfw
/package-lock.json
/frontend/tests_output
/tmp/
*.log
*.pid
*.db
*.db-journal
docker-compose.override.yml
docker-compose.tmp.yml
# Binaries for programs and plugins
*.exe
@ -60,7 +50,6 @@ Thumbs.db
.settings
.swp
.tmp
.env
#Karma Coverage Report
frontend/coverage/

169
.ldap.cfg
View file

@ -1,169 +0,0 @@
debug = true
[behaviors]
# Ignore all capabilities restrictions, for instance allowing every user to perform a search
IgnoreCapabilities = true
[ldap]
enabled = true
listen = "0.0.0.0:389"
[ldaps]
enabled = false
listen = "0.0.0.0:636"
[api]
enabled = true
internals = true
tls = false
listen = "0.0.0.0:5555"
[backend]
datastore = "config"
baseDN = "dc=localssl,dc=dev"
[[users]]
name = "user"
givenname = "John"
objectClass = "user"
displayName = "John Doe"
sn = "Doe"
uidnumber = 5003
primarygroup = 5501
loginShell = "/bin/sh"
otherGroups = [5505,5506,5507,5508]
userPrincipalName = "jdoe@example.com"
mail = "jdoe@example.com"
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.customattributes]]
photoprismRole = ["user"]
photoprismNoLogin = ["false"]
photoprismWebdav = ["true"]
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "bob"
givenname = "Bob"
objectClass = "user"
displayName = "Robert Jones"
sn = "Jones"
userPrincipalName = "bob@example.com"
mail = "bob@example.com"
uidnumber = 5005
primarygroup = 5502
loginShell = "/bin/bash"
otherGroups = [5505,5506]
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.customattributes]]
photoprismRoleUser = ["true"]
photoprismNoLogin = ["false"]
photoprismWebdav = ["true"]
photoprismUploadPath = ["bob"]
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "guest"
objectClass = "user"
givenname = "Guest"
displayName = "Guest User"
userPrincipalName = "guest@example.com"
mail = "guest@example.com"
uidnumber = 5006
primarygroup = 5503
loginShell = "/bin/sh"
otherGroups = [5505,5507]
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.customattributes]]
photoprismRole = ["guest"]
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "uploader"
givenname = "Uploader"
objectClass = "user"
displayName = "Uploader"
sn = "Uploader"
userPrincipalName = "uploader@example.com"
mail = "uploader@example.com"
uidnumber = 5007
primarygroup = 5504
loginShell = "/bin/bash"
otherGroups = [5508]
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.customattributes]]
photoprismUploadPath = ["bob"]
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "contributor"
givenname = "Contributor"
objectClass = "user"
displayName = "Contributor"
sn = "Contributor"
userPrincipalName = "contributor@example.com"
mail = "contributor@example.com"
uidnumber = 5009
primarygroup = 5509
loginShell = "/bin/bash"
otherGroups = [5508]
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.customattributes]]
photoprismUploadPath = ["contrib"]
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "mail"
objectClass = "user"
givenname = "Mail"
displayName = "Mail User"
userPrincipalName = "mail@example.com"
mail = "mail@example.com"
uidnumber = 5507
primarygroup = 5506
loginShell = "/bin/nologin"
otherGroups = [5505]
passsha256 = "4314c1fe282face45336b1422a3285c5ff31a39c8e24425615fa53a43b718493" # photoprism
[[users.capabilities]]
action = "search"
object = "*"
[[groups]]
name = "PhotoPrism-admin"
gidnumber = 5501
[[groups]]
name = "PhotoPrism-user"
gidnumber = 5502
[[groups]]
name = "PhotoPrism-guest"
gidnumber = 5503
[[groups]]
name = "PhotoPrism-uploader"
gidnumber = 5504
[[groups]]
name = "gmail"
gidnumber = 5505
[[groups]]
name = "email"
gidnumber = 5506
[[groups]]
name = "ssh"
gidnumber = 5507
[[groups]]
name = "PhotoPrism-webdav"
gidnumber = 5508
[[groups]]
name = "PhotoPrism-contributor"
gidnumber = 5509

View file

@ -1,5 +0,0 @@
[client]
user=root
password=photoprism
host=mariadb
port=4001

32
.travis.yml Normal file
View file

@ -0,0 +1,32 @@
sudo: required
addons:
apt:
packages:
- docker-ce
cache:
directories:
- $HOME/.cache
before_cache:
- sudo chown -R travis:travis $HOME/.cache
services:
- docker
before_script:
- docker-compose -f docker-compose.travis.yml up -d --build
script:
- scripts/travis.sh
after_script:
- docker-compose -f docker-compose.travis.yml down
deploy:
provider: script
script: make docker-photoprism docker-demo
skip_cleanup: true
on:
branch: master

View file

@ -1,45 +0,0 @@
# PhotoPrism® Code of Conduct
**By using the software and services we provide, you agree to our [Terms of Service](https://www.photoprism.app/terms), including our [Privacy Policy](https://www.photoprism.app/privacy) and the following Code of Conduct. It explains the "dos and donts" when interacting with our team and other community members.**
*Last Updated: July 5, 2023*
## Rules
Because we want our Code of Conduct to be easy to understand and implement, we have only three basic rules, numbered in order of importance:
(1) Be respectful, be responsible, be kind.
(2) Dont panic.
(3) Dont feed the trolls.
## Guidelines
Not everyone has experience with Open Source communities and intuitively knows what is acceptable. In that case, the following guidelines and examples are meant to provide a quick overview and help you avoid the most common pitfalls:
(a) Do not [feel entitled](https://www.reddit.com/r/photoprism/comments/13emwf0/did_you_guys_really_nerf_hardware_transcoding/) to free software, support, or advice, especially if you are not a contributor, [member](https://link.photoprism.app/membership), or business customer. Don't expect contributors to [give status reports](https://docs.photoprism.app/developer-guide/code-quality/#go-slow-before-you-go-fast) as if they work for you or owe you something, even if you have donated a small amount. We also ask that you do not use GitHub Issues or other development tools to start general discussions, get technical support, or express personal opinions.
(b) Honor **Rule &#35;2**, [read the docs](https://docs.photoprism.app) and [determine the cause of your problem](https://docs.photoprism.app/getting-started/troubleshooting/) before opening invalid bug reports, starting a public "shitstorm", or insulting other community members in our chat rooms. Aside from being annoying for everyone, it also keeps our team from working on features and enhancements that users like you are waiting for.
(c) Reckless, [surprisingly harsh](https://github.com/photoprism/photoprism/issues/281#issuecomment-1207233135) or ignorant communication that disregards **Rule &#35;1** is unacceptable, whether public or private. If you are having a bad day and want to offend someone, please go somewhere else.
We have found that many of the issues that new users get upset about when they read about them in community forums or old issue comments have been resolved in the meantime. If not, you can be sure that we are working to improve our software and services to the best of our ability.
*Thanks to our amazing community, problems are rare in practice. Common sense and staying away from the computer when you are tired or hungry should usually be enough to get along with others.*
## Reporting
We encourage all community members to resolve problems on their own whenever possible. Serious and persistent violations, such as disrespectful, abusive, harassing, or otherwise unacceptable behavior, [may be reported](https://www.photoprism.app/contact) to us.
## Enforcement
Our community standards will be enforced as necessary to protect everyone's well-being and to ensure that our discussion forums, chat rooms, and other infrastructure can be used as intended.
Initial warnings may be issued in the form of a [snarky comment](https://www.urbandictionary.com/define.php?term=snarky), especially if your tone is harsh to begin with. In serious cases, we will provide a link to this Code of Conduct to avoid misunderstandings. We also reserve the right to delete rants, personal attacks, spam, and unsolicited advertising from our community forums.
Getting a simple **\*plonk\***[^1] in response finally signals that we have lost hope and you're being ignored according to **Rule &#35;3**. This old tradition from Usenet days is as time-saving as it is clear. It is not meant in a disrespectful way.
In addition, we may use technical measures to temporarily or permanently restrict your access to our infrastructure, including forums and chats.
[^1]: \*plonk\* including variants such as "Plonk." stands for the metaphorical sound of a user hitting the bottom of the kill file. It was first used in [Usenet forums](https://en.everybodywiki.com/Plonk_(Usenet)), a worldwide distributed discussion system and precursor to the Web.

View file

@ -1,78 +1,46 @@
# Every Contribution Makes a Difference
# Every contribution makes a difference
We welcome contributions of any kind, including blog posts, tutorials, testing, writing documentation, and pull requests. Our [Developer Guide](https://docs.photoprism.app/developer-guide/) contains all the information necessary for you to get started.
Think of open-source development as free training with a visible outcome.
Exploring new technologies is easier than in commercial environments,
where development effort is more focused on immediate results.
## Join the Community ##
We welcome contributions of any kind including pull requests, ideas, bug reports,
testing, writing documentation, tutorials and blog posts. If you help with development,
you have the opportunity to learn Docker, Go, TensorFlow and much more.
Follow us on [Twitter](https://link.photoprism.app/twitter) and join the [Community Chat](https://link.photoprism.app/chat)
to get regular updates, connect with other contributors, 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.
## Questions? ##
Feel free to [contact us](https://www.photoprism.app/contact) with anything that is on your mind. We appreciate your feedback! 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.
Follow us on [Twitter][twitter] and join our [developers mailing list](https://groups.google.com/a/photoprism.org/forum/#!forum/developers)
to receive regular project updates, get in contact with other contributors and discuss your ideas. Don't be afraid to ask stupid questions.
## Not a Developer? No Problem ##
Of all the tools we tested, Twitter works best to get and give continuous feedback. Especially polls are amazing for product development.
You can also contribute by…
## Pull requests ##
* answering questions in the [Community Chat](https://link.photoprism.app/chat), on [Reddit](https://link.photoprism.app/reddit) and in [GitHub Discussions](https://link.photoprism.app/discussions)
* helping us [translate](https://docs.photoprism.app/developer-guide/translations-weblate/) the Web UI on [Weblate](https://translate.photoprism.app/)
* [conducting research](https://github.com/photoprism/photoprism/issues?q=is%3Aopen+is%3Aissue+label%3Aresearch) and [improving the documentation](https://github.com/photoprism/photoprism/issues?q=is%3Aopen+is%3Aissue+label%3Adocs)
* publishing tutorials, blog posts, and podcasts
* voting for us on pages like:
* https://alternativeto.net/software/photoprism/about/
* https://www.saashub.com/google-photos-alternatives
* recommending PhotoPrism to your friends
Issues labeled [help wanted](https://github.com/photoprism/photoprism/labels/help%20wanted) /
[easy](https://github.com/photoprism/photoprism/labels/easy) can be good (first) contributions.
Our [Developer Guide](https://docs.photoprism.org/en/latest/developer-guide/) contains all information necessary to get you started.
## Creating Bug Reports ##
Our [step-by-step guide](https://github.com/photoprism/photoprism/wiki/Pull-Requests) explains how to submit new features, bugfixes and documentation.
Before reporting a bug, please use our [Troubleshooting Checklists](https://docs.photoprism.app/getting-started/troubleshooting/)
to determine the cause of your problem. If you have a general question, need help, or an issue has not
(yet) been clearly identified:
## Feature requests ##
- You are welcome to ask in our [Community Chat](https://link.photoprism.app/chat)
- or post your question in [GitHub Discussions](https://link.photoprism.app/discussions)
You are welcome to add specific feature requests directly to our [GitHub issue tracker](https://github.com/photoprism/photoprism/issues)
if no similar [idea](https://github.com/photoprism/photoprism/labels/idea)
or [todo](https://github.com/photoprism/photoprism/labels/todo) already exists.
Please don't use the issue tracker to ask general questions.
### GitHub Issues ###
We also maintain a couple of pages in our [Wiki](https://github.com/photoprism/photoprism/wiki)
for collecting interesting ideas and feedback, e.g.
[Related](https://github.com/photoprism/photoprism/wiki/Related),
[Love](https://github.com/photoprism/photoprism/wiki/Love),
[Concerns](https://github.com/photoprism/photoprism/wiki/Concerns) and
[Research](https://github.com/photoprism/photoprism/wiki/Research).
We kindly ask you not to report bugs via GitHub Issues **unless you are certain to have found a fully reproducible and previously unreported issue** that must be fixed directly in [our source code](https://github.com/photoprism/photoprism). Thank you for your careful consideration!
## Reporting bugs ##
- When reporting a problem, always include the software versions you are using and other information about your environment such as [browser, browser plugins](https://docs.photoprism.app/getting-started/troubleshooting/browsers/), operating system, [storage type](https://docs.photoprism.app/getting-started/troubleshooting/performance/#storage), [memory size](https://docs.photoprism.app/getting-started/troubleshooting/performance/#memory), and [processor](https://docs.photoprism.app/getting-started/troubleshooting/performance/#server-cpu)
- Note that all issue **subscribers receive an email notification** from GitHub whenever a new comment is added, so these should only be used for sharing important information and not for discussions, questions or expressing personal opinions
- [Contact us](https://www.photoprism.app/contact) or [a community member](https://link.photoprism.app/discussions) if you need help, it could be a local configuration problem, or a misunderstanding in how the software works
- This gives our team the opportunity to [improve the docs](https://docs.photoprism.app/getting-started/troubleshooting/) and provide best-in-class support to you, instead of handling unclear/duplicate bug reports or triggering a flood of notifications by responding to comments
Please use the [GitHub issue tracker](https://github.com/photoprism/photoprism/issues) to report clearly identified bugs and impediments to us.
If you're not sure, start by asking in our [help forum](https://groups.google.com/a/photoprism.org/forum/#!forum/help) or [contact us via email](mailto:help@photoprism.org).
When reporting an issue, please provide the version in use and information about your environment like browser, operating system, installed memory, and processor type.
## Submitting Pull Requests ##
Follow our [step-by-step guide](https://docs.photoprism.app/developer-guide/pull-requests) to learn how to submit new features, bug fixes, and documentation enhancements.
Pull requests solving ["help wanted"](https://github.com/photoprism/photoprism/labels/help%20wanted) issues are the easiest to merge and the most helpful to us, as they allow us to spend more time on core functionality and other issues that are difficult for external contributors to work on. If you are new to this project, anything labeled ["easy"](https://github.com/photoprism/photoprism/labels/easy) may be a good first contribution.
**Be aware that reviewing, testing and finally merging pull requests requires significant resources on our side. It can therefore take several months if it is not just a small fix, especially if extensive testing is needed to prevent bugs from getting into our stable version.**
## Contributor License Agreement (CLA) ##
After you submit your first pull request, you will be asked to accept our Contributor License Agreement (CLA). Visit [photoprism.app/cla](https://www.photoprism.app/cla) and [photoprism.app/oss/faq](https://www.photoprism.app/oss/faq#cla) to learn more.
## Thank You to All Current and Past Sponsors 💎 ##
[A big thank you to all of our sponsors](SPONSORS.md), whose generous support has been and continues to be essential to the success of the project! 💜
Our project infrastructure is provided by the following companies:
- [**GitHub**](https://github.com/) hosts our [code repositories](https://github.com/photoprism/photoprism) and also provides many other important services
- [**Docker**](https://www.docker.com/) approved us for their [Open Source Program](https://www.docker.com/community/open-source/application/) and hosts all of our app images
- [**Element**](https://element.io/) develops and [operates the infrastructure](https://matrix.org/) that our [community chat](https://link.photoprism.app/chat) is based on
- [**BrowserStack**](https://www.browserstack.com/) provides [free access](https://www.browserstack.com/open-source) to their device and browser testing infrastructure
[View Sponsors ](SPONSORS.md)[View Credits ](https://docs.photoprism.app/credits/)
## Privacy Notice ##
We operate a number of web services that help us develop and maintain our software in collaboration with the open source community, for example [translate.photoprism.app](https://translate.photoprism.app/).
Because many of these apps and tools were originally developed for internal use without a high level of privacy in mind, we ask that you do not enter personal information such as your real name or personal email address if you want it to remain private.
**Personal details may otherwise show up in logs, source code, translation files, commit messages, and pull request comments.**
----
*PhotoPrism® is a [registered trademark](https://www.photoprism.app/trademark). By using the software and services we provide, you agree to our [Terms of Service](https://www.photoprism.app/terms), [Privacy Policy](https://www.photoprism.app/privacy), and [Code of Conduct](https://www.photoprism.app/code-of-conduct). Docs are [available](https://link.photoprism.app/github-docs) under the [CC BY-NC-SA 4.0 License](https://creativecommons.org/licenses/by-nc-sa/4.0/); [additional terms](https://github.com/photoprism/photoprism/blob/develop/assets/README.md) may apply.*
[twitter]: https://twitter.com/browseyourlife

View file

@ -1,18 +1,5 @@
# Ubuntu 23.10 (Mantic Minotaur)
FROM photoprism/develop:231206-mantic
FROM photoprism/development:20200519
## Alternative Environments:
# FROM photoprism/develop:armv7 # ARMv7 (32bit)
# FROM photoprism/develop:lunar # Ubuntu 23.04 (Lunar Lobster)
# FROM photoprism/develop:jammy # Ubuntu 22.04 LTS (Jammy Jellyfish)
# FROM photoprism/develop:impish # Ubuntu 21.10 (Impish Indri)
# FROM photoprism/develop:bookworm # Debian 12 (Bookworm)
# FROM photoprism/develop:bullseye # Debian 11 (Bullseye)
# FROM photoprism/develop:buster # Debian 10 (Buster)
# Set default working directory.
# Set up project directory
WORKDIR "/go/src/github.com/photoprism/photoprism"
# Copy source to image.
COPY . .
COPY --chown=root:root /scripts/dist/ /scripts/

View file

@ -1,3 +1,3 @@
custom: "https://www.photoprism.app/editions#compare"
github: photoprism
patreon: photoprism
github: lastzero
patreon: photoprism
custom: "https://www.paypal.me/photoprism"

188
LICENSE
View file

@ -1,5 +1,5 @@
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
@ -7,15 +7,17 @@
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
@ -24,34 +26,44 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
@ -60,7 +72,7 @@ modification follow.
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
@ -537,45 +549,35 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
@ -616,31 +618,57 @@ an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
ADDITIONAL TERMS
18. PhotoPrism® Trademark and Brand Assets
(a) PhotoPrisms Brand Assets — including trademarks, logos, icons, fonts,
corporate design, product and service names, and any other brand features
and elements, whether registered or unregistered („Brand Assets“) — are
proprietary assets owned exclusively by PhotoPrism UG („PhotoPrism“). We
reserve the right to object to any use or misuse in any jurisdiction
worldwide. Visit <https://www.photoprism.app/trademark> to learn more.
(b) Contributors, licensees, business partners, and other third parties
may never claim ownership of PhotoPrism's Brand Assets or brands confusingly
similar to PhotoPrism's Brand Assets in any way, including, without
limitation, as a trademark, service mark, company name or designation,
domain name, social media profile/handle, or in any other manner.
(c) You may not include the PhotoPrism trademark in the name of your app,
product, or service, whether commercial or non-commercial in nature. This
includes online services such as e-commerce, community, blog, information,
advertising, and personal home pages, as well as apps, app stores, client
apps, or third-party apps that interact with PhotoPrism.
(d) In the event that any provision is found to be unenforceable by a court
or other competent jurisdiction, the remaining portions hereof shall remain
in full force and effect.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

655
Makefile
View file

@ -1,226 +1,75 @@
# Copyright © 2018 - 2023 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
-include .env
export
# Binary file names.
BINARY_NAME=photoprism
GOIMPORTS=goimports
BINARY_NAME=photoprism
DOCKER_TAG=`date -u +%Y%m%d`
# Build parameters.
BUILD_PATH ?= $(shell realpath "./build")
BUILD_DATE ?= $(shell date -u +%y%m%d)
BUILD_VERSION ?= $(shell git describe --always)
BUILD_TAG ?= $(BUILD_DATE)-$(BUILD_VERSION)
BUILD_OS ?= $(shell uname -s)
BUILD_ARCH ?= $(shell scripts/dist/arch.sh)
JS_BUILD_PATH ?= $(shell realpath "./assets/static/build")
# Install parameters.
INSTALL_PATH ?= $(BUILD_PATH)/photoprism-ce_$(BUILD_TAG)-$(shell echo $(BUILD_OS) | tr '[:upper:]' '[:lower:]')-$(BUILD_ARCH)
DESTDIR ?= $(INSTALL_PATH)
DESTUID ?= 1000
DESTGID ?= 1000
INSTALL_USER ?= $(DESTUID):$(DESTGID)
INSTALL_MODE ?= u+rwX,a+rX
INSTALL_MODE_BIN ?= 755
UID := $(shell id -u)
GID := $(shell id -g)
HASRICHGO := $(shell which richgo)
ifdef HASRICHGO
GOTEST=richgo test
else
GOTEST=go test
endif
# Ensure compatibility with "docker-compose" (old) and "docker compose" (new).
HAS_DOCKER_COMPOSE_WITH_DASH := $(shell which docker-compose)
ifdef HAS_DOCKER_COMPOSE_WITH_DASH
DOCKER_COMPOSE=docker-compose
else
DOCKER_COMPOSE=docker compose
endif
# Declare "make" targets.
all: dep build-js
dep: dep-tensorflow dep-js
biuld: build
build: build-go
build-all: build-go build-js
pull: docker-pull
test: test-js test-go
test-go: reset-sqlite run-test-go
test-pkg: reset-sqlite run-test-pkg
test-api: reset-sqlite run-test-api
test-commands: reset-sqlite run-test-commands
test-photoprism: reset-sqlite run-test-photoprism
test-short: reset-sqlite run-test-short
test-mariadb: reset-acceptance run-test-mariadb
acceptance-run-chromium: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth acceptance-auth-sqlite-stop acceptance-sqlite-restart wait-2 acceptance acceptance-sqlite-stop
acceptance-run-chromium-short: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth-short acceptance-auth-sqlite-stop acceptance-sqlite-restart wait-2 acceptance-short acceptance-sqlite-stop
acceptance-auth-run-chromium: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth acceptance-auth-sqlite-stop
acceptance-public-run-chromium: storage/acceptance acceptance-sqlite-restart wait acceptance acceptance-sqlite-stop
wait:
sleep 20
wait-2:
sleep 20
show-build:
@echo "$(BUILD_TAG)"
test-all: test acceptance-run-chromium
all: dep build
dep: dep-tensorflow dep-js dep-go
build: generate build-js build-go
install: install-bin install-assets
test: reset-test-db test-js test-go
acceptance-all: start acceptance acceptance-firefox stop
test-all: test acceptance-all
fmt: fmt-js fmt-go
clean-local: clean-local-config clean-local-cache
upgrade: dep-upgrade-js dep-upgrade
devtools: install-go dep-npm
.SILENT: help;
logs:
$(DOCKER_COMPOSE) logs -f
help:
@echo "For build instructions, visit <https://docs.photoprism.app/developer-guide/>."
fix-permissions:
$(info Updating filesystem permissions...)
@if [ $(UID) != 0 ]; then\
echo "Running \"chown --preserve-root -Rcf $(UID):$(GID) /go /photoprism /opt/photoprism /tmp/photoprism\". Please wait."; \
sudo chown --preserve-root -Rcf $(UID):$(GID) /go /photoprism /opt/photoprism /tmp/photoprism || true;\
echo "Running \"chmod --preserve-root -Rcf u+rwX /go/src/github.com/photoprism/* /photoprism /opt/photoprism /tmp/photoprism\". Please wait.";\
sudo chmod --preserve-root -Rcf u+rwX /go/src/github.com/photoprism/photoprism/* /photoprism /opt/photoprism /tmp/photoprism || true;\
echo "Done."; \
else\
echo "Running as root. Nothing to do."; \
fi
gettext-merge:
./scripts/gettext-merge.sh
gettext-clear-fuzzy:
./scripts/gettext-clear-fuzzy.sh
clean:
rm -f *.log .test*
[ ! -f "$(BINARY_NAME)" ] || rm -f $(BINARY_NAME)
[ ! -d "node_modules" ] || rm -rf node_modules
[ ! -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)
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-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
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
install:
$(info Installing in "$(DESTDIR)"...)
@[ ! -d "$(DESTDIR)" ] || (echo "ERROR: Install path '$(DESTDIR)' already exists!"; exit 1)
mkdir --mode=$(INSTALL_MODE) -p $(DESTDIR)
env TMPDIR="$(BUILD_PATH)" ./scripts/dist/install-tensorflow.sh $(DESTDIR)
rm -rf --preserve-root $(DESTDIR)/include
(cd $(DESTDIR) && mkdir -p bin lib assets)
./scripts/build.sh prod "$(DESTDIR)/bin/$(BINARY_NAME)"
rsync -r -l --safe-links --exclude-from=assets/.buildignore --chmod=a+r,u+rw ./assets/ $(DESTDIR)/assets
wget -O $(DESTDIR)/assets/static/img/wallpaper/welcome.jpg https://cdn.photoprism.app/wallpaper/welcome.jpg
wget -O $(DESTDIR)/assets/static/img/preview.jpg https://cdn.photoprism.app/img/preview.jpg
chown -R $(INSTALL_USER) $(DESTDIR)
chmod -R $(INSTALL_MODE) $(DESTDIR)
chmod -R $(INSTALL_MODE_BIN) $(DESTDIR)/bin $(DESTDIR)/lib
@echo "PhotoPrism $(BUILD_TAG) has been successfully installed in \"$(DESTDIR)\".\nEnjoy!"
install-go:
sudo scripts/dist/install-go.sh
go build -v ./...
install-tensorflow:
sudo scripts/dist/install-tensorflow.sh
install-darktable:
sudo scripts/dist/install-darktable.sh
acceptance-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
rm -rf storage/acceptance/sidecar/2020
rm -rf storage/acceptance/sidecar/2011
rm -rf storage/acceptance/originals/2010
rm -rf storage/acceptance/originals/2020
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
acceptance-sqlite-stop:
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" --test 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
acceptance-auth-sqlite-stop:
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" --test stop
clean-local: clean-local-config clean-local-share clean-local-cache
clean-install: clean-local dep build-js install-bin install-assets
start:
./photoprism start -d
go run cmd/photoprism/photoprism.go start -d
stop:
./photoprism stop
go run cmd/photoprism/photoprism.go stop
terminal:
$(DOCKER_COMPOSE) exec -u $(UID) photoprism bash
rootshell: root-terminal
root-terminal:
$(DOCKER_COMPOSE) exec -u root photoprism bash
docker-compose exec photoprism bash
migrate:
go run cmd/photoprism/photoprism.go migrations run
go run cmd/photoprism/photoprism.go migrate
generate:
POT_SIZE_BEFORE=$(shell stat -L -c %s assets/locales/messages.pot)
go generate ./pkg/... ./internal/...
go fmt ./pkg/... ./internal/...
POT_SIZE_AFTER=$(shell stat -L -c %s assets/locales/messages.pot)
@if [ $(POT_SIZE_BEFORE) == $(POT_SIZE_AFTER) ]; then\
git checkout -- assets/locales/messages.pot;\
echo "Reverted unnecessary change in assets/locales/messages.pot.";\
fi
go-generate:
go generate ./pkg/... ./internal/...
go fmt ./pkg/... ./internal/...
clean-local-assets:
rm -rf $(BUILD_PATH)/assets/*
install-bin:
scripts/build.sh prod ~/.local/bin/$(BINARY_NAME)
install-assets:
$(info Installing assets)
mkdir -p ~/.config/photoprism
mkdir -p ~/.cache/photoprism
mkdir -p ~/Pictures/Originals
mkdir -p ~/Pictures/Import
mkdir -p ~/.local/share/photoprism/resources/database
cp -r assets/resources/static assets/resources/templates assets/resources/nasnet assets/resources/nsfw ~/.local/share/photoprism/resources
rsync -a -v --ignore-existing assets/config/*.yml ~/.config/photoprism
find ~/.local/share/photoprism -name '.*' -type f -delete
clean-local-share:
rm -rf ~/.local/share/photoprism
clean-local-cache:
rm -rf $(BUILD_PATH)/storage/cache/*
rm -rf ~/.cache/photoprism
clean-local-config:
rm -f $(BUILD_PATH)/config/*
dep-list:
go list -u -m -json all | go-mod-outdated -direct
dep-npm:
sudo npm install -g npm
rm -f ~/.config/photoprism/*
dep-js:
(cd frontend && npm ci --no-update-notifier --no-audit)
(cd frontend && npm install --silent)
dep-go:
go build -v ./...
dep-upgrade:
go get -u -t ./...
dep-upgrade-js:
(cd frontend && npm --depth 3 update --legacy-peer-deps)
(cd frontend && npm --depth 3 update)
dep-tensorflow:
scripts/download-facenet.sh
scripts/download-nasnet.sh
scripts/download-nsfw.sh
dep-acceptance: storage/acceptance
storage/acceptance:
[ -f "./storage/acceptance/index.db" ] || (cd storage && rm -rf acceptance && wget -c https://dl.photoprism.app/qa/acceptance.tar.gz -O - | tar -xz)
zip-facenet:
(cd assets && zip -r facenet.zip facenet -x "*/.*" -x "*/version.txt")
zip-nasnet:
(cd assets && zip -r nasnet.zip nasnet -x "*/.*" -x "*/version.txt")
(cd assets/resources && zip -r nasnet.zip nasnet -x "*/.*" -x "*/version.txt")
zip-nsfw:
(cd assets && zip -r nsfw.zip nsfw -x "*/.*" -x "*/version.txt")
(cd assets/resources && zip -r nsfw.zip nsfw -x "*/.*" -x "*/version.txt")
build-js:
(cd frontend && env NODE_ENV=production npm run build)
build-go: build-debug
build-debug:
build-go:
rm -f $(BINARY_NAME)
scripts/build.sh debug $(BINARY_NAME)
build-prod:
rm -f $(BINARY_NAME)
scripts/build.sh prod $(BINARY_NAME)
build-race:
rm -f $(BINARY_NAME)
scripts/build.sh race $(BINARY_NAME)
build-static:
rm -f $(BINARY_NAME)
scripts/build.sh static $(BINARY_NAME)
@ -234,413 +83,67 @@ watch-js:
(cd frontend && env NODE_ENV=development npm run watch)
test-js:
$(info Running JS unit tests...)
(cd frontend && env TZ=UTC NODE_ENV=development BABEL_ENV=test npm run test)
(cd frontend && env NODE_ENV=development BABEL_ENV=test npm run test)
acceptance:
$(info Running public-mode tests in 'chromium:headless'...)
(cd frontend && npm run testcafe -- chrome:headless --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 --test-grep "^(Common|Core)\:*" --test-meta mode=public,type=short --config-file ./testcaferc.json "tests/acceptance")
(cd frontend && npm run 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")
acceptance-auth:
$(info Running JS acceptance-auth tests in Chrome...)
(cd frontend && npm run testcafe -- chrome:headless --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 --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")
reset-mariadb:
$(info Resetting photoprism database...)
mysql < scripts/sql/reset-photoprism.sql
reset-mariadb-testdb:
$(info Resetting testdb database...)
mysql < scripts/sql/reset-testdb.sql
reset-mariadb-local:
$(info Resetting local database...)
mysql < scripts/sql/reset-local.sql
reset-mariadb-acceptance:
$(info Resetting acceptance database...)
mysql < scripts/sql/reset-acceptance.sql
reset-mariadb-all: reset-mariadb-testdb reset-mariadb-local reset-mariadb-acceptance reset-mariadb-photoprism
reset-testdb: reset-sqlite reset-mariadb-testdb
reset-acceptance: reset-mariadb-acceptance
reset-sqlite:
$(info Removing test database files...)
find ./internal -type f -name ".test.*" -delete
run-test-short:
$(info Running short Go tests in parallel mode...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -short -timeout 5m ./pkg/... ./internal/...
run-test-go:
$(info Running all Go tests...)
(cd frontend && npm run acceptance-firefox)
reset-test-db:
mysql < scripts/reset-test-db.sql
test-go:
$(info Running all Go unit tests...)
$(GOTEST) -parallel 1 -count 1 -cpu 1 -tags slow -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/...
run-test-pkg:
$(info Running all Go tests in "/pkg"...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./pkg/...
run-test-api:
$(info Running all API tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./internal/api/...
run-test-commands:
$(info Running all CLI command tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -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/...
test-parallel:
$(info Running all Go tests in parallel mode...)
$(info Running all Go unit tests in parallel mode...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags slow -timeout 20m ./pkg/... ./internal/...
test-verbose:
$(info Running all Go tests in verbose mode...)
$(info Running all Go unit tests in verbose mode...)
$(GOTEST) -parallel 1 -count 1 -cpu 1 -tags slow -timeout 20m -v ./pkg/... ./internal/...
test-short:
$(info Running short Go unit tests in parallel mode...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -short -timeout 5m ./pkg/... ./internal/...
test-race:
$(info Running all Go tests with race detection in verbose mode...)
$(info Running all Go unit tests with race detection in verbose mode...)
$(GOTEST) -tags slow -race -timeout 60m -v ./pkg/... ./internal/...
test-codecov:
$(info Running all Go unit tests with code coverage report for codecov...)
go test -parallel 1 -count 1 -cpu 1 -failfast -tags slow -timeout 30m -coverprofile coverage.txt -covermode atomic ./pkg/... ./internal/...
scripts/codecov.sh
test-coverage:
$(info Running all Go tests with code coverage report...)
$(info Running all Go unit 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 tool cover -html=coverage.txt -o coverage.html
go tool cover -func coverage.txt | grep total:
docker-pull:
$(DOCKER_COMPOSE) pull --ignore-pull-failures
$(DOCKER_COMPOSE) -f docker-compose.latest.yml pull --ignore-pull-failures
docker-build:
$(DOCKER_COMPOSE) pull --ignore-pull-failures
$(DOCKER_COMPOSE) build
docker-local-up:
$(DOCKER_COMPOSE) -f docker-compose.local.yml up --force-recreate
docker-local-down:
$(DOCKER_COMPOSE) -f docker-compose.local.yml down -V
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-mantic docker-develop-mantic-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
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
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bookworm-slim /bookworm-slim
docker-develop-bullseye:
docker pull --platform=amd64 golang:1-bullseye
docker pull --platform=arm64 golang:1-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
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bullseye-slim /bullseye-slim
develop-armv7: docker-develop-armv7
docker-develop-armv7:
docker pull --platform=arm ubuntu:mantic
scripts/docker/buildx.sh develop linux/arm armv7 /armv7
docker-develop-buster:
docker pull --platform=amd64 golang:1-buster
docker pull --platform=arm64 golang:1-buster
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 buster /buster
docker-develop-impish:
docker pull --platform=amd64 ubuntu:impish
docker pull --platform=arm64 ubuntu:impish
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 impish /impish
docker-develop-jammy:
docker pull --platform=amd64 ubuntu:jammy
docker pull --platform=arm64 ubuntu: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
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 jammy-slim /jammy-slim
docker-develop-lunar:
docker pull --platform=amd64 ubuntu:lunar
docker pull --platform=arm64 ubuntu:lunar
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 lunar /lunar
docker-develop-lunar-slim:
docker pull --platform=amd64 ubuntu:lunar
docker pull --platform=arm64 ubuntu:lunar
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 lunar-slim /lunar-slim
docker-develop-mantic:
docker pull --platform=amd64 ubuntu:mantic
docker pull --platform=arm64 ubuntu:mantic
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 mantic /mantic "-t photoprism/develop:latest -t photoprism/develop:ubuntu"
docker-develop-mantic-slim:
docker pull --platform=amd64 ubuntu:mantic
docker pull --platform=arm64 ubuntu:mantic
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 mantic-slim /mantic-slim
unstable: docker-unstable
docker-unstable: docker-unstable-mantic
docker-unstable-jammy:
docker pull --platform=amd64 photoprism/develop:jammy
docker pull --platform=amd64 photoprism/develop:jammy-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64 unstable-ce /jammy
docker-unstable-lunar:
docker pull --platform=amd64 photoprism/develop:lunar
docker pull --platform=amd64 photoprism/develop:lunar-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64 unstable-ce /lunar
docker-unstable-mantic:
docker pull --platform=amd64 photoprism/develop:mantic
docker pull --platform=amd64 photoprism/develop:mantic-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64 unstable-ce /mantic
preview: docker-preview-ce
docker-preview: docker-preview-ce
docker-preview-all: docker-preview-latest docker-preview-other
docker-preview-ce: docker-preview-mantic
docker-preview-latest: docker-preview-ubuntu
docker-preview-debian: docker-preview-bookworm
docker-preview-ubuntu: docker-preview-mantic
docker-preview-other: docker-preview-debian docker-preview-bullseye
docker-preview-arm: docker-preview-arm64 docker-preview-armv7
docker-preview-bookworm:
docker pull --platform=amd64 photoprism/develop:bookworm
docker pull --platform=amd64 photoprism/develop:bookworm-slim
docker pull --platform=arm64 photoprism/develop:bookworm
docker pull --platform=arm64 photoprism/develop:bookworm-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-bookworm /bookworm "-t photoprism/photoprism:preview-ce-debian"
docker-preview-armv7:
docker pull --platform=arm photoprism/develop:armv7
docker pull --platform=arm ubuntu:mantic
scripts/docker/buildx.sh photoprism linux/arm preview-armv7 /armv7
docker-preview-arm64:
docker pull --platform=arm64 photoprism/develop:lunar
docker pull --platform=arm64 photoprism/develop:lunar-slim
scripts/docker/buildx.sh photoprism linux/arm64 preview-arm64 /lunar
docker-preview-bullseye:
docker pull --platform=amd64 photoprism/develop:bullseye
docker pull --platform=amd64 photoprism/develop:bullseye-slim
docker pull --platform=arm64 photoprism/develop:bullseye
docker pull --platform=arm64 photoprism/develop:bullseye-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-bullseye /bullseye
docker-preview-buster:
docker pull --platform=amd64 photoprism/develop:buster
docker pull --platform=arm64 photoprism/develop:buster
docker pull --platform=amd64 debian:buster-slim
docker pull --platform=arm64 debian:buster-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-buster /buster
docker-preview-impish:
docker pull --platform=amd64 photoprism/develop:impish
docker pull --platform=arm64 photoprism/develop:impish
docker pull --platform=amd64 ubuntu:impish
docker pull --platform=arm64 ubuntu:impish
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-impish /impish
docker-preview-jammy:
docker pull --platform=amd64 photoprism/develop:jammy
docker pull --platform=amd64 photoprism/develop:jammy-slim
docker pull --platform=arm64 photoprism/develop:jammy
docker pull --platform=arm64 photoprism/develop:jammy-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /jammy
docker-preview-lunar:
docker pull --platform=amd64 photoprism/develop:lunar
docker pull --platform=amd64 photoprism/develop:lunar-slim
docker pull --platform=arm64 photoprism/develop:lunar
docker pull --platform=arm64 photoprism/develop:lunar-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /lunar
docker-preview-mantic:
docker pull --platform=amd64 photoprism/develop:mantic
docker pull --platform=amd64 photoprism/develop:mantic-slim
docker pull --platform=arm64 photoprism/develop:mantic
docker pull --platform=arm64 photoprism/develop:mantic-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /mantic
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-mantic
docker-release-other: docker-release-debian docker-release-bullseye
docker-release-arm: docker-release-arm64 docker-release-armv7
docker-release-bookworm:
docker pull --platform=amd64 photoprism/develop:bookworm
docker pull --platform=amd64 photoprism/develop:bookworm-slim
docker pull --platform=arm64 photoprism/develop:bookworm
docker pull --platform=arm64 photoprism/develop:bookworm-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce-bookworm /bookworm "-t photoprism/photoprism:ce-debian"
docker-release-armv7:
docker pull --platform=arm photoprism/develop:armv7
docker pull --platform=arm ubuntu:mantic
scripts/docker/buildx.sh photoprism linux/arm armv7 /armv7
docker-release-arm64:
docker pull --platform=arm64 photoprism/develop:lunar
docker pull --platform=arm64 photoprism/develop:lunar-slim
scripts/docker/buildx.sh photoprism linux/arm64 ce-arm64 /lunar
docker-release-bullseye:
docker pull --platform=amd64 photoprism/develop:bullseye
docker pull --platform=amd64 photoprism/develop:bullseye-slim
docker pull --platform=arm64 photoprism/develop:bullseye
docker pull --platform=arm64 photoprism/develop:bullseye-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce-bullseye /bullseye
docker-release-buster:
docker pull --platform=amd64 photoprism/develop:buster
docker pull --platform=arm64 photoprism/develop:buster
docker pull --platform=amd64 debian:buster-slim
docker pull --platform=arm64 debian:buster-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce-buster /buster
docker-release-impish:
docker pull --platform=amd64 photoprism/develop:impish
docker pull --platform=arm64 photoprism/develop:impish
docker pull --platform=amd64 ubuntu:impish
docker pull --platform=arm64 ubuntu:impish
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce-impish /impish
docker-release-jammy:
docker pull --platform=amd64 photoprism/develop:jammy
docker pull --platform=amd64 photoprism/develop:jammy-slim
docker pull --platform=arm64 photoprism/develop:jammy
docker pull --platform=arm64 photoprism/develop:jammy-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce-jammy /jammy
docker-release-lunar:
docker pull --platform=amd64 photoprism/develop:lunar
docker pull --platform=amd64 photoprism/develop:lunar-slim
docker pull --platform=arm64 photoprism/develop:lunar
docker pull --platform=arm64 photoprism/develop:lunar-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /lunar
docker-release-mantic:
docker pull --platform=amd64 photoprism/develop:mantic
docker pull --platform=amd64 photoprism/develop:mantic-slim
docker pull --platform=arm64 photoprism/develop:mantic
docker pull --platform=arm64 photoprism/develop:mantic-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /mantic
start-local:
$(DOCKER_COMPOSE) -f docker-compose.local.yml up -d --wait
stop-local:
$(DOCKER_COMPOSE) -f docker-compose.local.yml stop
mysql:
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml pull mysql
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml stop mysql
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml up -d --wait mysql
start-mysql:
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml up -d --wait mysql
stop-mysql:
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml stop mysql
logs-mysql:
$(DOCKER_COMPOSE) -f docker-compose.mysql.yml logs -f mysql
latest:
$(DOCKER_COMPOSE) -f docker-compose.latest.yml pull photoprism-latest
$(DOCKER_COMPOSE) -f docker-compose.latest.yml stop photoprism-latest
$(DOCKER_COMPOSE) -f docker-compose.latest.yml up -d --wait photoprism-latest
start-latest:
$(DOCKER_COMPOSE) -f docker-compose.latest.yml up photoprism-latest
stop-latest:
$(DOCKER_COMPOSE) -f docker-compose.latest.yml stop photoprism-latest
terminal-latest:
$(DOCKER_COMPOSE) -f docker-compose.latest.yml exec photoprism-latest bash
logs-latest:
$(DOCKER_COMPOSE) -f docker-compose.latest.yml logs -f photoprism-latest
docker-local: docker-local-mantic
docker-local-all: 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
scripts/docker/build.sh photoprism ce-bookworm /bookworm "-t photoprism/photoprism:local"
docker-local-bullseye:
docker pull photoprism/develop:bullseye
docker pull photoprism/develop:bullseye-slim
scripts/docker/build.sh photoprism ce-bullseye /bullseye "-t photoprism/photoprism:local"
docker-local-buster:
docker pull photoprism/develop:buster
docker pull debian:buster-slim
scripts/docker/build.sh photoprism ce-buster /buster "-t photoprism/photoprism:local"
docker-local-impish:
docker pull photoprism/develop:impish
docker pull ubuntu:impish
scripts/docker/build.sh photoprism ce-impish /impish "-t photoprism/photoprism:local"
docker-local-jammy:
docker pull photoprism/develop:jammy
docker pull ubuntu:jammy
scripts/docker/build.sh photoprism ce-jammy /jammy "-t photoprism/photoprism:local"
docker-local-lunar:
docker pull photoprism/develop:lunar
docker pull ubuntu:lunar
scripts/docker/build.sh photoprism ce-lunar /lunar "-t photoprism/photoprism:local"
docker-local-mantic:
docker pull photoprism/develop:mantic
docker pull ubuntu:mantic
scripts/docker/build.sh photoprism ce-mantic /mantic "-t photoprism/photoprism:local"
docker-local-develop: docker-local-develop-mantic
docker-local-develop-all: docker-local-develop-mantic docker-local-develop-lunar docker-local-develop-jammy docker-local-develop-bookworm docker-local-develop-bullseye docker-local-develop-buster docker-local-develop-impish
docker-local-develop-bookworm:
docker pull debian:bookworm-slim
scripts/docker/build.sh develop bookworm /bookworm
docker-local-develop-bullseye:
docker pull golang:1-bullseye
scripts/docker/build.sh develop bullseye /bullseye
docker-local-develop-buster:
docker pull golang:1-buster
scripts/docker/build.sh develop buster /buster
docker-local-develop-impish:
docker pull ubuntu:impish
scripts/docker/build.sh develop impish /impish
docker-local-develop-jammy:
docker pull ubuntu:jammy
scripts/docker/build.sh develop jammy /jammy
docker-local-develop-lunar:
docker pull ubuntu:lunar
scripts/docker/build.sh develop lunar /lunar
docker-local-develop-mantic:
docker pull ubuntu:mantic
scripts/docker/build.sh develop mantic /mantic
docker-ddns:
docker pull golang:alpine
scripts/docker/buildx-multi.sh ddns linux/amd64,linux/arm64 $(BUILD_DATE)
docker-goproxy:
docker pull golang:alpine
scripts/docker/buildx-multi.sh goproxy linux/amd64,linux/arm64 $(BUILD_DATE)
demo: docker-demo
docker-demo: docker-demo-latest
docker-demo-all: docker-demo-latest docker-demo-debian
docker-demo-latest:
docker pull photoprism/photoprism:preview-ce
scripts/docker/build.sh demo ce
scripts/docker/push.sh demo ce
docker-demo-debian:
docker pull photoprism/photoprism:preview-ce-debian
scripts/docker/build.sh demo debian /debian
scripts/docker/push.sh demo debian
docker-demo-ubuntu:
docker pull photoprism/photoprism:preview-ce-ubuntu
scripts/docker/build.sh demo ubuntu /ubuntu
scripts/docker/push.sh demo ubuntu
docker-demo-unstable:
docker pull photoprism/photoprism:unstable-ce
scripts/docker/build.sh demo $(BUILD_DATE) /unstable
scripts/docker/push.sh demo $(BUILD_DATE)
docker-demo-local:
scripts/docker/build.sh photoprism
scripts/docker/build.sh demo $(BUILD_DATE) /debian
scripts/docker/push.sh demo $(BUILD_DATE)
docker-dummy-webdav:
docker pull --platform=amd64 golang:1
docker pull --platform=arm64 golang:1
scripts/docker/buildx-multi.sh dummy-webdav linux/amd64,linux/arm64 $(BUILD_DATE)
docker-dummy-oidc:
docker pull --platform=amd64 golang:1
docker pull --platform=arm64 golang:1
scripts/docker/buildx-multi.sh dummy-oidc linux/amd64,linux/arm64 $(BUILD_DATE)
packer-digitalocean:
$(info Buildinng DigitalOcean marketplace image...)
(cd ./setup/docker/cloud && packer build digitalocean.json)
drone-sign:
drone sign photoprism/photoprism --save
clean:
rm -f $(BINARY_NAME)
rm -f *.log
rm -rf node_modules
rm -rf assets/testdata
rm -rf assets/backups
rm -rf frontend/node_modules
docker-development:
scripts/docker-build.sh development $(DOCKER_TAG)
scripts/docker-push.sh development $(DOCKER_TAG)
docker-photoprism:
scripts/docker-build.sh photoprism $(DOCKER_TAG)
scripts/docker-push.sh photoprism $(DOCKER_TAG)
docker-photoprism-arm64:
scripts/docker-build.sh photoprism-arm64 $(DOCKER_TAG)
scripts/docker-push.sh photoprism-arm64 $(DOCKER_TAG)
docker-demo:
scripts/docker-build.sh demo $(DOCKER_TAG)
scripts/docker-push.sh demo $(DOCKER_TAG)
docker-webdav:
scripts/docker-build.sh webdav $(DOCKER_TAG)
scripts/docker-push.sh webdav $(DOCKER_TAG)
lint-js:
(cd frontend && npm run lint)
fmt-js:
(cd frontend && npm run fmt)
fmt-imports:
goimports -w pkg internal cmd
fmt-go:
go fmt ./pkg/... ./internal/... ./cmd/...
gofmt -w -s pkg internal cmd
goimports -w pkg internal cmd
tidy:
go mod tidy -go=1.16 && go mod tidy -go=1.17
users:
./photoprism users add -p photoprism -r admin -s -a test:true -n "Alice Austen" superadmin
./photoprism users ls
# Declare all targets as "PHONY", see https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html.
MAKEFLAGS += --always-make
.PHONY: all assets build cmd docker frontend internal pkg scripts storage photoprism install;
go mod tidy

35020
NOTICE

File diff suppressed because one or more lines are too long

177
README.md
View file

@ -1,110 +1,141 @@
PhotoPrism: Browse Your Life in Pictures
PhotoPrism: Browse your life in pictures
========================================
[![License: AGPL](https://img.shields.io/badge/license-AGPL-blue.svg)](https://docs.photoprism.app/license/agpl/)
[![Documentation](https://img.shields.io/badge/read-the%20docs-4aa087.svg)](https://docs.photoprism.app/)
[![Community Chat](https://img.shields.io/badge/chat-on%20gitter-4aa087.svg)](https://link.photoprism.app/chat)
[![GitHub Discussions](https://img.shields.io/badge/ask-%20on%20github-4d6a91.svg)](https://link.photoprism.app/discussions)
[![Bluesky Social](https://dl.photoprism.app/img/badges/badge-follow-photoprism-bsky-social.svg)](https://photoprism.bsky.social/)
[![Mastodon](https://dl.photoprism.app/img/badges/badge-floss-social.svg)](https://floss.social/@photoprism)
[![License: GPL](https://img.shields.io/badge/license-GPL-blue.svg)][license]
[![Code Quality](https://goreportcard.com/badge/github.com/photoprism/photoprism)][goreport]
[![Build Status](https://travis-ci.org/photoprism/photoprism.png?branch=develop)][ci]
[![Documentation](https://readthedocs.org/projects/photoprism-docs/badge/?version=latest&style=flat)][docs]
[![GitHub contributors](https://img.shields.io/github/contributors/photoprism/photoprism.svg)](https://github.com/photoprism/photoprism/graphs/contributors/)
[![Community Chat](https://img.shields.io/badge/chat-on%20gitter-4aa087.svg)][chat]
[![Twitter](https://img.shields.io/badge/follow-@browseyourlife-00acee.svg)][twitter]
PhotoPrism® is an AI-Powered Photos App for the [Decentralized Web](https://en.wikipedia.org/wiki/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.
PhotoPrism is a server-based application for browsing, organizing and sharing your personal photo collection.
It makes use of the latest technologies to automatically tag and find pictures without getting in your way.
Say goodbye to solutions that force you to upload your visual memories to the cloud.
![](https://dl.photoprism.app/img/ui/search-cards-view.jpg)
![](https://dl.photoprism.org/assets/img/preview.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.
More screenshots: https://github.com/photoprism/photoprism/wiki/Screenshots
## Feature Overview ##
## What to expect ##
**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:
* Clearly structured Web interface for browsing, organizing and sharing your personal photo collection
* Import everything without worrying about duplicates or [RAW to JPEG conversion][wiki:raw]
* [Geocoding][wiki:geocoding], [XMP support][wiki:xmp] and [automated tagging][wiki:classification]
based on Google TensorFlow
* 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
## For the early birds ##
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. 🔒
You're welcome to play with our demo at [demo.photoprism.org](https://demo.photoprism.org).
Leave your email to get a [release notification](https://goo.gl/forms/KBPVGl9PCsOKrAv33).
## 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.org/en/latest/getting-started/) can be found
in our [User Guide](https://docs.photoprism.org/en/latest/).
Developers can skip this and move on to the [Developer Guide](https://docs.photoprism.org/en/latest/developer-guide/).
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.
All you need is a Web browser and [Docker](https://store.docker.com/search?type=edition&offering=community)
to run the server. It is available for Mac, Linux and Windows.
The [stable releases](https://docs.photoprism.app/release-notes/) and [development preview](https://docs.photoprism.app/getting-started/updates/#development-preview) are available as a [multi-arch image](https://link.photoprism.app/docker-hub) for 64-bit AMD, Intel, and ARM processors.
That means, [Raspberry Pi](https://docs.photoprism.app/getting-started/raspberry-pi/) and Apple Silicon users enjoy the exact same functionality and can follow the same [installation steps](https://docs.photoprism.app/getting-started/docker-compose/).
There is also a [pre-installed Raspberry Pi image here](https://github.com/guysoft/PhotoPrismPi).
See our [Getting Started FAQ](https://docs.photoprism.app/getting-started/faq/#how-can-i-install-photoprism-without-docker) for alternative installation methods, for example using the [*tar.gz* packages](https://dl.photoprism.app/pkg/linux/README.html) we provide.
Note that this is work in progress. We do our best to provide a complete, stable version.
If you have a question, don't hesitate to ask in our [help forum][help]
or [contact us via email](mailto:hello@photoprism.org).
## Support Our Mission 💎 ##
## Why this has to be free software ##
**PhotoPrism is 100% self-funded and independent.** Your [continued support](https://link.photoprism.app/membership) helps us [provide more features to the public](https://www.photoprism.app/oss/faq#what-functionality-is-generally-available), release [regular updates](https://docs.photoprism.app/release-notes/), and remain independent!
The development of every commercial product is focused on monetization.
We've [built similar apps more than once](https://github.com/photoprism/photoprism/wiki/Mediencenter)
and every single time the constraints of working
in a profit-oriented corporate environment were an impediment.
Our members [enjoy additional features](https://www.photoprism.app/kb/personal), including access to [interactive world maps](https://try.photoprism.app/library/places), and can join our private chat room to [connect with our team](https://www.photoprism.app/about/team). We currently have the following membership options:
We are sure we can do better with only a fraction of the budget. Simplicity - the art of maximizing the
amount of work not done - can be very powerful.
Go itself is a [great example](https://talks.golang.org/2015/simplicity-is-complicated.slide).
- You can [sign up directly on our website](https://link.photoprism.app/membership) and pay with credit card or SEPA through Stripe, so you don't need to [link an external account](https://www.photoprism.app/kb/activation) and can easily upgrade or downgrade at any time
- Alternatively, [Patreon](https://link.photoprism.app/patreon) also supports PayPal, additional currencies, and lets you choose between monthly and annual billing for all tiers
Our long-term goal is to become an open platform for machine
learning [research](https://github.com/photoprism/photoprism/wiki/Research) based on real-world photo collections.
We're already in contact with data scientists who like our idea.
If you currently support us through [GitHub Sponsors](https://link.photoprism.app/sponsor), you can also [register on our website](https://my.photoprism.app/register) and use the *Activate GitHub Sponsors Membership* button to link your account. For details on this and how to [link your Patreon account](https://www.patreon.com/pledges), see our [Activation Guide](https://www.photoprism.app/kb/activation).
## How to contribute ##
You are [welcome to contact us](https://www.photoprism.app/contact) for change requests, membership questions, and business partnerships.
We welcome contributions of any kind. If you have a bug or an idea, read our
[guide](https://docs.photoprism.org/en/latest/developer-guide/) before opening an issue.
Issues labeled [help wanted](https://github.com/photoprism/photoprism/labels/help%20wanted) /
[easy](https://github.com/photoprism/photoprism/issues?q=is%3Aissue+is%3Aopen+label%3Aeasy) can be
good (first) contributions.
[View Membership FAQ ](https://www.photoprism.app/kb/membership)[Sign Up ](https://link.photoprism.app/membership)
Please follow us on [Twitter][twitter] and join our [developers mailing list](https://groups.google.com/a/photoprism.org/forum/#!forum/developers)
to receive regular project updates and discuss development related topics. Don't be afraid to ask stupid questions.
### Why Your Support Matters ###
## Free beer ##
- Your continued support helps us provide regular updates and remain independent, so we can fulfill our mission and protect your privacy
- Sustained funding is key to quickly releasing new features requested by you and other community members
- Being self-funded and independent, we can personally promise you that we will never sell your data and that we will always be transparent about our software and services
This project is about freedom and privacy but not necessarily about free beer. We feel like it
would be a mistake to state there will be no costs, because clearly we have huge expenses, your server hardware
will have a price tag and then maybe you'd like to have some extra features that need to be developed.
Please also leave [a star](https://github.com/photoprism/photoprism/stargazers) on GitHub if you like this project. It provides additional motivation to keep going.
It's fair to say that users with basic needs will have no monthly costs. We were also way more effective
per dollar than commercial projects and learned a lot on top of it.
An earlier version of this document contained a rough number, but at the end of the day it doesn't matter.
**A big thank you to all current and past sponsors, whose generous support has been and continues to be essential to the success of the project!**
Basically all established OSS companies make 90% of their revenue with enterprise customers, that's why private users
and single developers typically get everything for free. Obviously that doesn't work if you have only private users
that refuse to share their data on top of it. In our opinion it would have made sense to finance this like all
public infrastructure, our expenses are peanuts compared to building a road.
[View Sponsors ](SPONSORS.md)[View Credits ](https://docs.photoprism.app/credits/)
Looking forward, specific solutions for funding development and maintenance could be to...
## Getting Support ##
- sell a tested & supported version in the app store while our contributors and other developers can
continue to use Docker or build from source
- offer a geodata, public events and maps subscription since OpenStreetMap doesn't want us to use their development
API for production, which is perfectly fine
Visit [docs.photoprism.app/user-guide](https://docs.photoprism.app/user-guide/) to learn how to [sync](https://docs.photoprism.app/user-guide/sync/webdav/), [organize](https://docs.photoprism.app/user-guide/library/), and [share](https://docs.photoprism.app/user-guide/share/) your pictures. If you need help installing our software at home, you are welcome to post your question in [GitHub Discussions](https://link.photoprism.app/discussions) or ask in our [Community Chat](https://link.photoprism.app/chat).
Common problems can be quickly diagnosed and solved using our [Troubleshooting Checklists](https://docs.photoprism.app/getting-started/troubleshooting/). Eligible [members](https://link.photoprism.app/membership) are also welcome to email us for technical support and advice.
## Donations ##
## Upcoming Features and Enhancements ##
You're most welcome to support us via [GitHub Sponsors](https://github.com/sponsors/lastzero),
especially if you need help with using our software. They will match every donation in the first year.
In addition, you can find us on [Patreon](https://www.patreon.com/photoprism) and [PayPal](https://www.paypal.me/photoprism).
Our [sponsors](https://github.com/photoprism/photoprism/blob/develop/SPONSORS.md) and
[contributors](https://github.com/photoprism/photoprism/graphs/contributors/) will get for free whatever we might
have to charge for a geodata subscription later.
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.
Also please [leave a star](https://github.com/photoprism/photoprism/stargazers) on GitHub if you like this project,
it provides additional motivation to keep going.
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.
Ideas backed by a sponsor are marked with a golden [sponsor](https://github.com/photoprism/photoprism/issues?q=is%3Aissue+is%3Aopen+label%3Asponsor) label.
Let us know if we mistakenly label an idea as [unfunded](https://github.com/photoprism/photoprism/issues?q=is%3Aissue+is%3Aopen+label%3Aunfunded).
**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.**
Thank you very much! <3
## GitHub Issues ⚠️ ##
## Public and corporate sponsorship ##
We kindly ask you not to report bugs via GitHub Issues **unless you are certain to have found a fully reproducible and previously unreported issue** that must be fixed directly in the app. Thank you for your careful consideration!
We spent weeks asking organizations like [The Prototype Fund](https://prototypefund.de/en/) for help
and also tried to cooperate with companies like Mapbox and Cewe.
You would think it's easier to get a few dollars with [our background](http://docs.photoprism.org/en/latest/team/)
and [working code](https://demo.photoprism.org/).
- When reporting a problem, always include the software versions you are using and other information about your environment such as [browser, browser plugins](https://docs.photoprism.app/getting-started/troubleshooting/browsers/), operating system, [storage type](https://docs.photoprism.app/getting-started/troubleshooting/performance/#storage), [memory size](https://docs.photoprism.app/getting-started/troubleshooting/performance/#memory), and [processor](https://docs.photoprism.app/getting-started/troubleshooting/performance/#server-cpu)
- Note that all issue **subscribers receive an email notification** from GitHub whenever a new comment is added, so these should only be used for sharing important information and not for discussions, questions or expressing personal opinions
- [Contact us](https://www.photoprism.app/contact) or [a community member](https://link.photoprism.app/discussions) if you need help, it could be a local configuration problem, or a misunderstanding in how the software works
- This gives our team the opportunity to [improve the docs](https://docs.photoprism.app/getting-started/troubleshooting/) and provide best-in-class support to you, instead of handling unclear/duplicate bug reports or triggering a flood of notifications by responding to comments
If any of those organizations changes their mind, they are welcome to [reach out to us](mailto:hello@photoprism.org).
## Connect with the Community ##
## Disclaimer ##
Follow us on [Twitter](https://link.photoprism.app/twitter) and 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.
We'd like to remind everyone that we are not full-time marketing specialists but developers who work a lot and
enjoy a bit of sarcasm from time to time. Please let us know when there is an issue with our "nuance and tone"
and we'll find a solution.
Feel free to contact us at [hello@photoprism.app](mailto:hello@photoprism.app) with anything that is on your mind. We appreciate your feedback! 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.
## Every Contribution Makes a Difference ##
We welcome [contributions](CONTRIBUTING.md) of any kind, including blog posts, tutorials, translations, testing, writing documentation, and pull requests. Our [Developer Guide](https://docs.photoprism.app/developer-guide/) contains all the information necessary for you to get started.
----
*PhotoPrism® is a [registered trademark](https://www.photoprism.app/trademark). By using the software and services we provide, you agree to our [Terms of Service](https://www.photoprism.app/terms), [Privacy Policy](https://www.photoprism.app/privacy), and [Code of Conduct](https://www.photoprism.app/code-of-conduct). Docs are [available](https://link.photoprism.app/github-docs) under the [CC BY-NC-SA 4.0 License](https://creativecommons.org/licenses/by-nc-sa/4.0/); [additional terms](https://github.com/photoprism/photoprism/blob/develop/assets/README.md) may apply.*
[wiki:classification]: https://github.com/photoprism/photoprism/wiki/Image-Classification
[wiki:xmp]: https://github.com/photoprism/photoprism/wiki/XMP
[wiki:geocoding]: https://github.com/photoprism/photoprism/wiki/Geocoding
[wiki:raw]: https://github.com/photoprism/photoprism/wiki/Converting-RAW-to-JPEG
[help]: https://groups.google.com/a/photoprism.org/forum/#!forum/help
[license]: https://github.com/photoprism/photoprism/blob/develop/LICENSE
[patreon]: https://www.patreon.com/photoprism
[paypal]: https://www.paypal.me/photoprism
[goreport]: https://goreportcard.com/report/github.com/photoprism/photoprism
[coverage]: https://codecov.io/gh/photoprism/photoprism
[ci]: https://travis-ci.org/photoprism/photoprism
[docs]: https://docs.photoprism.org/en/latest/
[issuehunt]: https://issuehunt.io/repos/119160553
[chat]: https://gitter.im/browseyourlife/community
[twitter]: https://twitter.com/browseyourlife
[unfunded issues]: https://github.com/photoprism/photoprism/issues?q=is%3Aissue+is%3Aopen+label%3Aunfunded
[sponsored issues]: https://github.com/photoprism/photoprism/issues?q=is%3Aissue+is%3Aopen+label%3Asponsor

View file

@ -1,32 +0,0 @@
# PhotoPrism® Security Policy
**Please contact us at [security@photoprism.app](mailto:security@photoprism.app) when you have discovered a potential security issue.** You are welcome to also report vulnerabilities in third-party applications that we may not be able to fix directly.
At a minimum, your report should include the following:
- version and architecture
- vulnerability description
- reproduction steps
We will then try to reproduce the problem, determine the impact and get back to you as soon as possible.
Confirmed vulnerabilities will be fixed within 90 days, depending on the severity and whether third-party
packages are affected.
## Responsible Disclosure
1. Confirm that the vulnerability applies to a current version and is reproducible.
2. First share the vulnerability details with us so that users are not put at risk.
3. Wait before publishing details until everyone has had a chance to update.
4. Respect the privacy of others.
*Avoid activities that disrupt, degrade, or interrupt our services or compromise other users' data, such as spam, brute force attacks, denial of service attacks, and malicious file distribution.*
## Reporting Issues as a Business or Organization
(a) If an email we receive appears to be auto-generated and does not look like a legitimate report that has been manually reviewed in accordance with the requirements of this policy, we may ignore it and you should not expect a response in order to protect our ability to respond to actual issues.
(b) Unless absolutely necessary, for example to report a major issue that has just been discovered, please send requests or reports during regular business hours and never at night or on weekends, especially if they are sent asynchronously.
(c) Refrain from sending HTML emails as we consider them insecure and unsuitable for this purpose.
(d) If you are contacting us as a business or organization, we encourage you to include legal and contact information on your website, as failure to provide legally required information may compromise your eligibility and trustworthiness.

View file

@ -1,97 +1,41 @@
# Thank You to All Current and Past Sponsors 💎 #
Let's join forces
=================
Your [continued support](https://link.photoprism.app/membership) helps us [provide more features to the public](https://www.photoprism.app/oss/faq#what-functionality-is-generally-available), release [regular updates](https://docs.photoprism.app/release-notes/), and remain independent! 💜
You're most welcome to support us via [GitHub Sponsors](https://github.com/sponsors/lastzero),
especially if you need help with using our software. They will match every donation in the first year.
In addition, you can find us on [Patreon][patreon] and [PayPal][paypal].
Our sponsors and contributors will get for free whatever we might have to
[charge](https://docs.photoprism.org/en/latest/funding/) for a geodata, public events and maps
subscription later.
You are [welcome to contact us](https://www.photoprism.app/contact) for change requests, membership questions, and business partnerships.
Also please [leave a star](https://github.com/photoprism/photoprism/stargazers) here on GitHub if you like this project,
it provides additional motivation to keep going.
[View Membership FAQ ](https://www.photoprism.app/kb/membership)[Contact Us ](https://www.photoprism.app/contact)
Ideas backed by a sponsor are marked with a golden [sponsor][issues:sponsor] label.
Let us know if we mistakenly label an idea as [unfunded][issues:unfunded].
## Platinum Sponsors ##
Thank you very much to all of our sponsors and donors (including those that want to stay private)!
[**Sid Karunaratne**](https://github.com/sakaru) (Patreon, May 2019)
## Sponsors ##
**Andrew** (Patreon, October 2021)
[![Liquid Bytes](https://blog.liquidbytes.net/img/logo-retina.png)](https://blog.liquidbytes.net/)
[**@ppibburr**](https://github.com/ppibburr) (GitHub Sponsors, December 2021)
[Sid Karunaratne](https://github.com/sakaru) (Patreon, May 2019)
[**Arto Bendiken**](https://github.com/artob) (GitHub Sponsors, March 2023)
[Simen Eriksen](https://github.com/dennorske) (GitHub Sponsors, December 2019)
**Marko Eckert** (Patreon, May 2023)
[Alex Leahu](https://github.com/alxjsn) (GitHub Sponsors, January 2020)
**Vitold Romanovski** (May 2023)
[Thomas Eg](https://github.com/ThomasEg) (GitHub Sponsors, April 2020)
**Aaron C. de Bruyn** (September 2023)
For a full list of GitHub sponsors, see https://github.com/sponsors/lastzero.
[**Patrick Kvaksrud**](https://github.com/Kvaksrud) (October 2023)
## Donations ##
## Gold Sponsors ##
[David Pennington](https://github.com/Xeoncross), Jun Li, Jonas Aaberg, Dmitry, Fabian Graf,
Klemens Guder, [Greg](https://github.com/oziee)
[**Simen Eriksen**](https://github.com/dennorske) (GitHub Sponsors, December 2019)
[**Alex Leahu**](https://github.com/alxjsn) (GitHub Sponsors, January 2020)
[**Thomas Eg**](https://github.com/ThomasEg) (GitHub Sponsors, April 2020)
[**@mpodshivalin**](https://github.com/mpodshivalin) (GitHub Sponsors, July 2020)
[**@kvtong93**](https://github.com/kvtong93) (GitHub Sponsors, September 2020)
[**Thomas Eizinger**](https://github.com/thomaseizinger) (GitHub Sponsors, October 2020)
[**@FreshMosh**](https://github.com/FreshMosh) (GitHub Sponsors, November 2020)
**Cooper** (Patreon, November 2020)
[**Asim Aslam**](https://github.com/asim) (GitHub Sponsors, November 2020)
**Garn Penrod** (Patreon, November 2020)
[**@anaxmedia**](https://github.com/anaxmedia) (GitHub Sponsors, November 2020)
[**Kevin Anderson**](https://github.com/kevinanderson1) (GitHub Sponsors, November 2020)
[**@reyman**](https://github.com/reyman) (GitHub Sponsors, January 2021)
[**Ben McCann**](https://github.com/benmccann) (GitHub Sponsors, January 2021)
[**Steven Chan**](https://github.com/nioq) (GitHub Sponsors, April 2021)
[**Joseph Jacks**](https://github.com/josephjacks) (GitHub Sponsors, June 2021)
[**Daniel Hähnke**](https://github.com/DanBenHa) (GitHub Sponsors, July 2021)
[**@jasontitus**](https://github.com/jasontitus) (GitHub Sponsors, October 2021)
[**Łukasz Anwajler**](https://github.com/anwajler) (GitHub Sponsors, November 2021)
[**Gyto6**](https://github.com/gyto6) (GitHub Sponsors, May 2022)
**Sandro Petruzzi** (Patreon, May 2022)
[**Toly Rugalev**](https://github.com/AnatolyRugalev) (GitHub Sponsors, March 2023)
[**Yongho Lee**](https://github.com/lyh16) (Patreon, May 2023)
**Albert R** (Patreon, August 2023)
**Peter Galbavy** (Patreon, November 2023)
## Infrastructure Sponsors ##
Our project infrastructure is provided by the following companies:
- [**GitHub**](https://github.com/) hosts our [code repositories](https://github.com/photoprism/photoprism) and also provides many other important services
- [**Docker**](https://www.docker.com/) approved us for their [Open Source Program](https://www.docker.com/community/open-source/application/) and hosts all of our app images
- [**Element**](https://element.io/) develops and [operates the infrastructure](https://matrix.org/) that our [community chat](https://link.photoprism.app/chat) is based on
- [**BrowserStack**](https://www.browserstack.com/) provides [free access](https://www.browserstack.com/open-source) to their device and browser testing infrastructure
[View Credits ](https://docs.photoprism.app/credits/)
## One-Time Donations ##
[WarpinWolf](https://github.com/WarpinWolf), [David Pennington](https://github.com/Xeoncross), Jun Li, Jonas Aaberg, Dmitry, Fabian Graf, Klemens
Guder, [Greg](https://github.com/oziee), Jean-Louis Frenkel, [INIT_6](https://twitter.com/init_3), Sandro Rüegge,
William Kray, Ovace Mamnoon, Clément Caplain Moreau, The Gordon Project, [@pluja](https://github.com/pluja),
[@swingstate](https://github.com/photoprism/photoprism/issues/808#issuecomment-997467377), [Sola](https://github.com/solacrypto)
[Make Donation ](https://link.photoprism.app/donate)
[patreon]: https://www.patreon.com/photoprism
[paypal]: https://www.paypal.me/photoprism
[issues:sponsor]: https://github.com/photoprism/photoprism/issues?q=is%3Aissue+is%3Aopen+label%3Asponsor
[issues:unfunded]: https://github.com/photoprism/photoprism/issues?q=is%3Aissue+is%3Aopen+label%3Aunfunded

View file

@ -1,3 +0,0 @@
examples
README.md
.*

View file

@ -1,149 +0,0 @@
PhotoPrism® Documentation and Digital Assets
This Agreement is between you and PhotoPrism UG ("PhotoPrism", "we" or "us").
Visit photoprism.app/contact to view our full contact information as required
by law.
We may update this Agreement as necessary (1) for legal reasons or (2) to
improve readability and make clarifications that our users request.
By using the Documentation and Digital Assets we provide, you agree to the
terms of this Agreement.
Last Updated: April 5, 2023
DEFINITIONS
"Software" means any software published and distributed by PhotoPrism, either
self-hosted, installed on a device, managed, or as a service.
"Open Source Software" is any software component or software application,
including third-party software, distributed under a Public License.
"Services" means any backend services, world maps, hosted documentation, remote
access, cloud storage, software as a service, support forums, member benefits
and/or other services offered by PhotoPrism that are based on or complementary
to the Software.
"Documentation" means all instructions, diagrams, screenshots, manuals, guides,
references and/or other written documents related to the Software and the
Services.
"Digital Assets" means icons, fonts, illustrations, graphics, background
images, videos, sounds, models, and sample files related to or accompanying the
Software and/or Documentation, such as those provided on GitHub, distributed at
dl.photoprism.app, or used on docs.photoprism.app.
"Brand Assets" means trademarks, logos, icons, fonts, corporate designs,
product and service names, and any other brand features and elements, whether
registered or unregistered.
"Customer" means an individual, company or partnership that has entered into a
written agreement with PhotoPrism to license Software.
"Affiliate(s)" means any entity that controls, is controlled by, or is under
common control with a party, where "control" means the ability to direct the
management and policies of an entity.
"Intellectual Property Rights" means all intellectual property rights,
including but not limited to patents, copyrights, trademarks, goodwill, moral
rights, trade secrets and all other intellectual and industrial property rights
and proprietary rights, including registrations, applications, renewals and
extensions of such rights worldwide.
"License Agreement" means the agreement between PhotoPrism (or a PhotoPrism
Affiliate or an authorized reseller of the Software) and Customer under which
Customer has acquired or will acquire license rights to use the Software.
"Public License" means any license that conforms to the Open Source Definition
(as promulgated by the Open Source Initiative) or the Free Software Definition
(as promulgated by the Free Software Foundation) or a substantially similar
license, including any license approved by the Open Source Initiative or a
Creative Commons license. "Open Source Licenses" include copyleft licenses.
TERMS OF USE
(a) Our public Documentation is available under the terms of the CC BY-NC-SA
4.0 License. Other terms may apply to Digital Assets — in particular
illustrations, graphics, and videos — embedded in the documentation if they
are licensed to us solely for direct distribution. When in doubt, please ask
before distributing or using them for other works.
(b) We hereby grant you a non-exclusive, royalty-free, worldwide,
non-sublicensable, non-transferable right to use the Digital Assets in
combination with the Software and Services, unless otherwise noted.
(c) Because some Digital Assets are licensed to us solely for direct
distribution, we cannot redistribute them under a more permissive license for
other purposes. If the author or copyright holder has not released them under a
permissive license, you must obtain a license before using them in your own
work, whether commercial or non-commercial in nature.
(d) All rights not expressly licensed by PhotoPrism under a License Agreement or
provided under a Public License are reserved. For the avoidance of doubt, this
also applies to promotional materials, legal documents, and any other
Intellectual Property Rights. The use, reproduction, and distribution of Open
Source Software is subject to the terms of the applicable Public License.
TRADEMARK AND BRAND ASSETS
(a) PhotoPrisms Brand Assets are proprietary assets owned exclusively by
PhotoPrism. We reserve the right to object to any use or misuse in any
jurisdiction worldwide. Visit photoprism.app/trademark to learn more.
(b) Contributors, licensees, business partners, and other third parties may
never claim ownership of PhotoPrism's Brand Assets or brands confusingly
similar to PhotoPrism's Brand Assets in any way, including, without limitation,
as a trademark, service mark, company name or designation, domain name, social
media profile/handle, or in any other manner.
(c) You may not include the PhotoPrism trademark in the name of your app,
product, or service, whether commercial or non-commercial in nature. This
includes online services such as e-commerce, community, blog, information,
advertising, and personal home pages, as well as apps, app stores, client apps,
or third-party apps that interact with PhotoPrism.
DISCLAIMER OF WARRANTY
OUR SOFTWARE, SERVICES AND DOCUMENTATION ARE PROVIDED "AS-IS" AND WITHOUT
WARRANTY OF ANY KIND. WE DISCLAIM ALL WARRANTIES, EXPRESSED OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, TITLE,
NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
PHOTOPRISM DOES NOT WARRANT THAT THE SOFTWARE, SERVICES OR DOCUMENTATION WILL
BE UNINTERRUPTED OR ERROR-FREE OR THAT ALL ERRORS WILL BE CORRECTED. WE
DISCLAIM ALL LIABILITY AND RESPONSIBILITY FOR ANY THIRD-PARTY PRODUCTS OR
SERVICES OR FOR ANY ACTS OR OMISSIONS OF ANY THIRD-PARTY SUPPLIERS, VENDORS OR
SERVICE PROVIDERS.
LIMITATION OF LIABILITY
TO THE FULLEST EXTENT PERMITTED BY LAW, WE WILL NOT BE LIABLE FOR ANY DAMAGES
ASSOCIATED WITH OUR SOFTWARE, SERVICES OR DOCUMENTATION, INCLUDING WITHOUT
LIMITATION ORDINARY, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES OF ANY
KIND, INCLUDING BUT NOT LIMITED TO DAMAGES RELATING TO LOST DATA OR LOST
PROFITS, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
IN NO EVENT SHALL PHOTOPRISM HAVE ANY LIABILITY TO ANY THIRD-PARTY SUPPLIER,
VENDOR OR SERVICE PROVIDER. NOTWITHSTANDING ANY OTHER PROVISION IN THESE TERMS,
OUR MAXIMUM AGGREGATE LIABILITY IS EUR 50.
FINAL PROVISIONS
(a) These terms do not imply any rights other than those expressly granted in
these terms.
(b) In the event that you breach these terms and we do not take any action, we
will still be entitled to use our rights and remedies in any other situation
where you breach these terms.
(c) If a provision of these terms is or becomes legally invalid or if there is
any gap that needs to be filled, the validity of the remainder of these terms
shall not be affected thereby. Invalid provisions shall be replaced by common
consent with such provisions which come as close as possible to the intended
result of the invalid provision. In the event of gaps, such provisions shall
come into force by common consent which comes as close as possible to the
intended result of these terms, should the matter have been considered in
advance. Any changes of or amendments to these terms must be in writing to
become effective.

View file

@ -0,0 +1,33 @@
url: "https://demo.photoprism.org/"
title: "PhotoPrism"
subtitle: "Browse your life"
description: "Personal Photo Management powered by Go and Google TensorFlow. Free and open-source."
author: "Anonymous"
twitter: "@browseyourlife"
debug: false
read-only: false
public: false
experimental: false
admin-password: photoprism
config-path: ~/.config/photoprism
cache-path: ~/.cache/photoprism
assets-path: ~/.local/share/photoprism
resources-path: ~/.local/share/photoprism/resources
originals-path: ~/Pictures/Originals
import-path: ~/Pictures/Import
http-host:
http-mode: release
http-port: 2342
tidb-host: localhost
tidb-port: 2343
tidb-password: photoprism
database-driver: tidb
database-dsn: root:photoprism@tcp(localhost:2343)/photoprism?parseTime=true
pid-filename: ~/.local/share/photoprism/photoprism.pid
log-filename: ~/.local/share/photoprism/photoprism.log
detach-server: false
sidecar-json: false
sidecar-yaml: false
sidecar-hidden: true
jpeg-quality: 90
jpeg-hidden: true

27
assets/config/settings.yml Executable file
View file

@ -0,0 +1,27 @@
theme: default
language: en
templates:
default: index.tmpl
maps:
animate: 0
style: streets
features:
archive: true
private: true
review: true
upload: true
import: true
labels: true
places: true
download: true
edit: true
share: true
logs: true
import:
path: /
move: false
index:
path: /
convert: true
rescan: false
group: true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

View file

@ -1,9 +0,0 @@
# Sample File Attribution
| Filename | Author | URL |
|-------------------------------|------------|----------------------------------------------------------------------|
| pythagoras.gif | Petrus3743 | <https://commons.wikimedia.org/wiki/File:01-Satz_des_Pythagoras.gif> |
| fox.profile0.8bpc.yuv420.avif | Link-U | <https://github.com/link-u/avif-sample-images> |
**Additional File Samples can be found at <https://dl.photoprism.app/samples/>.**

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

View file

@ -1,70 +0,0 @@
[{
"SourceFile": "beach_sand.jpg",
"ExifToolVersion": 12.56,
"FileName": "beach_sand.jpg",
"Directory": ".",
"FileSize": 105321,
"FileModifyDate": "2023:06:20 04:43:41+00:00",
"FileAccessDate": "2023:08:06 16:38:50+00:00",
"FileInodeChangeDate": "2023:08:04 05:10:37+00:00",
"FilePermissions": 100644,
"FileType": "JPEG",
"FileTypeExtension": "JPG",
"MIMEType": "image/jpeg",
"JFIFVersion": "1 2",
"ExifByteOrder": "MM",
"Make": "Apple",
"Model": "iPhone SE",
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Software": "10.2.1",
"ModifyDate": "2017:02:15 14:13:40",
"YCbCrPositioning": 1,
"ExposureTime": 0.0004940711462,
"ExposureProgram": 2,
"ISO": 25,
"ExifVersion": "0231",
"DateTimeOriginal": "2017:02:15 14:13:40",
"CreateDate": "2017:02:15 14:13:40",
"ComponentsConfiguration": "1 2 3 0",
"ApertureValue": 2.19999999733148,
"MeteringMode": 5,
"Flash": 16,
"FocalLength": 4.2,
"SubSecTimeOriginal": 249,
"SubSecTimeDigitized": 249,
"FlashpixVersion": "0100",
"ColorSpace": 65535,
"SensingMethod": 2,
"ExposureMode": 0,
"WhiteBalance": 0,
"SceneCaptureType": 0,
"LensModel": "iPhone SE back camera 4.15mm f/2.2",
"GPSVersionID": "2 3 0 0",
"GPSLatitudeRef": "S",
"GPSLongitudeRef": "E",
"GPSAltitudeRef": 1,
"CurrentIPTCDigest": "804bedc723e0e6cd3a41d0a44b074d19",
"DocumentNotes": "https://flickr.com/e/Rl7qi7oH%2BSEGDuwWBbZYaBQMEB5oNfPvQ6m3aMrPQ64%3D",
"ApplicationRecordVersion": 4,
"ImageWidth": 640,
"ImageHeight": 480,
"EncodingProcess": 2,
"BitsPerSample": 8,
"ColorComponents": 3,
"YCbCrSubSampling": "2 2",
"Aperture": 2.19999999733148,
"ImageSize": "640 480",
"Megapixels": 0.3072,
"ShutterSpeed": 0.0004940711462,
"SubSecCreateDate": "2017:02:15 14:13:40.249",
"SubSecDateTimeOriginal": "2017:02:15 14:13:40.249",
"GPSAltitude": -1.990417522,
"GPSLatitude": -29.2824777777778,
"GPSLongitude": 31.4436361111111,
"FocalLength35efl": 4.2,
"GPSPosition": "-29.2824777777778 31.4436361111111",
"LightValue": 15.2580006188259,
"LensID": "iPhone SE back camera 4.15mm f/2.2"
}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

View file

@ -1,85 +0,0 @@
[{
"SourceFile": "/Users/michael/Downloads/20200511-141648-Berlin-Germany-2020-3ku.mp4",
"ExifToolVersion": 11.85,
"FileName": "blue-go-video.mp4",
"Directory": "/Users/michael/Downloads",
"FileSize": "4.4 MB",
"FileModifyDate": "2020:05:14 14:02:58+02:00",
"FileAccessDate": "2020:05:14 14:02:58+02:00",
"FileInodeChangeDate": "2020:05:14 14:02:58+02:00",
"FilePermissions": "rw-r--r--",
"FileType": "MP4",
"FileTypeExtension": "mp4",
"MIMEType": "video/mp4",
"MajorBrand": "MP4 v2 [ISO 14496-14]",
"MinorVersion": "0.0.0",
"CompatibleBrands": ["isom","mp42"],
"MovieHeaderVersion": 0,
"CreateDate": "2020:05:11 14:16:48",
"ModifyDate": "2020:05:11 14:16:48",
"TimeScale": 1000,
"Duration": "2.42 s",
"PreferredRate": 1,
"PreferredVolume": "100.00%",
"PreviewTime": "0 s",
"PreviewDuration": "0 s",
"PosterTime": "0 s",
"SelectionTime": "0 s",
"SelectionDuration": "0 s",
"CurrentTime": "0 s",
"NextTrackID": 3,
"GPSCoordinates": "52 deg 27' 34.56\" N, 13 deg 19' 18.48\" E",
"AndroidVersion": 10,
"TrackHeaderVersion": 0,
"TrackCreateDate": "2020:05:11 14:16:48",
"TrackModifyDate": "2020:05:11 14:16:48",
"TrackID": 1,
"TrackDuration": "2.42 s",
"TrackLayer": 0,
"TrackVolume": "0.00%",
"ImageWidth": 1920,
"ImageHeight": 1080,
"GraphicsMode": "srcCopy",
"OpColor": "0 0 0",
"CompressorID": "avc1",
"SourceImageWidth": 1920,
"SourceImageHeight": 1080,
"XResolution": 72,
"YResolution": 72,
"BitDepth": 24,
"PixelAspectRatio": "65536:65536",
"ColorRepresentation": "nclx 1 1 1",
"VideoFrameRate": 28.101,
"MatrixStructure": "1 0 0 0 1 0 0 0 1",
"MediaHeaderVersion": 0,
"MediaCreateDate": "2020:05:11 14:16:48",
"MediaModifyDate": "2020:05:11 14:16:48",
"MediaTimeScale": 48000,
"MediaDuration": "2.41 s",
"HandlerType": "Audio Track",
"HandlerDescription": "SoundHandle",
"Balance": 0,
"AudioFormat": "mp4a",
"AudioChannels": 2,
"AudioBitsPerSample": 16,
"AudioSampleRate": 48000,
"MediaDataSize": 3818513,
"MediaDataOffset": 810340,
"ImageSize": "1920x1080",
"Megapixels": 2.1,
"AvgBitrate": "12.6 Mbps",
"GPSLatitude": "52 deg 27' 34.56\" N",
"GPSLongitude": "13 deg 19' 18.48\" E",
"Rotation": 90,
"GPSPosition": "52 deg 27' 34.56\" N, 13 deg 19' 18.48\" E",
"Title": "Blue Gopher",
"Description": "Cute gopher",
"Comment": "We love go",
"Subject": "gopher",
"Keywords": "blue, desk",
"Artist": "Micha",
"CameraOwner": "Micha",
"CameraSerial": "123",
"DocumentID": "12398365",
"InstanceID": "9058055",
}]

Binary file not shown.

View file

@ -1,6 +0,0 @@
[{
"SourceFile": "/Users/michael/Downloads/20200511-141648-Berlin-Germany-2020-3ku.mp4",
"ExifToolVersion": 11.85,
"FileName": "blue-go-video.mp4",
"Directory": "/Users/michael/Downloads"
}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

View file

@ -1,25 +0,0 @@
[{
"SourceFile": "example.gif",
"ExifToolVersion": 12.40,
"FileName": "example.gif",
"Directory": ".",
"FileSize": 5760,
"FileModifyDate": "2021:11:01 14:39:36+00:00",
"FileAccessDate": "2022:04:12 15:49:52+00:00",
"FileInodeChangeDate": "2022:03:02 20:29:31+00:00",
"FilePermissions": 100666,
"FileType": "GIF",
"FileTypeExtension": "GIF",
"MIMEType": "image/gif",
"GIFVersion": "89a",
"ImageWidth": 100,
"ImageHeight": 67,
"HasColorMap": 1,
"ColorResolutionDepth": 8,
"BitsPerPixel": 8,
"BackgroundColor": 0,
"AnimationIterations": 0,
"TransparentColor": 255,
"ImageSize": "100 67",
"Megapixels": 0.0067
}]

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

View file

@ -1,153 +0,0 @@
[{
"SourceFile": "iphone_15_pro.heic",
"ExifToolVersion": 12.40,
"FileName": "iphone_15_pro.heic",
"Directory": ".",
"FileSize": 886825,
"FileModifyDate": "2023:10:31 11:48:48+01:00",
"FileAccessDate": "2023:10:31 11:51:22+01:00",
"FileInodeChangeDate": "2023:10:31 11:50:11+01:00",
"FilePermissions": 100664,
"FileType": "HEIC",
"FileTypeExtension": "HEIC",
"MIMEType": "image/heic",
"MajorBrand": "heic",
"MinorVersion": "0.0.0",
"CompatibleBrands": ["mif1","MiHE","MiPr","miaf","MiHB","heic"],
"HandlerType": "pict",
"PrimaryItemReference": 49,
"MetaImageSize": "0 1287 4032 3024",
"XMPToolkit": "XMP Core 6.0.0",
"HDRGainMapHeadroom": 3.847906,
"HDRGainMapVersion": 131072,
"ExifByteOrder": "MM",
"Make": "Apple",
"Model": "iPhone 15 Pro",
"Orientation": 6,
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Software": 17.1,
"ModifyDate": "2023:10:31 11:44:43",
"HostComputer": "iPhone 15 Pro",
"ExposureTime": 0.01666666667,
"FNumber": 2.2,
"ExposureProgram": 2,
"ISO": 400,
"ExifVersion": "0232",
"DateTimeOriginal": "2023:10:31 11:44:43",
"CreateDate": "2023:10:31 11:44:43",
"OffsetTime": "+01:00",
"OffsetTimeOriginal": "+01:00",
"OffsetTimeDigitized": "+01:00",
"ShutterSpeedValue": 0.0165679999782223,
"ApertureValue": 2.20000000038133,
"BrightnessValue": 2.15000162,
"ExposureCompensation": 0,
"MeteringMode": 5,
"Flash": 16,
"FocalLength": 2.22,
"SubjectArea": "2015 1511 2323 1330",
"RunTimeFlags": 1,
"RunTimeValue": 154455128730208,
"RunTimeScale": 1000000000,
"RunTimeEpoch": 0,
"AccelerationVector": "-0.004213878416 -1.002046108 -0.01470538881",
"Warning": "[minor] Bad format (16) for MakerNotes entry 10",
"SubSecTimeOriginal": 432,
"SubSecTimeDigitized": 432,
"ColorSpace": 65535,
"ExifImageWidth": 4032,
"ExifImageHeight": 3024,
"SensingMethod": 2,
"SceneType": 1,
"ExposureMode": 0,
"WhiteBalance": 0,
"FocalLengthIn35mmFormat": 14,
"LensInfo": "2.22 9 1.779999971 2.8",
"LensMake": "Apple",
"LensModel": "iPhone 15 Pro back triple camera 2.22mm f/2.2",
"CompositeImage": 2,
"GPSLatitudeRef": "N",
"GPSLongitudeRef": "E",
"GPSAltitudeRef": 0,
"GPSTimeStamp": "10:44:43",
"GPSSpeedRef": "K",
"GPSSpeed": 0,
"GPSImgDirectionRef": "T",
"GPSImgDirection": 101.3112946,
"GPSDestBearingRef": "T",
"GPSDestBearing": 101.3112946,
"GPSDateStamp": "2023:10:31",
"GPSHPositioningError": 14.275587,
"ProfileCMMType": "appl",
"ProfileVersion": 1024,
"ProfileClass": "mntr",
"ColorSpaceData": "RGB ",
"ProfileConnectionSpace": "XYZ ",
"ProfileDateTime": "2022:01:01 00:00:00",
"ProfileFileSignature": "acsp",
"PrimaryPlatform": "APPL",
"CMMFlags": 0,
"DeviceManufacturer": "APPL",
"DeviceModel": "",
"DeviceAttributes": "0 0",
"RenderingIntent": 0,
"ConnectionSpaceIlluminant": "0.9642 1 0.82491",
"ProfileCreator": "appl",
"ProfileID": "236 253 163 142 56 133 71 195 109 180 189 79 122 218 24 47",
"ProfileDescription": "Display P3",
"ProfileCopyright": "Copyright Apple Inc., 2022",
"MediaWhitePoint": "0.96419 1 0.82489",
"RedMatrixColumn": "0.51512 0.2412 -0.00105",
"GreenMatrixColumn": "0.29198 0.69225 0.04189",
"BlueMatrixColumn": "0.1571 0.06657 0.78407",
"RedTRC": "(Binary data 32 bytes, use -b option to extract)",
"ChromaticAdaptation": "1.04788 0.02292 -0.0502 0.02959 0.99048 -0.01706 -0.00923 0.01508 0.75168",
"BlueTRC": "(Binary data 32 bytes, use -b option to extract)",
"GreenTRC": "(Binary data 32 bytes, use -b option to extract)",
"HEVCConfigurationVersion": 1,
"GeneralProfileSpace": 0,
"GeneralTierFlag": 0,
"GeneralProfileIDC": 3,
"GenProfileCompatibilityFlags": 1879048192,
"ConstraintIndicatorFlags": "176 0 0 0 0 0",
"GeneralLevelIDC": 90,
"MinSpatialSegmentationIDC": 0,
"ParallelismType": 0,
"ChromaFormat": 1,
"BitDepthLuma": 8,
"BitDepthChroma": 8,
"AverageFrameRate": 0,
"ConstantFrameRate": 0,
"NumTemporalLayers": 1,
"TemporalIDNested": 0,
"ImageWidth": 4032,
"ImageHeight": 3024,
"ImageSpatialExtent": "4032 3024",
"Rotation": 270,
"ImagePixelDepth": 8,
"AuxiliaryImageType": "urn:com:apple:photo:2020:aux:hdrgainmap",
"MediaDataSize": 882139,
"MediaDataOffset": 4686,
"RunTimeSincePowerUp": 154455.128730208,
"Aperture": 2.2,
"ImageSize": "4032 3024",
"Megapixels": 12.192768,
"ScaleFactor35efl": 6.30630630630631,
"ShutterSpeed": 0.01666666667,
"SubSecCreateDate": "2023:10:31 11:44:43.432+01:00",
"SubSecDateTimeOriginal": "2023:10:31 11:44:43.432+01:00",
"SubSecModifyDate": "2023:10:31 11:44:43+01:00",
"GPSAltitude": 50.15664187,
"GPSDateTime": "2023:10:31 10:44:43Z",
"GPSLatitude": 52.4596055555556,
"GPSLongitude": 13.3218416666667,
"CircleOfConfusion": "0.00476447847114884",
"FOV": 104.250120754113,
"FocalLength35efl": 14,
"GPSPosition": "52.4596055555556 13.3218416666667",
"HyperfocalDistance": 0.470184057236731,
"LightValue": 6.18189764281985,
"LensID": "iPhone 15 Pro back triple camera 2.22mm f/2.2"
}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

View file

@ -1,28 +0,0 @@
[{
"SourceFile": "pythagoras.gif",
"ExifToolVersion": 12.40,
"FileName": "pythagoras.gif",
"Directory": ".",
"FileSize": 191371,
"FileModifyDate": "2022:04:13 08:42:33+00:00",
"FileAccessDate": "2022:04:13 10:52:43+00:00",
"FileInodeChangeDate": "2022:04:13 08:42:42+00:00",
"FilePermissions": 100664,
"FileType": "GIF",
"FileTypeExtension": "GIF",
"MIMEType": "image/gif",
"GIFVersion": "89a",
"ImageWidth": 591,
"ImageHeight": 639,
"HasColorMap": 1,
"ColorResolutionDepth": 7,
"BitsPerPixel": 8,
"BackgroundColor": 255,
"AnimationIterations": 0,
"Comment": "Created with GIMP",
"TransparentColor": 255,
"FrameCount": 201,
"Duration": 49.8,
"ImageSize": "591 639",
"Megapixels": 0.377649
}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 MiB

View file

@ -1,82 +0,0 @@
[{
"SourceFile": "/go/src/github.com/photoprism/photoprism/storage/import/samsung-motion-photo.jpg",
"ExifToolVersion": 12.56,
"FileName": "samsung-motion-photo.jpg",
"Directory": "/go/src/github.com/photoprism/photoprism/storage/import",
"FileSize": 7221645,
"FileModifyDate": "2023:07:27 02:03:13+00:00",
"FileAccessDate": "2023:08:13 17:11:04+00:00",
"FileInodeChangeDate": "2023:08:13 17:11:02+00:00",
"FilePermissions": 100644,
"FileType": "JPEG",
"FileTypeExtension": "JPG",
"MIMEType": "image/jpeg",
"ExifByteOrder": "II",
"Make": "samsung",
"Model": "SM-G973F",
"Orientation": 1,
"XResolution": 72,
"YResolution": 72,
"ResolutionUnit": 2,
"Software": "G973FXXU4CTC9",
"ModifyDate": "2020:04:23 18:33:41",
"YCbCrPositioning": 1,
"ExposureTime": 0.0007575757576,
"FNumber": 2.4,
"ExposureProgram": 2,
"ISO": 50,
"ExifVersion": "0220",
"DateTimeOriginal": "2020:04:23 18:33:41",
"CreateDate": "2020:04:23 18:33:41",
"ShutterSpeedValue": 0.999475026346474,
"ApertureValue": 2.39495740923786,
"BrightnessValue": 22.58,
"ExposureCompensation": 0,
"MaxApertureValue": 2.39495740923786,
"MeteringMode": 2,
"Flash": 0,
"FocalLength": 4.32,
"ColorSpace": 1,
"ExifImageWidth": 4032,
"ExifImageHeight": 3024,
"ExposureMode": 0,
"WhiteBalance": 0,
"DigitalZoomRatio": 1,
"FocalLengthIn35mmFormat": 26,
"SceneCaptureType": 0,
"ImageUniqueID": "L12XLLD01VM",
"GPSLatitudeRef": "N",
"GPSLongitudeRef": "W",
"Compression": 6,
"ThumbnailOffset": 888,
"ThumbnailLength": 50555,
"XMPToolkit": "Adobe XMP Core 5.1.0-jc003",
"MicroVideo": 1,
"MicroVideoVersion": 1,
"MicroVideoOffset": 4535831,
"MicroVideoPresentationTimestampUs": -1,
"ImageWidth": 4032,
"ImageHeight": 3024,
"EncodingProcess": 0,
"BitsPerSample": 8,
"ColorComponents": 3,
"YCbCrSubSampling": "2 2",
"TimeStamp": "2020:04:23 17:33:41.809+00:00",
"MCCData": 234,
"EmbeddedVideoType": "MotionPhoto_Data",
"EmbeddedVideoFile": "(Binary data 4535775 bytes, use -b option to extract)",
"Aperture": 2.4,
"ImageSize": "4032 3024",
"Megapixels": 12.192768,
"ScaleFactor35efl": 6.01851851851852,
"ShutterSpeed": 0.0007575757576,
"ThumbnailImage": "(Binary data 50555 bytes, use -b option to extract)",
"GPSLatitude": 51.5049828,
"GPSLongitude": -0.0787347997222222,
"CircleOfConfusion": "0.00499230176602706",
"FOV": 69.3903656740024,
"FocalLength35efl": 26,
"GPSPosition": "51.5049828 -0.0787347997222222",
"HyperfocalDistance": 1.55759815100044,
"LightValue": 13.8923910258672
}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

View file

@ -1,38 +0,0 @@
# Backend Translations
PhotoPrism uses [gettext](https://en.wikipedia.org/wiki/Gettext) for localizing frontend and backend.
It's one of the most widely adopted standards for translating user interfaces.
Human-readable messages like `File not found` are used as ids for finding matching translations,
and used as defaults whenever there is no translation available.
Messages may optionally contain placeholders, like `Found %d files`, for numbers and
other variables.
We strongly recommend [Poedit](https://poedit.net/download) for creating and updating translations.
Download is free for Mac, Windows, and Linux.
It's source code can be obtained on [GitHub](https://github.com/vslavik/poedit).
Only asynchronous notifications and certain API responses need translation to provide a
consistent user experience.
Technical log messages should be in English to avoid ambiguities and (even slightly) wrong translations.
`default.po` files in subdirectories contain localized messages for each
[language](https://www.gnu.org/software/gettext/manual/html_node/Usual-Language-Codes.html) identified
by their [locale](https://www.gnu.org/software/gettext/manual/html_node/Locale-Names.html),
for example `de/default.po` for German and `pt_BR/default.po` for Brazilian Portuguese.
You can open, edit, and save them with Poedit. Please also add and commit binary `*.mo` files,
which will be automatically created by Poedit.
To add a new translation, open `messages.pot`, click on "Create New Translation" at the bottom and select
the language. Now you can start translating.
When done, create a new directory (using the locale as name) and save your translation there as `default.po`.
The POT file `/assets/locales/messages.pot` will be automatically updated when
running `go generate` in `/internal/i18n` or `make generate` in the main project directory.
Note that this will only work when you have gettext installed on your system.
We recommend using our latest development image as described in the Developer Guide.
Apply changes to existing translations by clicking on "Catalogue" > "Update from POT File..."
in the Poedit app menu.

View file

@ -1,377 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-09 12:51+0000\n"
"PO-Revision-Date: 2023-02-09 13:13+0000\n"
"Last-Translator: Anonymous <noreply@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 4.15.2\n"
#: messages.go:94
msgid "Something went wrong, try again"
msgstr "Iets het verkeerd geloop, probeer weer"
#: messages.go:95
msgid "Unable to do that"
msgstr "Kan dit nie doen nie"
#: messages.go:96
msgid "Changes could not be saved"
msgstr "Veranderinge kon nie gestoor word nie"
#: messages.go:97
msgid "Could not be deleted"
msgstr "Kan nie verwyder word nie"
#: messages.go:98
#, c-format
msgid "%s already exists"
msgstr "%s bestaan reeds"
#: messages.go:99
msgid "Not found"
msgstr "Nie gevind"
#: messages.go:100
msgid "File not found"
msgstr "Lêer nie gevind nie"
#: messages.go:101
msgid "File too large"
msgstr "Lêer te groot"
#: messages.go:102
msgid "Unsupported format"
msgstr "Ongesteunde formaat"
#: messages.go:103
msgid "Originals folder is empty"
msgstr "Oorspronklike omslag is leeg"
#: messages.go:104
msgid "Selection not found"
msgstr "Seleksie nie gevind nie"
#: messages.go:105
msgid "Entity not found"
msgstr "Entiteit nie gevind nie"
#: messages.go:106
msgid "Account not found"
msgstr "Rekening nie gevind nie"
#: messages.go:107
msgid "User not found"
msgstr "Verbruiker nie gevind nie"
#: messages.go:108
msgid "Label not found"
msgstr "Merker nie gevind nie"
#: messages.go:109
msgid "Album not found"
msgstr "Album nie gevind nie"
#: messages.go:110
msgid "Subject not found"
msgstr "Onderwerp nie gevind nie"
#: messages.go:111
msgid "Person not found"
msgstr "Persoon nie gevind nie"
#: messages.go:112
msgid "Face not found"
msgstr "Gesig nie gevind nie"
#: messages.go:113
msgid "Not available in public mode"
msgstr "Nie beskikbaar in publieke modus nie"
#: messages.go:114
msgid "Not available in read-only mode"
msgstr "Nie beskikbaar in leesalleen modus nie"
#: messages.go:115
msgid "Please log in to your account"
msgstr "Teken asseblief in op jou rekening"
#: messages.go:116
msgid "Permission denied"
msgstr "Toegang geweier"
#: messages.go:117
msgid "Upload might be offensive"
msgstr "Oplegging mag aanstoot gee"
#: messages.go:118
msgid "Upload failed"
msgstr "Oplegging misluk"
#: messages.go:119
msgid "No items selected"
msgstr "Geen items gekies nie"
#: messages.go:120
msgid "Failed creating file, please check permissions"
msgstr "Kon nie lêer skep nie. Gaan asseblief toestemmings na"
#: messages.go:121
msgid "Failed creating folder, please check permissions"
msgstr "Kon nie vouer skep nie. Gaan asseblief toestemmings na"
#: messages.go:122
msgid "Could not connect, please try again"
msgstr "Kon nie konnekteer nie, probeer asseblief weer"
#: messages.go:123
msgid "Invalid password, please try again"
msgstr "Ongeldige wagwoord, probeer asseblief weer"
#: messages.go:124
msgid "Feature disabled"
msgstr "Eienskap gedeaktiveer"
#: messages.go:125
msgid "No labels selected"
msgstr "Geen merker geselekteer"
#: messages.go:126
msgid "No albums selected"
msgstr "Geen albums geselekteer nie"
#: messages.go:127
msgid "No files available for download"
msgstr "Geen lêers beskikbaar vir aflaai nie"
#: messages.go:128
msgid "Failed to create zip file"
msgstr "Kon nie zip-lêer skep nie"
#: messages.go:129
msgid "Invalid credentials"
msgstr "Ongeldige magtiging"
#: messages.go:130
msgid "Invalid link"
msgstr "Ongeldige skakel"
#: messages.go:131
msgid "Invalid name"
msgstr "Ongeldige naam"
#: messages.go:132
msgid "Busy, please try again later"
msgstr "Besig, probeer asseblief later weer"
#: messages.go:133
#, 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:134
msgid "Your account could not be connected"
msgstr "Jou rekening kon nie gekoppel word nie"
#: messages.go:137
msgid "Changes successfully saved"
msgstr "Veranderinge suksesvol gestoor"
#: messages.go:138
msgid "Album created"
msgstr "Album geskep"
#: messages.go:139
msgid "Album saved"
msgstr "Album gestoor"
#: messages.go:140
#, c-format
msgid "Album %s deleted"
msgstr "Album %s uitgevee"
#: messages.go:141
msgid "Album contents cloned"
msgstr "Albuminhoud gekloon"
#: messages.go:142
msgid "File removed from stack"
msgstr "Lêer verwyder uit stapel"
#: messages.go:143
msgid "File deleted"
msgstr "Lêer uitgevee"
#: messages.go:144
#, c-format
msgid "Selection added to %s"
msgstr "Seleksie bygevoeg na %s"
#: messages.go:145
#, c-format
msgid "One entry added to %s"
msgstr "Een inskrywing bygevoeg na %s"
#: messages.go:146
#, c-format
msgid "%d entries added to %s"
msgstr "%d inskrywings by %s gevoeg"
#: messages.go:147
#, c-format
msgid "One entry removed from %s"
msgstr "Een inskrywing verwyder uit %s"
#: messages.go:148
#, c-format
msgid "%d entries removed from %s"
msgstr "%d inskrywings verwyder uit %s"
#: messages.go:149
msgid "Account created"
msgstr "Rekening geskep"
#: messages.go:150
msgid "Account saved"
msgstr "Rekening gestoor"
#: messages.go:151
msgid "Account deleted"
msgstr "Rekening uitgevee"
#: messages.go:152
msgid "Settings saved"
msgstr "Stellings gestoor"
#: messages.go:153
msgid "Password changed"
msgstr "Wagwoord verander"
#: messages.go:154
#, c-format
msgid "Import completed in %d s"
msgstr "Invoer voltooi in %d s"
#: messages.go:155
msgid "Import canceled"
msgstr "Invoer gekanselleer"
#: messages.go:156
#, c-format
msgid "Indexing completed in %d s"
msgstr "inhoudsopgawe voltooi in %d s"
#: messages.go:157
msgid "Indexing originals..."
msgstr "Indekseer van oorspronklikes …"
#: messages.go:158
#, c-format
msgid "Indexing files in %s"
msgstr "Indekseer lêers in %s"
#: messages.go:159
msgid "Indexing canceled"
msgstr "Indeksering gekanselleer"
#: messages.go:160
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d lêers en %d foto's verwyder"
#: messages.go:161
#, c-format
msgid "Moving files from %s"
msgstr "Skuif lêers van %s af"
#: messages.go:162
#, c-format
msgid "Copying files from %s"
msgstr "Kopieer lêers van %s"
#: messages.go:163
msgid "Labels deleted"
msgstr "Merkers uitgevee"
#: messages.go:164
msgid "Label saved"
msgstr "Merkers gestoor"
#: messages.go:165
msgid "Subject saved"
msgstr "Onderwerp gestoor"
#: messages.go:166
msgid "Subject deleted"
msgstr "Onderwerp uitgevee"
#: messages.go:167
msgid "Person saved"
msgstr "Persoon gestoor"
#: messages.go:168
msgid "Person deleted"
msgstr "Persoon uitgevee"
#: messages.go:169
msgid "File uploaded"
msgstr "Lêer opgelaai"
#: messages.go:170
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d lêers opgelaai in %d s"
#: messages.go:171
msgid "Processing upload..."
msgstr "Verwerk oplegging..."
#: messages.go:172
msgid "Upload has been processed"
msgstr "Oplegging geprosesseer"
#: messages.go:173
msgid "Selection approved"
msgstr "Seleksie goedgekeur"
#: messages.go:174
msgid "Selection archived"
msgstr "Seleksie geargiveer"
#: messages.go:175
msgid "Selection restored"
msgstr "Seleksie herstel"
#: messages.go:176
msgid "Selection marked as private"
msgstr "Seleksie gemerk as privaat"
#: messages.go:177
msgid "Albums deleted"
msgstr "Albums uitgevee"
#: messages.go:178
#, c-format
msgid "Zip created in %d s"
msgstr "Zip geskep in %d s"
#: messages.go:179
msgid "Permanently deleted"
msgstr "Permanent uitgevee"
#: messages.go:180
#, c-format
msgid "%s has been restored"
msgstr "%s geherstel"
#~ msgid "Invalid request"
#~ msgstr "Ongeldige versoek"
#~ msgid "Unexpected error, please try again"
#~ msgstr "Onverwagte fout, probeer asseblief weer"

View file

@ -1,378 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-09 12:51+0000\n"
"PO-Revision-Date: 2023-02-09 13:13+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: none\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"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 4.15.2\n"
#: messages.go:94
msgid "Something went wrong, try again"
msgstr "حدث خطأ ما حاول مرة أخرى"
#: messages.go:95
msgid "Unable to do that"
msgstr "غير قادر على فعل ذلك"
#: messages.go:96
msgid "Changes could not be saved"
msgstr "لا يمكن حفظ التغييرات"
#: messages.go:97
msgid "Could not be deleted"
msgstr "لا يمكن حذفه"
#: messages.go:98
#, c-format
msgid "%s already exists"
msgstr "%s موجود بالفعل"
#: messages.go:99
msgid "Not found"
msgstr "لم يتم العثور على"
#: messages.go:100
msgid "File not found"
msgstr "لم يتم العثور على الملف"
#: messages.go:101
msgid "File too large"
msgstr "الملف كبير جدًا"
#: messages.go:102
msgid "Unsupported format"
msgstr "صيغة غير مدعومة"
#: messages.go:103
msgid "Originals folder is empty"
msgstr "مجلد النسخ الأصلية فارغ"
#: messages.go:104
msgid "Selection not found"
msgstr "الاختيار غير موجود"
#: messages.go:105
msgid "Entity not found"
msgstr "الكيان غير موجود"
#: messages.go:106
msgid "Account not found"
msgstr "الحساب غير موجود"
#: messages.go:107
msgid "User not found"
msgstr "المستخدم غير موجود"
#: messages.go:108
msgid "Label not found"
msgstr "التصنيف غير موجود"
#: messages.go:109
msgid "Album not found"
msgstr "الألبوم غير موجود"
#: messages.go:110
msgid "Subject not found"
msgstr "الموضوع غير موجود"
#: messages.go:111
msgid "Person not found"
msgstr "لم يتم العثور على الشخص"
#: messages.go:112
msgid "Face not found"
msgstr "الوجه غير موجود"
#: messages.go:113
msgid "Not available in public mode"
msgstr "غير متاح في الوضع العام"
#: messages.go:114
msgid "Not available in read-only mode"
msgstr "غير متوفر في وضع القراءة فقط"
#: messages.go:115
msgid "Please log in to your account"
msgstr "يرجى تسجيل الدخول إلى حسابك"
#: messages.go:116
msgid "Permission denied"
msgstr "طلب الاذن مرفوض"
#: messages.go:117
msgid "Upload might be offensive"
msgstr "تحميل قد يكون مسيئا"
#: messages.go:118
msgid "Upload failed"
msgstr "التحميل فشل"
#: messages.go:119
msgid "No items selected"
msgstr "لم يتم تحديد الاختيار"
#: messages.go:120
msgid "Failed creating file, please check permissions"
msgstr "فشل إنشاء الملف ، يرجى التحقق من الأذونات"
#: messages.go:121
msgid "Failed creating folder, please check permissions"
msgstr "فشل إنشاء المجلد ، يرجى التحقق من الأذونات"
#: messages.go:122
msgid "Could not connect, please try again"
msgstr "تعذر الاتصال ، يرجى المحاولة مرة أخرى"
#: messages.go:123
msgid "Invalid password, please try again"
msgstr "كلمة السر غير مطابقة، برجاء حاول مرة أخرى"
#: messages.go:124
msgid "Feature disabled"
msgstr "الخاصية معطلة"
#: messages.go:125
msgid "No labels selected"
msgstr "لم يتم تحديد تسميات"
#: messages.go:126
msgid "No albums selected"
msgstr "لم يتم تحديد ألبومات"
#: messages.go:127
msgid "No files available for download"
msgstr "لا توجد ملفات متاحة للتنزيل"
#: messages.go:128
msgid "Failed to create zip file"
msgstr "فشل إنشاء ملف مضغوط"
#: messages.go:129
msgid "Invalid credentials"
msgstr "بيانات الاعتماد غير صالحة"
#: messages.go:130
msgid "Invalid link"
msgstr "ارتباط غير صالح"
#: messages.go:131
msgid "Invalid name"
msgstr "اسم غير صحيح"
#: messages.go:132
msgid "Busy, please try again later"
msgstr "مشغول ، يرجى المحاولة مرة أخرى في وقت لاحق"
#: messages.go:133
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "فترة التنبيه هي %s ، لكن يجب أن تكون ساعة واحدة أو أقل"
#: messages.go:134
msgid "Your account could not be connected"
msgstr "لا يمكن ربط حسابك"
#: messages.go:137
msgid "Changes successfully saved"
msgstr "تم حفظ التغييرات بنجاح"
#: messages.go:138
msgid "Album created"
msgstr "تم إنشاء الألبوم"
#: messages.go:139
msgid "Album saved"
msgstr "تم حفظ الألبوم"
#: messages.go:140
#, c-format
msgid "Album %s deleted"
msgstr "تم حذف الألبوم %s"
#: messages.go:141
msgid "Album contents cloned"
msgstr "تم نسخ محتويات الألبوم"
#: messages.go:142
msgid "File removed from stack"
msgstr "تمت إزالة الملف من المكدس"
#: messages.go:143
msgid "File deleted"
msgstr "تم حذف الملف"
#: messages.go:144
#, c-format
msgid "Selection added to %s"
msgstr "تمت إضافة التحديد إلى %s"
#: messages.go:145
#, c-format
msgid "One entry added to %s"
msgstr "تمت إضافة إدخال واحد إلى %s"
#: messages.go:146
#, c-format
msgid "%d entries added to %s"
msgstr "تمت إضافة %d مدخلات إلى %s"
#: messages.go:147
#, c-format
msgid "One entry removed from %s"
msgstr "تمت إزالة إدخال واحد من %s"
#: messages.go:148
#, c-format
msgid "%d entries removed from %s"
msgstr "تمت إزالة %d مدخلات من %s"
#: messages.go:149
msgid "Account created"
msgstr "تم إنشاء الحساب"
#: messages.go:150
msgid "Account saved"
msgstr "تم حفظ الحساب"
#: messages.go:151
msgid "Account deleted"
msgstr "تم حذف الحساب"
#: messages.go:152
msgid "Settings saved"
msgstr "تم حفظ الإعدادات"
#: messages.go:153
msgid "Password changed"
msgstr "تم تغيير كلمة السر"
#: messages.go:154
#, c-format
msgid "Import completed in %d s"
msgstr "اكتمل الاستيراد في %d ثانية"
#: messages.go:155
msgid "Import canceled"
msgstr "تم إلغاء الاستيراد"
#: messages.go:156
#, c-format
msgid "Indexing completed in %d s"
msgstr "اكتملت الفهرسة في %d ثانية"
#: messages.go:157
msgid "Indexing originals..."
msgstr "تتم فهرسة الصور الأصلية ..."
#: messages.go:158
#, c-format
msgid "Indexing files in %s"
msgstr "فهرسة الملفات في %s"
#: messages.go:159
msgid "Indexing canceled"
msgstr "تم إلغاء الفهرسة"
#: messages.go:160
#, c-format
msgid "Removed %d files and %d photos"
msgstr "تمت إزالة %d ملفات و %d صورة"
#: messages.go:161
#, c-format
msgid "Moving files from %s"
msgstr "نقل الملفات من %s"
#: messages.go:162
#, c-format
msgid "Copying files from %s"
msgstr "نسخ ملفات من %s"
#: messages.go:163
msgid "Labels deleted"
msgstr "تم حذف التصنيفات"
#: messages.go:164
msgid "Label saved"
msgstr "تم حفظ التصنيف"
#: messages.go:165
msgid "Subject saved"
msgstr "تم حفظ الموضوع"
#: messages.go:166
msgid "Subject deleted"
msgstr "تم حذف الموضوع"
#: messages.go:167
msgid "Person saved"
msgstr "حفظ الشخص"
#: messages.go:168
msgid "Person deleted"
msgstr "تم حذف الشخص"
#: messages.go:169
msgid "File uploaded"
msgstr "تم تحميل الملف"
#: messages.go:170
#, c-format
msgid "%d files uploaded in %d s"
msgstr "تم تحميل %d ملف في %d ثانية"
#: messages.go:171
msgid "Processing upload..."
msgstr "جارٍ معالجة التحميل ..."
#: messages.go:172
msgid "Upload has been processed"
msgstr "تمت معالجة التحميل"
#: messages.go:173
msgid "Selection approved"
msgstr "تمت الموافقة على الاختيار"
#: messages.go:174
msgid "Selection archived"
msgstr "تمت أرشفة الاختيار"
#: messages.go:175
msgid "Selection restored"
msgstr "تمت استعادة التحديد"
#: messages.go:176
msgid "Selection marked as private"
msgstr "تم تحديد الاختيار على أنه خاص"
#: messages.go:177
msgid "Albums deleted"
msgstr "تم حذف الألبومات"
#: messages.go:178
#, c-format
msgid "Zip created in %d s"
msgstr "إنشاء الملف المضغوط خلال %d ثوانٍ"
#: messages.go:179
msgid "Permanently deleted"
msgstr "تم الحذف بشكل نهائي"
#: messages.go:180
#, c-format
msgid "%s has been restored"
msgstr "تمت استعادة %s"
#~ msgid "Invalid request"
#~ msgstr "طلب غير صالح"
#~ msgid "Unexpected error, please try again"
#~ msgstr "خطأ غير متوقع ، يرجى المحاولة مرة أخرى"

View file

@ -1,372 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-09 12:51+0000\n"
"PO-Revision-Date: 2023-02-26 21:43+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: none\n"
"Language: be\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"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 4.15.2\n"
#: messages.go:94
msgid "Something went wrong, try again"
msgstr "Нешта пайшло не так, паўтарыце спробу"
#: messages.go:95
msgid "Unable to do that"
msgstr "Немагчыма зрабіць гэта"
#: messages.go:96
msgid "Changes could not be saved"
msgstr "Не ўдалося захаваць змены"
#: messages.go:97
msgid "Could not be deleted"
msgstr "Немагчыма выдаліць"
#: messages.go:98
#, c-format
msgid "%s already exists"
msgstr "%s ужо існуе"
#: messages.go:99
msgid "Not found"
msgstr "Не знойдзена"
#: messages.go:100
msgid "File not found"
msgstr "Файл не знойдзены"
#: messages.go:101
msgid "File too large"
msgstr "Файл занадта вялікі"
#: messages.go:102
msgid "Unsupported format"
msgstr "Фармат не падтрымліваецца"
#: messages.go:103
msgid "Originals folder is empty"
msgstr "Тэчка арыгіналаў пустая"
#: messages.go:104
msgid "Selection not found"
msgstr "Выбар не знойдзены"
#: messages.go:105
msgid "Entity not found"
msgstr "Аб'ект не знойдзены"
#: messages.go:106
msgid "Account not found"
msgstr "Уліковы запіс не знойдзены"
#: messages.go:107
msgid "User not found"
msgstr "Карыстальнік не знойдзены"
#: messages.go:108
msgid "Label not found"
msgstr "Цэтлік не знойдзены"
#: messages.go:109
msgid "Album not found"
msgstr "Альбом не знойдзены"
#: messages.go:110
msgid "Subject not found"
msgstr "Тэма не знойдзена"
#: messages.go:111
msgid "Person not found"
msgstr "Чалавек не знойдзены"
#: messages.go:112
msgid "Face not found"
msgstr "Твар не знойдзены"
#: messages.go:113
msgid "Not available in public mode"
msgstr "Недаступна ў публічным рэжыме"
#: messages.go:114
msgid "Not available in read-only mode"
msgstr "Недаступна ў рэжыме толькі для чытання"
#: messages.go:115
msgid "Please log in to your account"
msgstr "Калі ласка, увайдзіце ў свой уліковы запіс"
#: messages.go:116
msgid "Permission denied"
msgstr "У доступе адмоўлена"
#: messages.go:117
msgid "Upload might be offensive"
msgstr "Запампоўка можа быць абразлівай"
#: messages.go:118
msgid "Upload failed"
msgstr "Памылка загрузкі"
#: messages.go:119
msgid "No items selected"
msgstr "Элементы не выбраны"
#: messages.go:120
msgid "Failed creating file, please check permissions"
msgstr "Не ўдалося стварыць файл, праверце дазволы"
#: messages.go:121
msgid "Failed creating folder, please check permissions"
msgstr "Не атрымалася стварыць папку, праверце дазволы"
#: messages.go:122
msgid "Could not connect, please try again"
msgstr "Немагчыма падключыцца, паспрабуйце яшчэ раз"
#: messages.go:123
msgid "Invalid password, please try again"
msgstr "Няправільны пароль, паспрабуйце яшчэ раз"
#: messages.go:124
msgid "Feature disabled"
msgstr "Функцыя адключана"
#: messages.go:125
msgid "No labels selected"
msgstr "Меткі не выбраны"
#: messages.go:126
msgid "No albums selected"
msgstr "Альбомы не выбраны"
#: messages.go:127
msgid "No files available for download"
msgstr "Няма даступных файлаў для спампоўкі"
#: messages.go:128
msgid "Failed to create zip file"
msgstr "Не ўдалося стварыць zip-файл"
#: messages.go:129
msgid "Invalid credentials"
msgstr "Няправільныя ўліковыя даныя"
#: messages.go:130
msgid "Invalid link"
msgstr "Няправільная спасылка"
#: messages.go:131
msgid "Invalid name"
msgstr "Няправільнае імя"
#: messages.go:132
msgid "Busy, please try again later"
msgstr "Заняты, паўтарыце спробу пазней"
#: messages.go:133
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Інтэрвал абуджэння складае %s, але павінен быць не больш за 1 гадзіну"
#: messages.go:134
msgid "Your account could not be connected"
msgstr "Ваш уліковы запіс не можа быць падключаны"
#: messages.go:137
msgid "Changes successfully saved"
msgstr "Змены паспяхова захаваны"
#: messages.go:138
msgid "Album created"
msgstr "Альбом створаны"
#: messages.go:139
msgid "Album saved"
msgstr "Альбом захаваны"
#: messages.go:140
#, c-format
msgid "Album %s deleted"
msgstr "Альбом %s выдалены"
#: messages.go:141
msgid "Album contents cloned"
msgstr "Змест альбома кланаваны"
#: messages.go:142
msgid "File removed from stack"
msgstr "Файл выдалены са стэка"
#: messages.go:143
msgid "File deleted"
msgstr "Файл выдалены"
#: messages.go:144
#, c-format
msgid "Selection added to %s"
msgstr "Выбар дададзены ў %s"
#: messages.go:145
#, c-format
msgid "One entry added to %s"
msgstr "Адзін запіс дададзены ў %s"
#: messages.go:146
#, c-format
msgid "%d entries added to %s"
msgstr "%d запісы дададзены ў %s"
#: messages.go:147
#, c-format
msgid "One entry removed from %s"
msgstr "Адзін запіс выдалены з %s"
#: messages.go:148
#, c-format
msgid "%d entries removed from %s"
msgstr "Запісы %d выдалены з %s"
#: messages.go:149
msgid "Account created"
msgstr "Уліковы запіс створаны"
#: messages.go:150
msgid "Account saved"
msgstr "Уліковы запіс захаваны"
#: messages.go:151
msgid "Account deleted"
msgstr "Уліковы запіс выдалены"
#: messages.go:152
msgid "Settings saved"
msgstr "Налады захаваны"
#: messages.go:153
msgid "Password changed"
msgstr "Пароль зменены"
#: messages.go:154
#, c-format
msgid "Import completed in %d s"
msgstr "Імпарт завершаны праз %d с"
#: messages.go:155
msgid "Import canceled"
msgstr "Імпарт адменены"
#: messages.go:156
#, c-format
msgid "Indexing completed in %d s"
msgstr "Індэксацыя завершана ў %d с"
#: messages.go:157
msgid "Indexing originals..."
msgstr "Індэксаванне арыгіналаў..."
#: messages.go:158
#, c-format
msgid "Indexing files in %s"
msgstr "Індэксацыя файлаў у %s"
#: messages.go:159
msgid "Indexing canceled"
msgstr "Індэксацыя адменена"
#: messages.go:160
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Выдалены файлы %d і фатаграфіі %d."
#: messages.go:161
#, c-format
msgid "Moving files from %s"
msgstr "Перамяшчэнне файлаў з %s"
#: messages.go:162
#, c-format
msgid "Copying files from %s"
msgstr "Капіраванне файлаў з %s"
#: messages.go:163
msgid "Labels deleted"
msgstr "Цэтлікі выдалены"
#: messages.go:164
msgid "Label saved"
msgstr "Цэтлік захаваны"
#: messages.go:165
msgid "Subject saved"
msgstr "Тэма захавана"
#: messages.go:166
msgid "Subject deleted"
msgstr "Тэма выдалена"
#: messages.go:167
msgid "Person saved"
msgstr "Чалавек выратаваны"
#: messages.go:168
msgid "Person deleted"
msgstr "Асоба выдалена"
#: messages.go:169
msgid "File uploaded"
msgstr "Файл запампаваны"
#: messages.go:170
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d файлы, загружаныя ў %d с"
#: messages.go:171
msgid "Processing upload..."
msgstr "Апрацоўка запампоўкі..."
#: messages.go:172
msgid "Upload has been processed"
msgstr "Загрузка апрацавана"
#: messages.go:173
msgid "Selection approved"
msgstr "Выбар ухвалены"
#: messages.go:174
msgid "Selection archived"
msgstr "Выбранае заархівавана"
#: messages.go:175
msgid "Selection restored"
msgstr "Выбар адноўлены"
#: messages.go:176
msgid "Selection marked as private"
msgstr "Выбар пазначаны як прыватны"
#: messages.go:177
msgid "Albums deleted"
msgstr "Альбомы выдалены"
#: messages.go:178
#, c-format
msgid "Zip created in %d s"
msgstr "Zip створаны ў %d с"
#: messages.go:179
msgid "Permanently deleted"
msgstr "Выдалены назаўсёды"
#: messages.go:180
#, c-format
msgid "%s has been restored"
msgstr "%s быў адноўлены"

View file

@ -1,377 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-09 12:51+0000\n"
"PO-Revision-Date: 2023-02-09 13:13+0000\n"
"Last-Translator: Anonymous <noreply@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 4.15.2\n"
#: messages.go:94
msgid "Something went wrong, try again"
msgstr "Нещо се е объркало, опитайте отново"
#: messages.go:95
msgid "Unable to do that"
msgstr "Не можете да го направите"
#: messages.go:96
msgid "Changes could not be saved"
msgstr "Промените не могат да бъдат запазени"
#: messages.go:97
msgid "Could not be deleted"
msgstr "Не може да бъде изтрит"
#: messages.go:98
#, c-format
msgid "%s already exists"
msgstr "%s вече съществува"
#: messages.go:99
msgid "Not found"
msgstr "Не е намерен"
#: messages.go:100
msgid "File not found"
msgstr "Файлът не е намерен"
#: messages.go:101
msgid "File too large"
msgstr "Твърде голям файл"
#: messages.go:102
msgid "Unsupported format"
msgstr "Неподдържан формат"
#: messages.go:103
msgid "Originals folder is empty"
msgstr "Папката с оригинали е празна"
#: messages.go:104
msgid "Selection not found"
msgstr "Изборът не е намерен"
#: messages.go:105
msgid "Entity not found"
msgstr "Субектът не е намерен"
#: messages.go:106
msgid "Account not found"
msgstr "Акаунтът не е намерен"
#: messages.go:107
msgid "User not found"
msgstr "Потребителят не е намерен"
#: messages.go:108
msgid "Label not found"
msgstr "Етикетът не е намерен"
#: messages.go:109
msgid "Album not found"
msgstr "Албумът не е намерен"
#: messages.go:110
msgid "Subject not found"
msgstr "Темата не е намерена"
#: messages.go:111
msgid "Person not found"
msgstr "Лицето не е намерено"
#: messages.go:112
msgid "Face not found"
msgstr "Лицето не е намерено"
#: messages.go:113
msgid "Not available in public mode"
msgstr "Не е наличен в публичен режим"
#: messages.go:114
msgid "Not available in read-only mode"
msgstr "Не е наличен в режим само за четене"
#: messages.go:115
msgid "Please log in to your account"
msgstr "Моля, влезте в профила си"
#: messages.go:116
msgid "Permission denied"
msgstr "Достъп отказан"
#: messages.go:117
msgid "Upload might be offensive"
msgstr "Качването може да е обидно"
#: messages.go:118
msgid "Upload failed"
msgstr "Файловете не успяха да се качат"
#: messages.go:119
msgid "No items selected"
msgstr "Няма избрани елементи"
#: messages.go:120
msgid "Failed creating file, please check permissions"
msgstr "Неуспешно създаване на файл, моля, проверете разрешенията"
#: messages.go:121
msgid "Failed creating folder, please check permissions"
msgstr "Неуспешно създаване на папка, моля, проверете разрешенията"
#: messages.go:122
msgid "Could not connect, please try again"
msgstr "Не може да се свърже, опитайте отново"
#: messages.go:123
msgid "Invalid password, please try again"
msgstr "Невалидна парола, моля, опитайте отново"
#: messages.go:124
msgid "Feature disabled"
msgstr "Функцията е деактивирана"
#: messages.go:125
msgid "No labels selected"
msgstr "Няма избрани етикети"
#: messages.go:126
msgid "No albums selected"
msgstr "Няма избрани албуми"
#: messages.go:127
msgid "No files available for download"
msgstr "Няма налични файлове за изтегляне"
#: messages.go:128
msgid "Failed to create zip file"
msgstr "Неуспешно създаване на zip файл"
#: messages.go:129
msgid "Invalid credentials"
msgstr "Невалидни креденции"
#: messages.go:130
msgid "Invalid link"
msgstr "Невалидна връзка"
#: messages.go:131
msgid "Invalid name"
msgstr "Невалидно име"
#: messages.go:132
msgid "Busy, please try again later"
msgstr "Заето, моля, опитайте отново по-късно"
#: messages.go:133
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Интервалът на събуждане е %s, но трябва да е 1 час или по-малко"
#: messages.go:134
msgid "Your account could not be connected"
msgstr "Вашият акаунт не може да бъде свързан"
#: messages.go:137
msgid "Changes successfully saved"
msgstr "Промените са успешно записани"
#: messages.go:138
msgid "Album created"
msgstr "Създаден албум"
#: messages.go:139
msgid "Album saved"
msgstr "Запазен албум"
#: messages.go:140
#, c-format
msgid "Album %s deleted"
msgstr "Албум %s изтрит"
#: messages.go:141
msgid "Album contents cloned"
msgstr "Съдържанието на албума беше клонирано"
#: messages.go:142
msgid "File removed from stack"
msgstr "Премахване на файла от стека"
#: messages.go:143
msgid "File deleted"
msgstr "Изтрит файл"
#: messages.go:144
#, c-format
msgid "Selection added to %s"
msgstr "Добавяне на селекция към %s"
#: messages.go:145
#, c-format
msgid "One entry added to %s"
msgstr "Добавяне на един запис към %s"
#: messages.go:146
#, c-format
msgid "%d entries added to %s"
msgstr "%d добавени записи към %s"
#: messages.go:147
#, c-format
msgid "One entry removed from %s"
msgstr "Отстранен е един запис от %s"
#: messages.go:148
#, c-format
msgid "%d entries removed from %s"
msgstr "%d премахнати записи от %s"
#: messages.go:149
msgid "Account created"
msgstr "Създаден акаунт"
#: messages.go:150
msgid "Account saved"
msgstr "Акаунтът запазен"
#: messages.go:151
msgid "Account deleted"
msgstr "Изтрит акаунт"
#: messages.go:152
msgid "Settings saved"
msgstr "Запазени настройки"
#: messages.go:153
msgid "Password changed"
msgstr "Паролата е променена"
#: messages.go:154
#, c-format
msgid "Import completed in %d s"
msgstr "Импортът е завършен за %d s"
#: messages.go:155
msgid "Import canceled"
msgstr "Вносът е отменен"
#: messages.go:156
#, c-format
msgid "Indexing completed in %d s"
msgstr "Индексирането е завършено за %d сек"
#: messages.go:157
msgid "Indexing originals..."
msgstr "Индексиране на оригинали..."
#: messages.go:158
#, c-format
msgid "Indexing files in %s"
msgstr "Индексиране на файлове в %s"
#: messages.go:159
msgid "Indexing canceled"
msgstr "Отменено индексиране"
#: messages.go:160
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Премахнати са %d файлове и %d снимки"
#: messages.go:161
#, c-format
msgid "Moving files from %s"
msgstr "Преместване на файлове от %s"
#: messages.go:162
#, c-format
msgid "Copying files from %s"
msgstr "Копиране на файлове от %s"
#: messages.go:163
msgid "Labels deleted"
msgstr "Изтрити етикети"
#: messages.go:164
msgid "Label saved"
msgstr "Запазен етикет"
#: messages.go:165
msgid "Subject saved"
msgstr "Тема: запазени"
#: messages.go:166
msgid "Subject deleted"
msgstr "Изтрит предмет"
#: messages.go:167
msgid "Person saved"
msgstr "Запазено лице"
#: messages.go:168
msgid "Person deleted"
msgstr "Изтрито лице"
#: messages.go:169
msgid "File uploaded"
msgstr "Качен файл"
#: messages.go:170
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d файлове, качени за %d сек"
#: messages.go:171
msgid "Processing upload..."
msgstr "Обработка на качването..."
#: messages.go:172
msgid "Upload has been processed"
msgstr "Качването е обработено"
#: messages.go:173
msgid "Selection approved"
msgstr "Одобрена селекция"
#: messages.go:174
msgid "Selection archived"
msgstr "Архивирана селекция"
#: messages.go:175
msgid "Selection restored"
msgstr "Възстановена селекция"
#: messages.go:176
msgid "Selection marked as private"
msgstr "Селекция, отбелязана като частна"
#: messages.go:177
msgid "Albums deleted"
msgstr "Изтрити албуми"
#: messages.go:178
#, c-format
msgid "Zip created in %d s"
msgstr "Zip създаден за %d s"
#: messages.go:179
msgid "Permanently deleted"
msgstr "Постоянно изтрити"
#: messages.go:180
#, c-format
msgid "%s has been restored"
msgstr "%s е възстановена"
#~ msgid "Invalid request"
#~ msgstr "Невалидна заявка"
#~ msgid "Unexpected error, please try again"
#~ msgstr "Неочаквана грешка, моля, опитайте отново"

View file

@ -1,377 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-09 12:51+0000\n"
"PO-Revision-Date: 2023-02-09 13:13+0000\n"
"Last-Translator: Anonymous <noreply@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 4.15.2\n"
#: messages.go:94
msgid "Something went wrong, try again"
msgstr "S'ha produït un error, torna-ho a provar"
#: messages.go:95
msgid "Unable to do that"
msgstr "Incapaç de fer-ho"
#: messages.go:96
msgid "Changes could not be saved"
msgstr "No s'han pogut desar els canvis"
#: messages.go:97
msgid "Could not be deleted"
msgstr "No s'ha pogut suprimir"
#: messages.go:98
#, c-format
msgid "%s already exists"
msgstr "%s El nom ja existeix"
#: messages.go:99
msgid "Not found"
msgstr "No trobat"
#: messages.go:100
msgid "File not found"
msgstr "No s'ha trobat el fitxer"
#: messages.go:101
msgid "File too large"
msgstr "Fitxer massa gran"
#: messages.go:102
msgid "Unsupported format"
msgstr "Format no compatible"
#: messages.go:103
msgid "Originals folder is empty"
msgstr "La carpeta d'originals està buida"
#: messages.go:104
msgid "Selection not found"
msgstr "No s'ha trobat la selecció"
#: messages.go:105
msgid "Entity not found"
msgstr "No s'ha trobat l'entitat"
#: messages.go:106
msgid "Account not found"
msgstr "Compte no trobat"
#: messages.go:107
msgid "User not found"
msgstr "Usuari no trobat"
#: messages.go:108
msgid "Label not found"
msgstr "No s'ha trobat l'etiqueta"
#: messages.go:109
msgid "Album not found"
msgstr "No s'ha trobat l'àlbum"
#: messages.go:110
msgid "Subject not found"
msgstr "No s'ha trobat el tema"
#: messages.go:111
msgid "Person not found"
msgstr "Persona no trobada"
#: messages.go:112
msgid "Face not found"
msgstr "No s'ha trobat la cara"
#: messages.go:113
msgid "Not available in public mode"
msgstr "No disponible en mode públic"
#: messages.go:114
msgid "Not available in read-only mode"
msgstr "No disponible en mode només de lectura"
#: messages.go:115
msgid "Please log in to your account"
msgstr "Si us plau, inicieu sessió al vostre compte"
#: messages.go:116
msgid "Permission denied"
msgstr "Permís denegat"
#: messages.go:117
msgid "Upload might be offensive"
msgstr "La càrrega pot ser ofensiva"
#: messages.go:118
msgid "Upload failed"
msgstr "La càrrega ha fallat"
#: messages.go:119
msgid "No items selected"
msgstr "No s'ha seleccionat cap element"
#: messages.go:120
msgid "Failed creating file, please check permissions"
msgstr "No s'ha pogut crear el fitxer, comproveu els permisos"
#: messages.go:121
msgid "Failed creating folder, please check permissions"
msgstr "No s'ha pogut crear la carpeta, comproveu els permisos"
#: messages.go:122
msgid "Could not connect, please try again"
msgstr "No s'ha pogut connectar, torna-ho a provar"
#: messages.go:123
msgid "Invalid password, please try again"
msgstr "La contrasenya no és vàlida, torneu-ho a provar"
#: messages.go:124
msgid "Feature disabled"
msgstr "Funció desactivada"
#: messages.go:125
msgid "No labels selected"
msgstr "No s'ha seleccionat cap etiqueta"
#: messages.go:126
msgid "No albums selected"
msgstr "No s'ha seleccionat cap àlbum"
#: messages.go:127
msgid "No files available for download"
msgstr "No hi ha fitxers disponibles per a la baixada"
#: messages.go:128
msgid "Failed to create zip file"
msgstr "No s'ha pogut crear el fitxer zip"
#: messages.go:129
msgid "Invalid credentials"
msgstr "Credencials incorrectes"
#: messages.go:130
msgid "Invalid link"
msgstr "Enllaç no vàlid"
#: messages.go:131
msgid "Invalid name"
msgstr "Nom no vàlid"
#: messages.go:132
msgid "Busy, please try again later"
msgstr "Ocupat, torna-ho a provar més tard"
#: messages.go:133
#, 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:134
msgid "Your account could not be connected"
msgstr "No s'ha pogut connectar el vostre compte"
#: messages.go:137
msgid "Changes successfully saved"
msgstr "Els canvis s'han desat correctament"
#: messages.go:138
msgid "Album created"
msgstr "Àlbum creat"
#: messages.go:139
msgid "Album saved"
msgstr "Àlbum desat"
#: messages.go:140
#, c-format
msgid "Album %s deleted"
msgstr "S'ha suprimit l'àlbum %s"
#: messages.go:141
msgid "Album contents cloned"
msgstr "Contingut de l'àlbum clonat"
#: messages.go:142
msgid "File removed from stack"
msgstr "S'ha eliminat el fitxer de la pila"
#: messages.go:143
msgid "File deleted"
msgstr "S'ha suprimit el fitxer"
#: messages.go:144
#, c-format
msgid "Selection added to %s"
msgstr "S'ha afegit una selecció a %s"
#: messages.go:145
#, c-format
msgid "One entry added to %s"
msgstr "S'ha afegit una entrada a %s"
#: messages.go:146
#, c-format
msgid "%d entries added to %s"
msgstr "%d entrades afegides a %s"
#: messages.go:147
#, c-format
msgid "One entry removed from %s"
msgstr "S'ha eliminat una entrada de %s"
#: messages.go:148
#, c-format
msgid "%d entries removed from %s"
msgstr "S'han eliminat %d entrades de %s"
#: messages.go:149
msgid "Account created"
msgstr "Compte creat"
#: messages.go:150
msgid "Account saved"
msgstr "Compte desat"
#: messages.go:151
msgid "Account deleted"
msgstr "Compte suprimit"
#: messages.go:152
msgid "Settings saved"
msgstr "Configuració desada"
#: messages.go:153
msgid "Password changed"
msgstr "Sha canviat la contrasenya"
#: messages.go:154
#, c-format
msgid "Import completed in %d s"
msgstr "Importació completada en %d s"
#: messages.go:155
msgid "Import canceled"
msgstr "Importació cancel·lada"
#: messages.go:156
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexació completada en %d s"
#: messages.go:157
msgid "Indexing originals..."
msgstr "S'estan indexant els originals..."
#: messages.go:158
#, c-format
msgid "Indexing files in %s"
msgstr "Indexant fitxers a %s"
#: messages.go:159
msgid "Indexing canceled"
msgstr "S'ha cancel·lat la indexació"
#: messages.go:160
#, c-format
msgid "Removed %d files and %d photos"
msgstr "S'han eliminat %d fitxers i %d fotos"
#: messages.go:161
#, c-format
msgid "Moving files from %s"
msgstr "S'estan movent fitxers de %s"
#: messages.go:162
#, c-format
msgid "Copying files from %s"
msgstr "S'estan copiant fitxers de %s"
#: messages.go:163
msgid "Labels deleted"
msgstr "S'han suprimit les etiquetes"
#: messages.go:164
msgid "Label saved"
msgstr "S'ha desat l'etiqueta"
#: messages.go:165
msgid "Subject saved"
msgstr "Assumpte desat"
#: messages.go:166
msgid "Subject deleted"
msgstr "S'ha suprimit el tema"
#: messages.go:167
msgid "Person saved"
msgstr "Persona salvada"
#: messages.go:168
msgid "Person deleted"
msgstr "S'ha suprimit la persona"
#: messages.go:169
msgid "File uploaded"
msgstr "Fitxer penjat"
#: messages.go:170
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d fitxers penjats en %d s"
#: messages.go:171
msgid "Processing upload..."
msgstr "S'està processant la càrrega..."
#: messages.go:172
msgid "Upload has been processed"
msgstr "S'ha processat la càrrega"
#: messages.go:173
msgid "Selection approved"
msgstr "Selecció aprovada"
#: messages.go:174
msgid "Selection archived"
msgstr "Selecció arxivada"
#: messages.go:175
msgid "Selection restored"
msgstr "S'ha restaurat la selecció"
#: messages.go:176
msgid "Selection marked as private"
msgstr "La selecció s'ha marcat com a privada"
#: messages.go:177
msgid "Albums deleted"
msgstr "Àlbums suprimits"
#: messages.go:178
#, c-format
msgid "Zip created in %d s"
msgstr "Zip creat en %d s"
#: messages.go:179
msgid "Permanently deleted"
msgstr "Esborrat permanentment"
#: messages.go:180
#, c-format
msgid "%s has been restored"
msgstr "%s s'ha restaurat"
#~ msgid "Invalid request"
#~ msgstr "La sol·licitud no és vàlida"
#~ msgid "Unexpected error, please try again"
#~ msgstr "Error inesperat, torneu-ho a provar"

View file

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

View file

@ -1,378 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-09 12:51+0000\n"
"PO-Revision-Date: 2023-02-09 13:13+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Danish <https://translate.photoprism.app/projects/photoprism/"
"backend/da/>\n"
"Language: da\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 4.15.2\n"
#: messages.go:94
msgid "Something went wrong, try again"
msgstr "Noget gik galt, prøv igen"
#: messages.go:95
msgid "Unable to do that"
msgstr "Det kan ikke lade sig gøre"
#: messages.go:96
msgid "Changes could not be saved"
msgstr "Ændringer kunne ikke gemmes"
#: messages.go:97
msgid "Could not be deleted"
msgstr "Kunne ikke slettes"
#: messages.go:98
#, c-format
msgid "%s already exists"
msgstr "%s findes allerede"
#: messages.go:99
msgid "Not found"
msgstr "Ikke fundet"
#: messages.go:100
msgid "File not found"
msgstr "Fil ikke fundet"
#: messages.go:101
msgid "File too large"
msgstr "Filen er for stor"
#: messages.go:102
msgid "Unsupported format"
msgstr "Ikke understøttet format"
#: messages.go:103
msgid "Originals folder is empty"
msgstr "Mappen Originaler er tom"
#: messages.go:104
msgid "Selection not found"
msgstr "Valg ikke fundet"
#: messages.go:105
msgid "Entity not found"
msgstr "Enhed ikke fundet"
#: messages.go:106
msgid "Account not found"
msgstr "Konto ikke fundet"
#: messages.go:107
msgid "User not found"
msgstr "Bruger ikke fundet"
#: messages.go:108
msgid "Label not found"
msgstr "Etiket ikke fundet"
#: messages.go:109
msgid "Album not found"
msgstr "Album ikke fundet"
#: messages.go:110
msgid "Subject not found"
msgstr "Emne ikke fundet"
#: messages.go:111
msgid "Person not found"
msgstr "Person ikke fundet"
#: messages.go:112
msgid "Face not found"
msgstr "Ansigt ikke fundet"
#: messages.go:113
msgid "Not available in public mode"
msgstr "Ikke tilgængelig i offentlig tilstand"
#: messages.go:114
msgid "Not available in read-only mode"
msgstr "Ikke tilgængelig i skrivebeskyttet tilstand"
#: messages.go:115
msgid "Please log in to your account"
msgstr "Log ind på din konto"
#: messages.go:116
msgid "Permission denied"
msgstr "Tilladelse nægtet"
#: messages.go:117
msgid "Upload might be offensive"
msgstr "Upload kan være stødende"
#: messages.go:118
msgid "Upload failed"
msgstr "Upload mislykkedes"
#: messages.go:119
msgid "No items selected"
msgstr "Ingen emner valgt"
#: messages.go:120
msgid "Failed creating file, please check permissions"
msgstr "Oprettelse af fil mislykkedes, tjek venligst tilladelser"
#: messages.go:121
msgid "Failed creating folder, please check permissions"
msgstr "Oprettelse af mappe mislykkedes, tjek venligst tilladelser"
#: messages.go:122
msgid "Could not connect, please try again"
msgstr "Kunne ikke oprette forbindelse, prøv venligst igen"
#: messages.go:123
msgid "Invalid password, please try again"
msgstr "Ugyldig adgangskode, prøv venligst igen"
#: messages.go:124
msgid "Feature disabled"
msgstr "Funktion deaktiveret"
#: messages.go:125
msgid "No labels selected"
msgstr "Ingen etiketter valgt"
#: messages.go:126
msgid "No albums selected"
msgstr "Ingen album valgt"
#: messages.go:127
msgid "No files available for download"
msgstr "Ingen filer til rådighed til download"
#: messages.go:128
msgid "Failed to create zip file"
msgstr "Det lykkedes ikke at oprette zip-fil"
#: messages.go:129
msgid "Invalid credentials"
msgstr "Ugyldige legitimationsoplysninger"
#: messages.go:130
msgid "Invalid link"
msgstr "Ugyldigt link"
#: messages.go:131
msgid "Invalid name"
msgstr "Ugyldigt navn"
#: messages.go:132
msgid "Busy, please try again later"
msgstr "Optaget, prøv venligst igen senere"
#: messages.go:133
#, 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:134
msgid "Your account could not be connected"
msgstr "Der kunne ikke oprettes forbindelse til din konto"
#: messages.go:137
msgid "Changes successfully saved"
msgstr "Ændringer gemt med succes"
#: messages.go:138
msgid "Album created"
msgstr "Album oprettet"
#: messages.go:139
msgid "Album saved"
msgstr "Album gemt"
#: messages.go:140
#, c-format
msgid "Album %s deleted"
msgstr "Album %s slettet"
#: messages.go:141
msgid "Album contents cloned"
msgstr "Albumindhold klonet"
#: messages.go:142
msgid "File removed from stack"
msgstr "Fil fjernet fra stakken"
#: messages.go:143
msgid "File deleted"
msgstr "Fil slettet"
#: messages.go:144
#, c-format
msgid "Selection added to %s"
msgstr "Valg tilføjet til %s"
#: messages.go:145
#, c-format
msgid "One entry added to %s"
msgstr "En post tilføjet til %s"
#: messages.go:146
#, c-format
msgid "%d entries added to %s"
msgstr "%d poster tilføjet til %s"
#: messages.go:147
#, c-format
msgid "One entry removed from %s"
msgstr "En post fjernet fra %s"
#: messages.go:148
#, c-format
msgid "%d entries removed from %s"
msgstr "%d poster fjernet fra %s"
#: messages.go:149
msgid "Account created"
msgstr "Konto oprettet"
#: messages.go:150
msgid "Account saved"
msgstr "Gemte konto"
#: messages.go:151
msgid "Account deleted"
msgstr "Konto slettet"
#: messages.go:152
msgid "Settings saved"
msgstr "Indstillinger gemt"
#: messages.go:153
msgid "Password changed"
msgstr "Adgangskode ændret"
#: messages.go:154
#, c-format
msgid "Import completed in %d s"
msgstr "Import afsluttet efter %d s"
#: messages.go:155
msgid "Import canceled"
msgstr "Import annulleret"
#: messages.go:156
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indeksering afsluttet efter %d s"
#: messages.go:157
msgid "Indexing originals..."
msgstr "Indeksering af originaler..."
#: messages.go:158
#, c-format
msgid "Indexing files in %s"
msgstr "Indeksering af filer i %s"
#: messages.go:159
msgid "Indexing canceled"
msgstr "Indeksering annulleret"
#: messages.go:160
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Fjernede %d filer og %d fotos"
#: messages.go:161
#, c-format
msgid "Moving files from %s"
msgstr "Flytter filer fra %s"
#: messages.go:162
#, c-format
msgid "Copying files from %s"
msgstr "Kopierer filer fra %s"
#: messages.go:163
msgid "Labels deleted"
msgstr "Etiketter slettet"
#: messages.go:164
msgid "Label saved"
msgstr "Etikette gemt"
#: messages.go:165
msgid "Subject saved"
msgstr "Emne gemt"
#: messages.go:166
msgid "Subject deleted"
msgstr "Emne slettet"
#: messages.go:167
msgid "Person saved"
msgstr "Person gemt"
#: messages.go:168
msgid "Person deleted"
msgstr "Person slettet"
#: messages.go:169
msgid "File uploaded"
msgstr "Fil uploadet"
#: messages.go:170
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d filer uploadet på %d s"
#: messages.go:171
msgid "Processing upload..."
msgstr "Behandling af upload..."
#: messages.go:172
msgid "Upload has been processed"
msgstr "Upload er blevet behandlet"
#: messages.go:173
msgid "Selection approved"
msgstr "Udvælgelse godkendt"
#: messages.go:174
msgid "Selection archived"
msgstr "Udvælgelse arkiveret"
#: messages.go:175
msgid "Selection restored"
msgstr "Udvalgte gendannet"
#: messages.go:176
msgid "Selection marked as private"
msgstr "Udvalgte er markeret som privat"
#: messages.go:177
msgid "Albums deleted"
msgstr "Albums slettet"
#: messages.go:178
#, c-format
msgid "Zip created in %d s"
msgstr "Zip filen blev lavet på %d s"
#: messages.go:179
msgid "Permanently deleted"
msgstr "Permanent slettet"
#: messages.go:180
#, c-format
msgid "%s has been restored"
msgstr "%s er blevet genoprettet"
#~ msgid "Invalid request"
#~ msgstr "Ugyldig anmodning"
#~ msgid "Unexpected error, please try again"
#~ msgstr "Uventet fejl, prøv venligst igen"

View file

@ -1,382 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-09 13:14+0000\n"
"PO-Revision-Date: 2023-03-29 12:10+0000\n"
"Last-Translator: Admin <hello@photoprism.app>\n"
"Language-Team: German <https://translate.photoprism.app/projects/photoprism/"
"backend/de/>\n"
"Language: de\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 4.16.2\n"
"X-Poedit-Basepath: .\n"
#: messages.go:94
msgid "Something went wrong, try again"
msgstr "Etwas ist schief gelaufen, versuche es noch einmal"
#: messages.go:95
msgid "Unable to do that"
msgstr "Dies ist nicht möglich"
#: messages.go:96
msgid "Changes could not be saved"
msgstr "Fehler beim Speichern der Daten"
#: messages.go:97
msgid "Could not be deleted"
msgstr "Konnte nicht gelöscht werden"
#: messages.go:98
#, c-format
msgid "%s already exists"
msgstr "%s existiert bereits"
#: messages.go:99
msgid "Not found"
msgstr "Nicht gefunden"
#: messages.go:100
msgid "File not found"
msgstr "Datei konnte nicht gefunden werden"
#: messages.go:101
msgid "File too large"
msgstr "Datei zu groß"
#: messages.go:102
msgid "Unsupported format"
msgstr "Nicht unterstütztes Format"
#: messages.go:103
msgid "Originals folder is empty"
msgstr "Originals-Verzeichnis ist leer"
#: messages.go:104
msgid "Selection not found"
msgstr "Auswahl nicht gefunden"
#: messages.go:105
msgid "Entity not found"
msgstr "Keine Daten gefunden"
#: messages.go:106
msgid "Account not found"
msgstr "Unbekannter Account"
#: messages.go:107
msgid "User not found"
msgstr "Nutzer nicht gefunden"
#: messages.go:108
msgid "Label not found"
msgstr "Kategorie nicht gefunden"
#: messages.go:109
msgid "Album not found"
msgstr "Album nicht gefunden"
#: messages.go:110
msgid "Subject not found"
msgstr "Unbekanntes Motiv"
#: messages.go:111
msgid "Person not found"
msgstr "Unbekannte Person"
#: messages.go:112
msgid "Face not found"
msgstr "Unbekanntes Gesicht"
#: messages.go:113
msgid "Not available in public mode"
msgstr "Im öffentlichen Modus nicht verfügbar"
#: messages.go:114
msgid "Not available in read-only mode"
msgstr "Im Nur-Lese-Modus nicht verfügbar"
#: messages.go:115
msgid "Please log in to your account"
msgstr "Bitte melde dich an"
#: messages.go:116
msgid "Permission denied"
msgstr "Erlaubnis verweigert"
#: messages.go:117
msgid "Upload might be offensive"
msgstr "Inhalt könnte anstößig sein und wurde abgelehnt"
#: messages.go:118
msgid "Upload failed"
msgstr "Upload fehlgeschlagen"
#: messages.go:119
msgid "No items selected"
msgstr "Nichts ausgewählt"
#: messages.go:120
msgid "Failed creating file, please check permissions"
msgstr "Datei konnte nicht erstellt werden"
#: messages.go:121
msgid "Failed creating folder, please check permissions"
msgstr "Ordner konnte nicht erstellt werden"
#: messages.go:122
msgid "Could not connect, please try again"
msgstr "Verbindung fehlgeschlagen"
#: messages.go:123
msgid "Invalid password, please try again"
msgstr "Ungültiges Passwort"
#: messages.go:124
msgid "Feature disabled"
msgstr "Funktion deaktiviert"
#: messages.go:125
msgid "No labels selected"
msgstr "Keine Kategorien ausgewählt"
#: messages.go:126
msgid "No albums selected"
msgstr "Keine Alben ausgewählt"
#: messages.go:127
msgid "No files available for download"
msgstr "Keine Dateien zum Download verfügbar"
#: messages.go:128
msgid "Failed to create zip file"
msgstr "Zip-Datei konnte nicht erstellt werden"
#: messages.go:129
msgid "Invalid credentials"
msgstr "Ungültige Zugangsdaten"
#: messages.go:130
msgid "Invalid link"
msgstr "Ungültiger Link"
#: messages.go:131
msgid "Invalid name"
msgstr "Ungültiger Name"
#: messages.go:132
msgid "Busy, please try again later"
msgstr "Beschäftigt, bitte später erneut versuchen"
#: messages.go:133
#, 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:134
msgid "Your account could not be connected"
msgstr "Das Konto konnte nicht verbunden werden"
#: messages.go:137
msgid "Changes successfully saved"
msgstr "Änderungen erfolgreich gespeichert"
#: messages.go:138
msgid "Album created"
msgstr "Album erstellt"
#: messages.go:139
msgid "Album saved"
msgstr "Album gespeichert"
#: messages.go:140
#, c-format
msgid "Album %s deleted"
msgstr "Album %s gelöscht"
#: messages.go:141
msgid "Album contents cloned"
msgstr "Album-Einträge kopiert"
#: messages.go:142
msgid "File removed from stack"
msgstr "Datei aus Stapel entfernt"
#: messages.go:143
msgid "File deleted"
msgstr "Datei gelöscht"
#: messages.go:144
#, c-format
msgid "Selection added to %s"
msgstr "Auswahl zu %s hinzugefügt"
#: messages.go:145
#, c-format
msgid "One entry added to %s"
msgstr "Ein Eintrag zu %s hinzugefügt"
#: messages.go:146
#, c-format
msgid "%d entries added to %s"
msgstr "%d Einträge zu %s hinzugefügt"
#: messages.go:147
#, c-format
msgid "One entry removed from %s"
msgstr "Ein Eintrag aus %s entfernt"
#: messages.go:148
#, c-format
msgid "%d entries removed from %s"
msgstr "%d Einträge aus %s entfernt"
#: messages.go:149
msgid "Account created"
msgstr "Konto hinzugefügt"
#: messages.go:150
msgid "Account saved"
msgstr "Konto gespeichert"
#: messages.go:151
msgid "Account deleted"
msgstr "Konto gelöscht"
#: messages.go:152
msgid "Settings saved"
msgstr "Einstellungen gespeichert"
#: messages.go:153
msgid "Password changed"
msgstr "Passwort geändert"
#: messages.go:154
#, c-format
msgid "Import completed in %d s"
msgstr "Import in %d s abgeschlossen"
#: messages.go:155
msgid "Import canceled"
msgstr "Import abgebrochen"
#: messages.go:156
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexierung in %d s abgeschlossen"
#: messages.go:157
msgid "Indexing originals..."
msgstr "Indexiere Dateien…"
#: messages.go:158
#, c-format
msgid "Indexing files in %s"
msgstr "Indexiere Dateien in %s"
#: messages.go:159
msgid "Indexing canceled"
msgstr "Indexierung abgebrochen"
#: messages.go:160
#, c-format
msgid "Removed %d files and %d photos"
msgstr "%d Dateien und %d Bilder wurden entfernt"
#: messages.go:161
#, c-format
msgid "Moving files from %s"
msgstr "Verschiebe Dateien von %s"
#: messages.go:162
#, c-format
msgid "Copying files from %s"
msgstr "Kopiere Dateien von %s"
#: messages.go:163
msgid "Labels deleted"
msgstr "Kategorien gelöscht"
#: messages.go:164
msgid "Label saved"
msgstr "Kategorie gespeichert"
#: messages.go:165
msgid "Subject saved"
msgstr "Motiv gespeichert"
#: messages.go:166
msgid "Subject deleted"
msgstr "Motiv gelöscht"
#: messages.go:167
msgid "Person saved"
msgstr "Person gespeichert"
#: messages.go:168
msgid "Person deleted"
msgstr "Person gelöscht"
#: messages.go:169
msgid "File uploaded"
msgstr "Datei hochgeladen"
#: messages.go:170
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d Dateien hochgeladen in %d s"
#: messages.go:171
msgid "Processing upload..."
msgstr "Verarbeitung des Uploads..."
#: messages.go:172
msgid "Upload has been processed"
msgstr "Der Upload wurde verarbeitet"
#: messages.go:173
msgid "Selection approved"
msgstr "Auswahl übernommen"
#: messages.go:174
msgid "Selection archived"
msgstr "Auswahl archiviert"
#: messages.go:175
msgid "Selection restored"
msgstr "Auswahl wiederhergestellt"
#: messages.go:176
msgid "Selection marked as private"
msgstr "Auswahl als privat markiert"
#: messages.go:177
msgid "Albums deleted"
msgstr "Alben gelöscht"
#: messages.go:178
#, c-format
msgid "Zip created in %d s"
msgstr "Zip-Datei erstellt in %d s"
#: messages.go:179
msgid "Permanently deleted"
msgstr "Endgültig gelöscht"
#: messages.go:180
#, c-format
msgid "%s has been restored"
msgstr "%s wurde wiederhergestellt"
#~ msgid "Invalid request"
#~ msgstr "Ungültige Anfrage"
#~ msgid "Unexpected error, please try again"
#~ msgstr "Unerwarteter Fehler, bitte erneut versuchen"
#~ msgid "Not found on server, deleted?"
#~ msgstr "Nicht auf Server gefunden, gelöscht?"

View file

@ -1,377 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-09 13:14+0000\n"
"PO-Revision-Date: 2023-10-16 16:35+0000\n"
"Last-Translator: dtsolakis <dtsola@eranet.gr>\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.0.2\n"
#: messages.go:94
msgid "Something went wrong, try again"
msgstr "Κάτι πήγε στραβά, δοκιμάστε ξανά"
#: messages.go:95
msgid "Unable to do that"
msgstr "Αυτό δεν είναι εφικτό"
#: messages.go:96
msgid "Changes could not be saved"
msgstr "Οι αλλαγές δεν μπόρεσαν να αποθηκευτούν"
#: messages.go:97
msgid "Could not be deleted"
msgstr "Δεν μπόρεσε να διαγραφεί"
#: messages.go:98
#, c-format
msgid "%s already exists"
msgstr "%s υπάρχει ήδη"
#: messages.go:99
msgid "Not found"
msgstr "Δεν βρέθηκε"
#: messages.go:100
msgid "File not found"
msgstr "Το αρχείο δεν βρέθηκε"
#: messages.go:101
msgid "File too large"
msgstr "Πολύ μεγάλο αρχείο"
#: messages.go:102
msgid "Unsupported format"
msgstr "Μη υποστηριζόμενη μορφή"
#: messages.go:103
msgid "Originals folder is empty"
msgstr "Ο φάκελος Πρωτότυπα είναι άδειος"
#: messages.go:104
msgid "Selection not found"
msgstr "Η επιλογή δεν βρέθηκε"
#: messages.go:105
msgid "Entity not found"
msgstr "Η οντότητα δεν βρέθηκε"
#: messages.go:106
msgid "Account not found"
msgstr "Ο λογαριασμός δεν βρέθηκε"
#: messages.go:107
msgid "User not found"
msgstr "Ο χρήστης δεν βρέθηκε"
#: messages.go:108
msgid "Label not found"
msgstr "Η ετικέτα δεν βρέθηκε"
#: messages.go:109
msgid "Album not found"
msgstr "Η Συλλογή δεν βρέθηκε"
#: messages.go:110
msgid "Subject not found"
msgstr "Το Θέμα δεν βρέθηκε"
#: messages.go:111
msgid "Person not found"
msgstr "Το Άτομο δεν βρέθηκε"
#: messages.go:112
msgid "Face not found"
msgstr "Το Πρόσωπο δεν βρέθηκε"
#: messages.go:113
msgid "Not available in public mode"
msgstr "Μη διαθέσιμο κατά τη δημόσια λειτουργία"
#: messages.go:114
msgid "Not available in read-only mode"
msgstr "μη διαθέσιμο στην κατάσταση \"μόνο για ανάγνωση\""
#: messages.go:115
msgid "Please log in to your account"
msgstr "Παρακαλούμε συνδεθείτε και δοκιμάστε ξανά"
#: messages.go:116
msgid "Permission denied"
msgstr "Το Άτομο διαγράφηκε"
#: messages.go:117
msgid "Upload might be offensive"
msgstr "Η φόρτωση μπορεί να είναι προσβλητική"
#: messages.go:118
msgid "Upload failed"
msgstr "Αποτυχία αποστολής"
#: messages.go:119
msgid "No items selected"
msgstr "Δεν έχουν επιλεγεί αντικείμενα"
#: messages.go:120
msgid "Failed creating file, please check permissions"
msgstr "Απέτυχε η δημιουργία αρχείου, παρακαλούμε ελέγξτε τα δικαιώματα"
#: messages.go:121
msgid "Failed creating folder, please check permissions"
msgstr "Απέτυχε η δημιουργία φακέλου, παρακαλούμε ελέγξτε τα δικαιώματα"
#: messages.go:122
msgid "Could not connect, please try again"
msgstr "Δεν ήταν δυνατή η σύνδεση, παρακαλώ δοκιμάστε ξανά"
#: messages.go:123
msgid "Invalid password, please try again"
msgstr "Μη έγκυρος κωδικός πρόσβασης, παρακαλώ δοκιμάστε ξανά"
#: messages.go:124
msgid "Feature disabled"
msgstr "Λειτουργία απενεργοποιημένη"
#: messages.go:125
msgid "No labels selected"
msgstr "Δεν έχουν επιλεγεί ετικέτες"
#: messages.go:126
msgid "No albums selected"
msgstr "Δεν έχουν επιλεγεί συλλογές"
#: messages.go:127
msgid "No files available for download"
msgstr "Δεν υπάρχουν διαθέσιμα αρχεία για λήψη"
#: messages.go:128
msgid "Failed to create zip file"
msgstr "Απέτυχε η δημιουργία αρχείου zip"
#: messages.go:129
msgid "Invalid credentials"
msgstr "Μη έγκυρα διαπιστευτήρια"
#: messages.go:130
msgid "Invalid link"
msgstr "Μη έγκυρος σύνδεσμος"
#: messages.go:131
msgid "Invalid name"
msgstr "Μη έγκυρο όνομα"
#: messages.go:132
msgid "Busy, please try again later"
msgstr "Απασχολημένος, προσπαθήστε ξανά αργότερα"
#: messages.go:133
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "Το διάστημα αφύπνισης είναι %s, αλλά πρέπει να είναι 1 ώρα ή λιγότερο"
#: messages.go:134
msgid "Your account could not be connected"
msgstr "Ο λογαριασμός σας δεν μπόρεσε να συνδεθεί"
#: messages.go:137
msgid "Changes successfully saved"
msgstr "Οι αλλαγές αποθηκεύτηκαν επιτυχώς"
#: messages.go:138
msgid "Album created"
msgstr "Η Συλλογή δημιουργήθηκε"
#: messages.go:139
msgid "Album saved"
msgstr "Η Συλλογή αποθηκεύθηκε"
#: messages.go:140
#, c-format
msgid "Album %s deleted"
msgstr "Η Συλλογή %s διαγράφηκε"
#: messages.go:141
msgid "Album contents cloned"
msgstr "Τα περιεχόμενα της Συλλογής αντιγράφηκαν"
#: messages.go:142
msgid "File removed from stack"
msgstr "Αφαίρεση αρχείου από τη στοίβα"
#: messages.go:143
msgid "File deleted"
msgstr "Το αρχείο διαγράφηκε"
#: messages.go:144
#, c-format
msgid "Selection added to %s"
msgstr "Η επιλογή προστέθηκε στο %s"
#: messages.go:145
#, c-format
msgid "One entry added to %s"
msgstr "Μία εγγραφή προστέθηκε στο %s"
#: messages.go:146
#, c-format
msgid "%d entries added to %s"
msgstr "%d καταχωρήσεις προστέθηκαν στο %s"
#: messages.go:147
#, c-format
msgid "One entry removed from %s"
msgstr "Μία καταχώρηση αφαιρέθηκε από %s"
#: messages.go:148
#, c-format
msgid "%d entries removed from %s"
msgstr "%d καταχωρήσεις αφαιρέθηκαν από %s"
#: messages.go:149
msgid "Account created"
msgstr "Ο Λογαριασμός δημιουργήθηκε"
#: messages.go:150
msgid "Account saved"
msgstr "Ο Λογαριασμός αποθηκεύθηκε"
#: messages.go:151
msgid "Account deleted"
msgstr "Ο Λογαριασμός διαγράφηκε"
#: messages.go:152
msgid "Settings saved"
msgstr "Οι ρυθμίσεις αποθηκεύτηκαν"
#: messages.go:153
msgid "Password changed"
msgstr "Ο κωδικός πρόσβασης άλλαξε"
#: messages.go:154
#, c-format
msgid "Import completed in %d s"
msgstr "Η εισαγωγή ολοκληρώθηκε σε %d s"
#: messages.go:155
msgid "Import canceled"
msgstr "Η εισαγωγή ακυρώθηκε"
#: messages.go:156
#, c-format
msgid "Indexing completed in %d s"
msgstr "Η δημιουργία ευρετηρίου σε %d s"
#: messages.go:157
msgid "Indexing originals..."
msgstr "Δημιουργία ευρετηρίου για τα πρωτότυπα..."
#: messages.go:158
#, c-format
msgid "Indexing files in %s"
msgstr "Δημιουργία ευρετηρίου αρχείων σε %s"
#: messages.go:159
msgid "Indexing canceled"
msgstr "Η δημιουργία ευρετηρίου ακυρώθηκε"
#: messages.go:160
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Αφαίρεση %d αρχείων και %d φωτογραφιών"
#: messages.go:161
#, c-format
msgid "Moving files from %s"
msgstr "Μετακίνηση αρχείων από %s"
#: messages.go:162
#, c-format
msgid "Copying files from %s"
msgstr "Αντιγραφή αρχείων από %s"
#: messages.go:163
msgid "Labels deleted"
msgstr "Οι Ετικέτες διαγράφηκαν"
#: messages.go:164
msgid "Label saved"
msgstr "Η Ετικέτα αποθηκεύτηκε"
#: messages.go:165
msgid "Subject saved"
msgstr "Το Θέμα αποθηκεύθηκε"
#: messages.go:166
msgid "Subject deleted"
msgstr "Το Θέμα διαγράφηκε"
#: messages.go:167
msgid "Person saved"
msgstr "Το Άτομο αποθηκεύθηκε"
#: messages.go:168
msgid "Person deleted"
msgstr "Το Άτομο διαγράφηκε"
#: messages.go:169
msgid "File uploaded"
msgstr "Το αρχείο διαγράφηκε"
#: messages.go:170
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d αρχεία μεταφορτώθηκαν σε %d s"
#: messages.go:171
msgid "Processing upload..."
msgstr "Επεξεργασία μεταφόρτωσης..."
#: messages.go:172
msgid "Upload has been processed"
msgstr "Η φόρτωση έχει ολοκληρωθεί"
#: messages.go:173
msgid "Selection approved"
msgstr "Η επιλογή εγκρίθηκε"
#: messages.go:174
msgid "Selection archived"
msgstr "Η επιλογή αρχειοθετήθηκε"
#: messages.go:175
msgid "Selection restored"
msgstr "Η επιλογή αποκαταστάθηκε"
#: messages.go:176
msgid "Selection marked as private"
msgstr "Η επιλογή χαρακτηρίστηκε ως ιδιωτική"
#: messages.go:177
msgid "Albums deleted"
msgstr "Οι Συλλογές διαγράφηκαν"
#: messages.go:178
#, c-format
msgid "Zip created in %d s"
msgstr "Το αρχείο συμπίεσης δημιουργήθηκε σε %d s"
#: messages.go:179
msgid "Permanently deleted"
msgstr "Διαγράφηκε μόνιμα"
#: messages.go:180
#, c-format
msgid "%s has been restored"
msgstr "%s έχει αποκατασταθεί"
#~ msgid "Invalid request"
#~ msgstr "Μη έγκυρο αίτημα"
#~ msgid "Unexpected error, please try again"
#~ msgstr "Απρόσμενο σφάλμα, δοκιμάστε ξανά"

View file

@ -1,371 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-09 12:51+0000\n"
"PO-Revision-Date: 2022-10-31 16:44+0100\n"
"Last-Translator: Michael Mayer <michael@photoprism.org>\n"
"Language-Team: \n"
"Language: en\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: Poedit 2.3\n"
#: messages.go:94
msgid "Something went wrong, try again"
msgstr ""
#: messages.go:95
msgid "Unable to do that"
msgstr ""
#: messages.go:96
msgid "Changes could not be saved"
msgstr ""
#: messages.go:97
msgid "Could not be deleted"
msgstr ""
#: messages.go:98
#, c-format
msgid "%s already exists"
msgstr ""
#: messages.go:99
msgid "Not found"
msgstr ""
#: messages.go:100
msgid "File not found"
msgstr ""
#: messages.go:101
msgid "File too large"
msgstr ""
#: messages.go:102
msgid "Unsupported format"
msgstr ""
#: messages.go:103
msgid "Originals folder is empty"
msgstr ""
#: messages.go:104
msgid "Selection not found"
msgstr ""
#: messages.go:105
msgid "Entity not found"
msgstr ""
#: messages.go:106
msgid "Account not found"
msgstr ""
#: messages.go:107
msgid "User not found"
msgstr ""
#: messages.go:108
msgid "Label not found"
msgstr ""
#: messages.go:109
msgid "Album not found"
msgstr ""
#: messages.go:110
msgid "Subject not found"
msgstr ""
#: messages.go:111
msgid "Person not found"
msgstr ""
#: messages.go:112
msgid "Face not found"
msgstr ""
#: messages.go:113
msgid "Not available in public mode"
msgstr ""
#: messages.go:114
msgid "Not available in read-only mode"
msgstr ""
#: messages.go:115
msgid "Please log in to your account"
msgstr ""
#: messages.go:116
msgid "Permission denied"
msgstr ""
#: messages.go:117
msgid "Upload might be offensive"
msgstr ""
#: messages.go:118
msgid "Upload failed"
msgstr ""
#: messages.go:119
msgid "No items selected"
msgstr ""
#: messages.go:120
msgid "Failed creating file, please check permissions"
msgstr ""
#: messages.go:121
msgid "Failed creating folder, please check permissions"
msgstr ""
#: messages.go:122
msgid "Could not connect, please try again"
msgstr ""
#: messages.go:123
msgid "Invalid password, please try again"
msgstr ""
#: messages.go:124
msgid "Feature disabled"
msgstr ""
#: messages.go:125
msgid "No labels selected"
msgstr ""
#: messages.go:126
msgid "No albums selected"
msgstr ""
#: messages.go:127
msgid "No files available for download"
msgstr ""
#: messages.go:128
msgid "Failed to create zip file"
msgstr ""
#: messages.go:129
msgid "Invalid credentials"
msgstr ""
#: messages.go:130
msgid "Invalid link"
msgstr ""
#: messages.go:131
msgid "Invalid name"
msgstr ""
#: messages.go:132
msgid "Busy, please try again later"
msgstr ""
#: messages.go:133
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr ""
#: messages.go:134
msgid "Your account could not be connected"
msgstr ""
#: messages.go:137
msgid "Changes successfully saved"
msgstr ""
#: messages.go:138
msgid "Album created"
msgstr ""
#: messages.go:139
msgid "Album saved"
msgstr ""
#: messages.go:140
#, c-format
msgid "Album %s deleted"
msgstr ""
#: messages.go:141
msgid "Album contents cloned"
msgstr ""
#: messages.go:142
msgid "File removed from stack"
msgstr ""
#: messages.go:143
msgid "File deleted"
msgstr ""
#: messages.go:144
#, c-format
msgid "Selection added to %s"
msgstr ""
#: messages.go:145
#, c-format
msgid "One entry added to %s"
msgstr ""
#: messages.go:146
#, c-format
msgid "%d entries added to %s"
msgstr ""
#: messages.go:147
#, c-format
msgid "One entry removed from %s"
msgstr ""
#: messages.go:148
#, c-format
msgid "%d entries removed from %s"
msgstr ""
#: messages.go:149
msgid "Account created"
msgstr ""
#: messages.go:150
msgid "Account saved"
msgstr ""
#: messages.go:151
msgid "Account deleted"
msgstr ""
#: messages.go:152
msgid "Settings saved"
msgstr ""
#: messages.go:153
msgid "Password changed"
msgstr ""
#: messages.go:154
#, c-format
msgid "Import completed in %d s"
msgstr ""
#: messages.go:155
msgid "Import canceled"
msgstr ""
#: messages.go:156
#, c-format
msgid "Indexing completed in %d s"
msgstr ""
#: messages.go:157
msgid "Indexing originals..."
msgstr ""
#: messages.go:158
#, c-format
msgid "Indexing files in %s"
msgstr ""
#: messages.go:159
msgid "Indexing canceled"
msgstr ""
#: messages.go:160
#, c-format
msgid "Removed %d files and %d photos"
msgstr ""
#: messages.go:161
#, c-format
msgid "Moving files from %s"
msgstr ""
#: messages.go:162
#, c-format
msgid "Copying files from %s"
msgstr ""
#: messages.go:163
msgid "Labels deleted"
msgstr ""
#: messages.go:164
msgid "Label saved"
msgstr ""
#: messages.go:165
msgid "Subject saved"
msgstr ""
#: messages.go:166
msgid "Subject deleted"
msgstr ""
#: messages.go:167
msgid "Person saved"
msgstr ""
#: messages.go:168
msgid "Person deleted"
msgstr ""
#: messages.go:169
msgid "File uploaded"
msgstr ""
#: messages.go:170
#, c-format
msgid "%d files uploaded in %d s"
msgstr ""
#: messages.go:171
msgid "Processing upload..."
msgstr ""
#: messages.go:172
msgid "Upload has been processed"
msgstr ""
#: messages.go:173
msgid "Selection approved"
msgstr ""
#: messages.go:174
msgid "Selection archived"
msgstr ""
#: messages.go:175
msgid "Selection restored"
msgstr ""
#: messages.go:176
msgid "Selection marked as private"
msgstr ""
#: messages.go:177
msgid "Albums deleted"
msgstr ""
#: messages.go:178
#, c-format
msgid "Zip created in %d s"
msgstr ""
#: messages.go:179
msgid "Permanently deleted"
msgstr ""
#: messages.go:180
#, c-format
msgid "%s has been restored"
msgstr ""

View file

@ -1,381 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-09 12:51+0000\n"
"PO-Revision-Date: 2023-02-09 13:13+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: Spanish <https://translate.photoprism.app/projects/photoprism/"
"backend/es/>\n"
"Language: es\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 4.15.2\n"
#: messages.go:94
msgid "Something went wrong, try again"
msgstr "Algo ha ido mal, inténtalo de nuevo"
#: messages.go:95
msgid "Unable to do that"
msgstr "Incapaz de hacerlo"
#: messages.go:96
msgid "Changes could not be saved"
msgstr "No se pudieron guardar los cambios"
#: messages.go:97
msgid "Could not be deleted"
msgstr "No se pudo borrar"
#: messages.go:98
#, c-format
msgid "%s already exists"
msgstr "%s ya existe"
#: messages.go:99
msgid "Not found"
msgstr "No encontrado"
#: messages.go:100
msgid "File not found"
msgstr "No se encuentra el archivo"
#: messages.go:101
msgid "File too large"
msgstr "Archivo demasiado grande"
#: messages.go:102
msgid "Unsupported format"
msgstr "Formato no admitido"
#: messages.go:103
msgid "Originals folder is empty"
msgstr "La carpeta de originales está vacía"
#: messages.go:104
msgid "Selection not found"
msgstr "Selección no encontrada"
#: messages.go:105
msgid "Entity not found"
msgstr "Entidad no encontrada"
#: messages.go:106
msgid "Account not found"
msgstr "Cuenta no encontrada"
#: messages.go:107
msgid "User not found"
msgstr "Usuario no encontrado"
#: messages.go:108
msgid "Label not found"
msgstr "Etiqueta no encontrada"
#: messages.go:109
msgid "Album not found"
msgstr "Álbum no encontrado"
#: messages.go:110
msgid "Subject not found"
msgstr "Asunto no encontrado"
#: messages.go:111
msgid "Person not found"
msgstr "Persona no encontrada"
#: messages.go:112
msgid "Face not found"
msgstr "Cara no encontrada"
#: messages.go:113
msgid "Not available in public mode"
msgstr "No disponible en modo público"
#: messages.go:114
msgid "Not available in read-only mode"
msgstr "No está disponible en modo de sólo lectura"
#: messages.go:115
msgid "Please log in to your account"
msgstr "Por favor inicie sesión"
#: messages.go:116
msgid "Permission denied"
msgstr "Permiso denegado"
#: messages.go:117
msgid "Upload might be offensive"
msgstr "El archivo subido puede ser ofensivo"
#: messages.go:118
msgid "Upload failed"
msgstr "Carga fallida"
#: messages.go:119
msgid "No items selected"
msgstr "Ningún elemento seleccionado"
#: messages.go:120
msgid "Failed creating file, please check permissions"
msgstr "Fallo al crear el archivo, por favor, compruebe los permisos"
#: messages.go:121
msgid "Failed creating folder, please check permissions"
msgstr "Fallo al crear la carpeta, por favor, compruebe los permisos"
#: messages.go:122
msgid "Could not connect, please try again"
msgstr "No se pudo conectar, por favor vuelva a intentarlo"
#: messages.go:123
msgid "Invalid password, please try again"
msgstr "Contraseña inválida, por favor vuelva a intentarlo"
#: messages.go:124
msgid "Feature disabled"
msgstr "Característica desactivada"
#: messages.go:125
msgid "No labels selected"
msgstr "Ninguna etiqueta seleccionada"
#: messages.go:126
msgid "No albums selected"
msgstr "Ningún álbum seleccionado"
#: messages.go:127
msgid "No files available for download"
msgstr "Ningún archivo disponible para descargar"
#: messages.go:128
msgid "Failed to create zip file"
msgstr "Fallo al crear el archivo zip"
#: messages.go:129
msgid "Invalid credentials"
msgstr "Credenciales no válidas"
#: messages.go:130
msgid "Invalid link"
msgstr "Enlace inválido"
#: messages.go:131
msgid "Invalid name"
msgstr "Nombre inválido"
#: messages.go:132
msgid "Busy, please try again later"
msgstr "Ocupado, por favor vuelva a intentarlo más tarde"
#: messages.go:133
#, 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:134
msgid "Your account could not be connected"
msgstr "Su cuenta no pudo ser conectada"
#: messages.go:137
msgid "Changes successfully saved"
msgstr "Cambios guardados con éxito"
#: messages.go:138
msgid "Album created"
msgstr "Álbum creado"
#: messages.go:139
msgid "Album saved"
msgstr "Álbum guardado"
#: messages.go:140
#, c-format
msgid "Album %s deleted"
msgstr "Álbum %s borrado"
#: messages.go:141
msgid "Album contents cloned"
msgstr "Contenidos del álbum clonados"
#: messages.go:142
msgid "File removed from stack"
msgstr "Archivo eliminado de la pila"
#: messages.go:143
msgid "File deleted"
msgstr "Archivo eliminado"
#: messages.go:144
#, c-format
msgid "Selection added to %s"
msgstr "Selección añadida a %s"
#: messages.go:145
#, c-format
msgid "One entry added to %s"
msgstr "Una entrada añadida a %s"
#: messages.go:146
#, c-format
msgid "%d entries added to %s"
msgstr "%d entradas añadidas a %s"
#: messages.go:147
#, c-format
msgid "One entry removed from %s"
msgstr "Una entrada eliminada de %s"
#: messages.go:148
#, c-format
msgid "%d entries removed from %s"
msgstr "%d entradas eliminadas de %s"
#: messages.go:149
msgid "Account created"
msgstr "Cuenta creada"
#: messages.go:150
msgid "Account saved"
msgstr "Cuenta guardada"
#: messages.go:151
msgid "Account deleted"
msgstr "Cuenta borrada"
#: messages.go:152
msgid "Settings saved"
msgstr "Ajustes guardados"
#: messages.go:153
msgid "Password changed"
msgstr "Contraseña cambiada"
#: messages.go:154
#, c-format
msgid "Import completed in %d s"
msgstr "Importación completada en %d"
#: messages.go:155
msgid "Import canceled"
msgstr "Importación cancelada"
#: messages.go:156
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexación completada em %d"
#: messages.go:157
msgid "Indexing originals..."
msgstr "Indexando originales..."
#: messages.go:158
#, c-format
msgid "Indexing files in %s"
msgstr "Indexando archivos en %s"
#: messages.go:159
msgid "Indexing canceled"
msgstr "Indexación cancelada"
#: messages.go:160
#, c-format
msgid "Removed %d files and %d photos"
msgstr "Eliminados %d archivos y %d fotos"
#: messages.go:161
#, c-format
msgid "Moving files from %s"
msgstr "Moviendo achivos desde %s"
#: messages.go:162
#, c-format
msgid "Copying files from %s"
msgstr "Copiando archivos desde %s"
#: messages.go:163
msgid "Labels deleted"
msgstr "Etiquetas borradas"
#: messages.go:164
msgid "Label saved"
msgstr "Etiqueta guardada"
#: messages.go:165
msgid "Subject saved"
msgstr "Asunto guardado"
#: messages.go:166
msgid "Subject deleted"
msgstr "Sujeto eliminado"
#: messages.go:167
msgid "Person saved"
msgstr "Persona salvada"
#: messages.go:168
msgid "Person deleted"
msgstr "Persona eliminada"
#: messages.go:169
msgid "File uploaded"
msgstr "Archivo cargado"
#: messages.go:170
#, c-format
msgid "%d files uploaded in %d s"
msgstr "%d archivos subidos en %d"
#: messages.go:171
msgid "Processing upload..."
msgstr "Procesando la carga..."
#: messages.go:172
msgid "Upload has been processed"
msgstr "La carga ha sido procesada"
#: messages.go:173
msgid "Selection approved"
msgstr "Selección aprobada"
#: messages.go:174
msgid "Selection archived"
msgstr "Selección archivada"
#: messages.go:175
msgid "Selection restored"
msgstr "Selección restaurada"
#: messages.go:176
msgid "Selection marked as private"
msgstr "Selección marcada como privada"
#: messages.go:177
msgid "Albums deleted"
msgstr "Álbumes borrados"
#: messages.go:178
#, c-format
msgid "Zip created in %d s"
msgstr "Zip creado en %d"
#: messages.go:179
msgid "Permanently deleted"
msgstr "Eliminado permanentemente"
#: messages.go:180
#, c-format
msgid "%s has been restored"
msgstr "%s ha sido restaurado"
#~ msgid "Invalid request"
#~ msgstr "Petición no válida"
#~ msgid "Unexpected error, please try again"
#~ msgstr "Error inesperado, por favor vuelva a intentarlo"
#~ msgid "Not found on server, deleted?"
#~ msgstr "No encontrado en el servidor, ¿fue borrado?"

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