aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.docker/nginx.conf43
-rw-r--r--.dockerignore11
-rw-r--r--.htaccess2
-rw-r--r--application/config/ConfigManager.php4
-rw-r--r--application/front/controller/admin/ServerController.php15
-rw-r--r--assets/vintage/css/shaarli.css61
-rw-r--r--doc/md/Docker.md7
-rw-r--r--doc/md/Server-configuration.md42
-rw-r--r--docker-compose.yml9
-rw-r--r--inc/languages/fr/LC_MESSAGES/shaarli.po113
-rw-r--r--tpl/vintage/daily.html8
-rw-r--r--tpl/vintage/editlink.html32
-rw-r--r--tpl/vintage/page.header.html24
13 files changed, 251 insertions, 120 deletions
diff --git a/.docker/nginx.conf b/.docker/nginx.conf
index 023f52c1..30810a87 100644
--- a/.docker/nginx.conf
+++ b/.docker/nginx.conf
@@ -17,27 +17,13 @@ http {
17 index index.html index.php; 17 index index.html index.php;
18 18
19 server { 19 server {
20 listen 80; 20 listen 80;
21 root /var/www/shaarli; 21 root /var/www/shaarli;
22 22
23 access_log /var/log/nginx/shaarli.access.log; 23 access_log /var/log/nginx/shaarli.access.log;
24 error_log /var/log/nginx/shaarli.error.log; 24 error_log /var/log/nginx/shaarli.error.log;
25 25
26 location ~ /\. { 26 location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$ {
27 # deny access to dotfiles
28 access_log off;
29 log_not_found off;
30 deny all;
31 }
32
33 location ~ ~$ {
34 # deny access to temp editor files, e.g. "script.php~"
35 access_log off;
36 log_not_found off;
37 deny all;
38 }
39
40 location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
41 # cache static assets 27 # cache static assets
42 expires max; 28 expires max;
43 add_header Pragma public; 29 add_header Pragma public;
@@ -49,30 +35,25 @@ http {
49 alias /var/www/shaarli/images/favicon.ico; 35 alias /var/www/shaarli/images/favicon.ico;
50 } 36 }
51 37
38 location /doc/html/ {
39 default_type "text/html";
40 try_files $uri $uri/ $uri.html =404;
41 }
42
52 location / { 43 location / {
53 # Slim - rewrite URLs 44 # Slim - rewrite URLs & do NOT serve static files through this location
54 try_files $uri /index.php$is_args$args; 45 try_files _ /index.php$is_args$args;
55 } 46 }
56 47
57 location ~ (index)\.php$ { 48 location ~ index\.php$ {
58 # Slim - split URL path into (script_filename, path_info) 49 # Slim - split URL path into (script_filename, path_info)
59 try_files $uri =404; 50 try_files $uri =404;
60 fastcgi_split_path_info ^(.+\.php)(/.+)$; 51 fastcgi_split_path_info ^(index.php)(/.+)$;
61 52
62 # filter and proxy PHP requests to PHP-FPM 53 # filter and proxy PHP requests to PHP-FPM
63 fastcgi_pass unix:/var/run/php-fpm.sock; 54 fastcgi_pass unix:/var/run/php-fpm.sock;
64 fastcgi_index index.php; 55 fastcgi_index index.php;
65 include fastcgi.conf; 56 include fastcgi.conf;
66 } 57 }
67
68 location ~ /doc/ {
69 default_type "text/html";
70 try_files $uri $uri/ $uri.html =404;
71 }
72
73 location ~ \.php$ {
74 # deny access to all other PHP scripts
75 deny all;
76 }
77 } 58 }
78} 59}
diff --git a/.dockerignore b/.dockerignore
index 96fd31c5..19fd87a5 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -2,8 +2,16 @@
2.dev 2.dev
3.git 3.git
4.github 4.github
5.gitattributes
6.gitignore
7.travis.yml
5tests 8tests
6 9
10# Docker related resources are not needed inside the container
11.dockerignore
12Dockerfile
13Dockerfile.armhf
14
7# Docker Compose resources 15# Docker Compose resources
8docker-compose.yml 16docker-compose.yml
9 17
@@ -13,6 +21,9 @@ data/*
13pagecache/* 21pagecache/*
14tmp/* 22tmp/*
15 23
24# Shaarli's docs are created during the build
25doc/html/
26
16# Eclipse project files 27# Eclipse project files
17.settings 28.settings
18.buildpath 29.buildpath
diff --git a/.htaccess b/.htaccess
index 25fcfb03..9d1522df 100644
--- a/.htaccess
+++ b/.htaccess
@@ -13,7 +13,7 @@ RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
13# Alternative (if the 2 lines above don't work) 13# Alternative (if the 2 lines above don't work)
14# SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0 14# SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
15 15
16# REST API 16# Slim URL Redirection
17# Ionos Hosting needs RewriteBase / 17# Ionos Hosting needs RewriteBase /
18# RewriteBase / 18# RewriteBase /
19RewriteCond %{REQUEST_FILENAME} !-f 19RewriteCond %{REQUEST_FILENAME} !-f
diff --git a/application/config/ConfigManager.php b/application/config/ConfigManager.php
index a0acc94d..717a038f 100644
--- a/application/config/ConfigManager.php
+++ b/application/config/ConfigManager.php
@@ -371,8 +371,8 @@ class ConfigManager
371 $this->setEmpty('general.enable_async_metadata', true); 371 $this->setEmpty('general.enable_async_metadata', true);
372 $this->setEmpty('general.tags_separator', ' '); 372 $this->setEmpty('general.tags_separator', ' ');
373 373
374 $this->setEmpty('updates.check_updates', false); 374 $this->setEmpty('updates.check_updates', true);
375 $this->setEmpty('updates.check_updates_branch', 'stable'); 375 $this->setEmpty('updates.check_updates_branch', 'latest');
376 $this->setEmpty('updates.check_updates_interval', 86400); 376 $this->setEmpty('updates.check_updates_interval', 86400);
377 377
378 $this->setEmpty('feed.rss_permalinks', true); 378 $this->setEmpty('feed.rss_permalinks', true);
diff --git a/application/front/controller/admin/ServerController.php b/application/front/controller/admin/ServerController.php
index 575a2f9d..fabeaf2f 100644
--- a/application/front/controller/admin/ServerController.php
+++ b/application/front/controller/admin/ServerController.php
@@ -25,9 +25,16 @@ class ServerController extends ShaarliAdminController
25 */ 25 */
26 public function index(Request $request, Response $response): Response 26 public function index(Request $request, Response $response): Response
27 { 27 {
28 $latestVersion = 'v' . ApplicationUtils::getVersion( 28 $releaseUrl = ApplicationUtils::$GITHUB_URL . '/releases/';
29 ApplicationUtils::$GIT_RAW_URL . '/latest/' . ApplicationUtils::$VERSION_FILE 29 if ($this->container->conf->get('updates.check_updates', true)) {
30 ); 30 $latestVersion = 'v' . ApplicationUtils::getVersion(
31 ApplicationUtils::$GIT_RAW_URL . '/latest/' . ApplicationUtils::$VERSION_FILE
32 );
33 $releaseUrl .= 'tag/' . $latestVersion;
34 } else {
35 $latestVersion = t('Check disabled');
36 }
37
31 $currentVersion = ApplicationUtils::getVersion('./shaarli_version.php'); 38 $currentVersion = ApplicationUtils::getVersion('./shaarli_version.php');
32 $currentVersion = $currentVersion === 'dev' ? $currentVersion : 'v' . $currentVersion; 39 $currentVersion = $currentVersion === 'dev' ? $currentVersion : 'v' . $currentVersion;
33 $phpEol = new \DateTimeImmutable(ApplicationUtils::getPhpEol(PHP_VERSION)); 40 $phpEol = new \DateTimeImmutable(ApplicationUtils::getPhpEol(PHP_VERSION));
@@ -37,7 +44,7 @@ class ServerController extends ShaarliAdminController
37 $this->assignView('php_has_reached_eol', $phpEol < new \DateTimeImmutable()); 44 $this->assignView('php_has_reached_eol', $phpEol < new \DateTimeImmutable());
38 $this->assignView('php_extensions', ApplicationUtils::getPhpExtensionsRequirement()); 45 $this->assignView('php_extensions', ApplicationUtils::getPhpExtensionsRequirement());
39 $this->assignView('permissions', ApplicationUtils::checkResourcePermissions($this->container->conf)); 46 $this->assignView('permissions', ApplicationUtils::checkResourcePermissions($this->container->conf));
40 $this->assignView('release_url', ApplicationUtils::$GITHUB_URL . '/releases/tag/' . $latestVersion); 47 $this->assignView('release_url', $releaseUrl);
41 $this->assignView('latest_version', $latestVersion); 48 $this->assignView('latest_version', $latestVersion);
42 $this->assignView('current_version', $currentVersion); 49 $this->assignView('current_version', $currentVersion);
43 $this->assignView('thumbnails_mode', $this->container->conf->get('thumbnails.mode')); 50 $this->assignView('thumbnails_mode', $this->container->conf->get('thumbnails.mode'));
diff --git a/assets/vintage/css/shaarli.css b/assets/vintage/css/shaarli.css
index 1688dce0..33e178af 100644
--- a/assets/vintage/css/shaarli.css
+++ b/assets/vintage/css/shaarli.css
@@ -1122,6 +1122,16 @@ ul.errors {
1122 float: left; 1122 float: left;
1123} 1123}
1124 1124
1125ul.warnings {
1126 color: orange;
1127 float: left;
1128}
1129
1130ul.successes {
1131 color: green;
1132 float: left;
1133}
1134
1125#pluginsadmin { 1135#pluginsadmin {
1126 width: 80%; 1136 width: 80%;
1127 padding: 20px 0 0 20px; 1137 padding: 20px 0 0 20px;
@@ -1248,3 +1258,54 @@ ul.errors {
1248 width: 0%; 1258 width: 0%;
1249 height: 10px; 1259 height: 10px;
1250} 1260}
1261
1262.loading-input {
1263 position: relative;
1264}
1265
1266@keyframes around {
1267 0% {
1268 transform: rotate(0deg);
1269 }
1270
1271 100% {
1272 transform: rotate(360deg);
1273 }
1274}
1275
1276.loading-input .icon-container {
1277 position: absolute;
1278 right: 60px;
1279 top: calc(50% - 10px);
1280}
1281
1282.loading-input .loader {
1283 position: relative;
1284 height: 20px;
1285 width: 20px;
1286 display: inline-block;
1287 animation: around 5.4s infinite;
1288}
1289
1290.loading-input .loader::after,
1291.loading-input .loader::before {
1292 content: "";
1293 background: #eee;
1294 position: absolute;
1295 display: inline-block;
1296 width: 100%;
1297 height: 100%;
1298 border-width: 2px;
1299 border-color: #333 #333 transparent transparent;
1300 border-style: solid;
1301 border-radius: 20px;
1302 box-sizing: border-box;
1303 top: 0;
1304 left: 0;
1305 animation: around 0.7s ease-in-out infinite;
1306}
1307
1308.loading-input .loader::after {
1309 animation: around 0.7s ease-in-out 0.1s infinite;
1310 background: transparent;
1311}
diff --git a/doc/md/Docker.md b/doc/md/Docker.md
index c152fe92..fc406c00 100644
--- a/doc/md/Docker.md
+++ b/doc/md/Docker.md
@@ -1,3 +1,4 @@
1
1# Docker 2# Docker
2 3
3[Docker](https://docs.docker.com/get-started/overview/) is an open platform for developing, shipping, and running applications 4[Docker](https://docs.docker.com/get-started/overview/) is an open platform for developing, shipping, and running applications
@@ -113,9 +114,11 @@ $ mkdir shaarli && cd shaarli
113# Download the latest version of Shaarli's docker-compose.yml 114# Download the latest version of Shaarli's docker-compose.yml
114$ curl -L https://raw.githubusercontent.com/shaarli/Shaarli/latest/docker-compose.yml -o docker-compose.yml 115$ curl -L https://raw.githubusercontent.com/shaarli/Shaarli/latest/docker-compose.yml -o docker-compose.yml
115# Create the .env file and fill in your VPS and domain information 116# Create the .env file and fill in your VPS and domain information
116# (replace <MY_SHAARLI_DOMAIN> and <MY_CONTACT_EMAIL> with your actual information) 117# (replace <shaarli.mydomain.org>, <admin@mydomain.org> and <latest> with your actual information)
117$ echo 'SHAARLI_VIRTUAL_HOST=shaarli.mydomain.org' > .env 118$ echo 'SHAARLI_VIRTUAL_HOST=shaarli.mydomain.org' > .env
118$ echo 'SHAARLI_LETSENCRYPT_EMAIL=admin@mydomain.org' >> .env 119$ echo 'SHAARLI_LETSENCRYPT_EMAIL=admin@mydomain.org' >> .env
120# Available Docker tags can be found at https://hub.docker.com/r/shaarli/shaarli/tags
121$ echo 'SHAARLI_DOCKER_TAG=latest' >> .env
119# Pull the Docker images 122# Pull the Docker images
120$ docker-compose pull 123$ docker-compose pull
121# Run! 124# Run!
@@ -224,4 +227,4 @@ $ docker system prune
224- [docker pull](https://docs.docker.com/engine/reference/commandline/pull/) 227- [docker pull](https://docs.docker.com/engine/reference/commandline/pull/)
225- [docker run](https://docs.docker.com/engine/reference/commandline/run/) 228- [docker run](https://docs.docker.com/engine/reference/commandline/run/)
226- [docker-compose logs](https://docs.docker.com/compose/reference/logs/) 229- [docker-compose logs](https://docs.docker.com/compose/reference/logs/)
227- Træfik: [Getting Started](https://docs.traefik.io/), [Docker backend](https://docs.traefik.io/configuration/backends/docker/), [Let's Encrypt](https://docs.traefik.io/user-guide/docker-and-lets-encrypt/), [Docker image](https://hub.docker.com/_/traefik/) \ No newline at end of file 230- Træfik: [Getting Started](https://docs.traefik.io/), [Docker backend](https://docs.traefik.io/configuration/backends/docker/), [Let's Encrypt](https://docs.traefik.io/user-guide/docker-and-lets-encrypt/), [Docker image](https://hub.docker.com/_/traefik/)
diff --git a/doc/md/Server-configuration.md b/doc/md/Server-configuration.md
index 4e74d80b..a49b6033 100644
--- a/doc/md/Server-configuration.md
+++ b/doc/md/Server-configuration.md
@@ -193,19 +193,24 @@ sudo nano /etc/apache2/sites-available/shaarli.mydomain.org.conf
193 Require all granted 193 Require all granted
194 </Directory> 194 </Directory>
195 195
196 <LocationMatch "/\."> 196 # BE CAREFUL: directives order matter!
197 # Prevent accessing dotfiles
198 RedirectMatch 404 ".*"
199 </LocationMatch>
200 197
201 <LocationMatch "\.(?:ico|css|js|gif|jpe?g|png)$"> 198 <FilesMatch ".*\.(?!(ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$)[^\.]*$">
199 Require all denied
200 </FilesMatch>
201
202 <Files "index.php">
203 Require all granted
204 </Files>
205
206 <FilesMatch "\.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2)$">
202 # allow client-side caching of static files 207 # allow client-side caching of static files
203 Header set Cache-Control "max-age=2628000, public, must-revalidate, proxy-revalidate" 208 Header set Cache-Control "max-age=2628000, public, must-revalidate, proxy-revalidate"
204 </LocationMatch> 209 </FilesMatch>
210
205 211
206 # serve the Shaarli favicon from its custom location 212 # serve the Shaarli favicon from its custom location
207 Alias favicon.ico /var/www/shaarli.mydomain.org/images/favicon.ico 213 Alias favicon.ico /var/www/shaarli.mydomain.org/images/favicon.ico
208
209</VirtualHost> 214</VirtualHost>
210``` 215```
211 216
@@ -296,7 +301,7 @@ server {
296 location / { 301 location / {
297 # default index file when no file URI is requested 302 # default index file when no file URI is requested
298 index index.php; 303 index index.php;
299 try_files $uri /index.php$is_args$args; 304 try_files _ /index.php$is_args$args;
300 } 305 }
301 306
302 location ~ (index)\.php$ { 307 location ~ (index)\.php$ {
@@ -309,23 +314,7 @@ server {
309 include fastcgi.conf; 314 include fastcgi.conf;
310 } 315 }
311 316
312 location ~ \.php$ { 317 location ~ /doc/html/ {
313 # deny access to all other PHP scripts
314 # disable this if you host other PHP applications on the same virtualhost
315 deny all;
316 }
317
318 location ~ /\. {
319 # deny access to dotfiles
320 deny all;
321 }
322
323 location ~ ~$ {
324 # deny access to temp editor files, e.g. "script.php~"
325 deny all;
326 }
327
328 location ~ /doc/ {
329 default_type "text/html"; 318 default_type "text/html";
330 try_files $uri $uri/ $uri.html =404; 319 try_files $uri $uri/ $uri.html =404;
331 } 320 }
@@ -336,13 +325,12 @@ server {
336 } 325 }
337 326
338 # allow client-side caching of static files 327 # allow client-side caching of static files
339 location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { 328 location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$ {
340 expires max; 329 expires max;
341 add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 330 add_header Cache-Control "public, must-revalidate, proxy-revalidate";
342 # HTTP 1.0 compatibility 331 # HTTP 1.0 compatibility
343 add_header Pragma public; 332 add_header Pragma public;
344 } 333 }
345
346} 334}
347``` 335```
348 336
diff --git a/docker-compose.yml b/docker-compose.yml
index a3de4b1c..4ebae447 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -2,12 +2,13 @@
2# Shaarli - Docker Compose example configuration 2# Shaarli - Docker Compose example configuration
3# 3#
4# See: 4# See:
5# - https://shaarli.readthedocs.io/en/master/docker/shaarli-images/ 5# - https://shaarli.readthedocs.io/en/master/Docker/#docker-compose
6# - https://shaarli.readthedocs.io/en/master/guides/install-shaarli-with-debian9-and-docker/
7# 6#
8# Environment variables: 7# Environment variables:
9# - SHAARLI_VIRTUAL_HOST Fully Qualified Domain Name for the Shaarli instance 8# - SHAARLI_VIRTUAL_HOST Fully Qualified Domain Name for the Shaarli instance
10# - SHAARLI_LETSENCRYPT_EMAIL Contact email for certificate renewal 9# - SHAARLI_LETSENCRYPT_EMAIL Contact email for certificate renewal
10# - SHAARLI_DOCKER_TAG Shaarli docker tag to use
11# See: https://hub.docker.com/r/shaarli/shaarli/tags
11version: '3' 12version: '3'
12 13
13networks: 14networks:
@@ -20,7 +21,7 @@ volumes:
20 21
21services: 22services:
22 shaarli: 23 shaarli:
23 image: shaarli/shaarli:master 24 image: shaarli/shaarli:${SHAARLI_DOCKER_TAG}
24 build: ./ 25 build: ./
25 networks: 26 networks:
26 - http-proxy 27 - http-proxy
@@ -40,7 +41,7 @@ services:
40 - "--entrypoints=Name:https Address::443 TLS" 41 - "--entrypoints=Name:https Address::443 TLS"
41 - "--retry" 42 - "--retry"
42 - "--docker" 43 - "--docker"
43 - "--docker.domain=docker.localhost" 44 - "--docker.domain=${SHAARLI_VIRTUAL_HOST}"
44 - "--docker.exposedbydefault=true" 45 - "--docker.exposedbydefault=true"
45 - "--docker.watch=true" 46 - "--docker.watch=true"
46 - "--acme" 47 - "--acme"
diff --git a/inc/languages/fr/LC_MESSAGES/shaarli.po b/inc/languages/fr/LC_MESSAGES/shaarli.po
index 51bef6c7..26dede4e 100644
--- a/inc/languages/fr/LC_MESSAGES/shaarli.po
+++ b/inc/languages/fr/LC_MESSAGES/shaarli.po
@@ -1,8 +1,8 @@
1msgid "" 1msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: Shaarli\n" 3"Project-Id-Version: Shaarli\n"
4"POT-Creation-Date: 2020-11-05 19:43+0100\n" 4"POT-Creation-Date: 2020-11-09 14:39+0100\n"
5"PO-Revision-Date: 2020-11-05 19:44+0100\n" 5"PO-Revision-Date: 2020-11-09 14:42+0100\n"
6"Last-Translator: \n" 6"Last-Translator: \n"
7"Language-Team: Shaarli\n" 7"Language-Team: Shaarli\n"
8"Language: fr_FR\n" 8"Language: fr_FR\n"
@@ -189,9 +189,9 @@ msgstr ""
189#: application/bookmark/BookmarkInitializer.php:91 189#: application/bookmark/BookmarkInitializer.php:91
190#: application/legacy/LegacyLinkDB.php:246 190#: application/legacy/LegacyLinkDB.php:246
191#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15 191#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
192#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:50 192#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
193#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15 193#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15
194#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:50 194#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48
195msgid "" 195msgid ""
196"The personal, minimalist, super-fast, database free, bookmarking service" 196"The personal, minimalist, super-fast, database free, bookmarking service"
197msgstr "" 197msgstr ""
@@ -304,7 +304,7 @@ msgid "You have enabled or changed thumbnails mode."
304msgstr "Vous avez activé ou changé le mode de miniatures." 304msgstr "Vous avez activé ou changé le mode de miniatures."
305 305
306#: application/front/controller/admin/ConfigureController.php:103 306#: application/front/controller/admin/ConfigureController.php:103
307#: application/front/controller/admin/ServerController.php:68 307#: application/front/controller/admin/ServerController.php:75
308#: application/legacy/LegacyUpdater.php:538 308#: application/legacy/LegacyUpdater.php:538
309msgid "Please synchronize them." 309msgid "Please synchronize them."
310msgstr "Merci de les synchroniser." 310msgstr "Merci de les synchroniser."
@@ -347,30 +347,44 @@ msgstr ""
347"le serveur web peut accepter (%s). Merci de l'envoyer en parties plus " 347"le serveur web peut accepter (%s). Merci de l'envoyer en parties plus "
348"légères." 348"légères."
349 349
350#: application/front/controller/admin/ManageTagController.php:29 350#: application/front/controller/admin/ManageTagController.php:30
351msgid "whitespace"
352msgstr "espace"
353
354#: application/front/controller/admin/ManageTagController.php:35
351#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13 355#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
352#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42 356#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
353msgid "Manage tags" 357msgid "Manage tags"
354msgstr "Gérer les tags" 358msgstr "Gérer les tags"
355 359
356#: application/front/controller/admin/ManageTagController.php:48 360#: application/front/controller/admin/ManageTagController.php:54
357msgid "Invalid tags provided." 361msgid "Invalid tags provided."
358msgstr "Les tags fournis ne sont pas valides." 362msgstr "Les tags fournis ne sont pas valides."
359 363
360#: application/front/controller/admin/ManageTagController.php:72 364#: application/front/controller/admin/ManageTagController.php:78
361#, php-format 365#, php-format
362msgid "The tag was removed from %d bookmark." 366msgid "The tag was removed from %d bookmark."
363msgid_plural "The tag was removed from %d bookmarks." 367msgid_plural "The tag was removed from %d bookmarks."
364msgstr[0] "Le tag a été supprimé du %d lien." 368msgstr[0] "Le tag a été supprimé du %d lien."
365msgstr[1] "Le tag a été supprimé de %d liens." 369msgstr[1] "Le tag a été supprimé de %d liens."
366 370
367#: application/front/controller/admin/ManageTagController.php:77 371#: application/front/controller/admin/ManageTagController.php:83
368#, php-format 372#, php-format
369msgid "The tag was renamed in %d bookmark." 373msgid "The tag was renamed in %d bookmark."
370msgid_plural "The tag was renamed in %d bookmarks." 374msgid_plural "The tag was renamed in %d bookmarks."
371msgstr[0] "Le tag a été renommé dans %d lien." 375msgstr[0] "Le tag a été renommé dans %d lien."
372msgstr[1] "Le tag a été renommé dans %d liens." 376msgstr[1] "Le tag a été renommé dans %d liens."
373 377
378#: application/front/controller/admin/ManageTagController.php:105
379msgid "Tags separator must be a single character."
380msgstr "Un séparateur de tags doit contenir un seul caractère."
381
382#: application/front/controller/admin/ManageTagController.php:111
383msgid "These characters are reserved and can't be used as tags separator: "
384msgstr ""
385"Ces caractères sont réservés et ne peuvent être utilisés comme des "
386"séparateurs de tags : "
387
374#: application/front/controller/admin/PasswordController.php:28 388#: application/front/controller/admin/PasswordController.php:28
375#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13 389#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
376#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35 390#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35
@@ -405,17 +419,21 @@ msgstr ""
405"Une erreur s'est produite lors de la sauvegarde de la configuration des " 419"Une erreur s'est produite lors de la sauvegarde de la configuration des "
406"plugins : " 420"plugins : "
407 421
408#: application/front/controller/admin/ServerController.php:50 422#: application/front/controller/admin/ServerController.php:35
423msgid "Check disabled"
424msgstr "Vérification désactivée"
425
426#: application/front/controller/admin/ServerController.php:57
409#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 427#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
410#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28 428#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
411msgid "Server administration" 429msgid "Server administration"
412msgstr "Administration serveur" 430msgstr "Administration serveur"
413 431
414#: application/front/controller/admin/ServerController.php:67 432#: application/front/controller/admin/ServerController.php:74
415msgid "Thumbnails cache has been cleared." 433msgid "Thumbnails cache has been cleared."
416msgstr "Le cache des miniatures a été vidé." 434msgstr "Le cache des miniatures a été vidé."
417 435
418#: application/front/controller/admin/ServerController.php:76 436#: application/front/controller/admin/ServerController.php:83
419msgid "Shaarli's cache folder has been cleared!" 437msgid "Shaarli's cache folder has been cleared!"
420msgstr "Le dossier de cache de Shaarli a été vidé !" 438msgstr "Le dossier de cache de Shaarli a été vidé !"
421 439
@@ -441,18 +459,18 @@ msgstr "Le lien avec l'identifiant %s n'a pas pu être trouvé."
441msgid "Invalid visibility provided." 459msgid "Invalid visibility provided."
442msgstr "Visibilité du lien non valide." 460msgstr "Visibilité du lien non valide."
443 461
444#: application/front/controller/admin/ShaarePublishController.php:168 462#: application/front/controller/admin/ShaarePublishController.php:171
445#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:171 463#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:171
446msgid "Edit" 464msgid "Edit"
447msgstr "Modifier" 465msgstr "Modifier"
448 466
449#: application/front/controller/admin/ShaarePublishController.php:171 467#: application/front/controller/admin/ShaarePublishController.php:174
450#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28 468#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
451#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:28 469#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:28
452msgid "Shaare" 470msgid "Shaare"
453msgstr "Shaare" 471msgstr "Shaare"
454 472
455#: application/front/controller/admin/ShaarePublishController.php:202 473#: application/front/controller/admin/ShaarePublishController.php:205
456msgid "Note: " 474msgid "Note: "
457msgstr "Note : " 475msgstr "Note : "
458 476
@@ -467,7 +485,7 @@ msgstr "Mise à jour des miniatures"
467msgid "Tools" 485msgid "Tools"
468msgstr "Outils" 486msgstr "Outils"
469 487
470#: application/front/controller/visitor/BookmarkListController.php:116 488#: application/front/controller/visitor/BookmarkListController.php:120
471msgid "Search: " 489msgid "Search: "
472msgstr "Recherche : " 490msgstr "Recherche : "
473 491
@@ -572,7 +590,7 @@ msgstr "Nom d'utilisateur ou mot de passe incorrect(s)."
572msgid "Picture wall" 590msgid "Picture wall"
573msgstr "Mur d'images" 591msgstr "Mur d'images"
574 592
575#: application/front/controller/visitor/TagCloudController.php:88 593#: application/front/controller/visitor/TagCloudController.php:90
576msgid "Tag " 594msgid "Tag "
577msgstr "Tag " 595msgstr "Tag "
578 596
@@ -1033,6 +1051,32 @@ msgstr "Vous pouvez aussi modifier les tags dans la"
1033msgid "tag list" 1051msgid "tag list"
1034msgstr "liste des tags" 1052msgstr "liste des tags"
1035 1053
1054#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47
1055msgid "Change tags separator"
1056msgstr "Changer le séparateur de tags"
1057
1058#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:50
1059msgid "Your current tag separator is"
1060msgstr "Votre séparateur actuel est"
1061
1062#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:53
1063msgid "New separator"
1064msgstr "Nouveau séparateur"
1065
1066#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58
1067#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:355
1068#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:121
1069#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139
1070#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:199
1071msgid "Save"
1072msgstr "Enregistrer"
1073
1074#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:61
1075msgid "Note that hashtags won't fully work with a non-whitespace separator."
1076msgstr ""
1077"Notez que les hashtags ne sont pas complètement fonctionnels avec un "
1078"séparateur qui n'est pas un espace."
1079
1036#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29 1080#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
1037msgid "title" 1081msgid "title"
1038msgstr "titre" 1082msgstr "titre"
@@ -1176,13 +1220,6 @@ msgstr "Seulement les hébergeurs de média connus"
1176msgid "None" 1220msgid "None"
1177msgstr "Aucune" 1221msgstr "Aucune"
1178 1222
1179#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:355
1180#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:121
1181#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139
1182#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:199
1183msgid "Save"
1184msgstr "Enregistrer"
1185
1186#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26 1223#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
1187msgid "1 RSS entry per :type" 1224msgid "1 RSS entry per :type"
1188msgid_plural "" 1225msgid_plural ""
@@ -1435,8 +1472,8 @@ msgid "without any tag"
1435msgstr "sans tag" 1472msgstr "sans tag"
1436 1473
1437#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:175 1474#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:175
1438#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43 1475#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
1439#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:43 1476#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:41
1440msgid "Fold" 1477msgid "Fold"
1441msgstr "Replier" 1478msgstr "Replier"
1442 1479
@@ -1493,8 +1530,8 @@ msgstr "Tout sélectionner"
1493#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:89 1530#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:89
1494#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:29 1531#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:29
1495#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:89 1532#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:89
1496#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44 1533#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
1497#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:44 1534#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:42
1498msgid "Fold all" 1535msgid "Fold all"
1499msgstr "Replier tout" 1536msgstr "Replier tout"
1500 1537
@@ -1510,9 +1547,9 @@ msgid "Remember me"
1510msgstr "Rester connecté" 1547msgstr "Rester connecté"
1511 1548
1512#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15 1549#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
1513#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:50 1550#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
1514#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15 1551#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15
1515#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:50 1552#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48
1516msgid "by the Shaarli community" 1553msgid "by the Shaarli community"
1517msgstr "par la communauté Shaarli" 1554msgstr "par la communauté Shaarli"
1518 1555
@@ -1521,23 +1558,23 @@ msgstr "par la communauté Shaarli"
1521msgid "Documentation" 1558msgid "Documentation"
1522msgstr "Documentation" 1559msgstr "Documentation"
1523 1560
1524#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:45 1561#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43
1525#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:45 1562#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:43
1526msgid "Expand" 1563msgid "Expand"
1527msgstr "Déplier" 1564msgstr "Déplier"
1528 1565
1529#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46 1566#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
1530#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:46 1567#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:44
1531msgid "Expand all" 1568msgid "Expand all"
1532msgstr "Déplier tout" 1569msgstr "Déplier tout"
1533 1570
1534#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47 1571#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:45
1535#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:47 1572#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:45
1536msgid "Are you sure you want to delete this link?" 1573msgid "Are you sure you want to delete this link?"
1537msgstr "Êtes-vous sûr de vouloir supprimer ce lien ?" 1574msgstr "Êtes-vous sûr de vouloir supprimer ce lien ?"
1538 1575
1539#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48 1576#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
1540#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48 1577#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:46
1541msgid "Are you sure you want to delete this tag?" 1578msgid "Are you sure you want to delete this tag?"
1542msgstr "Êtes-vous sûr de vouloir supprimer ce tag ?" 1579msgstr "Êtes-vous sûr de vouloir supprimer ce tag ?"
1543 1580
diff --git a/tpl/vintage/daily.html b/tpl/vintage/daily.html
index 74f6cdc7..28ba9f90 100644
--- a/tpl/vintage/daily.html
+++ b/tpl/vintage/daily.html
@@ -14,9 +14,9 @@
14 14
15 <div class="dailyAbout"> 15 <div class="dailyAbout">
16 All links of one day<br>in a single page.<br> 16 All links of one day<br>in a single page.<br>
17 {if="$previousday"} <a href="{$base_path}/daily&amp;day={$previousday}"><b>&lt;</b>Previous day</a>{else}<b>&lt;</b>Previous day{/if} 17 {if="$previousday"} <a href="{$base_path}/daily?day={$previousday}"><b>&lt;</b>Previous day</a>{else}<b>&lt;</b>Previous day{/if}
18 - 18 -
19 {if="$nextday"}<a href="{$base_path}/daily&amp;day={$nextday}">Next day<b>&gt;</b></a>{else}Next day<b>&gt;</b>{/if} 19 {if="$nextday"}<a href="{$base_path}/daily?day={$nextday}">Next day<b>&gt;</b></a>{else}Next day<b>&gt;</b>{/if}
20 <br> 20 <br>
21 21
22 {loop="$daily_about_plugin"} 22 {loop="$daily_about_plugin"}
@@ -52,13 +52,13 @@
52 {$link=$value} 52 {$link=$value}
53 <div class="dailyEntry"> 53 <div class="dailyEntry">
54 <div class="dailyEntryPermalink"> 54 <div class="dailyEntryPermalink">
55 <a href="{$base_path}/?{$value.shorturl}"> 55 <a href="{$base_path}/shaare/{$value.shorturl}">
56 <img src="{$asset_path}/img/squiggle.png#" width="25" height="26" title="permalink" alt="permalink"> 56 <img src="{$asset_path}/img/squiggle.png#" width="25" height="26" title="permalink" alt="permalink">
57 </a> 57 </a>
58 </div> 58 </div>
59 {if="!$hide_timestamps || $is_logged_in"} 59 {if="!$hide_timestamps || $is_logged_in"}
60 <div class="dailyEntryLinkdate"> 60 <div class="dailyEntryLinkdate">
61 <a href="{$base_path}/?{$value.shorturl}">{function="strftime('%c', $link.timestamp)"}</a> 61 <a href="{$base_path}/shaare/{$value.shorturl}">{function="strftime('%c', $link.timestamp)"}</a>
62 </div> 62 </div>
63 {/if} 63 {/if}
64 {if="$link.tags"} 64 {if="$link.tags"}
diff --git a/tpl/vintage/editlink.html b/tpl/vintage/editlink.html
index eb8807b5..343418bc 100644
--- a/tpl/vintage/editlink.html
+++ b/tpl/vintage/editlink.html
@@ -6,6 +6,7 @@
6{if="$link.title==''"}onload="document.linkform.lf_title.focus();" 6{if="$link.title==''"}onload="document.linkform.lf_title.focus();"
7{elseif="$link.description==''"}onload="document.linkform.lf_description.focus();" 7{elseif="$link.description==''"}onload="document.linkform.lf_description.focus();"
8{else}onload="document.linkform.lf_tags.focus();"{/if} > 8{else}onload="document.linkform.lf_tags.focus();"{/if} >
9{$asyncLoadClass=$link_is_new && $async_metadata && empty($link.title) ? 'loading-input' : ''}
9<div id="pageheader"> 10<div id="pageheader">
10 {include="page.header"} 11 {include="page.header"}
11 <div id="shaarli_title"><a href="{$titleLink}">{$shaarlititle}</a></div> 12 <div id="shaarli_title"><a href="{$titleLink}">{$shaarlititle}</a></div>
@@ -14,12 +15,29 @@
14 {if="isset($link.id)"} 15 {if="isset($link.id)"}
15 <input type="hidden" name="lf_id" value="{$link.id}"> 16 <input type="hidden" name="lf_id" value="{$link.id}">
16 {/if} 17 {/if}
17 <label for="lf_url"><i>URL</i></label><br><input type="text" name="lf_url" id="lf_url" value="{$link.url}" class="lf_input"><br> 18 <label for="lf_url"><i>URL</i></label><br><input type="text" name="lf_url" id="lf_url" value="{$link.url}" class="lf_input">
18 <label for="lf_title"><i>Title</i></label><br><input type="text" name="lf_title" id="lf_title" value="{$link.title}" class="lf_input"><br> 19 <label for="lf_title"><i>Title</i></label>
19 <label for="lf_description"><i>Description</i></label><br><textarea name="lf_description" id="lf_description" rows="4" cols="25">{$link.description}</textarea><br> 20 <div class="{$asyncLoadClass}">
20 <label for="lf_tags"><i>Tags</i></label><br> 21 <input type="text" name="lf_title" id="lf_title" value="{$link.title}" class="lf_input">
21 <input type="text" name="lf_tags" id="lf_tags" value="{$link.tags}" class="lf_input" 22 <div class="icon-container">
22 data-list="{loop="$tags"}{$key}, {/loop}" data-multiple autocomplete="off" ><br> 23 <i class="loader"></i>
24 </div>
25 </div>
26 <label for="lf_description"><i>Description</i></label>
27 <div class="{if="$retrieve_description"}{$asyncLoadClass}{/if}">
28 <textarea name="lf_description" id="lf_description" rows="4" cols="25">{$link.description}</textarea>
29 <div class="icon-container">
30 <i class="loader"></i>
31 </div>
32 </div>
33 <label for="lf_tags"><i>Tags</i></label>
34 <div class="{if="$retrieve_description"}{$asyncLoadClass}{/if}">
35 <input type="text" name="lf_tags" id="lf_tags" value="{$link.tags}" class="lf_input"
36 data-list="{loop="$tags"}{$key}, {/loop}" data-multiple autocomplete="off" >
37 <div class="icon-container">
38 <i class="loader"></i>
39 </div>
40 </div>
23 41
24 {if="$formatter==='markdown'"} 42 {if="$formatter==='markdown'"}
25 <div class="md_help"> 43 <div class="md_help">
@@ -56,5 +74,5 @@
56 </div> 74 </div>
57</div> 75</div>
58{include="page.footer"} 76{include="page.footer"}
59</body> 77{if="$link_is_new && $async_metadata"}<script src="{$asset_path}/js/metadata.min.js?v={$version_hash}#"></script>{/if}</body>
60</html> 78</html>
diff --git a/tpl/vintage/page.header.html b/tpl/vintage/page.header.html
index 0a33523b..64d7f656 100644
--- a/tpl/vintage/page.header.html
+++ b/tpl/vintage/page.header.html
@@ -54,6 +54,30 @@
54 </ul> 54 </ul>
55{/if} 55{/if}
56 56
57{if="!empty($global_errors)"}
58 <ul class="errors">
59 {loop="$global_errors"}
60 <li>{$value}</li>
61 {/loop}
62 </ul>
63{/if}
64
65{if="!empty($global_warnings)"}
66 <ul class="warnings">
67 {loop="$global_warnings"}
68 <li>{$value}</li>
69 {/loop}
70 </ul>
71{/if}
72
73{if="!empty($global_successes)"}
74 <ul class="successes">
75 {loop="$global_successes"}
76 <li>{$value}</li>
77 {/loop}
78 </ul>
79{/if}
80
57<div class="clear"></div> 81<div class="clear"></div>
58 82
59 83