Merge branch 'erdnaxe_dec2022' into 'master'

End of year fixes

See merge request bde/photo21!28
This commit is contained in:
erdnaxe 2022-12-26 00:25:58 +01:00
commit b3bc9651e4
21 changed files with 721 additions and 758 deletions

167
README.md
View file

@ -1,149 +1,80 @@
# Serveur photos 2021
# Photo server 2021-2023
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.txt)
Le serveur photos est un projet Django permettant de gérer les photos de la vie
associative de l'ENS Paris-Saclay.
This is the source code for the webserver hosting pictures from the
ENS Paris-Saclay student life.
## Table des matières
The philosophy of this project is to keep this code as simple as possible to
run and to maintain.
- [Installation d'une instance de développement](#installation-dune-instance-de-développement)
- [Installation d'une instance de production](#installation-dune-instance-de-production)
## Setup
## Installation d'une instance de développement
L'instance de développement installe la majorité des dépendances dans un environnement Python isolé.
Bien que cela permette de créer une instance sur toutes les distributions,
**cela veut dire que vos dépendances ne seront pas mises à jour automatiquement.**
1. **Installation des dépendances de la distribution.**
Il y a quelques dépendances qui ne sont pas trouvable dans PyPI.
On donne ci-dessous l'exemple pour une distribution basée sur Debian, mais vous pouvez facilement adapter pour ArchLinux ou autre.
1. **Dependency installation.**
If you are not using Debian, please feel free to adapt the following instructions.
```bash
$ sudo apt update
$ sudo apt install --no-install-recommends -y \
ipython3 python3-setuptools python3-venv python3-dev \
gettext git
sudo apt install git gettext python3-django python3-django-allauth python3-django-crispy-forms python3-docutils python3-exifread python3-pil
# Only for production
sudo apt install nginx uwsgi uwsgi-plugin-python3 python3-certbot-nginx
```
2. **Clonage du dépot** là où vous voulez :
2. **Cloning.**
Change directory to where you want the project to be.
In production, we usually use `/var/www/photos/` as the `root` user.
```bash
$ git clone git@gitlab.crans.org:bde/photo21.git && cd photo21
git clone https://gitlab.crans.org/bde/photo21.git && cd photo21
```
3. **Création d'un environment de travail Python décorrélé du système.**
On n'utilise pas `--system-site-packages` ici pour ne pas avoir des clashs de versions de modules avec le système.
3. **Configuration (production only).**
```bash
$ python3 -m venv env
$ source env/bin/activate # entrer dans l'environnement
(env)$ pip3 install -r requirements.txt
(env)$ deactivate # sortir de l'environnement
# Only for production
sudo mkdir static media
sudo chown www-data:www-data -R static media
sudo chmod g+rwx -R static media
sudo cp docs/uwsgi_photos.ini /etc/uwsgi/apps-available/uwsgi_photos.ini
sudo ln -s /etc/uwsgi/apps-available/uwsgi_photos.ini /etc/uwsgi/apps-enabled/
sudo cp docs/nginx_photos /etc/nginx/sites-available/photos.crans.org
sudo ln -s /etc/nginx/sites-available/photos.crans.org /etc/nginx/sites-enabled/
sudo cp docs/letsencrypt_photos.crans.org /etc/letsencrypt/conf.d/photos.crans.org
sudo cp docs/renewal-hooks_post_nginx /etc/letsencrypt/renewal-hooks/post/nginx
sudo certbot --config /etc/letsencrypt/conf.d/photos.crans.org.ini certonly
```
4. **Migrations et chargement des données initiales.**
Pour initialiser la base de données avec de quoi travailler.
4. **Database (production only).**
In development, you may use SQLite (no setup).
In production, we use PostgreSQL which require a bit of setup:
```bash
(env)$ ./manage.py compilemessages
(env)$ ./manage.py migrate
(env)$ ./manage.py loaddata initial
(env)$ ./manage.py createsuperuser # Création d'un utilisateur initial
```
6. **Activation du mode déboguage.**
Dans `photo21/settings.py`, changer `DEBUG` à `True`.
7. Enjoy :
```bash
(env)$ ./manage.py runserver 0.0.0.0:8000
```
En mettant `0.0.0.0:8000` après `runserver`, vous rendez votre instance Django
accessible depuis l'ensemble de votre réseau, pratique pour tester le rendu
de la note sur un téléphone !
## Installation d'une instance de production
**En production on souhaite utiliser les modules Python packagées
dans le gestionnaire de paquet.** Cela permet de mettre à jour facilement les
dépendances critiques telles que Django. L'installation d'une instance de
production néccessite **une installation de Debian Bullseye ou plus récent**.
1. **Installation des dépendances APT.**
On tire les dépendances le plus possible à partir des dépôts de Debian.
```
$ sudo apt install nginx git gettext uwsgi uwsgi-plugin-python3 python3-venv \
python3-certbot-nginx python3-django python3-django-crispy-forms \
python3-pil python3-exifread python3-django-allauth python3-docutils
```
2. **Clonage du dépot dans `/var/www/photos/photo21`**
```
# on se place dans /var/www/photos/
$ sudo git clone https://gitlab.crans.org/bde/photo21.git && cd photo21
$ sudo mkdir static media
$ sudo chown www-data:www-data -R static media
$ sudo chmod g+rwx -R static media
```
3. **Configuration de UWSGI, NGINX et Let's Encrypt.**
```bash
$ sudo cp docs/uwsgi_photos.ini /etc/uwsgi/apps-available/uwsgi_photos.ini
$ sudo ln -s /etc/uwsgi/apps-available/uwsgi_photos.ini /etc/uwsgi/apps-enabled/
$ sudo cp docs/nginx_photos /etc/nginx/sites-available/photos.crans.org
$ sudo ln -s /etc/nginx/sites-available/photos.crans.org /etc/nginx/sites-enabled/
$ sudo cp docs/letsencrypt_photos.crans.org /etc/letsencrypt/conf.d/photos.crans.org
$ sudo cp docs/renewal-hooks_post_nginx /etc/letsencrypt/renewal-hooks/post/nginx
$ sudo certbot --config /etc/letsencrypt/conf.d/photos.crans.org.ini certonly
```
4. **Base de données.**
En production on utilise PostgreSQL.
```bash
$ sudo apt install postgresql postgresql-contrib
$ sudo -u postgres psql
sudo apt install postgresql postgresql-contrib
sudo -u postgres psql
postgres=# CREATE USER photo21 WITH PASSWORD 'un_mot_de_passe_sur';
postgres=# CREATE DATABASE photo21 OWNER photo21;
```
5. **Migrations et collecte des fichiers statiques**,
5. **Initialization.**,
In production, please use `www-data` user.
```
$ sudo -u www-data ./manage.py collectstatic
$ sudo -u www-data ./manage.py check
$ sudo -u www-data ./manage.py migrate
$ sudo -u www-data ./manage.py loaddata initial
$ sudo ./manage.py compilemessages
./manage.py collectstatic
./manage.py check
./manage.py migrate
./manage.py compilemessages
# Only when creating a new database
./manage.py loaddata initial
./manage.py createsuperuser
# change DEBUG to True in photo21/settings.py
```
6. *Enjoy \o/*
## Documentation
In production, the NGINX site should now work.
In development, you can launch the development server using:
La documentation des classes et fonctions est directement dans le code et est explorable à partir de la partie documentation de l'interface d'administration de Django.
**Commentez votre code !**
## FAQ
### Regénérer les fichiers de traduction
Pour regénérer les traductions vous pouvez vous placer à la racine du projet et lancer le script `makemessages`.
Il faut penser à ignorer les dossiers ne contenant pas notre code, dont le virtualenv.
```bash
python3 manage.py makemessages -i env
```
Une fois les fichiers édités, vous pouvez compiler les nouvelles traductions avec
```bash
python3 manage.py compilemessages
```
```bash
(env)$ ./manage.py runserver
```

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-30 09:55+0000\n"
"POT-Creation-Date: 2022-12-25 23:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,259 +17,242 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: photo21/forms.py:12
#: photo21/forms.py:16
msgid ""
"Please enter a valid email address ending with `@crans.org` or `@ens-paris-"
"saclay.fr`."
msgstr ""
#: photo21/forms.py:23
#: photo21/forms.py:29
msgid "Must end with `@crans.org` or `@ens-paris-saclay.fr`."
msgstr ""
#: photo21/hashers.py:42
msgid "algorithm"
msgstr ""
#: photo21/hashers.py:43
msgid "salt"
msgstr ""
#: photo21/hashers.py:44
msgid "hash"
msgstr ""
#: photo21/settings.py:161
#: photo21/settings.py:151
msgid "German"
msgstr ""
#: photo21/settings.py:162
#: photo21/settings.py:152
msgid "English"
msgstr ""
#: photo21/settings.py:163
#: photo21/settings.py:153
msgid "Spanish"
msgstr ""
#: photo21/settings.py:164
#: photo21/settings.py:154
msgid "French"
msgstr ""
#: photo21/templates/400.html:10
#: photo21/templates/400.html:12
msgid "Bad request"
msgstr ""
#: photo21/templates/400.html:14
#: photo21/templates/400.html:16
msgid ""
"Sorry, your request was bad. Don't know what could be wrong. An email has "
"been sent to webmasters with the details of the error. You can now drink a "
"coke."
msgstr ""
#: photo21/templates/403.html:10
#: photo21/templates/403.html:12
msgid "Permission denied"
msgstr ""
#: photo21/templates/403.html:13
#: photo21/templates/403.html:15
msgid "You don't have the right to perform this request."
msgstr ""
#: photo21/templates/403.html:15 photo21/templates/404.html:19
#: photo21/templates/403.html:17 photo21/templates/404.html:21
msgid "Exception message:"
msgstr ""
#: photo21/templates/404.html:10
#: photo21/templates/404.html:12
msgid "Page not found"
msgstr ""
#: photo21/templates/404.html:14
#: photo21/templates/404.html:16
#, python-format
msgid ""
"The requested path <code>%(request_path)s</code> was not found on the server."
msgstr ""
#: photo21/templates/500.html:10
#: photo21/templates/500.html:12
msgid "Server error"
msgstr ""
#: photo21/templates/500.html:14
#: photo21/templates/500.html:16
msgid ""
"Sorry, an error occurred when processing your request. An email has been "
"sent to webmasters with the detail of the error, and this will be fixed "
"soon. You can now drink a beer."
msgstr ""
#: photo21/templates/account/email.html:6
#: photo21/templates/account/email.html:14
#: photo21/templates/socialaccount/connections.html:14
#: photo21/templates/account/email.html:8
#: photo21/templates/account/email.html:16
#: photo21/templates/socialaccount/connections.html:16
msgid "E-mail Addresses"
msgstr ""
#: photo21/templates/account/email.html:9 photo21/templates/base.html:59
#: photo21/templates/socialaccount/connections.html:9
#: photo21/templates/account/email.html:11 photo21/templates/base.html:63
#: photo21/templates/socialaccount/connections.html:11
msgid "Account"
msgstr ""
#: photo21/templates/account/email.html:17
#: photo21/templates/socialaccount/connections.html:17
#: photo21/templates/account/email.html:19
#: photo21/templates/socialaccount/connections.html:19
msgid "Social connections"
msgstr ""
#: photo21/templates/account/email.html:23
#: photo21/templates/account/email.html:25
msgid "The following e-mail addresses are associated with your account:"
msgstr ""
#: photo21/templates/account/email.html:34
#: photo21/templates/account/email.html:36
msgid "Verified"
msgstr ""
#: photo21/templates/account/email.html:36
#: photo21/templates/account/email.html:38
msgid "Unverified"
msgstr ""
#: photo21/templates/account/email.html:38
#: photo21/templates/account/email.html:40
msgid "Primary"
msgstr ""
#: photo21/templates/account/email.html:44
#: photo21/templates/account/email.html:46
msgid "Make Primary"
msgstr ""
#: photo21/templates/account/email.html:45
#: photo21/templates/account/email.html:47
msgid "Re-send Verification"
msgstr ""
#: photo21/templates/account/email.html:46
#: photo21/templates/socialaccount/connections.html:45
#: photo21/templates/account/email.html:48
#: photo21/templates/socialaccount/connections.html:47
msgid "Remove"
msgstr ""
#: photo21/templates/account/email.html:51
#: photo21/templates/account/email.html:53
msgid "Warning:"
msgstr ""
#: photo21/templates/account/email.html:51
#: photo21/templates/account/email.html:53
msgid ""
"You currently do not have any e-mail address set up. You should really add "
"an e-mail address so you can receive notifications, reset your password, etc."
msgstr ""
#: photo21/templates/account/email.html:55
#: photo21/templates/account/email.html:57
msgid "Add E-mail Address"
msgstr ""
#: photo21/templates/account/email.html:60
#: photo21/templates/account/email.html:62
msgid "Add E-mail"
msgstr ""
#: photo21/templates/account/email.html:68
msgid "Do you really want to remove the selected e-mail address?"
msgstr ""
#: photo21/templates/account/login.html:6
#: photo21/templates/account/login.html:11
#: photo21/templates/account/login.html:39
#: photo21/templates/account/login.html:8
#: photo21/templates/account/login.html:36
msgid "Sign In"
msgstr ""
#: photo21/templates/account/login.html:16
#: photo21/templates/account/login.html:19
#, python-format
msgid ""
"Please sign in with one of your existing third party accounts. Or, <a href="
"\"%(signup_url)s\">sign up</a> for a %(site_name)s account and sign in below:"
msgstr ""
#: photo21/templates/account/login.html:24
msgid "or"
msgstr ""
#: photo21/templates/account/login.html:30
#: photo21/templates/account/login.html:26
#, python-format
msgid ""
"If you have not created an account yet, then please <a href=\"%(signup_url)s"
"\">sign up</a> first."
msgstr ""
#: photo21/templates/account/login.html:40
#: photo21/templates/account/login.html:39
msgid "Forgot Password?"
msgstr ""
#: photo21/templates/account/login.html:44
#: photo21/templates/account/login.html:42
msgid "If any problem, please contact the server owners at"
msgstr ""
#: photo21/templates/account/logout.html:6
#: photo21/templates/account/logout.html:11
#: photo21/templates/account/logout.html:20
#: photo21/templates/account/logout.html:8
#: photo21/templates/account/logout.html:13
#: photo21/templates/account/logout.html:22
msgid "Sign Out"
msgstr ""
#: photo21/templates/account/logout.html:14
#: photo21/templates/account/logout.html:16
msgid "Are you sure you want to sign out?"
msgstr ""
#: photo21/templates/account/signup.html:6
#: photo21/templates/account/signup.html:8
msgid "Signup"
msgstr ""
#: photo21/templates/account/signup.html:11
#: photo21/templates/account/signup.html:22
#: photo21/templates/account/signup.html:13
#: photo21/templates/account/signup.html:24
msgid "Sign Up"
msgstr ""
#: photo21/templates/account/signup.html:14
#: photo21/templates/account/signup.html:16
#, python-format
msgid ""
"Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>."
msgstr ""
#: photo21/templates/base.html:12
#: photo21/templates/base.html:16
msgid "The ENS Paris-Saclay pictures server."
msgstr ""
#: photo21/templates/base.html:37
#: photo21/templates/base.html:41
msgid "Galleries"
msgstr ""
#: photo21/templates/base.html:42
#: photo21/templates/base.html:46
msgid "Upload"
msgstr ""
#: photo21/templates/base.html:47
#: photo21/templates/base.html:51
msgid "Manage"
msgstr ""
#: photo21/templates/base.html:68
#: photo21/templates/base.html:72
msgid "Log out"
msgstr ""
#: photo21/templates/base.html:78
#: photo21/templates/base.html:82
msgid "Log in"
msgstr ""
#: photo21/templates/base.html:87
#: photo21/templates/base.html:91
msgid "Sign up"
msgstr ""
#: photo21/templates/base.html:109
#: photo21/templates/base.html:116
msgid "Connected as"
msgstr ""
#: photo21/templates/base.html:118
msgid "Source code"
msgstr ""
#: photo21/templates/index.html:6
#: photo21/templates/index.html:8
msgid "Home"
msgstr ""
#: photo21/templates/index.html:9
#: photo21/templates/index.html:11
msgid "Welcome to the pictures server!"
msgstr ""
#: photo21/templates/index.html:11
#: photo21/templates/index.html:13
msgid ""
"This website aims to collect the pictures and movies taken in the student "
"life of ENS Paris-Saclay-Saclay or involving its students."
"life of ENS Paris-Saclay or involving its students."
msgstr ""
#: photo21/templates/index.html:18
#: photo21/templates/index.html:20
#, python-format
msgid ""
"The pictures are visible in <a href=\"%(gallery_archive_url)s\">the "
@ -278,47 +261,60 @@ msgid ""
"republication on another platform. </b>"
msgstr ""
#: photo21/templates/index.html:27
#: photo21/templates/index.html:29
msgid ""
"If you want a photo to be deleted, please let us know: <a href=\"mailto:"
"photos@crans.org?subject=[ABUS] Nouvelle requête\" class=\"btn btn-dark btn-"
"sm\">Abuse request</a>"
"photos@crans.org?subject=[ABUS] Nouvelle requête\" class=\"btn btn-secondary "
"btn-sm\">Abuse request</a>"
msgstr ""
#: photo21/templates/index.html:33
#: photo21/templates/index.html:36
msgid ""
"If you want to obtain the right to upload pictures, please let us know: <a "
"href=\"mailto:photos@crans.org?subject=[Photographe] Demande de droits "
"photographe\" class=\"btn btn-dark btn-sm\">Become a photograph</a>"
"photographe\" class=\"btn btn-secondary btn-sm\">Become a photograph</a>"
msgstr ""
#: photo21/templates/index.html:39
#: photo21/templates/index.html:43
msgid "Last galleries"
msgstr ""
#: photo21/templates/index.html:50
msgid "Connected as"
#: photo21/templates/index.html:52
msgid "Behind the scene"
msgstr ""
#: photo21/templates/index.html:53
msgid "Select another language:"
#: photo21/templates/index.html:54
msgid ""
"Because we value your privacy, we do not sell the data on this site, unlike "
"many free online platforms. The dedicated server running this website is "
"kindly hosted by the <a href=\"https://www.crans.org/\">Crans</a> at the ENS "
"Paris-Saclay basement. It is not managed by the Crans. Current active "
"administrators are:"
msgstr ""
#: photo21/templates/socialaccount/connections.html:6
#: photo21/templates/index.html:63
msgid "They should be contacted at"
msgstr ""
#: photo21/templates/socialaccount/connections.html:8
msgid "Account Connections"
msgstr ""
#: photo21/templates/socialaccount/connections.html:23
#: photo21/templates/socialaccount/connections.html:25
msgid ""
"You can sign in to your account using any of the following third party "
"accounts:"
msgstr ""
#: photo21/templates/socialaccount/connections.html:51
#: photo21/templates/socialaccount/connections.html:53
msgid ""
"You currently have no social network accounts connected to this account."
msgstr ""
#: photo21/templates/socialaccount/connections.html:54
#: photo21/templates/socialaccount/connections.html:56
msgid "Add a 3rd Party Account"
msgstr ""
#: photo21/templates/socialaccount/snippets/provider_list.html:20
msgid "Sign in with"
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-30 09:55+0000\n"
"POT-Creation-Date: 2022-12-25 23:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -16,259 +16,242 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: photo21/forms.py:12
#: photo21/forms.py:16
msgid ""
"Please enter a valid email address ending with `@crans.org` or `@ens-paris-"
"saclay.fr`."
msgstr ""
#: photo21/forms.py:23
#: photo21/forms.py:29
msgid "Must end with `@crans.org` or `@ens-paris-saclay.fr`."
msgstr ""
#: photo21/hashers.py:42
msgid "algorithm"
msgstr ""
#: photo21/hashers.py:43
msgid "salt"
msgstr ""
#: photo21/hashers.py:44
msgid "hash"
msgstr ""
#: photo21/settings.py:161
#: photo21/settings.py:151
msgid "German"
msgstr ""
#: photo21/settings.py:162
#: photo21/settings.py:152
msgid "English"
msgstr ""
#: photo21/settings.py:163
#: photo21/settings.py:153
msgid "Spanish"
msgstr ""
#: photo21/settings.py:164
#: photo21/settings.py:154
msgid "French"
msgstr ""
#: photo21/templates/400.html:10
#: photo21/templates/400.html:12
msgid "Bad request"
msgstr ""
#: photo21/templates/400.html:14
#: photo21/templates/400.html:16
msgid ""
"Sorry, your request was bad. Don't know what could be wrong. An email has "
"been sent to webmasters with the details of the error. You can now drink a "
"coke."
msgstr ""
#: photo21/templates/403.html:10
#: photo21/templates/403.html:12
msgid "Permission denied"
msgstr ""
#: photo21/templates/403.html:13
#: photo21/templates/403.html:15
msgid "You don't have the right to perform this request."
msgstr ""
#: photo21/templates/403.html:15 photo21/templates/404.html:19
#: photo21/templates/403.html:17 photo21/templates/404.html:21
msgid "Exception message:"
msgstr ""
#: photo21/templates/404.html:10
#: photo21/templates/404.html:12
msgid "Page not found"
msgstr ""
#: photo21/templates/404.html:14
#: photo21/templates/404.html:16
#, python-format
msgid ""
"The requested path <code>%(request_path)s</code> was not found on the server."
msgstr ""
#: photo21/templates/500.html:10
#: photo21/templates/500.html:12
msgid "Server error"
msgstr ""
#: photo21/templates/500.html:14
#: photo21/templates/500.html:16
msgid ""
"Sorry, an error occurred when processing your request. An email has been "
"sent to webmasters with the detail of the error, and this will be fixed "
"soon. You can now drink a beer."
msgstr ""
#: photo21/templates/account/email.html:6
#: photo21/templates/account/email.html:14
#: photo21/templates/socialaccount/connections.html:14
#: photo21/templates/account/email.html:8
#: photo21/templates/account/email.html:16
#: photo21/templates/socialaccount/connections.html:16
msgid "E-mail Addresses"
msgstr ""
#: photo21/templates/account/email.html:9 photo21/templates/base.html:59
#: photo21/templates/socialaccount/connections.html:9
#: photo21/templates/account/email.html:11 photo21/templates/base.html:63
#: photo21/templates/socialaccount/connections.html:11
msgid "Account"
msgstr ""
#: photo21/templates/account/email.html:17
#: photo21/templates/socialaccount/connections.html:17
#: photo21/templates/account/email.html:19
#: photo21/templates/socialaccount/connections.html:19
msgid "Social connections"
msgstr ""
#: photo21/templates/account/email.html:23
#: photo21/templates/account/email.html:25
msgid "The following e-mail addresses are associated with your account:"
msgstr ""
#: photo21/templates/account/email.html:34
#: photo21/templates/account/email.html:36
msgid "Verified"
msgstr ""
#: photo21/templates/account/email.html:36
#: photo21/templates/account/email.html:38
msgid "Unverified"
msgstr ""
#: photo21/templates/account/email.html:38
#: photo21/templates/account/email.html:40
msgid "Primary"
msgstr ""
#: photo21/templates/account/email.html:44
#: photo21/templates/account/email.html:46
msgid "Make Primary"
msgstr ""
#: photo21/templates/account/email.html:45
#: photo21/templates/account/email.html:47
msgid "Re-send Verification"
msgstr ""
#: photo21/templates/account/email.html:46
#: photo21/templates/socialaccount/connections.html:45
#: photo21/templates/account/email.html:48
#: photo21/templates/socialaccount/connections.html:47
msgid "Remove"
msgstr ""
#: photo21/templates/account/email.html:51
#: photo21/templates/account/email.html:53
msgid "Warning:"
msgstr ""
#: photo21/templates/account/email.html:51
#: photo21/templates/account/email.html:53
msgid ""
"You currently do not have any e-mail address set up. You should really add "
"an e-mail address so you can receive notifications, reset your password, etc."
msgstr ""
#: photo21/templates/account/email.html:55
#: photo21/templates/account/email.html:57
msgid "Add E-mail Address"
msgstr ""
#: photo21/templates/account/email.html:60
#: photo21/templates/account/email.html:62
msgid "Add E-mail"
msgstr ""
#: photo21/templates/account/email.html:68
msgid "Do you really want to remove the selected e-mail address?"
msgstr ""
#: photo21/templates/account/login.html:6
#: photo21/templates/account/login.html:11
#: photo21/templates/account/login.html:39
#: photo21/templates/account/login.html:8
#: photo21/templates/account/login.html:36
msgid "Sign In"
msgstr ""
#: photo21/templates/account/login.html:16
#: photo21/templates/account/login.html:19
#, python-format
msgid ""
"Please sign in with one of your existing third party accounts. Or, <a href="
"\"%(signup_url)s\">sign up</a> for a %(site_name)s account and sign in below:"
msgstr ""
#: photo21/templates/account/login.html:24
msgid "or"
msgstr ""
#: photo21/templates/account/login.html:30
#: photo21/templates/account/login.html:26
#, python-format
msgid ""
"If you have not created an account yet, then please <a href=\"%(signup_url)s"
"\">sign up</a> first."
msgstr ""
#: photo21/templates/account/login.html:40
#: photo21/templates/account/login.html:39
msgid "Forgot Password?"
msgstr ""
#: photo21/templates/account/login.html:44
#: photo21/templates/account/login.html:42
msgid "If any problem, please contact the server owners at"
msgstr ""
#: photo21/templates/account/logout.html:6
#: photo21/templates/account/logout.html:11
#: photo21/templates/account/logout.html:20
#: photo21/templates/account/logout.html:8
#: photo21/templates/account/logout.html:13
#: photo21/templates/account/logout.html:22
msgid "Sign Out"
msgstr ""
#: photo21/templates/account/logout.html:14
#: photo21/templates/account/logout.html:16
msgid "Are you sure you want to sign out?"
msgstr ""
#: photo21/templates/account/signup.html:6
#: photo21/templates/account/signup.html:8
msgid "Signup"
msgstr ""
#: photo21/templates/account/signup.html:11
#: photo21/templates/account/signup.html:22
#: photo21/templates/account/signup.html:13
#: photo21/templates/account/signup.html:24
msgid "Sign Up"
msgstr ""
#: photo21/templates/account/signup.html:14
#: photo21/templates/account/signup.html:16
#, python-format
msgid ""
"Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>."
msgstr ""
#: photo21/templates/base.html:12
#: photo21/templates/base.html:16
msgid "The ENS Paris-Saclay pictures server."
msgstr ""
#: photo21/templates/base.html:37
#: photo21/templates/base.html:41
msgid "Galleries"
msgstr ""
#: photo21/templates/base.html:42
#: photo21/templates/base.html:46
msgid "Upload"
msgstr ""
#: photo21/templates/base.html:47
#: photo21/templates/base.html:51
msgid "Manage"
msgstr ""
#: photo21/templates/base.html:68
#: photo21/templates/base.html:72
msgid "Log out"
msgstr ""
#: photo21/templates/base.html:78
#: photo21/templates/base.html:82
msgid "Log in"
msgstr ""
#: photo21/templates/base.html:87
#: photo21/templates/base.html:91
msgid "Sign up"
msgstr ""
#: photo21/templates/base.html:109
#: photo21/templates/base.html:116
msgid "Connected as"
msgstr ""
#: photo21/templates/base.html:118
msgid "Source code"
msgstr ""
#: photo21/templates/index.html:6
#: photo21/templates/index.html:8
msgid "Home"
msgstr ""
#: photo21/templates/index.html:9
#: photo21/templates/index.html:11
msgid "Welcome to the pictures server!"
msgstr ""
#: photo21/templates/index.html:11
#: photo21/templates/index.html:13
msgid ""
"This website aims to collect the pictures and movies taken in the student "
"life of ENS Paris-Saclay-Saclay or involving its students."
"life of ENS Paris-Saclay or involving its students."
msgstr ""
#: photo21/templates/index.html:18
#: photo21/templates/index.html:20
#, python-format
msgid ""
"The pictures are visible in <a href=\"%(gallery_archive_url)s\">the "
@ -277,47 +260,60 @@ msgid ""
"republication on another platform. </b>"
msgstr ""
#: photo21/templates/index.html:27
#: photo21/templates/index.html:29
msgid ""
"If you want a photo to be deleted, please let us know: <a href=\"mailto:"
"photos@crans.org?subject=[ABUS] Nouvelle requête\" class=\"btn btn-dark btn-"
"sm\">Abuse request</a>"
"photos@crans.org?subject=[ABUS] Nouvelle requête\" class=\"btn btn-secondary "
"btn-sm\">Abuse request</a>"
msgstr ""
#: photo21/templates/index.html:33
#: photo21/templates/index.html:36
msgid ""
"If you want to obtain the right to upload pictures, please let us know: <a "
"href=\"mailto:photos@crans.org?subject=[Photographe] Demande de droits "
"photographe\" class=\"btn btn-dark btn-sm\">Become a photograph</a>"
"photographe\" class=\"btn btn-secondary btn-sm\">Become a photograph</a>"
msgstr ""
#: photo21/templates/index.html:39
#: photo21/templates/index.html:43
msgid "Last galleries"
msgstr ""
#: photo21/templates/index.html:50
msgid "Connected as"
#: photo21/templates/index.html:52
msgid "Behind the scene"
msgstr ""
#: photo21/templates/index.html:53
msgid "Select another language:"
#: photo21/templates/index.html:54
msgid ""
"Because we value your privacy, we do not sell the data on this site, unlike "
"many free online platforms. The dedicated server running this website is "
"kindly hosted by the <a href=\"https://www.crans.org/\">Crans</a> at the ENS "
"Paris-Saclay basement. It is not managed by the Crans. Current active "
"administrators are:"
msgstr ""
#: photo21/templates/socialaccount/connections.html:6
#: photo21/templates/index.html:63
msgid "They should be contacted at"
msgstr ""
#: photo21/templates/socialaccount/connections.html:8
msgid "Account Connections"
msgstr ""
#: photo21/templates/socialaccount/connections.html:23
#: photo21/templates/socialaccount/connections.html:25
msgid ""
"You can sign in to your account using any of the following third party "
"accounts:"
msgstr ""
#: photo21/templates/socialaccount/connections.html:51
#: photo21/templates/socialaccount/connections.html:53
msgid ""
"You currently have no social network accounts connected to this account."
msgstr ""
#: photo21/templates/socialaccount/connections.html:54
#: photo21/templates/socialaccount/connections.html:56
msgid "Add a 3rd Party Account"
msgstr ""
#: photo21/templates/socialaccount/snippets/provider_list.html:20
msgid "Sign in with"
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-17 09:13+0000\n"
"POT-Creation-Date: 2022-12-25 23:02+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -29,31 +29,19 @@ msgstr ""
msgid "Must end with `@crans.org` or `@ens-paris-saclay.fr`."
msgstr "Doit finir par `@crans.org` ou `@ens-paris-saclay.fr`."
#: photo21/hashers.py:48
msgid "algorithm"
msgstr ""
#: photo21/hashers.py:49
msgid "salt"
msgstr ""
#: photo21/hashers.py:50
msgid "hash"
msgstr ""
#: photo21/settings.py:157
#: photo21/settings.py:151
msgid "German"
msgstr ""
#: photo21/settings.py:158
#: photo21/settings.py:152
msgid "English"
msgstr ""
#: photo21/settings.py:159
#: photo21/settings.py:153
msgid "Spanish"
msgstr ""
#: photo21/settings.py:160
#: photo21/settings.py:154
msgid "French"
msgstr ""
@ -107,7 +95,7 @@ msgstr ""
msgid "E-mail Addresses"
msgstr ""
#: photo21/templates/account/email.html:11 photo21/templates/base.html:64
#: photo21/templates/account/email.html:11 photo21/templates/base.html:63
#: photo21/templates/socialaccount/connections.html:11
msgid "Account"
msgstr "Compte"
@ -158,19 +146,18 @@ msgstr ""
#: photo21/templates/account/email.html:57
msgid "Add E-mail Address"
msgstr ""
msgstr "Ajouter une Adresse E-mail"
#: photo21/templates/account/email.html:62
msgid "Add E-mail"
msgstr ""
msgstr "Ajouter un E-mail"
#: photo21/templates/account/login.html:8
#: photo21/templates/account/login.html:13
#: photo21/templates/account/login.html:41
#: photo21/templates/account/login.html:36
msgid "Sign In"
msgstr ""
msgstr "Se Connecter"
#: photo21/templates/account/login.html:18
#: photo21/templates/account/login.html:19
#, python-format
msgid ""
"Please sign in with one of your existing third party accounts. Or, <a href="
@ -181,10 +168,6 @@ msgstr ""
"identifiez-vous ci-dessous :"
#: photo21/templates/account/login.html:26
msgid "or"
msgstr ""
#: photo21/templates/account/login.html:32
#, python-format
msgid ""
"If you have not created an account yet, then please <a href=\"%(signup_url)s"
@ -193,11 +176,11 @@ msgstr ""
"Si vous n'avez pas déjà créé de compte, veuillez vous <a href="
"\"%(signup_url)s\">inscrire</a>."
#: photo21/templates/account/login.html:42
#: photo21/templates/account/login.html:39
msgid "Forgot Password?"
msgstr ""
msgstr "Mot de passe oublié ?"
#: photo21/templates/account/login.html:46
#: photo21/templates/account/login.html:42
msgid "If any problem, please contact the server owners at"
msgstr "En cas de problème, contactez les administrateurs à"
@ -230,35 +213,35 @@ msgstr ""
msgid "The ENS Paris-Saclay pictures server."
msgstr ""
#: photo21/templates/base.html:42
#: photo21/templates/base.html:41
msgid "Galleries"
msgstr "Galeries"
#: photo21/templates/base.html:47
#: photo21/templates/base.html:46
msgid "Upload"
msgstr "Téléversement"
#: photo21/templates/base.html:52
#: photo21/templates/base.html:51
msgid "Manage"
msgstr "Gestion"
#: photo21/templates/base.html:73
#: photo21/templates/base.html:72
msgid "Log out"
msgstr ""
#: photo21/templates/base.html:83
#: photo21/templates/base.html:82
msgid "Log in"
msgstr ""
#: photo21/templates/base.html:92
#: photo21/templates/base.html:91
msgid "Sign up"
msgstr "Inscription"
#: photo21/templates/base.html:117
#: photo21/templates/base.html:116
msgid "Connected as"
msgstr "Connecté en tant que"
#: photo21/templates/base.html:119
#: photo21/templates/base.html:118
msgid "Source code"
msgstr "Code source"
@ -294,23 +277,23 @@ msgstr ""
#: photo21/templates/index.html:29
msgid ""
"If you want a photo to be deleted, please let us know: <a href=\"mailto:"
"photos@crans.org?subject=[ABUS] Nouvelle requête\" class=\"btn btn-dark btn-"
"sm\">Abuse request</a>"
"photos@crans.org?subject=[ABUS] Nouvelle requête\" class=\"btn btn-secondary "
"btn-sm\">Abuse request</a>"
msgstr ""
"Si vous souhaitez qu'une photo soit supprimée, signalez le nous : <a href="
"\"mailto:photos@crans.org?subject=[ABUS] Nouvelle requête\" class=\"btn btn-"
"dark btn-sm\">Signaler un abus</a>"
"secondary btn-sm\">Signaler un abus</a>"
#: photo21/templates/index.html:36
msgid ""
"If you want to obtain the right to upload pictures, please let us know: <a "
"href=\"mailto:photos@crans.org?subject=[Photographe] Demande de droits "
"photographe\" class=\"btn btn-dark btn-sm\">Become a photograph</a>"
"photographe\" class=\"btn btn-secondary btn-sm\">Become a photograph</a>"
msgstr ""
"Si vous souhaitez obtenir les droits photographes pour téléverser vos "
"photos, signalez le nous : <a href=\"mailto:photos@crans.org?"
"subject=[Photographe] Demande de droits photographe\" class=\"btn btn-dark "
"btn-sm\">Devenir photographe</a>"
"subject=[Photographe] Demande de droits photographe\" class=\"btn btn-"
"secondary btn-sm\">Devenir photographe</a>"
#: photo21/templates/index.html:43
msgid "Last galleries"
@ -357,3 +340,7 @@ msgstr ""
#: photo21/templates/socialaccount/connections.html:56
msgid "Add a 3rd Party Account"
msgstr ""
#: photo21/templates/socialaccount/snippets/provider_list.html:20
msgid "Sign in with"
msgstr "Se Connecter avec"

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -4,6 +4,18 @@ Copyright (C) 2022 Amicale des élèves de l'ENS Paris-Saclay
SPDX-License-Identifier: GPL-3.0-or-later
*/
/* Use dark scrollbar */
:root {
color-scheme: dark;
}
/* Bootstrap icons */
.bi {
display: inline-block;
vertical-align: -0.125em;
fill: currentcolor;
}
/* Login view */
.login {
max-width: 35rem;

View file

@ -28,9 +28,9 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% csrf_token %}
<fieldset class="blockLabels">
{% for emailaddress in user.emailaddress_set.all %}
<div class="ctrlHolder">
<label for="email_radio_{{forloop.counter}}" class="{% if emailaddress.primary %}primary_email{%endif%}">
<input id="email_radio_{{forloop.counter}}" type="radio" name="email" {% if emailaddress.primary or user.emailaddress_set.count == 1 %}checked="checked"{%endif %} value="{{emailaddress.email}}"/>
<div class="form-check">
<input class="form-check-input" id="email_radio_{{forloop.counter}}" type="radio" name="email" {% if emailaddress.primary or user.emailaddress_set.count == 1 %}checked="checked"{% endif %} value="{{ emailaddress.email }}"/>
<label class="form-check-label" for="email_radio_{{forloop.counter}}">
{{ emailaddress.email }}
{% if emailaddress.verified %}
<span class="badge bg-success">{% trans "Verified" %}</span>
@ -41,7 +41,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
</label>
</div>
{% endfor %}
<div class="mt-2 mb-4">
<button class="btn btn-sm btn-secondary" type="submit" name="action_primary" >{% trans 'Make Primary' %}</button>
<button class="btn btn-sm btn-secondary" type="submit" name="action_send" >{% trans 'Re-send Verification' %}</button>
@ -52,10 +52,10 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% else %}
<p><strong>{% trans 'Warning:'%}</strong> {% trans "You currently do not have any e-mail address set up. You should really add an e-mail address so you can receive notifications, reset your password, etc." %}</p>
{% endif %}
{% if can_add_email %}
<h2>{% trans "Add E-mail Address" %}</h2>
<form method="post" action="{% url 'account_email' %}" class="add_email">
{% csrf_token %}
{{ form|crispy }}

View file

@ -9,22 +9,16 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% block content %}
<div class="card mx-auto login">
<h3 class="card-header text-center">
{% trans "Sign In" %}
</h3>
<div class="card-body">
{% get_providers as socialaccount_providers %}
{% if socialaccount_providers %}
<p>{% blocktrans trimmed with site.name as site_name %}Please sign in with one
of your existing third party accounts. Or, <a href="{{ signup_url }}">sign up</a>
for a {{ site_name }} account and sign in below:{% endblocktrans %}</p>
<div class="socialaccount_ballot">
<ul class="socialaccount_providers">
<div class="d-grid col-6 mx-auto">
{% include "socialaccount/snippets/provider_list.html" with process="login" %}
</ul>
<div class="login-or">{% trans 'or' %}</div>
</div>
<hr/>
<p>{% blocktrans trimmed with site.name as site_name %}Please sign in with one
of your existing third party accounts. Or, <a href="{{ signup_url }}">sign up</a>
for a {{ site_name }} account and sign in below:{% endblocktrans %}</p>
{% include "socialaccount/snippets/login_extra.html" %}
@ -38,9 +32,11 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
{% endif %}
<button type="submit" class="btn btn-primary mt-2">{% trans "Sign In" %}</button>
<a class="btn mt-2" href="{% url 'account_reset_password' %}">{% trans "Forgot Password?" %}</a>
<div class="d-grid col-6 mx-auto">
<button type="submit" class="btn btn-primary btn-lg my-2">{% trans "Sign In" %}</button>
</div>
</form>
<a class="link-secondary" href="{% url 'account_reset_password' %}">{% trans "Forgot Password?" %}</a>
</div>
</div>
<p class="small text-center mt-1">{% trans "If any problem, please contact the server owners at" %} <code>photos[at]crans.org</code>.</p>

View file

@ -6,7 +6,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% load static i18n %}
<!DOCTYPE html>
{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %}
<html lang="{{ LANGUAGE_CODE|default:"en" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
<html lang="{{ LANGUAGE_CODE|default:"en" }}"{% if LANGUAGE_BIDI %} dir="rtl"{% endif %} data-bs-theme="dark">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
@ -15,7 +15,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
<title>{% block title %}{{ title }}{% endblock title %} - {{ request.site.name }}</title>
<meta name="description" content="{% trans "The ENS Paris-Saclay pictures server." %}">
<link rel="stylesheet" href="{% static "bootstrap5/css/bootstrap.min.css" %}">
<link rel="stylesheet" href="{% static "bootstrap5/css/bootstrap-dark-plugin.min.css" %}">
<link rel="stylesheet" href="{% static "layout.css" %}">
<link rel="icon" type="image/png" sizes="16x16" href="{% static "favicon-16x16.png" %}">
<link rel="icon" type="image/png" sizes="32x32" href="{% static "favicon-32x32.png" %}">
@ -23,7 +22,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% block extracss %}{% endblock %}
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark py-0">
<nav class="navbar navbar-expand-lg bg-body-tertiary py-0">
<div class="container">
<a class="navbar-brand" href="{% url 'index' %}">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 16 20">
@ -132,7 +131,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
</footer>
<script src="{% static "lang-select.js" %}"></script>
<script src="{% static "bootstrap5/js/bootstrap.min.js" %}"></script>
<script src="{% static "bootstrap5/js/bootstrap.bundle.min.js" %}"></script>
{% block extrajs %}{% endblock %}
</body>
</html>

View file

@ -10,33 +10,33 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% block content %}
<h2>{% trans "Welcome to the pictures server!" %}</h2>
<p>
{% blocktranslate trimmed %}
{% blocktrans trimmed %}
This website aims to collect the pictures and movies taken in the student
life of ENS Paris-Saclay or involving its students.
{% endblocktranslate %}
{% endblocktrans %}
</p>
<p>
{% url 'photologue:pl-gallery-archive' as gallery_archive_url %}
{% blocktranslate trimmed %}
{% blocktrans trimmed %}
The pictures are visible in <a href="{{ gallery_archive_url }}">the galleries</a>
and are downloadable.
<b>However, the agreement of the photographer and the persons present
on the photo is necessary before any republication on another platform. </b>
{% endblocktranslate %}
{% endblocktrans %}
</p>
<p>
{% blocktranslate trimmed %}
{% blocktrans trimmed %}
If you want a photo to be deleted, please let us know:
<a href="mailto:photos@crans.org?subject=[ABUS] Nouvelle requête" class="btn btn-dark btn-sm">Abuse request</a>
{% endblocktranslate %}
<a href="mailto:photos@crans.org?subject=[ABUS] Nouvelle requête" class="btn btn-secondary btn-sm">Abuse request</a>
{% endblocktrans %}
</p>
{% if not perms.photologue.add_photo %}
<p>
{% blocktranslate trimmed %}
{% blocktrans trimmed %}
If you want to obtain the right to upload pictures, please let us know:
<a href="mailto:photos@crans.org?subject=[Photographe] Demande de droits photographe" class="btn btn-dark btn-sm">Become a photograph</a>
{% endblocktranslate %}
<a href="mailto:photos@crans.org?subject=[Photographe] Demande de droits photographe" class="btn btn-secondary btn-sm">Become a photograph</a>
{% endblocktrans %}
</p>
{% endif %}
@ -51,14 +51,14 @@ SPDX-License-Identifier: GPL-3.0-or-later
<h3 class="mt-4">{% trans "Behind the scene" %}</h3>
<p>
{% blocktranslate trimmed %}
{% blocktrans trimmed %}
Because we value your privacy, we do not sell the data on this site,
unlike many free online platforms.
The dedicated server running this website is kindly hosted by the
<a href="https://www.crans.org/">Crans</a> at the ENS Paris-Saclay
basement.
It is not managed by the Crans. Current active administrators are:
{% endblocktranslate %}
{% endblocktrans %}
{% for user in superusers %} <code>{{ user.username }}</code>{% endfor %}.
{% trans "They should be contacted at" %}
<a href="mailto:photos@crans.org">photos@crans.org</a>.

View file

@ -0,0 +1,21 @@
{% comment %}
This file is part of photo21
Copyright (C) 2022 Amicale des élèves de l'ENS Paris-Saclay
SPDX-License-Identifier: GPL-3.0-or-later
{% endcomment %}
{% load i18n socialaccount %}
{% get_providers as socialaccount_providers %}
{% for provider in socialaccount_providers %}
{% if provider.id == "openid" %}
{% for brand in provider.get_brands %}
<a title="{{brand.name}}"
class="btn btn-success"
href="{% provider_login_url provider.id openid=brand.openid_url process=process %}"
>{{brand.name}}</a>
{% endfor %}
{% endif %}
<a title="{{provider.name}}" class="btn btn-success"
href="{% provider_login_url provider.id process=process scope=scope auth_params=auth_params %}">{% trans "Sign in with" %} {{provider.name}}</a>
{% endfor %}

View file

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Photologue\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-30 09:55+0000\n"
"POT-Creation-Date: 2022-12-25 23:02+0000\n"
"PO-Revision-Date: 2017-12-03 14:47+0000\n"
"Last-Translator: Richard Barran <richard@arbee-design.co.uk>\n"
"Language-Team: German (http://www.transifex.com/richardbarran/django-"
@ -22,79 +22,135 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: photologue/admin.py:30 photologue/models.py:499
#: photologue/admin.py:26 photologue/models.py:162 photologue/models.py:772
msgid "tags"
msgstr ""
#: photologue/admin.py:50 photologue/models.py:521
msgid "owner"
msgstr ""
#: photologue/models.py:84
#: photologue/forms.py:29
msgid "Gallery"
msgstr "Galerie"
#: photologue/forms.py:31
msgid "-- Create a new gallery --"
msgstr ""
#: photologue/forms.py:33
msgid ""
"Select a gallery to add these images to. Leave this empty to create a new "
"gallery from the supplied title."
msgstr ""
"Wähle eine Galerie aus, zu der diese Bilder hinzugefügt werden sollen. Lasse "
"dieses Feld leer, um eine neue Galerie mit dem angegeben Titel zu erzeugen."
#: photologue/forms.py:38
msgid "New gallery title"
msgstr ""
#: photologue/forms.py:43
msgid "New gallery event start date"
msgstr ""
#: photologue/forms.py:48
msgid "New gallery event end date"
msgstr ""
#: photologue/forms.py:54
msgid "New gallery tags"
msgstr ""
#: photologue/forms.py:57
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
#: photologue/forms.py:75 photologue/templates/photologue/upload.html:8
#: photologue/templates/photologue/upload.html:15
msgid "Upload"
msgstr "Hochladen"
#: photologue/forms.py:81
msgid "A gallery with that title already exists."
msgstr "Es existiert bereits eine Gallerie mit diesem Titel."
#: photologue/forms.py:93
msgid "Select an existing gallery, or enter a title for a new gallery."
msgstr ""
"Wähle eine existierende Galerie aus oder gib einen Titel für eine neue "
"Galerie ein."
#: photologue/models.py:82
msgid "Very Low"
msgstr "Sehr niedrig"
#: photologue/models.py:85
#: photologue/models.py:83
msgid "Low"
msgstr "Niedrig"
#: photologue/models.py:86
#: photologue/models.py:84
msgid "Medium-Low"
msgstr "Mittel-niedrig"
#: photologue/models.py:87
#: photologue/models.py:85
msgid "Medium"
msgstr "Mittel"
#: photologue/models.py:88
#: photologue/models.py:86
msgid "Medium-High"
msgstr "Mittel-hoch"
#: photologue/models.py:89
#: photologue/models.py:87
msgid "High"
msgstr "Hoch"
#: photologue/models.py:90
#: photologue/models.py:88
msgid "Very High"
msgstr "Sehr hoch"
#: photologue/models.py:95
#: photologue/models.py:93
msgid "Top"
msgstr "Oben"
#: photologue/models.py:96
#: photologue/models.py:94
msgid "Right"
msgstr "Rechts"
#: photologue/models.py:97
#: photologue/models.py:95
msgid "Bottom"
msgstr "Unten"
#: photologue/models.py:98
#: photologue/models.py:96
msgid "Left"
msgstr "Links"
#: photologue/models.py:99
#: photologue/models.py:97
msgid "Center (Default)"
msgstr "Mitte (Standard)"
#: photologue/models.py:103
#: photologue/models.py:101
msgid "Flip left to right"
msgstr "Horizontal spiegeln"
#: photologue/models.py:104
#: photologue/models.py:102
msgid "Flip top to bottom"
msgstr "Vertikal spiegeln"
#: photologue/models.py:105
#: photologue/models.py:103
msgid "Rotate 90 degrees counter-clockwise"
msgstr "Um 90° nach links drehen"
#: photologue/models.py:106
#: photologue/models.py:104
msgid "Rotate 90 degrees clockwise"
msgstr "Um 90° nach rechts drehen"
#: photologue/models.py:107
#: photologue/models.py:105
msgid "Rotate 180 degrees"
msgstr "Um 180° drehen"
#: photologue/models.py:117
#: photologue/models.py:119
#, python-format
msgid ""
"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-"
@ -105,11 +161,7 @@ msgstr ""
"\". Bildfilter werden nach der Reihe angewendet. Folgende Filter sind "
"verfügbar: %s."
#: photologue/models.py:139
msgid "date published"
msgstr "Veröffentlichungsdatum"
#: photologue/models.py:141 photologue/models.py:485
#: photologue/models.py:142 photologue/models.py:509
msgid "title"
msgstr "Titel"
@ -117,110 +169,108 @@ msgstr "Titel"
msgid "title slug"
msgstr "Kurztitel"
#: photologue/models.py:147 photologue/models.py:491 photologue/models.py:697
#: photologue/models.py:147 photologue/models.py:514 photologue/models.py:766
msgid "A \"slug\" is a unique URL-friendly title for an object."
msgstr ""
"Ein Kurztitel (\"slug\") ist ein eindeutiger, URL-geeigneter Titel für ein "
"Objekt."
#: photologue/models.py:150
#: photologue/models.py:151
msgid "start date"
msgstr ""
#: photologue/models.py:155
#: photologue/models.py:156
msgid "end date"
msgstr ""
#: photologue/models.py:157
#: photologue/models.py:158
msgid "description"
msgstr "Beschreibung"
#: photologue/models.py:162 photologue/models.py:703
msgid "tags"
msgstr ""
#: photologue/models.py:165 photologue/models.py:506
msgid "is public"
msgstr "ist öffentlich"
#: photologue/models.py:167
msgid "Public galleries will be displayed in the default views."
msgstr "Öffentliche Galerien werden in den Standard-Views angezeigt."
#: photologue/models.py:171 photologue/models.py:514
#: photologue/models.py:168 photologue/models.py:540
msgid "photos"
msgstr "Fotos"
#: photologue/models.py:177
#: photologue/models.py:175
msgid "gallery"
msgstr "Galerie"
#: photologue/models.py:178
#: photologue/models.py:176
msgid "galleries"
msgstr "Galerien"
#: photologue/models.py:213
#: photologue/models.py:206
msgid "count"
msgstr "Anzahl"
#: photologue/models.py:221
#: photologue/models.py:207
#, fuzzy
#| msgid "view count"
msgid "private count"
msgstr "Anzahl an Aufrufen"
#: photologue/models.py:212
msgid "image"
msgstr "Bild"
#: photologue/models.py:224
#: photologue/models.py:215
msgid "date taken"
msgstr "Aufnahmedatum"
#: photologue/models.py:227
#: photologue/models.py:218
msgid "Date image was taken; is obtained from the image EXIF data."
msgstr ""
"Datum, an dem das Foto geschossen wurde; ausgelesen aus den EXIF-Daten."
#: photologue/models.py:228
#: photologue/models.py:220
msgid "view count"
msgstr "Anzahl an Aufrufen"
#: photologue/models.py:231
#: photologue/models.py:222
msgid "crop from"
msgstr "Beschneiden von"
#: photologue/models.py:254
#: photologue/models.py:246
msgid "An \"admin_thumbnail\" photo size has not been defined."
msgstr "Es ist keine Fotogröße \"admin_thumbnail\" definiert."
#: photologue/models.py:261
#: photologue/models.py:259
msgid "Thumbnail"
msgstr "Vorschaubild"
#: photologue/models.py:488 photologue/models.py:696
#: photologue/models.py:511 photologue/models.py:765
msgid "slug"
msgstr "Kurztitel"
#: photologue/models.py:492
#: photologue/models.py:516
msgid "caption"
msgstr "Bildunterschrift"
#: photologue/models.py:494
#: photologue/models.py:517
msgid "date added"
msgstr "Datum des Eintrags"
#: photologue/models.py:504
#: photologue/models.py:526
msgid "license"
msgstr ""
#: photologue/models.py:508
#: photologue/models.py:529
msgid "is public"
msgstr "ist öffentlich"
#: photologue/models.py:531
msgid "Public photographs will be displayed in the default views."
msgstr "Öffentliche Fotos werden in den Standard-Views angezeigt."
#: photologue/models.py:513
#: photologue/models.py:539
msgid "photo"
msgstr "Foto"
#: photologue/models.py:575 photologue/models.py:691
#: photologue/models.py:602 photologue/models.py:760
msgid "name"
msgstr "Name"
#: photologue/models.py:579
#: photologue/models.py:606
msgid ""
"Photo size name should contain only letters, numbers and underscores. "
"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"."
@ -229,41 +279,41 @@ msgstr ""
"enthalten. Beispiele: \"thumbnail\", \"display\", \"small\", "
"\"main_page_widget\"."
#: photologue/models.py:586
#: photologue/models.py:618
msgid "width"
msgstr "Breite"
#: photologue/models.py:589
#: photologue/models.py:621
msgid ""
"If width is set to \"0\" the image will be scaled to the supplied height."
msgstr ""
"Wenn die Breite auf \"0\" gesetzt ist, wird das Bild proportional auf die "
"angebene Höhe skaliert."
#: photologue/models.py:590
#: photologue/models.py:625
msgid "height"
msgstr "Höhe"
#: photologue/models.py:593
#: photologue/models.py:628
msgid ""
"If height is set to \"0\" the image will be scaled to the supplied width"
msgstr ""
"Wenn die Höhe auf \"0\" gesetzt ist, wird das Bild proportional auf die "
"angebene Breite skaliert."
#: photologue/models.py:594
#: photologue/models.py:632
msgid "quality"
msgstr "Qualität"
#: photologue/models.py:597
#: photologue/models.py:635
msgid "JPEG image quality."
msgstr "JPEG-Bildqualität"
#: photologue/models.py:598
#: photologue/models.py:638
msgid "upscale images?"
msgstr "Bilder hochskalieren?"
#: photologue/models.py:600
#: photologue/models.py:641
msgid ""
"If selected the image will be scaled up if necessary to fit the supplied "
"dimensions. Cropped sizes will be upscaled regardless of this setting."
@ -272,32 +322,32 @@ msgstr ""
"Beschnittene Größen werden unabhängig von dieser Einstellung bei Bedarf "
"hochskaliert."
#: photologue/models.py:604
#: photologue/models.py:647
msgid "crop to fit?"
msgstr "Zuschneiden?"
#: photologue/models.py:606
#: photologue/models.py:650
msgid ""
"If selected the image will be scaled and cropped to fit the supplied "
"dimensions."
msgstr ""
"Soll das Bild auf das angegebene Format skaliert und beschnitten werden?"
#: photologue/models.py:608
#: photologue/models.py:655
msgid "pre-cache?"
msgstr "Vorausspeichern?"
#: photologue/models.py:610
#: photologue/models.py:658
msgid "If selected this photo size will be pre-cached as photos are added."
msgstr ""
"Soll diese Bildgröße im Voraus gespeichert (pre-cached) werden, wenn Fotos "
"hinzugefügt werden?"
#: photologue/models.py:611
#: photologue/models.py:662
msgid "increment view count?"
msgstr "Bildzähler?"
#: photologue/models.py:613
#: photologue/models.py:665
msgid ""
"If selected the image's \"view_count\" will be incremented when this photo "
"size is displayed."
@ -305,127 +355,92 @@ msgstr ""
"Soll der Ansichts-Zähler (view-count) hochgezählt werden, wenn ein Foto "
"dieser Größe angezeigt wird?"
#: photologue/models.py:618
#: photologue/models.py:672
msgid "photo size"
msgstr "Foto-Größe"
#: photologue/models.py:619
#: photologue/models.py:673
msgid "photo sizes"
msgstr "Foto-Größen"
#: photologue/models.py:636
#: photologue/models.py:691
msgid "Can only crop photos if both width and height dimensions are set."
msgstr ""
"Fotos können nur zugeschnitten werden, wenn Breite und Höhe angegeben sind."
#: photologue/models.py:702
#: photologue/models.py:771
msgid "tag"
msgstr ""
#: photologue_custom/forms.py:22
msgid "Gallery"
msgstr "Galerie"
#: photologue_custom/forms.py:24
msgid "-- Create a new gallery --"
msgstr ""
#: photologue_custom/forms.py:25
msgid ""
"Select a gallery to add these images to. Leave this empty to create a new "
"gallery from the supplied title."
msgstr ""
"Wähle eine Galerie aus, zu der diese Bilder hinzugefügt werden sollen. Lasse "
"dieses Feld leer, um eine neue Galerie mit dem angegeben Titel zu erzeugen."
#: photologue_custom/forms.py:29
msgid "New gallery title"
msgstr ""
#: photologue_custom/forms.py:34
msgid "New gallery event start date"
msgstr ""
#: photologue_custom/forms.py:39
msgid "New gallery event end date"
msgstr ""
#: photologue_custom/forms.py:45
msgid "New gallery tags"
msgstr ""
#: photologue_custom/forms.py:47
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
#: photologue_custom/forms.py:64
#: photologue_custom/templates/photologue/upload.html:6
#: photologue_custom/templates/photologue/upload.html:73
msgid "Upload"
msgstr "Hochladen"
#: photologue_custom/forms.py:70
msgid "A gallery with that title already exists."
msgstr "Es existiert bereits eine Gallerie mit diesem Titel."
#: photologue_custom/forms.py:79
msgid "Select an existing gallery, or enter a title for a new gallery."
msgstr ""
"Wähle eine existierende Galerie aus oder gib einen Titel für eine neue "
"Galerie ein."
#: photologue_custom/templates/photologue/gallery_archive.html:7
#: photologue_custom/templates/photologue/gallery_archive.html:12
#: photologue/templates/photologue/gallery_archive.html:9
msgid "Latest photo galleries"
msgstr "Aktuelle Fotogalerien"
#: photologue_custom/templates/photologue/gallery_archive.html:18
#: photologue/templates/photologue/gallery_archive.html:14
#: photologue/templates/photologue/gallery_archive_year.html:14
msgid "Filter by year"
msgstr "Filtere nach Jahr"
#: photologue_custom/templates/photologue/gallery_archive.html:35
#: photologue/templates/photologue/gallery_archive.html:31
msgid "No galleries were found"
msgstr "Es wurden keine Galerien gefunden."
#: photologue_custom/templates/photologue/gallery_archive_year.html:7
#: photologue_custom/templates/photologue/gallery_archive_year.html:12
#: photologue/templates/photologue/gallery_archive_year.html:9
#, python-format
msgid "Galleries for %(show_year)s"
msgstr "Gallerien von %(show_year)s"
#: photologue_custom/templates/photologue/gallery_archive_year.html:17
msgid "View all galleries"
msgstr "Zeige alle Galerien."
#: photologue_custom/templates/photologue/gallery_archive_year.html:29
#: photologue/templates/photologue/gallery_archive_year.html:31
msgid "No galleries were found."
msgstr "Es wurden keine Galerien gefunden."
#: photologue_custom/templates/photologue/gallery_detail.html:41
#: photologue/templates/photologue/gallery_detail.html:41
msgid "to"
msgstr ""
#: photologue_custom/templates/photologue/gallery_detail.html:57
#: photologue/templates/photologue/gallery_detail.html:58
msgid "All pictures"
msgstr ""
#: photologue_custom/templates/photologue/gallery_detail.html:78
#: photologue/templates/photologue/gallery_detail.html:79
msgid "Download all gallery"
msgstr ""
#: photologue_custom/templates/photologue/photo_detail.html:13
#: photologue/templates/photologue/photo_confirm_delete.html:9
#: photologue/templates/photologue/photo_confirm_delete.html:14
msgid "Delete confirmation"
msgstr ""
#: photologue/templates/photologue/photo_confirm_delete.html:17
#, python-format
msgid "Are you sure you want to delete <code>%(object)s</code>?"
msgstr ""
#: photologue/templates/photologue/photo_confirm_delete.html:22
#: photologue/templates/photologue/photo_confirm_report.html:22
msgid "Confirm"
msgstr ""
#: photologue/templates/photologue/photo_confirm_report.html:9
#: photologue/templates/photologue/photo_confirm_report.html:14
msgid "Report confirmation"
msgstr ""
#: photologue/templates/photologue/photo_confirm_report.html:17
#, python-format
msgid ""
"Are you sure you want to report <code>%(object)s</code>? This photo will no "
"longer be public, and administrators will be notified."
msgstr ""
#: photologue/templates/photologue/photo_detail.html:15
msgid "Published"
msgstr "Veröffentlicht"
#: photologue_custom/templates/photologue/photo_detail.html:25
msgid "This photo is found in the following galleries"
msgstr "Dieses Foto befindet sich in folgenden Galerien"
#: photologue_custom/templates/photologue/upload.html:78
#: photologue/templates/photologue/upload.html:20
msgid "Drag and drop photos here"
msgstr ""
#: photologue_custom/templates/photologue/upload.html:82
#: photologue/templates/photologue/upload.html:24
msgid "Owner will be"
msgstr ""

View file

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Photologue\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-30 09:55+0000\n"
"POT-Creation-Date: 2022-12-25 23:02+0000\n"
"PO-Revision-Date: 2017-12-03 14:46+0000\n"
"Last-Translator: Richard Barran <richard@arbee-design.co.uk>\n"
"Language-Team: Spanish (Spain) (http://www.transifex.com/richardbarran/"
@ -23,79 +23,134 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: photologue/admin.py:30 photologue/models.py:499
#: photologue/admin.py:26 photologue/models.py:162 photologue/models.py:772
msgid "tags"
msgstr ""
#: photologue/admin.py:50 photologue/models.py:521
msgid "owner"
msgstr ""
#: photologue/models.py:84
#: photologue/forms.py:29
msgid "Gallery"
msgstr "Galería"
#: photologue/forms.py:31
msgid "-- Create a new gallery --"
msgstr ""
#: photologue/forms.py:33
msgid ""
"Select a gallery to add these images to. Leave this empty to create a new "
"gallery from the supplied title."
msgstr ""
"Seleccione una galería para agregarle estas imágenes. Déjelo vacío para "
"crear una nueva galería a partir de este título."
#: photologue/forms.py:38
msgid "New gallery title"
msgstr ""
#: photologue/forms.py:43
msgid "New gallery event start date"
msgstr ""
#: photologue/forms.py:48
msgid "New gallery event end date"
msgstr ""
#: photologue/forms.py:54
msgid "New gallery tags"
msgstr ""
#: photologue/forms.py:57
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
#: photologue/forms.py:75 photologue/templates/photologue/upload.html:8
#: photologue/templates/photologue/upload.html:15
msgid "Upload"
msgstr "Subir"
#: photologue/forms.py:81
msgid "A gallery with that title already exists."
msgstr "Ya existe una galería con ese título."
#: photologue/forms.py:93
msgid "Select an existing gallery, or enter a title for a new gallery."
msgstr ""
"Seleccione una galería existente o ingrese un nuevo nombre para la galería."
#: photologue/models.py:82
msgid "Very Low"
msgstr "Muy bajo"
#: photologue/models.py:85
#: photologue/models.py:83
msgid "Low"
msgstr "Bajo"
#: photologue/models.py:86
#: photologue/models.py:84
msgid "Medium-Low"
msgstr "Medio-bajo"
#: photologue/models.py:87
#: photologue/models.py:85
msgid "Medium"
msgstr "Medio"
#: photologue/models.py:88
#: photologue/models.py:86
msgid "Medium-High"
msgstr "Medio-alto"
#: photologue/models.py:89
#: photologue/models.py:87
msgid "High"
msgstr "Alto"
#: photologue/models.py:90
#: photologue/models.py:88
msgid "Very High"
msgstr "Muy alto"
#: photologue/models.py:95
#: photologue/models.py:93
msgid "Top"
msgstr "Arriba"
#: photologue/models.py:96
#: photologue/models.py:94
msgid "Right"
msgstr "Derecha"
#: photologue/models.py:97
#: photologue/models.py:95
msgid "Bottom"
msgstr "Abajo"
#: photologue/models.py:98
#: photologue/models.py:96
msgid "Left"
msgstr "Izquierda"
#: photologue/models.py:99
#: photologue/models.py:97
msgid "Center (Default)"
msgstr "Centro (por defecto)"
#: photologue/models.py:103
#: photologue/models.py:101
msgid "Flip left to right"
msgstr "Voltear de izquerda a derecha"
#: photologue/models.py:104
#: photologue/models.py:102
msgid "Flip top to bottom"
msgstr "Voltear de arriba a abajo"
#: photologue/models.py:105
#: photologue/models.py:103
msgid "Rotate 90 degrees counter-clockwise"
msgstr "Rotar 90 grados en sentido horario"
#: photologue/models.py:106
#: photologue/models.py:104
msgid "Rotate 90 degrees clockwise"
msgstr "Rotar 90 grados en sentido antihorario"
#: photologue/models.py:107
#: photologue/models.py:105
msgid "Rotate 180 degrees"
msgstr "Rotar 180 grados"
#: photologue/models.py:117
#: photologue/models.py:119
#, python-format
msgid ""
"Chain multiple filters using the following pattern \"FILTER_ONE->FILTER_TWO-"
@ -106,11 +161,7 @@ msgstr ""
">FILTRO_DOS->FILTRO_TRES\". Los filtros de imagen se aplicarán en orden. Los "
"siguientes filtros están disponibles: %s."
#: photologue/models.py:139
msgid "date published"
msgstr "fecha de publicación"
#: photologue/models.py:141 photologue/models.py:485
#: photologue/models.py:142 photologue/models.py:509
msgid "title"
msgstr "título"
@ -118,107 +169,105 @@ msgstr "título"
msgid "title slug"
msgstr "título slug"
#: photologue/models.py:147 photologue/models.py:491 photologue/models.py:697
#: photologue/models.py:147 photologue/models.py:514 photologue/models.py:766
msgid "A \"slug\" is a unique URL-friendly title for an object."
msgstr "Un \"slug\" es un único título URL-amigable para un objeto."
#: photologue/models.py:150
#: photologue/models.py:151
msgid "start date"
msgstr ""
#: photologue/models.py:155
#: photologue/models.py:156
msgid "end date"
msgstr ""
#: photologue/models.py:157
#: photologue/models.py:158
msgid "description"
msgstr "descripción"
#: photologue/models.py:162 photologue/models.py:703
msgid "tags"
msgstr ""
#: photologue/models.py:165 photologue/models.py:506
msgid "is public"
msgstr "es público"
#: photologue/models.py:167
msgid "Public galleries will be displayed in the default views."
msgstr "Las galerías públicas serán mostradas en las vistas por defecto."
#: photologue/models.py:171 photologue/models.py:514
#: photologue/models.py:168 photologue/models.py:540
msgid "photos"
msgstr "fotos"
#: photologue/models.py:177
#: photologue/models.py:175
msgid "gallery"
msgstr "galería"
#: photologue/models.py:178
#: photologue/models.py:176
msgid "galleries"
msgstr "galerías"
#: photologue/models.py:213
#: photologue/models.py:206
msgid "count"
msgstr "contar"
#: photologue/models.py:221
#: photologue/models.py:207
#, fuzzy
#| msgid "view count"
msgid "private count"
msgstr "Contador de visitas"
#: photologue/models.py:212
msgid "image"
msgstr "imagen"
#: photologue/models.py:224
#: photologue/models.py:215
msgid "date taken"
msgstr "fecha en la que se tomó"
#: photologue/models.py:227
#: photologue/models.py:218
msgid "Date image was taken; is obtained from the image EXIF data."
msgstr "La fecha de la imagen fue obtenida por información EXIF de la imagen."
#: photologue/models.py:228
#: photologue/models.py:220
msgid "view count"
msgstr "Contador de visitas"
#: photologue/models.py:231
#: photologue/models.py:222
msgid "crop from"
msgstr "Recortar desde"
#: photologue/models.py:254
#: photologue/models.py:246
msgid "An \"admin_thumbnail\" photo size has not been defined."
msgstr "El tamaño de foto de \"miniatura de admin\" no ha sido definido."
#: photologue/models.py:261
#: photologue/models.py:259
msgid "Thumbnail"
msgstr "Miniatura"
#: photologue/models.py:488 photologue/models.py:696
#: photologue/models.py:511 photologue/models.py:765
msgid "slug"
msgstr "slug"
#: photologue/models.py:492
#: photologue/models.py:516
msgid "caption"
msgstr "pie de foto"
#: photologue/models.py:494
#: photologue/models.py:517
msgid "date added"
msgstr "fecha añadida"
#: photologue/models.py:504
#: photologue/models.py:526
msgid "license"
msgstr ""
#: photologue/models.py:508
#: photologue/models.py:529
msgid "is public"
msgstr "es público"
#: photologue/models.py:531
msgid "Public photographs will be displayed in the default views."
msgstr "Las fotos públicas serán mostradas en las vistas por defecto."
#: photologue/models.py:513
#: photologue/models.py:539
msgid "photo"
msgstr "foto"
#: photologue/models.py:575 photologue/models.py:691
#: photologue/models.py:602 photologue/models.py:760
msgid "name"
msgstr "nombre"
#: photologue/models.py:579
#: photologue/models.py:606
msgid ""
"Photo size name should contain only letters, numbers and underscores. "
"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"."
@ -226,41 +275,41 @@ msgstr ""
"El nombre del tamaño solo puede contener letras, números y subrayados. Por "
"ejemplo:\"miniaturas\", \"muestra\", \"muestra_principal\"."
#: photologue/models.py:586
#: photologue/models.py:618
msgid "width"
msgstr "anchura"
#: photologue/models.py:589
#: photologue/models.py:621
msgid ""
"If width is set to \"0\" the image will be scaled to the supplied height."
msgstr ""
"Si la anchura se establece a \"0\" la imagen será escalada hasta la altura "
"proporcionada"
#: photologue/models.py:590
#: photologue/models.py:625
msgid "height"
msgstr "altura"
#: photologue/models.py:593
#: photologue/models.py:628
msgid ""
"If height is set to \"0\" the image will be scaled to the supplied width"
msgstr ""
"Si la altura se establece a \"0\" la imagen será escalada hasta la anchura "
"proporcionada"
#: photologue/models.py:594
#: photologue/models.py:632
msgid "quality"
msgstr "calidad"
#: photologue/models.py:597
#: photologue/models.py:635
msgid "JPEG image quality."
msgstr "Calidad de imagen JPEG."
#: photologue/models.py:598
#: photologue/models.py:638
msgid "upscale images?"
msgstr "¿Aumentar imágenes?"
#: photologue/models.py:600
#: photologue/models.py:641
msgid ""
"If selected the image will be scaled up if necessary to fit the supplied "
"dimensions. Cropped sizes will be upscaled regardless of this setting."
@ -269,11 +318,11 @@ msgstr ""
"las dimensiones proporcionadas. Los tamaños recortados serán aumentados de "
"acuerdo a esta opción."
#: photologue/models.py:604
#: photologue/models.py:647
msgid "crop to fit?"
msgstr "¿Recortar hasta ajustar?"
#: photologue/models.py:606
#: photologue/models.py:650
msgid ""
"If selected the image will be scaled and cropped to fit the supplied "
"dimensions."
@ -281,21 +330,21 @@ msgstr ""
"Si se selecciona la imagen será escalada y recortada para ajustarse a las "
"dimensiones proporcionadas."
#: photologue/models.py:608
#: photologue/models.py:655
msgid "pre-cache?"
msgstr "¿pre-cachear?"
#: photologue/models.py:610
#: photologue/models.py:658
msgid "If selected this photo size will be pre-cached as photos are added."
msgstr ""
"Si se selecciona, este tamaño de foto será pre-cacheado cuando se añadan "
"nuevas fotos."
#: photologue/models.py:611
#: photologue/models.py:662
msgid "increment view count?"
msgstr "¿incrementar contador de visualizaciones?"
#: photologue/models.py:613
#: photologue/models.py:665
msgid ""
"If selected the image's \"view_count\" will be incremented when this photo "
"size is displayed."
@ -303,125 +352,91 @@ msgstr ""
"Si se selecciona el \"contador de visualizaciones\" se incrementará cuando "
"esta foto sea visualizada."
#: photologue/models.py:618
#: photologue/models.py:672
msgid "photo size"
msgstr "tamaño de foto"
#: photologue/models.py:619
#: photologue/models.py:673
msgid "photo sizes"
msgstr "tamaños de foto"
#: photologue/models.py:636
#: photologue/models.py:691
msgid "Can only crop photos if both width and height dimensions are set."
msgstr "Solo puede recortar las fotos si ancho y alto están establecidos."
#: photologue/models.py:702
#: photologue/models.py:771
msgid "tag"
msgstr ""
#: photologue_custom/forms.py:22
msgid "Gallery"
msgstr "Galería"
#: photologue_custom/forms.py:24
msgid "-- Create a new gallery --"
msgstr ""
#: photologue_custom/forms.py:25
msgid ""
"Select a gallery to add these images to. Leave this empty to create a new "
"gallery from the supplied title."
msgstr ""
"Seleccione una galería para agregarle estas imágenes. Déjelo vacío para "
"crear una nueva galería a partir de este título."
#: photologue_custom/forms.py:29
msgid "New gallery title"
msgstr ""
#: photologue_custom/forms.py:34
msgid "New gallery event start date"
msgstr ""
#: photologue_custom/forms.py:39
msgid "New gallery event end date"
msgstr ""
#: photologue_custom/forms.py:45
msgid "New gallery tags"
msgstr ""
#: photologue_custom/forms.py:47
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
#: photologue_custom/forms.py:64
#: photologue_custom/templates/photologue/upload.html:6
#: photologue_custom/templates/photologue/upload.html:73
msgid "Upload"
msgstr "Subir"
#: photologue_custom/forms.py:70
msgid "A gallery with that title already exists."
msgstr "Ya existe una galería con ese título."
#: photologue_custom/forms.py:79
msgid "Select an existing gallery, or enter a title for a new gallery."
msgstr ""
"Seleccione una galería existente o ingrese un nuevo nombre para la galería."
#: photologue_custom/templates/photologue/gallery_archive.html:7
#: photologue_custom/templates/photologue/gallery_archive.html:12
#: photologue/templates/photologue/gallery_archive.html:9
msgid "Latest photo galleries"
msgstr "Fotos de galerías mas recientes"
#: photologue_custom/templates/photologue/gallery_archive.html:18
#: photologue/templates/photologue/gallery_archive.html:14
#: photologue/templates/photologue/gallery_archive_year.html:14
msgid "Filter by year"
msgstr "Filtrar por año"
#: photologue_custom/templates/photologue/gallery_archive.html:35
#: photologue/templates/photologue/gallery_archive.html:31
msgid "No galleries were found"
msgstr "No se encontraron galerías"
#: photologue_custom/templates/photologue/gallery_archive_year.html:7
#: photologue_custom/templates/photologue/gallery_archive_year.html:12
#: photologue/templates/photologue/gallery_archive_year.html:9
#, python-format
msgid "Galleries for %(show_year)s"
msgstr "Galerías por %(show_year)s"
#: photologue_custom/templates/photologue/gallery_archive_year.html:17
msgid "View all galleries"
msgstr "Ver todas las galerías"
#: photologue_custom/templates/photologue/gallery_archive_year.html:29
#: photologue/templates/photologue/gallery_archive_year.html:31
msgid "No galleries were found."
msgstr "No se encontraron galerías"
#: photologue_custom/templates/photologue/gallery_detail.html:41
#: photologue/templates/photologue/gallery_detail.html:41
msgid "to"
msgstr ""
#: photologue_custom/templates/photologue/gallery_detail.html:57
#: photologue/templates/photologue/gallery_detail.html:58
msgid "All pictures"
msgstr ""
#: photologue_custom/templates/photologue/gallery_detail.html:78
#: photologue/templates/photologue/gallery_detail.html:79
msgid "Download all gallery"
msgstr ""
#: photologue_custom/templates/photologue/photo_detail.html:13
#: photologue/templates/photologue/photo_confirm_delete.html:9
#: photologue/templates/photologue/photo_confirm_delete.html:14
msgid "Delete confirmation"
msgstr ""
#: photologue/templates/photologue/photo_confirm_delete.html:17
#, python-format
msgid "Are you sure you want to delete <code>%(object)s</code>?"
msgstr ""
#: photologue/templates/photologue/photo_confirm_delete.html:22
#: photologue/templates/photologue/photo_confirm_report.html:22
msgid "Confirm"
msgstr ""
#: photologue/templates/photologue/photo_confirm_report.html:9
#: photologue/templates/photologue/photo_confirm_report.html:14
msgid "Report confirmation"
msgstr ""
#: photologue/templates/photologue/photo_confirm_report.html:17
#, python-format
msgid ""
"Are you sure you want to report <code>%(object)s</code>? This photo will no "
"longer be public, and administrators will be notified."
msgstr ""
#: photologue/templates/photologue/photo_detail.html:15
msgid "Published"
msgstr "Publicado"
#: photologue_custom/templates/photologue/photo_detail.html:25
msgid "This photo is found in the following galleries"
msgstr "Esta foto se encontró en las siguientes galerías"
#: photologue_custom/templates/photologue/upload.html:78
#: photologue/templates/photologue/upload.html:20
msgid "Drag and drop photos here"
msgstr ""
#: photologue_custom/templates/photologue/upload.html:82
#: photologue/templates/photologue/upload.html:24
msgid "Owner will be"
msgstr ""

View file

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Photologue\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-17 09:13+0000\n"
"POT-Creation-Date: 2022-12-25 23:02+0000\n"
"PO-Revision-Date: 2017-12-03 14:47+0000\n"
"Last-Translator: Richard Barran <richard@arbee-design.co.uk>\n"
"Language-Team: French (http://www.transifex.com/richardbarran/django-"
@ -21,11 +21,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: photologue/admin.py:26 photologue/models.py:162 photologue/models.py:770
#: photologue/admin.py:26 photologue/models.py:162 photologue/models.py:772
msgid "tags"
msgstr "balises"
#: photologue/admin.py:50 photologue/models.py:519
#: photologue/admin.py:50 photologue/models.py:521
msgid "owner"
msgstr "propriétaire"
@ -160,7 +160,7 @@ msgstr ""
">FILTRE_DEUX->FILTRE_TROIS\". Les filtres d'image seront appliqués dans "
"l'ordre. Les filtres suivants sont disponibles: %s."
#: photologue/models.py:142 photologue/models.py:507
#: photologue/models.py:142 photologue/models.py:509
msgid "title"
msgstr "titre"
@ -168,7 +168,7 @@ msgstr "titre"
msgid "title slug"
msgstr "version abrégée du titre"
#: photologue/models.py:147 photologue/models.py:512 photologue/models.py:764
#: photologue/models.py:147 photologue/models.py:514 photologue/models.py:766
msgid "A \"slug\" is a unique URL-friendly title for an object."
msgstr ""
"Un \"slug\" est un titre abrégé et unique, compatible avec les URL, pour un "
@ -186,7 +186,7 @@ msgstr "date de fin"
msgid "description"
msgstr "description"
#: photologue/models.py:168 photologue/models.py:538
#: photologue/models.py:168 photologue/models.py:540
msgid "photos"
msgstr "photos"
@ -236,39 +236,39 @@ msgstr "Une taille de photo \"admin_thumbnail\" n'a pas encore été définie."
msgid "Thumbnail"
msgstr "Miniature"
#: photologue/models.py:509 photologue/models.py:763
#: photologue/models.py:511 photologue/models.py:765
msgid "slug"
msgstr "libellé court"
#: photologue/models.py:514
#: photologue/models.py:516
msgid "caption"
msgstr "légende"
#: photologue/models.py:515
#: photologue/models.py:517
msgid "date added"
msgstr "date d'ajout"
#: photologue/models.py:524
#: photologue/models.py:526
msgid "license"
msgstr "licence"
#: photologue/models.py:527
#: photologue/models.py:529
msgid "is public"
msgstr "est public"
#: photologue/models.py:529
#: photologue/models.py:531
msgid "Public photographs will be displayed in the default views."
msgstr "Les photographies publique seront affichées dans les vues par défaut."
#: photologue/models.py:537
#: photologue/models.py:539
msgid "photo"
msgstr "photo"
#: photologue/models.py:600 photologue/models.py:758
#: photologue/models.py:602 photologue/models.py:760
msgid "name"
msgstr "nom"
#: photologue/models.py:604
#: photologue/models.py:606
msgid ""
"Photo size name should contain only letters, numbers and underscores. "
"Examples: \"thumbnail\", \"display\", \"small\", \"main_page_widget\"."
@ -277,41 +277,41 @@ msgstr ""
"chiffres et des caractères de soulignement. Exemples: \"miniature\", "
"\"affichage\", \"petit\", \"widget_page_principale\"."
#: photologue/models.py:616
#: photologue/models.py:618
msgid "width"
msgstr "largeur"
#: photologue/models.py:619
#: photologue/models.py:621
msgid ""
"If width is set to \"0\" the image will be scaled to the supplied height."
msgstr ""
"Si la largeur est réglée à \"0\" l l'image sera redimensionnée par rapport à "
"la hauteur fournie."
#: photologue/models.py:623
#: photologue/models.py:625
msgid "height"
msgstr "hauteur"
#: photologue/models.py:626
#: photologue/models.py:628
msgid ""
"If height is set to \"0\" the image will be scaled to the supplied width"
msgstr ""
"Si la hauteur est réglée à \"0\" l l'image sera redimensionnée par rapport à "
"la largeur fournie."
#: photologue/models.py:630
#: photologue/models.py:632
msgid "quality"
msgstr "qualité"
#: photologue/models.py:633
#: photologue/models.py:635
msgid "JPEG image quality."
msgstr "Qualité JPEG de l'image."
#: photologue/models.py:636
#: photologue/models.py:638
msgid "upscale images?"
msgstr "agrandir les images ?"
#: photologue/models.py:639
#: photologue/models.py:641
msgid ""
"If selected the image will be scaled up if necessary to fit the supplied "
"dimensions. Cropped sizes will be upscaled regardless of this setting."
@ -320,11 +320,11 @@ msgstr ""
"dimensions fournies. Les dimensions ajustées seront agrandies sans prendre "
"en compte ce paramètre."
#: photologue/models.py:645
#: photologue/models.py:647
msgid "crop to fit?"
msgstr "découper pour adapter à la taille ?"
#: photologue/models.py:648
#: photologue/models.py:650
msgid ""
"If selected the image will be scaled and cropped to fit the supplied "
"dimensions."
@ -332,21 +332,21 @@ msgstr ""
"Si sélectionné l'image sera redimensionnée et recadrée pour coïncider avec "
"les dimensions fournies."
#: photologue/models.py:653
#: photologue/models.py:655
msgid "pre-cache?"
msgstr "mise en cache ?"
#: photologue/models.py:656
#: photologue/models.py:658
msgid "If selected this photo size will be pre-cached as photos are added."
msgstr ""
"Si sélectionné cette taille de photo sera mise en cache au moment au les "
"photos sont ajoutées."
#: photologue/models.py:660
#: photologue/models.py:662
msgid "increment view count?"
msgstr "incrémenter le nombre d'affichages ?"
#: photologue/models.py:663
#: photologue/models.py:665
msgid ""
"If selected the image's \"view_count\" will be incremented when this photo "
"size is displayed."
@ -354,21 +354,21 @@ msgstr ""
"Si sélectionné le \"view_count\" (nombre d'affichage) de l'image sera "
"incrémenté quand cette taille de photo sera affichée."
#: photologue/models.py:670
#: photologue/models.py:672
msgid "photo size"
msgstr "taille de la photo"
#: photologue/models.py:671
#: photologue/models.py:673
msgid "photo sizes"
msgstr "tailles des photos"
#: photologue/models.py:689
#: photologue/models.py:691
msgid "Can only crop photos if both width and height dimensions are set."
msgstr ""
"La hauteur et la largeur doivent être toutes les deux définies pour "
"retailler des photos."
#: photologue/models.py:769
#: photologue/models.py:771
msgid "tag"
msgstr ""

View file

@ -18,8 +18,8 @@ class lgAdmin {
init() {
const adminIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" class=\"bi bi-gear-fill\" viewBox=\"0 0 16 16\"><path d=\"M9.405 1.05c-.413-1.4-2.397-1.4-2.81 0l-.1.34a1.464 1.464 0 0 1-2.105.872l-.31-.17c-1.283-.698-2.686.705-1.987 1.987l.169.311c.446.82.023 1.841-.872 2.105l-.34.1c-1.4.413-1.4 2.397 0 2.81l.34.1a1.464 1.464 0 0 1 .872 2.105l-.17.31c-.698 1.283.705 2.686 1.987 1.987l.311-.169a1.464 1.464 0 0 1 2.105.872l.1.34c.413 1.4 2.397 1.4 2.81 0l.1-.34a1.464 1.464 0 0 1 2.105-.872l.31.17c1.283.698 2.686-.705 1.987-1.987l-.169-.311a1.464 1.464 0 0 1 .872-2.105l.34-.1c1.4-.413 1.4-2.397 0-2.81l-.34-.1a1.464 1.464 0 0 1-.872-2.105l.17-.31c.698-1.283-.705-2.686-1.987-1.987l-.311.169a1.464 1.464 0 0 1-2.105-.872l-.1-.34zM8 10.93a2.929 2.929 0 1 1 0-5.86 2.929 2.929 0 0 1 0 5.858z\"/></svg>";
const deleteIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 16 16\"><path d=\"M11 1.5v1h3.5a.5.5 0 0 1 0 1h-.538l-.853 10.66A2 2 0 0 1 11.115 16h-6.23a2 2 0 0 1-1.994-1.84L2.038 3.5H1.5a.5.5 0 0 1 0-1H5v-1A1.5 1.5 0 0 1 6.5 0h3A1.5 1.5 0 0 1 11 1.5Zm-5 0v1h4v-1a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5ZM4.5 5.029l.5 8.5a.5.5 0 1 0 .998-.06l-.5-8.5a.5.5 0 1 0-.998.06Zm6.53-.528a.5.5 0 0 0-.528.47l-.5 8.5a.5.5 0 0 0 .998.058l.5-8.5a.5.5 0 0 0-.47-.528ZM8 4.5a.5.5 0 0 0-.5.5v8.5a.5.5 0 0 0 1 0V5a.5.5 0 0 0-.5-.5Z\"/></svg>";;
const reportIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 16 16\"><path d=\"M11.46.146A.5.5 0 0 0 11.107 0H4.893a.5.5 0 0 0-.353.146L.146 4.54A.5.5 0 0 0 0 4.893v6.214a.5.5 0 0 0 .146.353l4.394 4.394a.5.5 0 0 0 .353.146h6.214a.5.5 0 0 0 .353-.146l4.394-4.394a.5.5 0 0 0 .146-.353V4.893a.5.5 0 0 0-.146-.353L11.46.146zM8 4c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 4.995A.905.905 0 0 1 8 4zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z\"/></svg>";
const deleteIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" class=\"bi\" viewBox=\"0 0 16 16\"><path d=\"M11 1.5v1h3.5a.5.5 0 0 1 0 1h-.538l-.853 10.66A2 2 0 0 1 11.115 16h-6.23a2 2 0 0 1-1.994-1.84L2.038 3.5H1.5a.5.5 0 0 1 0-1H5v-1A1.5 1.5 0 0 1 6.5 0h3A1.5 1.5 0 0 1 11 1.5Zm-5 0v1h4v-1a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5ZM4.5 5.029l.5 8.5a.5.5 0 1 0 .998-.06l-.5-8.5a.5.5 0 1 0-.998.06Zm6.53-.528a.5.5 0 0 0-.528.47l-.5 8.5a.5.5 0 0 0 .998.058l.5-8.5a.5.5 0 0 0-.47-.528ZM8 4.5a.5.5 0 0 0-.5.5v8.5a.5.5 0 0 0 1 0V5a.5.5 0 0 0-.5-.5Z\"/></svg>";;
const reportIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" class=\"bi\" viewBox=\"0 0 16 16\"><path d=\"M11.46.146A.5.5 0 0 0 11.107 0H4.893a.5.5 0 0 0-.353.146L.146 4.54A.5.5 0 0 0 0 4.893v6.214a.5.5 0 0 0 .146.353l4.394 4.394a.5.5 0 0 0 .353.146h6.214a.5.5 0 0 0 .353-.146l4.394-4.394a.5.5 0 0 0 .146-.353V4.893a.5.5 0 0 0-.146-.353L11.46.146zM8 4c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 4.995A.905.905 0 0 1 8 4zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z\"/></svg>";
// Add button linking to Django admin page
this.core.$toolbar.append(`<a href="#" target="_blank" id="lg-admin" title="Go to admin" class="lg-icon lg-bi-icon">${adminIcon}</a>`);

View file

@ -31,7 +31,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
{{ gallery.title }}
{% if request.user.is_staff and perms.photologue.change_gallery %}
<a href="{% url 'admin:photologue_gallery_change' gallery.id %}">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#555" class="bi bi-gear" viewBox="0 0 16 18">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-gear" viewBox="0 0 16 18">
<path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492zM5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0z"/>
<path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52l-.094-.319zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.377l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115l.094-.319z"/>
</svg>
@ -76,7 +76,13 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% endfor %}
</div>
<div class="card-footer">
<a href="{% url 'photologue:pl-gallery-download' gallery.slug %}" class="btn btn-secondary btn-sm">{% trans 'Download all gallery' %}</a>
<a href="{% url 'photologue:pl-gallery-download' gallery.slug %}" class="btn btn-secondary btn-sm">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-download" viewBox="0 0 16 16">
<path d="M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5z"/>
<path d="M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3z"/>
</svg>
{% trans 'Download all gallery' %}
</a>
</div>
</div>
{% endblock %}

View file

@ -14,9 +14,9 @@ SPDX-License-Identifier: GPL-3.0-or-later
<h1>{% trans "Delete confirmation" %}</h1>
<form method="post">{% csrf_token %}
<p>
{% blocktranslate trimmed %}
{% blocktrans trimmed %}
Are you sure you want to delete <code>{{ object }}</code>?
{% endblocktranslate %}
{% endblocktrans %}
</p>
{{ form }}
<input type="submit" class="btn btn-danger" value="{% trans "Confirm" %}">

View file

@ -14,10 +14,10 @@ SPDX-License-Identifier: GPL-3.0-or-later
<h1>{% trans "Report confirmation" %}</h1>
<form method="post">{% csrf_token %}
<p>
{% blocktranslate trimmed %}
{% blocktrans trimmed %}
Are you sure you want to report <code>{{ object }}</code>?
This photo will no longer be public, and administrators will be notified.
{% endblocktranslate %}
{% endblocktrans %}
</p>
<input type="submit" class="btn btn-warning" value="{% trans "Confirm" %}">
</form>