aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Dockerfile2
-rw-r--r--Dockerfile.armhf8
-rw-r--r--application/Languages.php1
-rw-r--r--application/bookmark/BookmarkIO.php22
-rw-r--r--application/container/ContainerBuilder.php17
-rw-r--r--application/front/controller/admin/ServerController.php7
-rw-r--r--application/front/controller/visitor/InstallController.php7
-rw-r--r--application/helper/ApplicationUtils.php16
-rw-r--r--application/plugin/PluginManager.php64
-rw-r--r--application/plugin/exception/PluginInvalidRouteException.php26
-rw-r--r--doc/md/dev/Plugin-system.md25
-rw-r--r--doc/md/dev/Release-Shaarli.md8
-rw-r--r--inc/languages/fr/LC_MESSAGES/shaarli.po186
-rw-r--r--inc/languages/ru/LC_MESSAGES/shaarli.po1944
-rw-r--r--index.php22
-rw-r--r--phpcs.xml1
-rw-r--r--plugins/demo_plugin/DemoPluginController.php24
-rw-r--r--plugins/demo_plugin/demo_plugin.php19
-rw-r--r--tests/PluginManagerTest.php39
-rw-r--r--tests/container/ContainerBuilderTest.php5
-rw-r--r--tests/front/controller/admin/ConfigureControllerTest.php2
-rw-r--r--tests/plugins/test/test.php16
-rw-r--r--tests/plugins/test_route_invalid/test_route_invalid.php12
-rw-r--r--tpl/default/pluginscontent.html13
-rw-r--r--yarn.lock6
25 files changed, 2377 insertions, 115 deletions
diff --git a/Dockerfile b/Dockerfile
index f6120b71..79d33130 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -26,7 +26,7 @@ RUN cd shaarli \
26 26
27# Stage 4: 27# Stage 4:
28# - Shaarli image 28# - Shaarli image
29FROM alpine:3.8 29FROM alpine:3.12
30LABEL maintainer="Shaarli Community" 30LABEL maintainer="Shaarli Community"
31 31
32RUN apk --update --no-cache add \ 32RUN apk --update --no-cache add \
diff --git a/Dockerfile.armhf b/Dockerfile.armhf
index 5bbf6680..471f2397 100644
--- a/Dockerfile.armhf
+++ b/Dockerfile.armhf
@@ -1,7 +1,7 @@
1# Stage 1: 1# Stage 1:
2# - Copy Shaarli sources 2# - Copy Shaarli sources
3# - Build documentation 3# - Build documentation
4FROM arm32v6/alpine:3.8 as docs 4FROM arm32v6/alpine:3.10 as docs
5ADD . /usr/src/app/shaarli 5ADD . /usr/src/app/shaarli
6RUN apk --update --no-cache add py2-pip \ 6RUN apk --update --no-cache add py2-pip \
7 && cd /usr/src/app/shaarli \ 7 && cd /usr/src/app/shaarli \
@@ -10,7 +10,7 @@ RUN apk --update --no-cache add py2-pip \
10 10
11# Stage 2: 11# Stage 2:
12# - Resolve PHP dependencies with Composer 12# - Resolve PHP dependencies with Composer
13FROM arm32v6/alpine:3.8 as composer 13FROM arm32v6/alpine:3.10 as composer
14COPY --from=docs /usr/src/app/shaarli /app/shaarli 14COPY --from=docs /usr/src/app/shaarli /app/shaarli
15RUN apk --update --no-cache add php7-curl php7-mbstring php7-simplexml composer \ 15RUN apk --update --no-cache add php7-curl php7-mbstring php7-simplexml composer \
16 && cd /app/shaarli \ 16 && cd /app/shaarli \
@@ -18,7 +18,7 @@ RUN apk --update --no-cache add php7-curl php7-mbstring php7-simplexml composer
18 18
19# Stage 3: 19# Stage 3:
20# - Frontend dependencies 20# - Frontend dependencies
21FROM arm32v6/alpine:3.8 as node 21FROM arm32v6/alpine:3.10 as node
22COPY --from=composer /app/shaarli /shaarli 22COPY --from=composer /app/shaarli /shaarli
23RUN apk --update --no-cache add yarn nodejs-current python2 build-base \ 23RUN apk --update --no-cache add yarn nodejs-current python2 build-base \
24 && cd /shaarli \ 24 && cd /shaarli \
@@ -28,7 +28,7 @@ RUN apk --update --no-cache add yarn nodejs-current python2 build-base \
28 28
29# Stage 4: 29# Stage 4:
30# - Shaarli image 30# - Shaarli image
31FROM arm32v6/alpine:3.8 31FROM arm32v6/alpine:3.10
32LABEL maintainer="Shaarli Community" 32LABEL maintainer="Shaarli Community"
33 33
34RUN apk --update --no-cache add \ 34RUN apk --update --no-cache add \
diff --git a/application/Languages.php b/application/Languages.php
index 60e91631..7177db2c 100644
--- a/application/Languages.php
+++ b/application/Languages.php
@@ -186,6 +186,7 @@ class Languages
186 'en' => t('English'), 186 'en' => t('English'),
187 'fr' => t('French'), 187 'fr' => t('French'),
188 'jp' => t('Japanese'), 188 'jp' => t('Japanese'),
189 'ru' => t('Russian'),
189 ]; 190 ];
190 } 191 }
191} 192}
diff --git a/application/bookmark/BookmarkIO.php b/application/bookmark/BookmarkIO.php
index c78dbe41..8439d470 100644
--- a/application/bookmark/BookmarkIO.php
+++ b/application/bookmark/BookmarkIO.php
@@ -4,6 +4,7 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Bookmark; 5namespace Shaarli\Bookmark;
6 6
7use malkusch\lock\exception\LockAcquireException;
7use malkusch\lock\mutex\Mutex; 8use malkusch\lock\mutex\Mutex;
8use malkusch\lock\mutex\NoMutex; 9use malkusch\lock\mutex\NoMutex;
9use Shaarli\Bookmark\Exception\DatastoreNotInitializedException; 10use Shaarli\Bookmark\Exception\DatastoreNotInitializedException;
@@ -80,7 +81,7 @@ class BookmarkIO
80 } 81 }
81 82
82 $content = null; 83 $content = null;
83 $this->mutex->synchronized(function () use (&$content) { 84 $this->synchronized(function () use (&$content) {
84 $content = file_get_contents($this->datastore); 85 $content = file_get_contents($this->datastore);
85 }); 86 });
86 87
@@ -119,11 +120,28 @@ class BookmarkIO
119 120
120 $data = self::$phpPrefix . base64_encode(gzdeflate(serialize($links))) . self::$phpSuffix; 121 $data = self::$phpPrefix . base64_encode(gzdeflate(serialize($links))) . self::$phpSuffix;
121 122
122 $this->mutex->synchronized(function () use ($data) { 123 $this->synchronized(function () use ($data) {
123 file_put_contents( 124 file_put_contents(
124 $this->datastore, 125 $this->datastore,
125 $data 126 $data
126 ); 127 );
127 }); 128 });
128 } 129 }
130
131 /**
132 * Wrapper applying mutex to provided function.
133 * If the lock can't be acquired (e.g. some shared hosting provider), we execute the function without mutex.
134 *
135 * @see https://github.com/shaarli/Shaarli/issues/1650
136 *
137 * @param callable $function
138 */
139 protected function synchronized(callable $function): void
140 {
141 try {
142 $this->mutex->synchronized($function);
143 } catch (LockAcquireException $exception) {
144 $function();
145 }
146 }
129} 147}
diff --git a/application/container/ContainerBuilder.php b/application/container/ContainerBuilder.php
index f0234eca..6d69a880 100644
--- a/application/container/ContainerBuilder.php
+++ b/application/container/ContainerBuilder.php
@@ -50,6 +50,9 @@ class ContainerBuilder
50 /** @var LoginManager */ 50 /** @var LoginManager */
51 protected $login; 51 protected $login;
52 52
53 /** @var PluginManager */
54 protected $pluginManager;
55
53 /** @var LoggerInterface */ 56 /** @var LoggerInterface */
54 protected $logger; 57 protected $logger;
55 58
@@ -61,12 +64,14 @@ class ContainerBuilder
61 SessionManager $session, 64 SessionManager $session,
62 CookieManager $cookieManager, 65 CookieManager $cookieManager,
63 LoginManager $login, 66 LoginManager $login,
67 PluginManager $pluginManager,
64 LoggerInterface $logger 68 LoggerInterface $logger
65 ) { 69 ) {
66 $this->conf = $conf; 70 $this->conf = $conf;
67 $this->session = $session; 71 $this->session = $session;
68 $this->login = $login; 72 $this->login = $login;
69 $this->cookieManager = $cookieManager; 73 $this->cookieManager = $cookieManager;
74 $this->pluginManager = $pluginManager;
70 $this->logger = $logger; 75 $this->logger = $logger;
71 } 76 }
72 77
@@ -78,12 +83,10 @@ class ContainerBuilder
78 $container['sessionManager'] = $this->session; 83 $container['sessionManager'] = $this->session;
79 $container['cookieManager'] = $this->cookieManager; 84 $container['cookieManager'] = $this->cookieManager;
80 $container['loginManager'] = $this->login; 85 $container['loginManager'] = $this->login;
86 $container['pluginManager'] = $this->pluginManager;
81 $container['logger'] = $this->logger; 87 $container['logger'] = $this->logger;
82 $container['basePath'] = $this->basePath; 88 $container['basePath'] = $this->basePath;
83 89
84 $container['plugins'] = function (ShaarliContainer $container): PluginManager {
85 return new PluginManager($container->conf);
86 };
87 90
88 $container['history'] = function (ShaarliContainer $container): History { 91 $container['history'] = function (ShaarliContainer $container): History {
89 return new History($container->conf->get('resource.history')); 92 return new History($container->conf->get('resource.history'));
@@ -113,14 +116,6 @@ class ContainerBuilder
113 ); 116 );
114 }; 117 };
115 118
116 $container['pluginManager'] = function (ShaarliContainer $container): PluginManager {
117 $pluginManager = new PluginManager($container->conf);
118
119 $pluginManager->load($container->conf->get('general.enabled_plugins'));
120
121 return $pluginManager;
122 };
123
124 $container['formatterFactory'] = function (ShaarliContainer $container): FormatterFactory { 119 $container['formatterFactory'] = function (ShaarliContainer $container): FormatterFactory {
125 return new FormatterFactory( 120 return new FormatterFactory(
126 $container->conf, 121 $container->conf,
diff --git a/application/front/controller/admin/ServerController.php b/application/front/controller/admin/ServerController.php
index fabeaf2f..4b74f4a9 100644
--- a/application/front/controller/admin/ServerController.php
+++ b/application/front/controller/admin/ServerController.php
@@ -39,11 +39,16 @@ class ServerController extends ShaarliAdminController
39 $currentVersion = $currentVersion === 'dev' ? $currentVersion : 'v' . $currentVersion; 39 $currentVersion = $currentVersion === 'dev' ? $currentVersion : 'v' . $currentVersion;
40 $phpEol = new \DateTimeImmutable(ApplicationUtils::getPhpEol(PHP_VERSION)); 40 $phpEol = new \DateTimeImmutable(ApplicationUtils::getPhpEol(PHP_VERSION));
41 41
42 $permissions = array_merge(
43 ApplicationUtils::checkResourcePermissions($this->container->conf),
44 ApplicationUtils::checkDatastoreMutex()
45 );
46
42 $this->assignView('php_version', PHP_VERSION); 47 $this->assignView('php_version', PHP_VERSION);
43 $this->assignView('php_eol', format_date($phpEol, false)); 48 $this->assignView('php_eol', format_date($phpEol, false));
44 $this->assignView('php_has_reached_eol', $phpEol < new \DateTimeImmutable()); 49 $this->assignView('php_has_reached_eol', $phpEol < new \DateTimeImmutable());
45 $this->assignView('php_extensions', ApplicationUtils::getPhpExtensionsRequirement()); 50 $this->assignView('php_extensions', ApplicationUtils::getPhpExtensionsRequirement());
46 $this->assignView('permissions', ApplicationUtils::checkResourcePermissions($this->container->conf)); 51 $this->assignView('permissions', $permissions);
47 $this->assignView('release_url', $releaseUrl); 52 $this->assignView('release_url', $releaseUrl);
48 $this->assignView('latest_version', $latestVersion); 53 $this->assignView('latest_version', $latestVersion);
49 $this->assignView('current_version', $currentVersion); 54 $this->assignView('current_version', $currentVersion);
diff --git a/application/front/controller/visitor/InstallController.php b/application/front/controller/visitor/InstallController.php
index bf965929..418d4a49 100644
--- a/application/front/controller/visitor/InstallController.php
+++ b/application/front/controller/visitor/InstallController.php
@@ -56,11 +56,16 @@ class InstallController extends ShaarliVisitorController
56 56
57 $phpEol = new \DateTimeImmutable(ApplicationUtils::getPhpEol(PHP_VERSION)); 57 $phpEol = new \DateTimeImmutable(ApplicationUtils::getPhpEol(PHP_VERSION));
58 58
59 $permissions = array_merge(
60 ApplicationUtils::checkResourcePermissions($this->container->conf),
61 ApplicationUtils::checkDatastoreMutex()
62 );
63
59 $this->assignView('php_version', PHP_VERSION); 64 $this->assignView('php_version', PHP_VERSION);
60 $this->assignView('php_eol', format_date($phpEol, false)); 65 $this->assignView('php_eol', format_date($phpEol, false));
61 $this->assignView('php_has_reached_eol', $phpEol < new \DateTimeImmutable()); 66 $this->assignView('php_has_reached_eol', $phpEol < new \DateTimeImmutable());
62 $this->assignView('php_extensions', ApplicationUtils::getPhpExtensionsRequirement()); 67 $this->assignView('php_extensions', ApplicationUtils::getPhpExtensionsRequirement());
63 $this->assignView('permissions', ApplicationUtils::checkResourcePermissions($this->container->conf)); 68 $this->assignView('permissions', $permissions);
64 69
65 $this->assignView('pagetitle', t('Install Shaarli')); 70 $this->assignView('pagetitle', t('Install Shaarli'));
66 71
diff --git a/application/helper/ApplicationUtils.php b/application/helper/ApplicationUtils.php
index 212dd8e2..a6c03aae 100644
--- a/application/helper/ApplicationUtils.php
+++ b/application/helper/ApplicationUtils.php
@@ -3,6 +3,8 @@
3namespace Shaarli\Helper; 3namespace Shaarli\Helper;
4 4
5use Exception; 5use Exception;
6use malkusch\lock\exception\LockAcquireException;
7use malkusch\lock\mutex\FlockMutex;
6use Shaarli\Config\ConfigManager; 8use Shaarli\Config\ConfigManager;
7 9
8/** 10/**
@@ -252,6 +254,20 @@ class ApplicationUtils
252 return $errors; 254 return $errors;
253 } 255 }
254 256
257 public static function checkDatastoreMutex(): array
258 {
259 $mutex = new FlockMutex(fopen(SHAARLI_MUTEX_FILE, 'r'), 2);
260 try {
261 $mutex->synchronized(function () {
262 return true;
263 });
264 } catch (LockAcquireException $e) {
265 $errors[] = t('Lock can not be acquired on the datastore. You might encounter concurrent access issues.');
266 }
267
268 return $errors ?? [];
269 }
270
255 /** 271 /**
256 * Returns a salted hash representing the current Shaarli version. 272 * Returns a salted hash representing the current Shaarli version.
257 * 273 *
diff --git a/application/plugin/PluginManager.php b/application/plugin/PluginManager.php
index 3ea55728..7fc0cb04 100644
--- a/application/plugin/PluginManager.php
+++ b/application/plugin/PluginManager.php
@@ -4,6 +4,7 @@ namespace Shaarli\Plugin;
4 4
5use Shaarli\Config\ConfigManager; 5use Shaarli\Config\ConfigManager;
6use Shaarli\Plugin\Exception\PluginFileNotFoundException; 6use Shaarli\Plugin\Exception\PluginFileNotFoundException;
7use Shaarli\Plugin\Exception\PluginInvalidRouteException;
7 8
8/** 9/**
9 * Class PluginManager 10 * Class PluginManager
@@ -26,6 +27,14 @@ class PluginManager
26 */ 27 */
27 private $loadedPlugins = []; 28 private $loadedPlugins = [];
28 29
30 /** @var array List of registered routes. Contains keys:
31 * - `method`: HTTP method, GET/POST/PUT/PATCH/DELETE
32 * - `route` (path): without prefix, e.g. `/up/{variable}`
33 * It will be later prefixed by `/plugin/<plugin name>/`.
34 * - `callable` string, function name or FQN class's method, e.g. `demo_plugin_custom_controller`.
35 */
36 protected $registeredRoutes = [];
37
29 /** 38 /**
30 * @var ConfigManager Configuration Manager instance. 39 * @var ConfigManager Configuration Manager instance.
31 */ 40 */
@@ -86,6 +95,9 @@ class PluginManager
86 $this->loadPlugin($dirs[$index], $plugin); 95 $this->loadPlugin($dirs[$index], $plugin);
87 } catch (PluginFileNotFoundException $e) { 96 } catch (PluginFileNotFoundException $e) {
88 error_log($e->getMessage()); 97 error_log($e->getMessage());
98 } catch (\Throwable $e) {
99 $error = $plugin . t(' [plugin incompatibility]: ') . $e->getMessage();
100 $this->errors = array_unique(array_merge($this->errors, [$error]));
89 } 101 }
90 } 102 }
91 } 103 }
@@ -166,6 +178,22 @@ class PluginManager
166 } 178 }
167 } 179 }
168 180
181 $registerRouteFunction = $pluginName . '_register_routes';
182 $routes = null;
183 if (function_exists($registerRouteFunction)) {
184 $routes = call_user_func($registerRouteFunction);
185 }
186
187 if ($routes !== null) {
188 foreach ($routes as $route) {
189 if (static::validateRouteRegistration($route)) {
190 $this->registeredRoutes[$pluginName][] = $route;
191 } else {
192 throw new PluginInvalidRouteException($pluginName);
193 }
194 }
195 }
196
169 $this->loadedPlugins[] = $pluginName; 197 $this->loadedPlugins[] = $pluginName;
170 } 198 }
171 199
@@ -238,6 +266,14 @@ class PluginManager
238 } 266 }
239 267
240 /** 268 /**
269 * @return array List of registered custom routes by plugins.
270 */
271 public function getRegisteredRoutes(): array
272 {
273 return $this->registeredRoutes;
274 }
275
276 /**
241 * Return the list of encountered errors. 277 * Return the list of encountered errors.
242 * 278 *
243 * @return array List of errors (empty array if none exists). 279 * @return array List of errors (empty array if none exists).
@@ -246,4 +282,32 @@ class PluginManager
246 { 282 {
247 return $this->errors; 283 return $this->errors;
248 } 284 }
285
286 /**
287 * Checks whether provided input is valid to register a new route.
288 * It must contain keys `method`, `route`, `callable` (all strings).
289 *
290 * @param string[] $input
291 *
292 * @return bool
293 */
294 protected static function validateRouteRegistration(array $input): bool
295 {
296 if (
297 !array_key_exists('method', $input)
298 || !in_array(strtoupper($input['method']), ['GET', 'PUT', 'PATCH', 'POST', 'DELETE'])
299 ) {
300 return false;
301 }
302
303 if (!array_key_exists('route', $input) || !preg_match('#^[a-z\d/\.\-_]+$#', $input['route'])) {
304 return false;
305 }
306
307 if (!array_key_exists('callable', $input)) {
308 return false;
309 }
310
311 return true;
312 }
249} 313}
diff --git a/application/plugin/exception/PluginInvalidRouteException.php b/application/plugin/exception/PluginInvalidRouteException.php
new file mode 100644
index 00000000..6ba9bc43
--- /dev/null
+++ b/application/plugin/exception/PluginInvalidRouteException.php
@@ -0,0 +1,26 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Shaarli\Plugin\Exception;
6
7use Exception;
8
9/**
10 * Class PluginFileNotFoundException
11 *
12 * Raise when plugin files can't be found.
13 */
14class PluginInvalidRouteException extends Exception
15{
16 /**
17 * Construct exception with plugin name.
18 * Generate message.
19 *
20 * @param string $pluginName name of the plugin not found
21 */
22 public function __construct()
23 {
24 $this->message = 'trying to register invalid route.';
25 }
26}
diff --git a/doc/md/dev/Plugin-system.md b/doc/md/dev/Plugin-system.md
index f09fadc2..79654011 100644
--- a/doc/md/dev/Plugin-system.md
+++ b/doc/md/dev/Plugin-system.md
@@ -139,6 +139,31 @@ Each file contain two keys:
139 139
140> Note: In PHP, `parse_ini_file()` seems to want strings to be between by quotes `"` in the ini file. 140> Note: In PHP, `parse_ini_file()` seems to want strings to be between by quotes `"` in the ini file.
141 141
142### Register plugin's routes
143
144Shaarli lets you register custom Slim routes for your plugin.
145
146To register a route, the plugin must include a function called `function <plugin_name>_register_routes(): array`.
147
148This method must return an array of routes, each entry must contain the following keys:
149
150 - `method`: HTTP method, `GET/POST/PUT/PATCH/DELETE`
151 - `route` (path): without prefix, e.g. `/up/{variable}`
152 It will be later prefixed by `/plugin/<plugin name>/`.
153 - `callable` string, function name or FQN class's method to execute, e.g. `demo_plugin_custom_controller`.
154
155Callable functions or methods must have `Slim\Http\Request` and `Slim\Http\Response` parameters
156and return a `Slim\Http\Response`. We recommend creating a dedicated class and extend either
157`ShaarliVisitorController` or `ShaarliAdminController` to use helper functions they provide.
158
159A dedicated plugin template is available for rendering content: `pluginscontent.html` using `content` placeholder.
160
161> **Warning**: plugins are not able to use RainTPL template engine for their content due to technical restrictions.
162> RainTPL does not allow to register multiple template folders, so all HTML rendering must be done within plugin
163> custom controller.
164
165Check out the `demo_plugin` for a live example: `GET <shaarli_url>/plugin/demo_plugin/custom`.
166
142### Understanding relative paths 167### Understanding relative paths
143 168
144Because Shaarli is a self-hosted tool, an instance can either be installed at the root directory, or under a subfolder. 169Because Shaarli is a self-hosted tool, an instance can either be installed at the root directory, or under a subfolder.
diff --git a/doc/md/dev/Release-Shaarli.md b/doc/md/dev/Release-Shaarli.md
index 2c772406..d79be9ce 100644
--- a/doc/md/dev/Release-Shaarli.md
+++ b/doc/md/dev/Release-Shaarli.md
@@ -64,6 +64,14 @@ git pull upstream master
64 64
65# If releasing a new minor version, create a release branch 65# If releasing a new minor version, create a release branch
66$ git checkout -b v0.x 66$ git checkout -b v0.x
67# Otherwise just use the existing one
68$ git checkout v0.x
69
70# Get the latest changes
71$ git merge master
72
73# Check that everything went fine:
74$ make test
67 75
68# Bump shaarli_version.php from dev to 0.x.0, **without the v** 76# Bump shaarli_version.php from dev to 0.x.0, **without the v**
69$ vim shaarli_version.php 77$ vim shaarli_version.php
diff --git a/inc/languages/fr/LC_MESSAGES/shaarli.po b/inc/languages/fr/LC_MESSAGES/shaarli.po
index 26dede4e..01492af4 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-09 14:39+0100\n" 4"POT-Creation-Date: 2020-11-24 13:13+0100\n"
5"PO-Revision-Date: 2020-11-09 14:42+0100\n" 5"PO-Revision-Date: 2020-11-24 13:14+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"
@@ -20,31 +20,31 @@ msgstr ""
20"X-Poedit-SearchPath-3: init.php\n" 20"X-Poedit-SearchPath-3: init.php\n"
21"X-Poedit-SearchPath-4: plugins\n" 21"X-Poedit-SearchPath-4: plugins\n"
22 22
23#: application/History.php:180 23#: application/History.php:181
24msgid "History file isn't readable or writable" 24msgid "History file isn't readable or writable"
25msgstr "Le fichier d'historique n'est pas accessible en lecture ou en écriture" 25msgstr "Le fichier d'historique n'est pas accessible en lecture ou en écriture"
26 26
27#: application/History.php:191 27#: application/History.php:192
28msgid "Could not parse history file" 28msgid "Could not parse history file"
29msgstr "Format incorrect pour le fichier d'historique" 29msgstr "Format incorrect pour le fichier d'historique"
30 30
31#: application/Languages.php:181 31#: application/Languages.php:184
32msgid "Automatic" 32msgid "Automatic"
33msgstr "Automatique" 33msgstr "Automatique"
34 34
35#: application/Languages.php:182 35#: application/Languages.php:185
36msgid "German" 36msgid "German"
37msgstr "Allemand" 37msgstr "Allemand"
38 38
39#: application/Languages.php:183 39#: application/Languages.php:186
40msgid "English" 40msgid "English"
41msgstr "Anglais" 41msgstr "Anglais"
42 42
43#: application/Languages.php:184 43#: application/Languages.php:187
44msgid "French" 44msgid "French"
45msgstr "Français" 45msgstr "Français"
46 46
47#: application/Languages.php:185 47#: application/Languages.php:188
48msgid "Japanese" 48msgid "Japanese"
49msgstr "Japonais" 49msgstr "Japonais"
50 50
@@ -56,46 +56,46 @@ msgstr ""
56"l'extension php-gd doit être chargée pour utiliser les miniatures. Les " 56"l'extension php-gd doit être chargée pour utiliser les miniatures. Les "
57"miniatures sont désormais désactivées. Rechargez la page." 57"miniatures sont désormais désactivées. Rechargez la page."
58 58
59#: application/Utils.php:402 59#: application/Utils.php:405
60msgid "Setting not set" 60msgid "Setting not set"
61msgstr "Paramètre non défini" 61msgstr "Paramètre non défini"
62 62
63#: application/Utils.php:409 63#: application/Utils.php:412
64msgid "Unlimited" 64msgid "Unlimited"
65msgstr "Illimité" 65msgstr "Illimité"
66 66
67#: application/Utils.php:412 67#: application/Utils.php:415
68msgid "B" 68msgid "B"
69msgstr "o" 69msgstr "o"
70 70
71#: application/Utils.php:412 71#: application/Utils.php:415
72msgid "kiB" 72msgid "kiB"
73msgstr "ko" 73msgstr "ko"
74 74
75#: application/Utils.php:412 75#: application/Utils.php:415
76msgid "MiB" 76msgid "MiB"
77msgstr "Mo" 77msgstr "Mo"
78 78
79#: application/Utils.php:412 79#: application/Utils.php:415
80msgid "GiB" 80msgid "GiB"
81msgstr "Go" 81msgstr "Go"
82 82
83#: application/bookmark/BookmarkFileService.php:183 83#: application/bookmark/BookmarkFileService.php:185
84#: application/bookmark/BookmarkFileService.php:205 84#: application/bookmark/BookmarkFileService.php:207
85#: application/bookmark/BookmarkFileService.php:227 85#: application/bookmark/BookmarkFileService.php:229
86#: application/bookmark/BookmarkFileService.php:241 86#: application/bookmark/BookmarkFileService.php:243
87msgid "You're not authorized to alter the datastore" 87msgid "You're not authorized to alter the datastore"
88msgstr "Vous n'êtes pas autorisé à modifier les données" 88msgstr "Vous n'êtes pas autorisé à modifier les données"
89 89
90#: application/bookmark/BookmarkFileService.php:208 90#: application/bookmark/BookmarkFileService.php:210
91msgid "This bookmarks already exists" 91msgid "This bookmarks already exists"
92msgstr "Ce marque-page existe déjà" 92msgstr "Ce marque-page existe déjà"
93 93
94#: application/bookmark/BookmarkInitializer.php:39 94#: application/bookmark/BookmarkInitializer.php:42
95msgid "(private bookmark with thumbnail demo)" 95msgid "(private bookmark with thumbnail demo)"
96msgstr "(marque page privé avec une miniature)" 96msgstr "(marque page privé avec une miniature)"
97 97
98#: application/bookmark/BookmarkInitializer.php:42 98#: application/bookmark/BookmarkInitializer.php:45
99msgid "" 99msgid ""
100"Shaarli will automatically pick up the thumbnail for links to a variety of " 100"Shaarli will automatically pick up the thumbnail for links to a variety of "
101"websites.\n" 101"websites.\n"
@@ -118,11 +118,11 @@ msgstr ""
118"\n" 118"\n"
119"Maintenant, vous pouvez modifier ou supprimer les shaares créés par défaut.\n" 119"Maintenant, vous pouvez modifier ou supprimer les shaares créés par défaut.\n"
120 120
121#: application/bookmark/BookmarkInitializer.php:55 121#: application/bookmark/BookmarkInitializer.php:58
122msgid "Note: Shaare descriptions" 122msgid "Note: Shaare descriptions"
123msgstr "Note : Description des Shaares" 123msgstr "Note : Description des Shaares"
124 124
125#: application/bookmark/BookmarkInitializer.php:57 125#: application/bookmark/BookmarkInitializer.php:60
126msgid "" 126msgid ""
127"Adding a shaare without entering a URL creates a text-only \"note\" post " 127"Adding a shaare without entering a URL creates a text-only \"note\" post "
128"such as this one.\n" 128"such as this one.\n"
@@ -186,7 +186,7 @@ msgstr ""
186"| Citron | Fruit | Jaune | 30 |\n" 186"| Citron | Fruit | Jaune | 30 |\n"
187"| Carotte | Légume | Orange | 14 |\n" 187"| Carotte | Légume | Orange | 14 |\n"
188 188
189#: application/bookmark/BookmarkInitializer.php:91 189#: application/bookmark/BookmarkInitializer.php:94
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:48 192#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
@@ -198,7 +198,7 @@ msgstr ""
198"Le gestionnaire de marque-pages personnel, minimaliste, et sans base de " 198"Le gestionnaire de marque-pages personnel, minimaliste, et sans base de "
199"données" 199"données"
200 200
201#: application/bookmark/BookmarkInitializer.php:94 201#: application/bookmark/BookmarkInitializer.php:97
202msgid "" 202msgid ""
203"Welcome to Shaarli!\n" 203"Welcome to Shaarli!\n"
204"\n" 204"\n"
@@ -247,11 +247,11 @@ msgstr ""
247"issues) si vous avez une suggestion ou si vous rencontrez un problème.\n" 247"issues) si vous avez une suggestion ou si vous rencontrez un problème.\n"
248" \n" 248" \n"
249 249
250#: application/bookmark/exception/BookmarkNotFoundException.php:13 250#: application/bookmark/exception/BookmarkNotFoundException.php:14
251msgid "The link you are trying to reach does not exist or has been deleted." 251msgid "The link you are trying to reach does not exist or has been deleted."
252msgstr "Le lien que vous essayez de consulter n'existe pas ou a été supprimé." 252msgstr "Le lien que vous essayez de consulter n'existe pas ou a été supprimé."
253 253
254#: application/config/ConfigJson.php:52 application/config/ConfigPhp.php:129 254#: application/config/ConfigJson.php:52 application/config/ConfigPhp.php:131
255msgid "" 255msgid ""
256"Shaarli could not create the config file. Please make sure Shaarli has the " 256"Shaarli could not create the config file. Please make sure Shaarli has the "
257"right to write in the folder is it installed in." 257"right to write in the folder is it installed in."
@@ -259,12 +259,12 @@ msgstr ""
259"Shaarli n'a pas pu créer le fichier de configuration. Merci de vérifier que " 259"Shaarli n'a pas pu créer le fichier de configuration. Merci de vérifier que "
260"Shaarli a les droits d'écriture dans le dossier dans lequel il est installé." 260"Shaarli a les droits d'écriture dans le dossier dans lequel il est installé."
261 261
262#: application/config/ConfigManager.php:136 262#: application/config/ConfigManager.php:137
263#: application/config/ConfigManager.php:163 263#: application/config/ConfigManager.php:164
264msgid "Invalid setting key parameter. String expected, got: " 264msgid "Invalid setting key parameter. String expected, got: "
265msgstr "Clé de paramétrage invalide. Chaîne de caractères obtenue, attendu : " 265msgstr "Clé de paramétrage invalide. Chaîne de caractères obtenue, attendu : "
266 266
267#: application/config/exception/MissingFieldConfigException.php:21 267#: application/config/exception/MissingFieldConfigException.php:20
268#, php-format 268#, php-format
269msgid "Configuration value is required for %s" 269msgid "Configuration value is required for %s"
270msgstr "Le paramètre %s est obligatoire" 270msgstr "Le paramètre %s est obligatoire"
@@ -274,48 +274,48 @@ msgid "An error occurred while trying to save plugins loading order."
274msgstr "" 274msgstr ""
275"Une erreur s'est produite lors de la sauvegarde de l'ordre des extensions." 275"Une erreur s'est produite lors de la sauvegarde de l'ordre des extensions."
276 276
277#: application/config/exception/UnauthorizedConfigException.php:16 277#: application/config/exception/UnauthorizedConfigException.php:15
278msgid "You are not authorized to alter config." 278msgid "You are not authorized to alter config."
279msgstr "Vous n'êtes pas autorisé à modifier la configuration." 279msgstr "Vous n'êtes pas autorisé à modifier la configuration."
280 280
281#: application/exceptions/IOException.php:22 281#: application/exceptions/IOException.php:23
282msgid "Error accessing" 282msgid "Error accessing"
283msgstr "Une erreur s'est produite en accédant à" 283msgstr "Une erreur s'est produite en accédant à"
284 284
285#: application/feed/FeedBuilder.php:179 285#: application/feed/FeedBuilder.php:180
286msgid "Direct link" 286msgid "Direct link"
287msgstr "Liens directs" 287msgstr "Liens directs"
288 288
289#: application/feed/FeedBuilder.php:181 289#: application/feed/FeedBuilder.php:182
290#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103 290#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103
291#: tmp/dailyrss.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26 291#: tmp/dailyrss.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
292#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:179 292#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:179
293msgid "Permalink" 293msgid "Permalink"
294msgstr "Permalien" 294msgstr "Permalien"
295 295
296#: application/front/controller/admin/ConfigureController.php:54 296#: application/front/controller/admin/ConfigureController.php:56
297#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24 297#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
298msgid "Configure" 298msgid "Configure"
299msgstr "Configurer" 299msgstr "Configurer"
300 300
301#: application/front/controller/admin/ConfigureController.php:102 301#: application/front/controller/admin/ConfigureController.php:106
302#: application/legacy/LegacyUpdater.php:537 302#: application/legacy/LegacyUpdater.php:539
303msgid "You have enabled or changed thumbnails mode." 303msgid "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:108
307#: application/front/controller/admin/ServerController.php:75 307#: application/front/controller/admin/ServerController.php:76
308#: application/legacy/LegacyUpdater.php:538 308#: application/legacy/LegacyUpdater.php:540
309msgid "Please synchronize them." 309msgid "Please synchronize them."
310msgstr "Merci de les synchroniser." 310msgstr "Merci de les synchroniser."
311 311
312#: application/front/controller/admin/ConfigureController.php:113 312#: application/front/controller/admin/ConfigureController.php:119
313#: application/front/controller/visitor/InstallController.php:146 313#: application/front/controller/visitor/InstallController.php:149
314msgid "Error while writing config file after configuration update." 314msgid "Error while writing config file after configuration update."
315msgstr "" 315msgstr ""
316"Une erreur s'est produite lors de la sauvegarde du fichier de configuration." 316"Une erreur s'est produite lors de la sauvegarde du fichier de configuration."
317 317
318#: application/front/controller/admin/ConfigureController.php:122 318#: application/front/controller/admin/ConfigureController.php:128
319msgid "Configuration was saved." 319msgid "Configuration was saved."
320msgstr "La configuration a été sauvegardée." 320msgstr "La configuration a été sauvegardée."
321 321
@@ -433,7 +433,7 @@ msgstr "Administration serveur"
433msgid "Thumbnails cache has been cleared." 433msgid "Thumbnails cache has been cleared."
434msgstr "Le cache des miniatures a été vidé." 434msgstr "Le cache des miniatures a été vidé."
435 435
436#: application/front/controller/admin/ServerController.php:83 436#: application/front/controller/admin/ServerController.php:85
437msgid "Shaarli's cache folder has been cleared!" 437msgid "Shaarli's cache folder has been cleared!"
438msgstr "Le dossier de cache de Shaarli a été vidé !" 438msgstr "Le dossier de cache de Shaarli a été vidé !"
439 439
@@ -459,18 +459,18 @@ msgstr "Le lien avec l'identifiant %s n'a pas pu être trouvé."
459msgid "Invalid visibility provided." 459msgid "Invalid visibility provided."
460msgstr "Visibilité du lien non valide." 460msgstr "Visibilité du lien non valide."
461 461
462#: application/front/controller/admin/ShaarePublishController.php:171 462#: application/front/controller/admin/ShaarePublishController.php:173
463#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:171 463#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:171
464msgid "Edit" 464msgid "Edit"
465msgstr "Modifier" 465msgstr "Modifier"
466 466
467#: application/front/controller/admin/ShaarePublishController.php:174 467#: application/front/controller/admin/ShaarePublishController.php:176
468#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28 468#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
469#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:28 469#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:28
470msgid "Shaare" 470msgid "Shaare"
471msgstr "Shaare" 471msgstr "Shaare"
472 472
473#: application/front/controller/admin/ShaarePublishController.php:205 473#: application/front/controller/admin/ShaarePublishController.php:208
474msgid "Note: " 474msgid "Note: "
475msgstr "Note : " 475msgstr "Note : "
476 476
@@ -485,7 +485,7 @@ msgstr "Mise à jour des miniatures"
485msgid "Tools" 485msgid "Tools"
486msgstr "Outils" 486msgstr "Outils"
487 487
488#: application/front/controller/visitor/BookmarkListController.php:120 488#: application/front/controller/visitor/BookmarkListController.php:121
489msgid "Search: " 489msgid "Search: "
490msgstr "Recherche : " 490msgstr "Recherche : "
491 491
@@ -535,12 +535,12 @@ msgstr "Une erreur inattendue s'est produite."
535msgid "Requested page could not be found." 535msgid "Requested page could not be found."
536msgstr "La page demandée n'a pas pu être trouvée." 536msgstr "La page demandée n'a pas pu être trouvée."
537 537
538#: application/front/controller/visitor/InstallController.php:64 538#: application/front/controller/visitor/InstallController.php:65
539#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22 539#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22
540msgid "Install Shaarli" 540msgid "Install Shaarli"
541msgstr "Installation de Shaarli" 541msgstr "Installation de Shaarli"
542 542
543#: application/front/controller/visitor/InstallController.php:83 543#: application/front/controller/visitor/InstallController.php:85
544#, php-format 544#, php-format
545msgid "" 545msgid ""
546"<pre>Sessions do not seem to work correctly on your server.<br>Make sure the " 546"<pre>Sessions do not seem to work correctly on your server.<br>Make sure the "
@@ -559,14 +559,14 @@ msgstr ""
559"des cookies. Nous vous recommandons d'accéder à votre serveur depuis son " 559"des cookies. Nous vous recommandons d'accéder à votre serveur depuis son "
560"adresse IP ou un <em>Fully Qualified Domain Name</em>.<br>" 560"adresse IP ou un <em>Fully Qualified Domain Name</em>.<br>"
561 561
562#: application/front/controller/visitor/InstallController.php:154 562#: application/front/controller/visitor/InstallController.php:157
563msgid "" 563msgid ""
564"Shaarli is now configured. Please login and start shaaring your bookmarks!" 564"Shaarli is now configured. Please login and start shaaring your bookmarks!"
565msgstr "" 565msgstr ""
566"Shaarli est maintenant configuré. Vous pouvez vous connecter et commencez à " 566"Shaarli est maintenant configuré. Vous pouvez vous connecter et commencez à "
567"shaare vos liens !" 567"shaare vos liens !"
568 568
569#: application/front/controller/visitor/InstallController.php:168 569#: application/front/controller/visitor/InstallController.php:171
570msgid "Insufficient permissions:" 570msgid "Insufficient permissions:"
571msgstr "Permissions insuffisantes :" 571msgstr "Permissions insuffisantes :"
572 572
@@ -580,7 +580,7 @@ msgstr "Permissions insuffisantes :"
580msgid "Login" 580msgid "Login"
581msgstr "Connexion" 581msgstr "Connexion"
582 582
583#: application/front/controller/visitor/LoginController.php:77 583#: application/front/controller/visitor/LoginController.php:78
584msgid "Wrong login/password." 584msgid "Wrong login/password."
585msgstr "Nom d'utilisateur ou mot de passe incorrect(s)." 585msgstr "Nom d'utilisateur ou mot de passe incorrect(s)."
586 586
@@ -620,7 +620,7 @@ msgstr ""
620msgid "Wrong token." 620msgid "Wrong token."
621msgstr "Jeton invalide." 621msgstr "Jeton invalide."
622 622
623#: application/helper/ApplicationUtils.php:162 623#: application/helper/ApplicationUtils.php:165
624#, php-format 624#, php-format
625msgid "" 625msgid ""
626"Your PHP version is obsolete! Shaarli requires at least PHP %s, and thus " 626"Your PHP version is obsolete! Shaarli requires at least PHP %s, and thus "
@@ -631,52 +631,60 @@ msgstr ""
631"peut donc pas fonctionner. Votre version de PHP a des failles de sécurités " 631"peut donc pas fonctionner. Votre version de PHP a des failles de sécurités "
632"connues et devrait être mise à jour au plus tôt." 632"connues et devrait être mise à jour au plus tôt."
633 633
634#: application/helper/ApplicationUtils.php:195 634#: application/helper/ApplicationUtils.php:200
635#: application/helper/ApplicationUtils.php:215 635#: application/helper/ApplicationUtils.php:220
636msgid "directory is not readable" 636msgid "directory is not readable"
637msgstr "le répertoire n'est pas accessible en lecture" 637msgstr "le répertoire n'est pas accessible en lecture"
638 638
639#: application/helper/ApplicationUtils.php:218 639#: application/helper/ApplicationUtils.php:223
640msgid "directory is not writable" 640msgid "directory is not writable"
641msgstr "le répertoire n'est pas accessible en écriture" 641msgstr "le répertoire n'est pas accessible en écriture"
642 642
643#: application/helper/ApplicationUtils.php:240 643#: application/helper/ApplicationUtils.php:247
644msgid "file is not readable" 644msgid "file is not readable"
645msgstr "le fichier n'est pas accessible en lecture" 645msgstr "le fichier n'est pas accessible en lecture"
646 646
647#: application/helper/ApplicationUtils.php:243 647#: application/helper/ApplicationUtils.php:250
648msgid "file is not writable" 648msgid "file is not writable"
649msgstr "le fichier n'est pas accessible en écriture" 649msgstr "le fichier n'est pas accessible en écriture"
650 650
651#: application/helper/ApplicationUtils.php:277 651#: application/helper/ApplicationUtils.php:260
652msgid ""
653"Lock can not be acquired on the datastore. You might encounter concurrent "
654"access issues."
655msgstr ""
656"Le fichier datastore ne peut pas être verrouillé. Vous pourriez rencontrer "
657"des problèmes d'accès concurrents."
658
659#: application/helper/ApplicationUtils.php:293
652msgid "Configuration parsing" 660msgid "Configuration parsing"
653msgstr "Chargement de la configuration" 661msgstr "Chargement de la configuration"
654 662
655#: application/helper/ApplicationUtils.php:278 663#: application/helper/ApplicationUtils.php:294
656msgid "Slim Framework (routing, etc.)" 664msgid "Slim Framework (routing, etc.)"
657msgstr "Slim Framwork (routage, etc.)" 665msgstr "Slim Framwork (routage, etc.)"
658 666
659#: application/helper/ApplicationUtils.php:279 667#: application/helper/ApplicationUtils.php:295
660msgid "Multibyte (Unicode) string support" 668msgid "Multibyte (Unicode) string support"
661msgstr "Support des chaînes de caractère multibytes (Unicode)" 669msgstr "Support des chaînes de caractère multibytes (Unicode)"
662 670
663#: application/helper/ApplicationUtils.php:280 671#: application/helper/ApplicationUtils.php:296
664msgid "Required to use thumbnails" 672msgid "Required to use thumbnails"
665msgstr "Obligatoire pour utiliser les miniatures" 673msgstr "Obligatoire pour utiliser les miniatures"
666 674
667#: application/helper/ApplicationUtils.php:281 675#: application/helper/ApplicationUtils.php:297
668msgid "Localized text sorting (e.g. e->è->f)" 676msgid "Localized text sorting (e.g. e->è->f)"
669msgstr "Tri des textes traduits (ex : e->è->f)" 677msgstr "Tri des textes traduits (ex : e->è->f)"
670 678
671#: application/helper/ApplicationUtils.php:282 679#: application/helper/ApplicationUtils.php:298
672msgid "Better retrieval of bookmark metadata and thumbnail" 680msgid "Better retrieval of bookmark metadata and thumbnail"
673msgstr "Meilleure récupération des meta-données des marque-pages et minatures" 681msgstr "Meilleure récupération des meta-données des marque-pages et minatures"
674 682
675#: application/helper/ApplicationUtils.php:283 683#: application/helper/ApplicationUtils.php:299
676msgid "Use the translation system in gettext mode" 684msgid "Use the translation system in gettext mode"
677msgstr "Utiliser le système de traduction en mode gettext" 685msgstr "Utiliser le système de traduction en mode gettext"
678 686
679#: application/helper/ApplicationUtils.php:284 687#: application/helper/ApplicationUtils.php:300
680msgid "Login using LDAP server" 688msgid "Login using LDAP server"
681msgstr "Authentification via un serveur LDAP" 689msgstr "Authentification via un serveur LDAP"
682 690
@@ -750,7 +758,7 @@ msgstr ""
750msgid "Couldn't retrieve updater class methods." 758msgid "Couldn't retrieve updater class methods."
751msgstr "Impossible de récupérer les méthodes de la classe Updater." 759msgstr "Impossible de récupérer les méthodes de la classe Updater."
752 760
753#: application/legacy/LegacyUpdater.php:538 761#: application/legacy/LegacyUpdater.php:540
754msgid "<a href=\"./admin/thumbnails\">" 762msgid "<a href=\"./admin/thumbnails\">"
755msgstr "<a href=\"./admin/thumbnails\">" 763msgstr "<a href=\"./admin/thumbnails\">"
756 764
@@ -776,11 +784,11 @@ msgstr ""
776"a été importé avec succès en %d secondes : %d liens importés, %d liens " 784"a été importé avec succès en %d secondes : %d liens importés, %d liens "
777"écrasés, %d liens ignorés." 785"écrasés, %d liens ignorés."
778 786
779#: application/plugin/PluginManager.php:124 787#: application/plugin/PluginManager.php:125
780msgid " [plugin incompatibility]: " 788msgid " [plugin incompatibility]: "
781msgstr " [incompatibilité de l'extension] : " 789msgstr " [incompatibilité de l'extension] : "
782 790
783#: application/plugin/exception/PluginFileNotFoundException.php:21 791#: application/plugin/exception/PluginFileNotFoundException.php:22
784#, php-format 792#, php-format
785msgid "Plugin \"%s\" files not found." 793msgid "Plugin \"%s\" files not found."
786msgstr "Les fichiers de l'extension \"%s\" sont introuvables." 794msgstr "Les fichiers de l'extension \"%s\" sont introuvables."
@@ -794,7 +802,7 @@ msgstr "Impossible de purger %s : le répertoire n'existe pas"
794msgid "An error occurred while running the update " 802msgid "An error occurred while running the update "
795msgstr "Une erreur s'est produite lors de l'exécution de la mise à jour " 803msgstr "Une erreur s'est produite lors de l'exécution de la mise à jour "
796 804
797#: index.php:80 805#: index.php:81
798msgid "Shared bookmarks on " 806msgid "Shared bookmarks on "
799msgstr "Liens partagés sur " 807msgstr "Liens partagés sur "
800 808
@@ -811,11 +819,11 @@ msgstr "Shaare"
811msgid "Adds the addlink input on the linklist page." 819msgid "Adds the addlink input on the linklist page."
812msgstr "Ajoute le formulaire d'ajout de liens sur la page principale." 820msgstr "Ajoute le formulaire d'ajout de liens sur la page principale."
813 821
814#: plugins/archiveorg/archiveorg.php:28 822#: plugins/archiveorg/archiveorg.php:29
815msgid "View on archive.org" 823msgid "View on archive.org"
816msgstr "Voir sur archive.org" 824msgstr "Voir sur archive.org"
817 825
818#: plugins/archiveorg/archiveorg.php:41 826#: plugins/archiveorg/archiveorg.php:42
819msgid "For each link, add an Archive.org icon." 827msgid "For each link, add an Archive.org icon."
820msgstr "Pour chaque lien, ajoute une icône pour Archive.org." 828msgstr "Pour chaque lien, ajoute une icône pour Archive.org."
821 829
@@ -845,7 +853,7 @@ msgstr "Couleur de fond (gris léger)"
845msgid "Dark main color (e.g. visited links)" 853msgid "Dark main color (e.g. visited links)"
846msgstr "Couleur principale sombre (ex : les liens visités)" 854msgstr "Couleur principale sombre (ex : les liens visités)"
847 855
848#: plugins/demo_plugin/demo_plugin.php:477 856#: plugins/demo_plugin/demo_plugin.php:478
849msgid "" 857msgid ""
850"A demo plugin covering all use cases for template designers and plugin " 858"A demo plugin covering all use cases for template designers and plugin "
851"developers." 859"developers."
@@ -853,11 +861,11 @@ msgstr ""
853"Une extension de démonstration couvrant tous les cas d'utilisation pour les " 861"Une extension de démonstration couvrant tous les cas d'utilisation pour les "
854"designers de thèmes et les développeurs d'extensions." 862"designers de thèmes et les développeurs d'extensions."
855 863
856#: plugins/demo_plugin/demo_plugin.php:478 864#: plugins/demo_plugin/demo_plugin.php:479
857msgid "This is a parameter dedicated to the demo plugin. It'll be suffixed." 865msgid "This is a parameter dedicated to the demo plugin. It'll be suffixed."
858msgstr "Ceci est un paramètre dédié au plugin de démo. Il sera suffixé." 866msgstr "Ceci est un paramètre dédié au plugin de démo. Il sera suffixé."
859 867
860#: plugins/demo_plugin/demo_plugin.php:479 868#: plugins/demo_plugin/demo_plugin.php:480
861msgid "Other demo parameter" 869msgid "Other demo parameter"
862msgstr "Un autre paramètre de démo" 870msgstr "Un autre paramètre de démo"
863 871
@@ -879,7 +887,7 @@ msgstr ""
879msgid "Isso server URL (without 'http://')" 887msgid "Isso server URL (without 'http://')"
880msgstr "URL du serveur Isso (sans 'http://')" 888msgstr "URL du serveur Isso (sans 'http://')"
881 889
882#: plugins/piwik/piwik.php:23 890#: plugins/piwik/piwik.php:24
883msgid "" 891msgid ""
884"Piwik plugin error: Please define PIWIK_URL and PIWIK_SITEID in the plugin " 892"Piwik plugin error: Please define PIWIK_URL and PIWIK_SITEID in the plugin "
885"administration page." 893"administration page."
@@ -887,27 +895,27 @@ msgstr ""
887"Erreur de l'extension Piwik : Merci de définir les paramètres PIWIK_URL et " 895"Erreur de l'extension Piwik : Merci de définir les paramètres PIWIK_URL et "
888"PIWIK_SITEID dans la page d'administration des extensions." 896"PIWIK_SITEID dans la page d'administration des extensions."
889 897
890#: plugins/piwik/piwik.php:72 898#: plugins/piwik/piwik.php:73
891msgid "A plugin that adds Piwik tracking code to Shaarli pages." 899msgid "A plugin that adds Piwik tracking code to Shaarli pages."
892msgstr "Ajoute le code de traçage de Piwik sur les pages de Shaarli." 900msgstr "Ajoute le code de traçage de Piwik sur les pages de Shaarli."
893 901
894#: plugins/piwik/piwik.php:73 902#: plugins/piwik/piwik.php:74
895msgid "Piwik URL" 903msgid "Piwik URL"
896msgstr "URL de Piwik" 904msgstr "URL de Piwik"
897 905
898#: plugins/piwik/piwik.php:74 906#: plugins/piwik/piwik.php:75
899msgid "Piwik site ID" 907msgid "Piwik site ID"
900msgstr "Site ID de Piwik" 908msgstr "Site ID de Piwik"
901 909
902#: plugins/playvideos/playvideos.php:25 910#: plugins/playvideos/playvideos.php:26
903msgid "Video player" 911msgid "Video player"
904msgstr "Lecteur vidéo" 912msgstr "Lecteur vidéo"
905 913
906#: plugins/playvideos/playvideos.php:28 914#: plugins/playvideos/playvideos.php:29
907msgid "Play Videos" 915msgid "Play Videos"
908msgstr "Jouer les vidéos" 916msgstr "Jouer les vidéos"
909 917
910#: plugins/playvideos/playvideos.php:59 918#: plugins/playvideos/playvideos.php:60
911msgid "Add a button in the toolbar allowing to watch all videos." 919msgid "Add a button in the toolbar allowing to watch all videos."
912msgstr "" 920msgstr ""
913"Ajoute un bouton dans la barre de menu pour regarder toutes les vidéos." 921"Ajoute un bouton dans la barre de menu pour regarder toutes les vidéos."
@@ -935,11 +943,11 @@ msgstr "Mauvaise réponse du hub %s"
935msgid "Enable PubSubHubbub feed publishing." 943msgid "Enable PubSubHubbub feed publishing."
936msgstr "Active la publication de flux vers PubSubHubbub." 944msgstr "Active la publication de flux vers PubSubHubbub."
937 945
938#: plugins/qrcode/qrcode.php:73 plugins/wallabag/wallabag.php:71 946#: plugins/qrcode/qrcode.php:74 plugins/wallabag/wallabag.php:72
939msgid "For each link, add a QRCode icon." 947msgid "For each link, add a QRCode icon."
940msgstr "Pour chaque lien, ajouter une icône de QRCode." 948msgstr "Pour chaque lien, ajouter une icône de QRCode."
941 949
942#: plugins/wallabag/wallabag.php:21 950#: plugins/wallabag/wallabag.php:22
943msgid "" 951msgid ""
944"Wallabag plugin error: Please define the \"WALLABAG_URL\" setting in the " 952"Wallabag plugin error: Please define the \"WALLABAG_URL\" setting in the "
945"plugin administration page." 953"plugin administration page."
@@ -947,15 +955,15 @@ msgstr ""
947"Erreur de l'extension Wallabag : Merci de définir le paramètre « " 955"Erreur de l'extension Wallabag : Merci de définir le paramètre « "
948"WALLABAG_URL » dans la page d'administration des extensions." 956"WALLABAG_URL » dans la page d'administration des extensions."
949 957
950#: plugins/wallabag/wallabag.php:48 958#: plugins/wallabag/wallabag.php:49
951msgid "Save to wallabag" 959msgid "Save to wallabag"
952msgstr "Sauvegarder dans Wallabag" 960msgstr "Sauvegarder dans Wallabag"
953 961
954#: plugins/wallabag/wallabag.php:72 962#: plugins/wallabag/wallabag.php:73
955msgid "Wallabag API URL" 963msgid "Wallabag API URL"
956msgstr "URL de l'API Wallabag" 964msgstr "URL de l'API Wallabag"
957 965
958#: plugins/wallabag/wallabag.php:73 966#: plugins/wallabag/wallabag.php:74
959msgid "Wallabag API version (1 or 2)" 967msgid "Wallabag API version (1 or 2)"
960msgstr "Version de l'API Wallabag (1 ou 2)" 968msgstr "Version de l'API Wallabag (1 ou 2)"
961 969
diff --git a/inc/languages/ru/LC_MESSAGES/shaarli.po b/inc/languages/ru/LC_MESSAGES/shaarli.po
new file mode 100644
index 00000000..98e70425
--- /dev/null
+++ b/inc/languages/ru/LC_MESSAGES/shaarli.po
@@ -0,0 +1,1944 @@
1msgid ""
2msgstr ""
3"Project-Id-Version: Shaarli\n"
4"POT-Creation-Date: 2020-11-14 07:47+0500\n"
5"PO-Revision-Date: 2020-11-15 06:16+0500\n"
6"Last-Translator: progit <pash.vld@gmail.com>\n"
7"Language-Team: Shaarli\n"
8"Language: ru_RU\n"
9"MIME-Version: 1.0\n"
10"Content-Type: text/plain; charset=UTF-8\n"
11"Content-Transfer-Encoding: 8bit\n"
12"X-Generator: Poedit 2.0.1\n"
13"X-Poedit-Basepath: ../../../..\n"
14"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16"X-Poedit-SourceCharset: UTF-8\n"
17"X-Poedit-KeywordsList: t:1,2;t\n"
18"X-Poedit-SearchPath-0: application\n"
19"X-Poedit-SearchPath-1: tmp\n"
20"X-Poedit-SearchPath-2: index.php\n"
21"X-Poedit-SearchPath-3: init.php\n"
22"X-Poedit-SearchPath-4: plugins\n"
23
24#: application/History.php:181
25msgid "History file isn't readable or writable"
26msgstr "Файл истории не доступен для чтения или записи"
27
28#: application/History.php:192
29msgid "Could not parse history file"
30msgstr "Не удалось разобрать файл истории"
31
32#: application/Languages.php:184
33msgid "Automatic"
34msgstr "Автоматический"
35
36#: application/Languages.php:185
37msgid "German"
38msgstr "Немецкий"
39
40#: application/Languages.php:186
41msgid "English"
42msgstr "Английский"
43
44#: application/Languages.php:187
45msgid "French"
46msgstr "Французский"
47
48#: application/Languages.php:188
49msgid "Japanese"
50msgstr "Японский"
51
52#: application/Languages.php:189
53msgid "Russian"
54msgstr "Русский"
55
56#: application/Thumbnailer.php:62
57msgid ""
58"php-gd extension must be loaded to use thumbnails. Thumbnails are now "
59"disabled. Please reload the page."
60msgstr ""
61"для использования миниатюр необходимо загрузить расширение php-gd. Миниатюры "
62"сейчас отключены. Перезагрузите страницу."
63
64#: application/Utils.php:405
65msgid "Setting not set"
66msgstr "Настройка не задана"
67
68#: application/Utils.php:412
69msgid "Unlimited"
70msgstr "Неограниченно"
71
72#: application/Utils.php:415
73msgid "B"
74msgstr "Б"
75
76#: application/Utils.php:415
77msgid "kiB"
78msgstr "КБ"
79
80#: application/Utils.php:415
81msgid "MiB"
82msgstr "МБ"
83
84#: application/Utils.php:415
85msgid "GiB"
86msgstr "ГБ"
87
88#: application/bookmark/BookmarkFileService.php:185
89#: application/bookmark/BookmarkFileService.php:207
90#: application/bookmark/BookmarkFileService.php:229
91#: application/bookmark/BookmarkFileService.php:243
92msgid "You're not authorized to alter the datastore"
93msgstr "У вас нет прав на изменение хранилища данных"
94
95#: application/bookmark/BookmarkFileService.php:210
96msgid "This bookmarks already exists"
97msgstr "Эта закладка уже существует"
98
99#: application/bookmark/BookmarkInitializer.php:42
100msgid "(private bookmark with thumbnail demo)"
101msgstr "(личная закладка с показом миниатюр)"
102
103#: application/bookmark/BookmarkInitializer.php:45
104msgid ""
105"Shaarli will automatically pick up the thumbnail for links to a variety of "
106"websites.\n"
107"\n"
108"Explore your new Shaarli instance by trying out controls and menus.\n"
109"Visit the project on [Github](https://github.com/shaarli/Shaarli) or [the "
110"documentation](https://shaarli.readthedocs.io/en/master/) to learn more "
111"about Shaarli.\n"
112"\n"
113"Now you can edit or delete the default shaares.\n"
114msgstr ""
115"Shaarli автоматически подберет миниатюру для ссылок на различные сайты.\n"
116"\n"
117"Изучите Shaarli, попробовав элементы управления и меню.\n"
118"Посетите проект [Github](https://github.com/shaarli/Shaarli) или "
119"[документацию](https://shaarli.readthedocs.io/en/master/),чтобы узнать "
120"больше о Shaarli.\n"
121"\n"
122"Теперь вы можете редактировать или удалять шаары по умолчанию.\n"
123
124#: application/bookmark/BookmarkInitializer.php:58
125msgid "Note: Shaare descriptions"
126msgstr "Примечание: описания Шаар"
127
128#: application/bookmark/BookmarkInitializer.php:60
129msgid ""
130"Adding a shaare without entering a URL creates a text-only \"note\" post "
131"such as this one.\n"
132"This note is private, so you are the only one able to see it while logged "
133"in.\n"
134"\n"
135"You can use this to keep notes, post articles, code snippets, and much "
136"more.\n"
137"\n"
138"The Markdown formatting setting allows you to format your notes and bookmark "
139"description:\n"
140"\n"
141"### Title headings\n"
142"\n"
143"#### Multiple headings levels\n"
144" * bullet lists\n"
145" * _italic_ text\n"
146" * **bold** text\n"
147" * ~~strike through~~ text\n"
148" * `code` blocks\n"
149" * images\n"
150" * [links](https://en.wikipedia.org/wiki/Markdown)\n"
151"\n"
152"Markdown also supports tables:\n"
153"\n"
154"| Name | Type | Color | Qty |\n"
155"| ------- | --------- | ------ | ----- |\n"
156"| Orange | Fruit | Orange | 126 |\n"
157"| Apple | Fruit | Any | 62 |\n"
158"| Lemon | Fruit | Yellow | 30 |\n"
159"| Carrot | Vegetable | Red | 14 |\n"
160msgstr ""
161"При добавлении закладки без ввода URL адреса создается текстовая \"заметка"
162"\", такая как эта.\n"
163"Эта заметка является личной, поэтому вы единственный, кто может ее увидеть, "
164"находясь в системе.\n"
165"\n"
166"Вы можете использовать это для хранения заметок, публикации статей, "
167"фрагментов кода и многого другого.\n"
168"\n"
169"Параметр форматирования Markdown позволяет форматировать заметки и описание "
170"закладок:\n"
171"\n"
172"### Заголовок заголовков\n"
173"\n"
174"#### Multiple headings levels\n"
175" * маркированные списки\n"
176" * _наклонный_ текст\n"
177" * **жирный** текст\n"
178" * ~~зачеркнутый~~ текст\n"
179" * блоки `кода`\n"
180" * изображения\n"
181" * [ссылки](https://en.wikipedia.org/wiki/Markdown)\n"
182"\n"
183"Markdown также поддерживает таблицы:\n"
184"\n"
185"| Имя | Тип | Цвет | Количество |\n"
186"| ------- | --------- | ------ | ----- |\n"
187"| Апельсин | Фрукт | Оранжевый | 126 |\n"
188"| Яблоко | Фрукт | Любой | 62 |\n"
189"| Лимон | Фрукт | Желтый | 30 |\n"
190"| Морковь | Овощ | Красный | 14 |\n"
191
192#: application/bookmark/BookmarkInitializer.php:94
193#: application/legacy/LegacyLinkDB.php:246
194#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
195#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
196#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15
197#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48
198msgid ""
199"The personal, minimalist, super-fast, database free, bookmarking service"
200msgstr "Личный, минималистичный, сверхбыстрый сервис закладок без баз данных"
201
202#: application/bookmark/BookmarkInitializer.php:97
203msgid ""
204"Welcome to Shaarli!\n"
205"\n"
206"Shaarli allows you to bookmark your favorite pages, and share them with "
207"others or store them privately.\n"
208"You can add a description to your bookmarks, such as this one, and tag "
209"them.\n"
210"\n"
211"Create a new shaare by clicking the `+Shaare` button, or using any of the "
212"recommended tools (browser extension, mobile app, bookmarklet, REST API, "
213"etc.).\n"
214"\n"
215"You can easily retrieve your links, even with thousands of them, using the "
216"internal search engine, or search through tags (e.g. this Shaare is tagged "
217"with `shaarli` and `help`).\n"
218"Hashtags such as #shaarli #help are also supported.\n"
219"You can also filter the available [RSS feed](/feed/atom) and picture wall by "
220"tag or plaintext search.\n"
221"\n"
222"We hope that you will enjoy using Shaarli, maintained with ❤️ by the "
223"community!\n"
224"Feel free to open [an issue](https://github.com/shaarli/Shaarli/issues) if "
225"you have a suggestion or encounter an issue.\n"
226msgstr ""
227"Добро пожаловать в Shaarli!\n"
228"\n"
229"Shaarli позволяет добавлять в закладки свои любимые страницы и делиться ими "
230"с другими или хранить их в частном порядке.\n"
231"Вы можете добавить описание к своим закладкам, например этой, и пометить "
232"их.\n"
233"\n"
234"Создайте новую закладку, нажав кнопку `+Поделиться`, или используя любой из "
235"рекомендуемых инструментов (расширение для браузера, мобильное приложение, "
236"букмарклет, REST API и т.д.).\n"
237"\n"
238"Вы можете легко получить свои ссылки, даже если их тысячи, с помощью "
239"внутренней поисковой системы или поиска по тегам (например, эта заметка "
240"помечена тегами `shaarli` and `help`).\n"
241"Также поддерживаются хэштеги, такие как #shaarli #help.\n"
242"Вы можете также фильтровать доступный [RSS канал](/feed/atom) и галерею по "
243"тегу или по поиску текста.\n"
244"\n"
245"Мы надеемся, что вам понравится использовать Shaarli, с ❤️ поддерживаемый "
246"сообществом!\n"
247"Не стесняйтесь открывать [запрос](https://github.com/shaarli/Shaarli/"
248"issues), если у вас есть предложение или возникла проблема.\n"
249
250#: application/bookmark/exception/BookmarkNotFoundException.php:14
251msgid "The link you are trying to reach does not exist or has been deleted."
252msgstr ""
253"Ссылка, по которой вы пытаетесь перейти, не существует или была удалена."
254
255#: application/config/ConfigJson.php:52 application/config/ConfigPhp.php:131
256msgid ""
257"Shaarli could not create the config file. Please make sure Shaarli has the "
258"right to write in the folder is it installed in."
259msgstr ""
260"Shaarli не удалось создать файл конфигурации. Убедитесь, что у Shaarli есть "
261"право на запись в папку, в которой он установлен."
262
263#: application/config/ConfigManager.php:137
264#: application/config/ConfigManager.php:164
265msgid "Invalid setting key parameter. String expected, got: "
266msgstr "Неверная настройка ключевого параметра. Ожидалась строка, получено: "
267
268#: application/config/exception/MissingFieldConfigException.php:20
269#, php-format
270msgid "Configuration value is required for %s"
271msgstr "Значение конфигурации требуется для %s"
272
273#: application/config/exception/PluginConfigOrderException.php:15
274msgid "An error occurred while trying to save plugins loading order."
275msgstr "Произошла ошибка при попытке сохранить порядок загрузки плагинов."
276
277#: application/config/exception/UnauthorizedConfigException.php:15
278msgid "You are not authorized to alter config."
279msgstr "Вы не авторизованы для изменения конфигурации."
280
281#: application/exceptions/IOException.php:23
282msgid "Error accessing"
283msgstr "Ошибка доступа"
284
285#: application/feed/FeedBuilder.php:180
286msgid "Direct link"
287msgstr "Прямая ссылка"
288
289#: application/feed/FeedBuilder.php:182
290#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103
291#: tmp/dailyrss.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
292#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:179
293msgid "Permalink"
294msgstr "Постоянная ссылка"
295
296#: application/front/controller/admin/ConfigureController.php:56
297#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
298msgid "Configure"
299msgstr "Настройка"
300
301#: application/front/controller/admin/ConfigureController.php:106
302#: application/legacy/LegacyUpdater.php:539
303msgid "You have enabled or changed thumbnails mode."
304msgstr "Вы включили или изменили режим миниатюр."
305
306#: application/front/controller/admin/ConfigureController.php:108
307#: application/front/controller/admin/ServerController.php:76
308#: application/legacy/LegacyUpdater.php:540
309msgid "Please synchronize them."
310msgstr "Пожалуйста, синхронизируйте их."
311
312#: application/front/controller/admin/ConfigureController.php:119
313#: application/front/controller/visitor/InstallController.php:149
314msgid "Error while writing config file after configuration update."
315msgstr "Ошибка при записи файла конфигурации после обновления конфигурации."
316
317#: application/front/controller/admin/ConfigureController.php:128
318msgid "Configuration was saved."
319msgstr "Конфигурация сохранена."
320
321#: application/front/controller/admin/ExportController.php:26
322#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:64
323msgid "Export"
324msgstr "Экспорт"
325
326#: application/front/controller/admin/ExportController.php:42
327msgid "Please select an export mode."
328msgstr "Выберите режим экспорта."
329
330#: application/front/controller/admin/ImportController.php:41
331#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83
332msgid "Import"
333msgstr "Импорт"
334
335#: application/front/controller/admin/ImportController.php:55
336msgid "No import file provided."
337msgstr "Файл импорта не предоставлен."
338
339#: application/front/controller/admin/ImportController.php:66
340#, php-format
341msgid ""
342"The file you are trying to upload is probably bigger than what this "
343"webserver can accept (%s). Please upload in smaller chunks."
344msgstr ""
345"Файл, который вы пытаетесь загрузить, вероятно, больше, чем может принять "
346"этот сервер (%s). Пожалуйста, загружайте небольшими частями."
347
348#: application/front/controller/admin/ManageTagController.php:30
349msgid "whitespace"
350msgstr "пробел"
351
352#: application/front/controller/admin/ManageTagController.php:35
353#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
354#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
355msgid "Manage tags"
356msgstr "Управление тегами"
357
358#: application/front/controller/admin/ManageTagController.php:54
359msgid "Invalid tags provided."
360msgstr "Предоставлены недействительные теги."
361
362#: application/front/controller/admin/ManageTagController.php:78
363#, php-format
364msgid "The tag was removed from %d bookmark."
365msgid_plural "The tag was removed from %d bookmarks."
366msgstr[0] "Тег был удален из %d закладки."
367msgstr[1] "Тег был удален из %d закладок."
368msgstr[2] "Тег был удален из %d закладок."
369
370#: application/front/controller/admin/ManageTagController.php:83
371#, php-format
372msgid "The tag was renamed in %d bookmark."
373msgid_plural "The tag was renamed in %d bookmarks."
374msgstr[0] "Тег был переименован в %d закладке."
375msgstr[1] "Тег был переименован в %d закладках."
376msgstr[2] "Тег был переименован в %d закладках."
377
378#: application/front/controller/admin/ManageTagController.php:105
379msgid "Tags separator must be a single character."
380msgstr "Разделитель тегов должен состоять из одного символа."
381
382#: application/front/controller/admin/ManageTagController.php:111
383msgid "These characters are reserved and can't be used as tags separator: "
384msgstr ""
385"Эти символы зарезервированы и не могут использоваться в качестве разделителя "
386"тегов: "
387
388#: application/front/controller/admin/PasswordController.php:28
389#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
390#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35
391msgid "Change password"
392msgstr "Изменить пароль"
393
394#: application/front/controller/admin/PasswordController.php:55
395msgid "You must provide the current and new password to change it."
396msgstr "Вы должны предоставить текущий и новый пароль, чтобы изменить его."
397
398#: application/front/controller/admin/PasswordController.php:71
399msgid "The old password is not correct."
400msgstr "Старый пароль неверен."
401
402#: application/front/controller/admin/PasswordController.php:97
403msgid "Your password has been changed"
404msgstr "Пароль изменен"
405
406#: application/front/controller/admin/PluginsController.php:45
407msgid "Plugin Administration"
408msgstr "Управление плагинами"
409
410#: application/front/controller/admin/PluginsController.php:76
411msgid "Setting successfully saved."
412msgstr "Настройка успешно сохранена."
413
414#: application/front/controller/admin/PluginsController.php:79
415msgid "Error while saving plugin configuration: "
416msgstr "Ошибка при сохранении конфигурации плагина: "
417
418#: application/front/controller/admin/ServerController.php:35
419msgid "Check disabled"
420msgstr "Проверка отключена"
421
422#: application/front/controller/admin/ServerController.php:57
423#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
424#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
425msgid "Server administration"
426msgstr "Администрирование сервера"
427
428#: application/front/controller/admin/ServerController.php:74
429msgid "Thumbnails cache has been cleared."
430msgstr "Кэш миниатюр очищен."
431
432#: application/front/controller/admin/ServerController.php:85
433msgid "Shaarli's cache folder has been cleared!"
434msgstr "Папка с кэшем Shaarli очищена!"
435
436#: application/front/controller/admin/ShaareAddController.php:26
437#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
438msgid "Shaare a new link"
439msgstr "Поделиться новой ссылкой"
440
441#: application/front/controller/admin/ShaareManageController.php:35
442#: application/front/controller/admin/ShaareManageController.php:93
443msgid "Invalid bookmark ID provided."
444msgstr "Указан неверный идентификатор закладки."
445
446#: application/front/controller/admin/ShaareManageController.php:47
447#: application/front/controller/admin/ShaareManageController.php:116
448#: application/front/controller/admin/ShaareManageController.php:156
449#: application/front/controller/admin/ShaarePublishController.php:82
450#, php-format
451msgid "Bookmark with identifier %s could not be found."
452msgstr "Закладка с идентификатором %s не найдена."
453
454#: application/front/controller/admin/ShaareManageController.php:101
455msgid "Invalid visibility provided."
456msgstr "Предоставлена недопустимая видимость."
457
458#: application/front/controller/admin/ShaarePublishController.php:173
459#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:171
460msgid "Edit"
461msgstr "Редактировать"
462
463#: application/front/controller/admin/ShaarePublishController.php:176
464#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
465#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:28
466msgid "Shaare"
467msgstr "Поделиться"
468
469#: application/front/controller/admin/ShaarePublishController.php:208
470msgid "Note: "
471msgstr "Заметка: "
472
473#: application/front/controller/admin/ThumbnailsController.php:37
474#: tmp/thumbnails.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
475msgid "Thumbnails update"
476msgstr "Обновление миниатюр"
477
478#: application/front/controller/admin/ToolsController.php:31
479#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:33
480#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:33
481msgid "Tools"
482msgstr "Инструменты"
483
484#: application/front/controller/visitor/BookmarkListController.php:121
485msgid "Search: "
486msgstr "Поиск: "
487
488#: application/front/controller/visitor/DailyController.php:200
489msgid "day"
490msgstr "день"
491
492#: application/front/controller/visitor/DailyController.php:200
493#: application/front/controller/visitor/DailyController.php:203
494#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
495#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
496#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:48
497msgid "Daily"
498msgstr "За день"
499
500#: application/front/controller/visitor/DailyController.php:201
501msgid "week"
502msgstr "неделя"
503
504#: application/front/controller/visitor/DailyController.php:201
505#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
506msgid "Weekly"
507msgstr "За неделю"
508
509#: application/front/controller/visitor/DailyController.php:202
510msgid "month"
511msgstr "месяц"
512
513#: application/front/controller/visitor/DailyController.php:202
514#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
515msgid "Monthly"
516msgstr "За месяц"
517
518#: application/front/controller/visitor/ErrorController.php:30
519msgid "Error: "
520msgstr "Ошибка: "
521
522#: application/front/controller/visitor/ErrorController.php:34
523msgid "Please report it on Github."
524msgstr "Пожалуйста, сообщите об этом на Github."
525
526#: application/front/controller/visitor/ErrorController.php:39
527msgid "An unexpected error occurred."
528msgstr "Произошла непредвиденная ошибка."
529
530#: application/front/controller/visitor/ErrorNotFoundController.php:25
531msgid "Requested page could not be found."
532msgstr "Запрошенная страница не может быть найдена."
533
534#: application/front/controller/visitor/InstallController.php:65
535#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22
536msgid "Install Shaarli"
537msgstr "Установить Shaarli"
538
539#: application/front/controller/visitor/InstallController.php:85
540#, php-format
541msgid ""
542"<pre>Sessions do not seem to work correctly on your server.<br>Make sure the "
543"variable \"session.save_path\" is set correctly in your PHP config, and that "
544"you have write access to it.<br>It currently points to %s.<br>On some "
545"browsers, accessing your server via a hostname like 'localhost' or any "
546"custom hostname without a dot causes cookie storage to fail. We recommend "
547"accessing your server via it's IP address or Fully Qualified Domain Name.<br>"
548msgstr ""
549"<pre>Сессии на вашем сервере работают некорректно.<br>Убедитесь, что "
550"переменная \"session.save_path\" правильно установлена в вашей конфигурации "
551"PHP и что у вас есть доступ к ней на запись.<br>В настоящее время она "
552"указывает на %s.<br>В некоторых браузерах доступ к вашему серверу через имя "
553"хоста, например localhost или любое другое имя хоста без точки, приводит к "
554"сбою хранилища файлов cookie. Мы рекомендуем получить доступ к вашему "
555"серверу через его IP адрес или полное доменное имя.<br>"
556
557#: application/front/controller/visitor/InstallController.php:157
558msgid ""
559"Shaarli is now configured. Please login and start shaaring your bookmarks!"
560msgstr "Shaarli настроен. Войдите и начните делиться своими закладками!"
561
562#: application/front/controller/visitor/InstallController.php:171
563msgid "Insufficient permissions:"
564msgstr "Недостаточно разрешений:"
565
566#: application/front/controller/visitor/LoginController.php:46
567#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
568#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
569#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:77
570#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:101
571#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:77
572#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:101
573msgid "Login"
574msgstr "Вход"
575
576#: application/front/controller/visitor/LoginController.php:78
577msgid "Wrong login/password."
578msgstr "Неверный логин или пароль."
579
580#: application/front/controller/visitor/PictureWallController.php:29
581#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43
582#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:43
583msgid "Picture wall"
584msgstr "Галерея"
585
586#: application/front/controller/visitor/TagCloudController.php:90
587msgid "Tag "
588msgstr "Тег "
589
590#: application/front/exceptions/AlreadyInstalledException.php:11
591msgid "Shaarli has already been installed. Login to edit the configuration."
592msgstr "Shaarli уже установлен. Войдите, чтобы изменить конфигурацию."
593
594#: application/front/exceptions/LoginBannedException.php:11
595msgid ""
596"You have been banned after too many failed login attempts. Try again later."
597msgstr ""
598"Вы были заблокированы из-за большого количества неудачных попыток входа в "
599"систему. Попробуйте позже."
600
601#: application/front/exceptions/OpenShaarliPasswordException.php:16
602msgid "You are not supposed to change a password on an Open Shaarli."
603msgstr "Вы не должны менять пароль на Open Shaarli."
604
605#: application/front/exceptions/ThumbnailsDisabledException.php:11
606msgid "Picture wall unavailable (thumbnails are disabled)."
607msgstr "Галерея недоступна (миниатюры отключены)."
608
609#: application/front/exceptions/WrongTokenException.php:16
610msgid "Wrong token."
611msgstr "Неправильный токен."
612
613#: application/helper/ApplicationUtils.php:163
614#, php-format
615msgid ""
616"Your PHP version is obsolete! Shaarli requires at least PHP %s, and thus "
617"cannot run. Your PHP version has known security vulnerabilities and should "
618"be updated as soon as possible."
619msgstr ""
620"Ваша версия PHP устарела! Shaarli требует как минимум PHP %s, и поэтому не "
621"может работать. В вашей версии PHP есть известные уязвимости в системе "
622"безопасности, и ее следует обновить как можно скорее."
623
624#: application/helper/ApplicationUtils.php:198
625#: application/helper/ApplicationUtils.php:218
626msgid "directory is not readable"
627msgstr "папка не доступна для чтения"
628
629#: application/helper/ApplicationUtils.php:221
630msgid "directory is not writable"
631msgstr "папка не доступна для записи"
632
633#: application/helper/ApplicationUtils.php:245
634msgid "file is not readable"
635msgstr "файл не доступен для чтения"
636
637#: application/helper/ApplicationUtils.php:248
638msgid "file is not writable"
639msgstr "файл не доступен для записи"
640
641#: application/helper/ApplicationUtils.php:282
642msgid "Configuration parsing"
643msgstr "Разбор конфигурации"
644
645#: application/helper/ApplicationUtils.php:283
646msgid "Slim Framework (routing, etc.)"
647msgstr "Slim Framework (маршрутизация и т. д.)"
648
649#: application/helper/ApplicationUtils.php:284
650msgid "Multibyte (Unicode) string support"
651msgstr "Поддержка многобайтовых (Unicode) строк"
652
653#: application/helper/ApplicationUtils.php:285
654msgid "Required to use thumbnails"
655msgstr "Обязательно использование миниатюр"
656
657#: application/helper/ApplicationUtils.php:286
658msgid "Localized text sorting (e.g. e->è->f)"
659msgstr "Локализованная сортировка текста (например, e->è->f)"
660
661#: application/helper/ApplicationUtils.php:287
662msgid "Better retrieval of bookmark metadata and thumbnail"
663msgstr "Лучшее получение метаданных закладок и миниатюр"
664
665#: application/helper/ApplicationUtils.php:288
666msgid "Use the translation system in gettext mode"
667msgstr "Используйте систему перевода в режиме gettext"
668
669#: application/helper/ApplicationUtils.php:289
670msgid "Login using LDAP server"
671msgstr "Вход через LDAP сервер"
672
673#: application/helper/DailyPageHelper.php:172
674msgid "Week"
675msgstr "Неделя"
676
677#: application/helper/DailyPageHelper.php:176
678msgid "Today"
679msgstr "Сегодня"
680
681#: application/helper/DailyPageHelper.php:178
682msgid "Yesterday"
683msgstr "Вчера"
684
685#: application/helper/FileUtils.php:100
686msgid "Provided path is not a directory."
687msgstr "Указанный путь не является папкой."
688
689#: application/helper/FileUtils.php:104
690msgid "Trying to delete a folder outside of Shaarli path."
691msgstr "Попытка удалить папку за пределами пути Shaarli."
692
693#: application/legacy/LegacyLinkDB.php:131
694msgid "You are not authorized to add a link."
695msgstr "Вы не авторизованы для изменения ссылки."
696
697#: application/legacy/LegacyLinkDB.php:134
698msgid "Internal Error: A link should always have an id and URL."
699msgstr "Внутренняя ошибка: ссылка всегда должна иметь идентификатор и URL."
700
701#: application/legacy/LegacyLinkDB.php:137
702msgid "You must specify an integer as a key."
703msgstr "В качестве ключа необходимо указать целое число."
704
705#: application/legacy/LegacyLinkDB.php:140
706msgid "Array offset and link ID must be equal."
707msgstr "Смещение массива и идентификатор ссылки должны быть одинаковыми."
708
709#: application/legacy/LegacyLinkDB.php:249
710msgid ""
711"Welcome to Shaarli! This is your first public bookmark. To edit or delete "
712"me, you must first login.\n"
713"\n"
714"To learn how to use Shaarli, consult the link \"Documentation\" at the "
715"bottom of this page.\n"
716"\n"
717"You use the community supported version of the original Shaarli project, by "
718"Sebastien Sauvage."
719msgstr ""
720"Добро пожаловать в Shaarli! Это ваша первая общедоступная закладка. Чтобы "
721"отредактировать или удалить меня, вы должны сначала авторизоваться.\n"
722"\n"
723"Чтобы узнать, как использовать Shaarli, перейдите по ссылке \"Документация\" "
724"внизу этой страницы.\n"
725"\n"
726"Вы используете поддерживаемую сообществом версию оригинального проекта "
727"Shaarli от Себастьяна Соваж."
728
729#: application/legacy/LegacyLinkDB.php:266
730msgid "My secret stuff... - Pastebin.com"
731msgstr "Мой секрет... - Pastebin.com"
732
733#: application/legacy/LegacyLinkDB.php:268
734msgid "Shhhh! I'm a private link only YOU can see. You can delete me too."
735msgstr ""
736"Тссс! Это личная ссылка, которую видите только ВЫ. Вы тоже можете удалить "
737"меня."
738
739#: application/legacy/LegacyUpdater.php:104
740msgid "Couldn't retrieve updater class methods."
741msgstr "Не удалось получить методы класса средства обновления."
742
743#: application/legacy/LegacyUpdater.php:540
744msgid "<a href=\"./admin/thumbnails\">"
745msgstr "<a href=\"./admin/thumbnails\">"
746
747#: application/netscape/NetscapeBookmarkUtils.php:63
748msgid "Invalid export selection:"
749msgstr "Неверный выбор экспорта:"
750
751#: application/netscape/NetscapeBookmarkUtils.php:215
752#, php-format
753msgid "File %s (%d bytes) "
754msgstr "Файл %s (%d байт) "
755
756#: application/netscape/NetscapeBookmarkUtils.php:217
757msgid "has an unknown file format. Nothing was imported."
758msgstr "имеет неизвестный формат файла. Ничего не импортировано."
759
760#: application/netscape/NetscapeBookmarkUtils.php:221
761#, php-format
762msgid ""
763"was successfully processed in %d seconds: %d bookmarks imported, %d "
764"bookmarks overwritten, %d bookmarks skipped."
765msgstr ""
766"успешно обработано за %d секунд: %d закладок импортировано, %d закладок "
767"перезаписаны, %d закладок пропущено."
768
769#: application/plugin/PluginManager.php:125
770msgid " [plugin incompatibility]: "
771msgstr " [несовместимость плагинов]: "
772
773#: application/plugin/exception/PluginFileNotFoundException.php:22
774#, php-format
775msgid "Plugin \"%s\" files not found."
776msgstr "Файл плагина \"%s\" не найден."
777
778#: application/render/PageCacheManager.php:32
779#, php-format
780msgid "Cannot purge %s: no directory"
781msgstr "Невозможно очистить%s: нет папки"
782
783#: application/updater/exception/UpdaterException.php:51
784msgid "An error occurred while running the update "
785msgstr "Произошла ошибка при запуске обновления "
786
787#: index.php:81
788msgid "Shared bookmarks on "
789msgstr "Общие закладки на "
790
791#: plugins/addlink_toolbar/addlink_toolbar.php:31
792msgid "URI"
793msgstr "URI"
794
795#: plugins/addlink_toolbar/addlink_toolbar.php:35
796#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:20
797msgid "Add link"
798msgstr "Добавить ссылку"
799
800#: plugins/addlink_toolbar/addlink_toolbar.php:52
801msgid "Adds the addlink input on the linklist page."
802msgstr ""
803"Добавляет на страницу списка ссылок поле для добавления новой закладки."
804
805#: plugins/archiveorg/archiveorg.php:29
806msgid "View on archive.org"
807msgstr "Посмотреть на archive.org"
808
809#: plugins/archiveorg/archiveorg.php:42
810msgid "For each link, add an Archive.org icon."
811msgstr "Для каждой ссылки добавить значок с Archive.org."
812
813#: plugins/default_colors/default_colors.php:38
814msgid ""
815"Default colors plugin error: This plugin is active and no custom color is "
816"configured."
817msgstr ""
818"Ошибка плагина цветов по умолчанию: этот плагин активен, и пользовательский "
819"цвет не настроен."
820
821#: plugins/default_colors/default_colors.php:113
822msgid "Override default theme colors. Use any CSS valid color."
823msgstr ""
824"Переопределить цвета темы по умолчанию. Используйте любой допустимый цвет "
825"CSS."
826
827#: plugins/default_colors/default_colors.php:114
828msgid "Main color (navbar green)"
829msgstr "Основной цвет (зеленый на панели навигации)"
830
831#: plugins/default_colors/default_colors.php:115
832msgid "Background color (light grey)"
833msgstr "Цвет фона (светло-серый)"
834
835#: plugins/default_colors/default_colors.php:116
836msgid "Dark main color (e.g. visited links)"
837msgstr "Темный основной цвет (например, посещенные ссылки)"
838
839#: plugins/demo_plugin/demo_plugin.php:478
840msgid ""
841"A demo plugin covering all use cases for template designers and plugin "
842"developers."
843msgstr ""
844"Демо плагин, охватывающий все варианты использования для дизайнеров шаблонов "
845"и разработчиков плагинов."
846
847#: plugins/demo_plugin/demo_plugin.php:479
848msgid "This is a parameter dedicated to the demo plugin. It'll be suffixed."
849msgstr ""
850"Это параметр предназначен для демонстрационного плагина. Это будет суффикс."
851
852#: plugins/demo_plugin/demo_plugin.php:480
853msgid "Other demo parameter"
854msgstr "Другой демонстрационный параметр"
855
856#: plugins/isso/isso.php:22
857msgid ""
858"Isso plugin error: Please define the \"ISSO_SERVER\" setting in the plugin "
859"administration page."
860msgstr ""
861"Ошибка плагина Isso: определите параметр \"ISSO_SERVER\" на странице "
862"настройки плагина."
863
864#: plugins/isso/isso.php:92
865msgid "Let visitor comment your shaares on permalinks with Isso."
866msgstr ""
867"Позволить посетителю комментировать ваши закладки по постоянным ссылкам с "
868"Isso."
869
870#: plugins/isso/isso.php:93
871msgid "Isso server URL (without 'http://')"
872msgstr "URL сервера Isso (без 'http: //')"
873
874#: plugins/piwik/piwik.php:24
875msgid ""
876"Piwik plugin error: Please define PIWIK_URL and PIWIK_SITEID in the plugin "
877"administration page."
878msgstr ""
879"Ошибка плагина Piwik: укажите PIWIK_URL и PIWIK_SITEID на странице настройки "
880"плагина."
881
882#: plugins/piwik/piwik.php:73
883msgid "A plugin that adds Piwik tracking code to Shaarli pages."
884msgstr "Плагин, который добавляет код отслеживания Piwik на страницы Shaarli."
885
886#: plugins/piwik/piwik.php:74
887msgid "Piwik URL"
888msgstr "Piwik URL"
889
890#: plugins/piwik/piwik.php:75
891msgid "Piwik site ID"
892msgstr "Piwik site ID"
893
894#: plugins/playvideos/playvideos.php:26
895msgid "Video player"
896msgstr "Видео плеер"
897
898#: plugins/playvideos/playvideos.php:29
899msgid "Play Videos"
900msgstr "Воспроизвести видео"
901
902#: plugins/playvideos/playvideos.php:60
903msgid "Add a button in the toolbar allowing to watch all videos."
904msgstr ""
905"Добавьте кнопку на панель инструментов, позволяющую смотреть все видео."
906
907#: plugins/playvideos/youtube_playlist.js:214
908msgid "plugins/playvideos/jquery-1.11.2.min.js"
909msgstr "plugins/playvideos/jquery-1.11.2.min.js"
910
911#: plugins/pubsubhubbub/pubsubhubbub.php:72
912#, php-format
913msgid "Could not publish to PubSubHubbub: %s"
914msgstr "Не удалось опубликовать в PubSubHubbub: %s"
915
916#: plugins/pubsubhubbub/pubsubhubbub.php:99
917#, php-format
918msgid "Could not post to %s"
919msgstr "Не удалось отправить сообщение в %s"
920
921#: plugins/pubsubhubbub/pubsubhubbub.php:103
922#, php-format
923msgid "Bad response from the hub %s"
924msgstr "Плохой ответ от хаба %s"
925
926#: plugins/pubsubhubbub/pubsubhubbub.php:114
927msgid "Enable PubSubHubbub feed publishing."
928msgstr "Включить публикацию канала PubSubHubbub."
929
930#: plugins/qrcode/qrcode.php:74 plugins/wallabag/wallabag.php:72
931msgid "For each link, add a QRCode icon."
932msgstr "Для каждой ссылки добавить значок QR кода."
933
934#: plugins/wallabag/wallabag.php:22
935msgid ""
936"Wallabag plugin error: Please define the \"WALLABAG_URL\" setting in the "
937"plugin administration page."
938msgstr ""
939"Ошибка плагина Wallabag: определите параметр \"WALLABAG_URL\" на странице "
940"настройки плагина."
941
942#: plugins/wallabag/wallabag.php:49
943msgid "Save to wallabag"
944msgstr "Сохранить в wallabag"
945
946#: plugins/wallabag/wallabag.php:73
947msgid "Wallabag API URL"
948msgstr "Wallabag API URL"
949
950#: plugins/wallabag/wallabag.php:74
951msgid "Wallabag API version (1 or 2)"
952msgstr "Wallabag версия API (1 или 2)"
953
954#: tmp/404.b91ef64efc3688266305ea9b42e5017e.rtpl.php:12
955msgid "Sorry, nothing to see here."
956msgstr "Извините, тут ничего нет."
957
958#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
959msgid "URL or leave empty to post a note"
960msgstr "URL или оставьте пустым, чтобы опубликовать заметку"
961
962#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
963msgid "BULK CREATION"
964msgstr "МАССОВОЕ СОЗДАНИЕ"
965
966#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:40
967msgid "Metadata asynchronous retrieval is disabled."
968msgstr "Асинхронное получение метаданных отключено."
969
970#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
971msgid ""
972"We recommend that you enable the setting <em>general > "
973"enable_async_metadata</em> in your configuration file to use bulk link "
974"creation."
975msgstr ""
976"Мы рекомендуем включить параметр <em>general > enable_async_metadata</em> в "
977"вашем файле конфигурации, чтобы использовать массовое создание ссылок."
978
979#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:56
980msgid "Shaare multiple new links"
981msgstr "Поделиться несколькими новыми ссылками"
982
983#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:59
984msgid "Add one URL per line to create multiple bookmarks."
985msgstr "Добавьте по одному URL в строке, чтобы создать несколько закладок."
986
987#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:63
988#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:67
989msgid "Tags"
990msgstr "Теги"
991
992#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:73
993#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83
994#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35
995#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169
996msgid "Private"
997msgstr "Личный"
998
999#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:78
1000msgid "Add links"
1001msgstr "Добавить ссылки"
1002
1003#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
1004msgid "Current password"
1005msgstr "Текущий пароль"
1006
1007#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
1008msgid "New password"
1009msgstr "Новый пароль"
1010
1011#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23
1012msgid "Change"
1013msgstr "Изменить"
1014
1015#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
1016#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:77
1017msgid "Tag"
1018msgstr "Тег"
1019
1020#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
1021msgid "New name"
1022msgstr "Новое имя"
1023
1024#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31
1025msgid "Case sensitive"
1026msgstr "С учетом регистра"
1027
1028#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
1029#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:68
1030msgid "Rename tag"
1031msgstr "Переименовать тег"
1032
1033#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35
1034msgid "Delete tag"
1035msgstr "Удалить тег"
1036
1037#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:40
1038msgid "You can also edit tags in the"
1039msgstr "Вы также можете редактировать теги в"
1040
1041#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:40
1042msgid "tag list"
1043msgstr "список тегов"
1044
1045#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47
1046msgid "Change tags separator"
1047msgstr "Изменить разделитель тегов"
1048
1049#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:50
1050msgid "Your current tag separator is"
1051msgstr "Текущий разделитель тегов"
1052
1053#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:53
1054msgid "New separator"
1055msgstr "Новый разделитель"
1056
1057#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58
1058#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:355
1059#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:121
1060#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139
1061#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:199
1062msgid "Save"
1063msgstr "Сохранить"
1064
1065#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:61
1066msgid "Note that hashtags won't fully work with a non-whitespace separator."
1067msgstr ""
1068"Обратите внимание, что хэштеги не будут полностью работать с разделителем, "
1069"отличным от пробелов."
1070
1071#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
1072msgid "title"
1073msgstr "заголовок"
1074
1075#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43
1076msgid "Home link"
1077msgstr "Домашняя ссылка"
1078
1079#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
1080msgid "Default value"
1081msgstr "Значение по умолчанию"
1082
1083#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58
1084msgid "Theme"
1085msgstr "Тема"
1086
1087#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:85
1088msgid "Description formatter"
1089msgstr "Средство форматирования описания"
1090
1091#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:114
1092#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:77
1093msgid "Language"
1094msgstr "Язык"
1095
1096#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:143
1097#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:101
1098msgid "Timezone"
1099msgstr "Часовой пояс"
1100
1101#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:144
1102#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:102
1103msgid "Continent"
1104msgstr "Континент"
1105
1106#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:144
1107#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:102
1108msgid "City"
1109msgstr "Город"
1110
1111#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:191
1112msgid "Disable session cookie hijacking protection"
1113msgstr "Отключить защиту от перехвата файлов сеанса cookie"
1114
1115#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:193
1116msgid "Check this if you get disconnected or if your IP address changes often"
1117msgstr "Проверьте это, если вы отключаетесь или ваш IP адрес часто меняется"
1118
1119#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:210
1120msgid "Private links by default"
1121msgstr "Приватные ссылки по умолчанию"
1122
1123#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:211
1124msgid "All new links are private by default"
1125msgstr "Все новые ссылки по умолчанию являются приватными"
1126
1127#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:226
1128msgid "RSS direct links"
1129msgstr "RSS прямые ссылки"
1130
1131#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:227
1132msgid "Check this to use direct URL instead of permalink in feeds"
1133msgstr ""
1134"Установите этот флажок, чтобы использовать прямой URL вместо постоянной "
1135"ссылки в фидах"
1136
1137#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:242
1138msgid "Hide public links"
1139msgstr "Скрыть общедоступные ссылки"
1140
1141#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:243
1142msgid "Do not show any links if the user is not logged in"
1143msgstr "Не показывать ссылки, если пользователь не авторизован"
1144
1145#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:258
1146#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:149
1147msgid "Check updates"
1148msgstr "Проверить обновления"
1149
1150#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:259
1151#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:151
1152msgid "Notify me when a new release is ready"
1153msgstr "Оповестить, когда будет готов новый выпуск"
1154
1155#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:274
1156msgid "Automatically retrieve description for new bookmarks"
1157msgstr "Автоматически получать описание для новых закладок"
1158
1159#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:275
1160msgid "Shaarli will try to retrieve the description from meta HTML headers"
1161msgstr "Shaarli попытается получить описание из мета заголовков HTML"
1162
1163#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:290
1164#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:168
1165msgid "Enable REST API"
1166msgstr "Включить REST API"
1167
1168#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:291
1169#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169
1170msgid "Allow third party software to use Shaarli such as mobile application"
1171msgstr ""
1172"Разрешить стороннему программному обеспечению использовать Shaarli, например "
1173"мобильное приложение"
1174
1175#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:306
1176msgid "API secret"
1177msgstr "API ключ"
1178
1179#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:320
1180msgid "Enable thumbnails"
1181msgstr "Включить миниатюры"
1182
1183#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:324
1184msgid "You need to enable the extension <code>php-gd</code> to use thumbnails."
1185msgstr ""
1186"Вам необходимо включить расширение <code>php-gd</code> для использования "
1187"миниатюр."
1188
1189#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:328
1190#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:122
1191msgid "Synchronize thumbnails"
1192msgstr "Синхронизировать миниатюры"
1193
1194#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:339
1195#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
1196#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:102
1197msgid "All"
1198msgstr "Все"
1199
1200#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:343
1201#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:106
1202msgid "Only common media hosts"
1203msgstr "Только обычные медиа хосты"
1204
1205#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:347
1206#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:110
1207msgid "None"
1208msgstr "Ничего"
1209
1210#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
1211msgid "1 RSS entry per :type"
1212msgid_plural ""
1213msgstr[0] "1 RSS запись для каждого :type"
1214msgstr[1] "1 RSS запись для каждого :type"
1215msgstr[2] "1 RSS запись для каждого :type"
1216
1217#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:49
1218msgid "Previous :type"
1219msgid_plural ""
1220msgstr[0] "Предыдущий :type"
1221msgstr[1] "Предыдущих :type"
1222msgstr[2] "Предыдущих :type"
1223
1224#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:56
1225#: tmp/dailyrss.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7
1226msgid "All links of one :type in a single page."
1227msgid_plural ""
1228msgstr[0] "Все ссылки одного :type на одной странице."
1229msgstr[1] "Все ссылки одного :type на одной странице."
1230msgstr[2] "Все ссылки одного :type на одной странице."
1231
1232#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:63
1233msgid "Next :type"
1234msgid_plural ""
1235msgstr[0] "Следующий :type"
1236msgstr[1] "Следующие :type"
1237msgstr[2] "Следующие :type"
1238
1239#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
1240msgid "Edit Shaare"
1241msgstr "Изменить закладку"
1242
1243#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
1244msgid "New Shaare"
1245msgstr "Новая закладка"
1246
1247#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:38
1248msgid "Created:"
1249msgstr "Создано:"
1250
1251#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
1252msgid "URL"
1253msgstr "URL"
1254
1255#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47
1256msgid "Title"
1257msgstr "Заголовок"
1258
1259#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58
1260#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
1261#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:75
1262#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:99
1263#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:124
1264msgid "Description"
1265msgstr "Описание"
1266
1267#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:89
1268msgid "Description will be rendered with"
1269msgstr "Описание будет отображаться с"
1270
1271#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:91
1272msgid "Markdown syntax documentation"
1273msgstr "Документация по синтаксису Markdown"
1274
1275#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:92
1276msgid "Markdown syntax"
1277msgstr "Синтаксис Markdown"
1278
1279#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:115
1280msgid "Cancel"
1281msgstr "Отменить"
1282
1283#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:121
1284msgid "Apply Changes"
1285msgstr "Применить изменения"
1286
1287#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:126
1288#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173
1289#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:147
1290#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:147
1291#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:67
1292msgid "Delete"
1293msgstr "Удалить"
1294
1295#: tmp/editlink.batch.b91ef64efc3688266305ea9b42e5017e.rtpl.php:21
1296#: tmp/editlink.batch.b91ef64efc3688266305ea9b42e5017e.rtpl.php:32
1297msgid "Save all"
1298msgstr "Сохранить все"
1299
1300#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
1301msgid "Export Database"
1302msgstr "Экспорт базы данных"
1303
1304#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23
1305msgid "Selection"
1306msgstr "Выбор"
1307
1308#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:40
1309msgid "Public"
1310msgstr "Общедоступно"
1311
1312#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:51
1313msgid "Prepend note permalinks with this Shaarli instance's URL"
1314msgstr ""
1315"Добавить постоянные ссылки на заметку с URL адресом этого экземпляра Shaarli"
1316
1317#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:52
1318msgid "Useful to import bookmarks in a web browser"
1319msgstr "Useful to import bookmarks in a web browser"
1320
1321#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
1322msgid "Import Database"
1323msgstr "Импорт базы данных"
1324
1325#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23
1326msgid "Maximum size allowed:"
1327msgstr "Максимально допустимый размер:"
1328
1329#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
1330msgid "Visibility"
1331msgstr "Видимость"
1332
1333#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
1334msgid "Use values from the imported file, default to public"
1335msgstr ""
1336"Использовать значения из импортированного файла, по умолчанию общедоступные"
1337
1338#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
1339msgid "Import all bookmarks as private"
1340msgstr "Импортировать все закладки как личные"
1341
1342#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
1343msgid "Import all bookmarks as public"
1344msgstr "Импортировать все закладки как общедоступные"
1345
1346#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:57
1347msgid "Overwrite existing bookmarks"
1348msgstr "Заменить существующие закладки"
1349
1350#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58
1351msgid "Duplicates based on URL"
1352msgstr "Дубликаты на основе URL"
1353
1354#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72
1355msgid "Add default tags"
1356msgstr "Добавить теги по умолчанию"
1357
1358#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:25
1359msgid "It looks like it's the first time you run Shaarli. Please configure it."
1360msgstr "Похоже, вы впервые запускаете Shaarli. Пожалуйста, настройте его."
1361
1362#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:32
1363#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
1364#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:167
1365#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:167
1366msgid "Username"
1367msgstr "Имя пользователя"
1368
1369#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47
1370#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:20
1371#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:168
1372#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:168
1373msgid "Password"
1374msgstr "Пароль"
1375
1376#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:62
1377msgid "Shaarli title"
1378msgstr "Заголовок Shaarli"
1379
1380#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:68
1381msgid "My links"
1382msgstr "Мои ссылки"
1383
1384#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:181
1385msgid "Install"
1386msgstr "Установка"
1387
1388#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:190
1389msgid "Server requirements"
1390msgstr "Системные требования"
1391
1392#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
1393#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:79
1394msgid "shaare"
1395msgid_plural "shaares"
1396msgstr[0] "закладка"
1397msgstr[1] "закладки"
1398msgstr[2] "закладок"
1399
1400#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:18
1401#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83
1402msgid "private link"
1403msgid_plural "private links"
1404msgstr[0] "личная ссылка"
1405msgstr[1] "личные ссылки"
1406msgstr[2] "личных ссылок"
1407
1408#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
1409#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:123
1410#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:123
1411msgid "Search text"
1412msgstr "Поиск текста"
1413
1414#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:37
1415#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:130
1416#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:130
1417#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
1418#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:65
1419#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
1420#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:74
1421msgid "Filter by tag"
1422msgstr "Фильтровать по тегу"
1423
1424#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
1425#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:87
1426#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139
1427#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:87
1428#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:139
1429#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
1430#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:45
1431msgid "Search"
1432msgstr "Поиск"
1433
1434#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:110
1435msgid "Nothing found."
1436msgstr "Ничего не найдено."
1437
1438#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:118
1439#, php-format
1440msgid "%s result"
1441msgid_plural "%s results"
1442msgstr[0] "%s результат"
1443msgstr[1] "%s результатов"
1444msgstr[2] "%s результатов"
1445
1446#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:122
1447msgid "for"
1448msgstr "для"
1449
1450#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:129
1451msgid "tagged"
1452msgstr "отмечено"
1453
1454#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:133
1455#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:134
1456msgid "Remove tag"
1457msgstr "Удалить тег"
1458
1459#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:144
1460msgid "with status"
1461msgstr "со статусом"
1462
1463#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:155
1464msgid "without any tag"
1465msgstr "без тега"
1466
1467#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:175
1468#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
1469#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:41
1470msgid "Fold"
1471msgstr "Сложить"
1472
1473#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:177
1474msgid "Edited: "
1475msgstr "Отредактировано: "
1476
1477#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:181
1478msgid "permalink"
1479msgstr "постоянная ссылка"
1480
1481#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:183
1482msgid "Add tag"
1483msgstr "Добавить тег"
1484
1485#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:185
1486msgid "Toggle sticky"
1487msgstr "Закрепить / Открепить"
1488
1489#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:187
1490msgid "Sticky"
1491msgstr "Закреплено"
1492
1493#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:189
1494msgid "Share a private link"
1495msgstr "Поделиться личной ссылкой"
1496
1497#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:5
1498#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:5
1499msgid "Filters"
1500msgstr "Фильтры"
1501
1502#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:10
1503#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:10
1504msgid "Only display private links"
1505msgstr "Отображать только личные ссылки"
1506
1507#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
1508#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:13
1509msgid "Only display public links"
1510msgstr "Отображать только общедоступные ссылки"
1511
1512#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:18
1513#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:18
1514msgid "Filter untagged links"
1515msgstr "Фильтровать неотмеченные ссылки"
1516
1517#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
1518#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:24
1519msgid "Select all"
1520msgstr "Выбрать все"
1521
1522#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
1523#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:89
1524#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:29
1525#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:89
1526#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
1527#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:42
1528msgid "Fold all"
1529msgstr "Сложить все"
1530
1531#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:76
1532#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:76
1533msgid "Links per page"
1534msgstr "Ссылок на страницу"
1535
1536#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:25
1537#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:171
1538#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:171
1539msgid "Remember me"
1540msgstr "Запомнить меня"
1541
1542#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
1543#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
1544#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15
1545#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48
1546msgid "by the Shaarli community"
1547msgstr "сообществом Shaarli"
1548
1549#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
1550#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:16
1551msgid "Documentation"
1552msgstr "Документация"
1553
1554#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43
1555#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:43
1556msgid "Expand"
1557msgstr "Развернуть"
1558
1559#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
1560#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:44
1561msgid "Expand all"
1562msgstr "Развернуть все"
1563
1564#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:45
1565#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:45
1566msgid "Are you sure you want to delete this link?"
1567msgstr "Вы уверены, что хотите удалить эту ссылку?"
1568
1569#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
1570#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:46
1571msgid "Are you sure you want to delete this tag?"
1572msgstr "Вы уверены, что хотите удалить этот тег?"
1573
1574#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:11
1575#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:11
1576msgid "Menu"
1577msgstr "Меню"
1578
1579#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:38
1580#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:38
1581#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
1582msgid "Tag cloud"
1583msgstr "Облако тегов"
1584
1585#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:67
1586#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:92
1587#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:67
1588#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:92
1589msgid "RSS Feed"
1590msgstr "RSS канал"
1591
1592#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72
1593#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:108
1594#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:72
1595#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:108
1596msgid "Logout"
1597msgstr "Выйти"
1598
1599#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:152
1600#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:152
1601msgid "Set public"
1602msgstr "Сделать общедоступным"
1603
1604#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:157
1605#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:157
1606msgid "Set private"
1607msgstr "Сделать личным"
1608
1609#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:189
1610#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:189
1611msgid "is available"
1612msgstr "доступно"
1613
1614#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:196
1615#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:196
1616msgid "Error"
1617msgstr "Ошибка"
1618
1619#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
1620msgid "There is no cached thumbnail."
1621msgstr "Нет кэшированных миниатюр."
1622
1623#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:17
1624msgid "Try to synchronize them."
1625msgstr "Попробуйте синхронизировать их."
1626
1627#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
1628msgid "Picture Wall"
1629msgstr "Галерея"
1630
1631#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
1632msgid "pics"
1633msgstr "изображений"
1634
1635#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
1636msgid "You need to enable Javascript to change plugin loading order."
1637msgstr ""
1638"Вам необходимо включить Javascript, чтобы изменить порядок загрузки плагинов."
1639
1640#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
1641#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22
1642msgid "Plugin administration"
1643msgstr "Управление плагинами"
1644
1645#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
1646msgid "Enabled Plugins"
1647msgstr "Включенные плагины"
1648
1649#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
1650#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:155
1651msgid "No plugin enabled."
1652msgstr "Нет включенных плагинов."
1653
1654#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:40
1655#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:73
1656msgid "Disable"
1657msgstr "Отключить"
1658
1659#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
1660#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:74
1661#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:98
1662#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:123
1663msgid "Name"
1664msgstr "Имя"
1665
1666#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43
1667#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:76
1668msgid "Order"
1669msgstr "Порядок"
1670
1671#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:86
1672msgid "Disabled Plugins"
1673msgstr "Отключенные плагины"
1674
1675#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:91
1676msgid "No plugin disabled."
1677msgstr "Нет отключенных плагинов."
1678
1679#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:97
1680#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:122
1681msgid "Enable"
1682msgstr "Включить"
1683
1684#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:134
1685msgid "More plugins available"
1686msgstr "Доступны другие плагины"
1687
1688#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:136
1689msgid "in the documentation"
1690msgstr "в документации"
1691
1692#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:150
1693msgid "Plugin configuration"
1694msgstr "Настройка плагинов"
1695
1696#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:195
1697msgid "No parameter available."
1698msgstr "Нет доступных параметров."
1699
1700#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
1701msgid "General"
1702msgstr "Общее"
1703
1704#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:20
1705msgid "Index URL"
1706msgstr "Индексный URL"
1707
1708#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
1709msgid "Base path"
1710msgstr "Базовый путь"
1711
1712#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
1713msgid "Client IP"
1714msgstr "IP клиента"
1715
1716#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
1717msgid "Trusted reverse proxies"
1718msgstr "Надежные обратные прокси"
1719
1720#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58
1721msgid "N/A"
1722msgstr "Нет данных"
1723
1724#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:84
1725msgid "Visit releases page on Github"
1726msgstr "Посетить страницу релизов на Github"
1727
1728#: tmp/server.b91ef64efc3688266305ea9b42e5017e.rtpl.php:121
1729msgid "Synchronize all link thumbnails"
1730msgstr "Синхронизировать все миниатюры ссылок"
1731
1732#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:2
1733#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:2
1734msgid "Permissions"
1735msgstr "Разрешения"
1736
1737#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:8
1738#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:8
1739msgid "There are permissions that need to be fixed."
1740msgstr "Есть разрешения, которые нужно исправить."
1741
1742#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23
1743#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:23
1744msgid "All read/write permissions are properly set."
1745msgstr "Все разрешения на чтение и запись установлены правильно."
1746
1747#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:32
1748#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:32
1749msgid "Running PHP"
1750msgstr "Запуск PHP"
1751
1752#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
1753#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:36
1754msgid "End of life: "
1755msgstr "Конец жизни: "
1756
1757#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
1758#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:48
1759msgid "Extension"
1760msgstr "Расширение"
1761
1762#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:49
1763#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:49
1764msgid "Usage"
1765msgstr "Применение"
1766
1767#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:50
1768#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:50
1769msgid "Status"
1770msgstr "Статус"
1771
1772#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:51
1773#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:66
1774#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:51
1775#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:66
1776msgid "Loaded"
1777msgstr "Загружено"
1778
1779#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:60
1780#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:60
1781msgid "Required"
1782msgstr "Обязательно"
1783
1784#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:60
1785#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:60
1786msgid "Optional"
1787msgstr "Необязательно"
1788
1789#: tmp/server.requirements.b91ef64efc3688266305ea9b42e5017e.rtpl.php:70
1790#: tmp/server.requirements.cedf684561d925457130839629000a81.rtpl.php:70
1791msgid "Not loaded"
1792msgstr "Не загружено"
1793
1794#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
1795#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
1796msgid "tags"
1797msgstr "теги"
1798
1799#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
1800#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
1801msgid "List all links with those tags"
1802msgstr "Список всех ссылок с этими тегами"
1803
1804#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
1805msgid "Tag list"
1806msgstr "Список тегов"
1807
1808#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:3
1809#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:3
1810msgid "Sort by:"
1811msgstr "Сортировать по:"
1812
1813#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:5
1814#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:5
1815msgid "Cloud"
1816msgstr "Облако"
1817
1818#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:6
1819#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:6
1820msgid "Most used"
1821msgstr "Наиболее используемое"
1822
1823#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7
1824#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:7
1825msgid "Alphabetical"
1826msgstr "Алфавит"
1827
1828#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
1829msgid "Settings"
1830msgstr "Настройки"
1831
1832#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
1833msgid "Change Shaarli settings: title, timezone, etc."
1834msgstr "Измените настройки Shaarli: заголовок, часовой пояс и т.д."
1835
1836#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:17
1837msgid "Configure your Shaarli"
1838msgstr "Настройка Shaarli"
1839
1840#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:21
1841msgid "Enable, disable and configure plugins"
1842msgstr "Включить, отключить и настроить плагины"
1843
1844#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:27
1845msgid "Check instance's server configuration"
1846msgstr "Проверка конфигурации экземпляра сервера"
1847
1848#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
1849msgid "Change your password"
1850msgstr "Изменить пароль"
1851
1852#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
1853msgid "Rename or delete a tag in all links"
1854msgstr "Переименовать или удалить тег во всех ссылках"
1855
1856#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47
1857msgid ""
1858"Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, "
1859"delicious...)"
1860msgstr ""
1861"Импорт закладок Netscape HTML (экспортированные из Firefox, Chrome, Opera, "
1862"delicious...)"
1863
1864#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
1865msgid "Import links"
1866msgstr "Импорт ссылок"
1867
1868#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:53
1869msgid ""
1870"Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, "
1871"Opera, delicious...)"
1872msgstr ""
1873"Экспорт закладок Netscape HTML (которые могут быть импортированы в Firefox, "
1874"Chrome, Opera, delicious...)"
1875
1876#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:54
1877msgid "Export database"
1878msgstr "Экспорт базы данных"
1879
1880#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:77
1881msgid ""
1882"Drag one of these button to your bookmarks toolbar or right-click it and "
1883"\"Bookmark This Link\""
1884msgstr ""
1885"Перетащите одну из этих кнопок на панель закладок или щелкните по ней правой "
1886"кнопкой мыши и выберите \"Добавить ссылку в закладки\""
1887
1888#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:78
1889msgid "then click on the bookmarklet in any page you want to share."
1890msgstr ""
1891"затем щелкните букмарклет на любой странице, которой хотите поделиться."
1892
1893#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:82
1894#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:106
1895msgid ""
1896"Drag this link to your bookmarks toolbar or right-click it and Bookmark This "
1897"Link"
1898msgstr ""
1899"Перетащите эту ссылку на панель закладок или щелкните по ней правой кнопкой "
1900"мыши и добавьте эту ссылку в закладки"
1901
1902#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83
1903msgid "then click ✚Shaare link button in any page you want to share"
1904msgstr ""
1905"затем нажмите кнопку ✚Поделиться ссылкой на любой странице, которой хотите "
1906"поделиться"
1907
1908#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:92
1909#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:114
1910msgid "The selected text is too long, it will be truncated."
1911msgstr "Выделенный текст слишком длинный, он будет обрезан."
1912
1913#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:102
1914msgid "Shaare link"
1915msgstr "Поделиться ссылкой"
1916
1917#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:107
1918msgid ""
1919"Then click ✚Add Note button anytime to start composing a private Note (text "
1920"post) to your Shaarli"
1921msgstr ""
1922"Затем в любое время нажмите кнопку ✚Добавить заметку, чтобы начать создавать "
1923"личную заметку (текстовое сообщение) в своем Shaarli"
1924
1925#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:123
1926msgid "Add Note"
1927msgstr "Добавить заметку"
1928
1929#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:132
1930msgid "3rd party"
1931msgstr "Третья сторона"
1932
1933#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:135
1934#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:140
1935msgid "plugin"
1936msgstr "плагин"
1937
1938#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:165
1939msgid ""
1940"Drag this link to your bookmarks toolbar, or right-click it and choose "
1941"Bookmark This Link"
1942msgstr ""
1943"Перетащите эту ссылку на панель закладок или щелкните по ней правой кнопкой "
1944"мыши и выберите \"Добавить ссылку в закладки\""
diff --git a/index.php b/index.php
index 1eb7659a..862c53ef 100644
--- a/index.php
+++ b/index.php
@@ -31,6 +31,7 @@ use Psr\Log\LogLevel;
31use Shaarli\Config\ConfigManager; 31use Shaarli\Config\ConfigManager;
32use Shaarli\Container\ContainerBuilder; 32use Shaarli\Container\ContainerBuilder;
33use Shaarli\Languages; 33use Shaarli\Languages;
34use Shaarli\Plugin\PluginManager;
34use Shaarli\Security\BanManager; 35use Shaarli\Security\BanManager;
35use Shaarli\Security\CookieManager; 36use Shaarli\Security\CookieManager;
36use Shaarli\Security\LoginManager; 37use Shaarli\Security\LoginManager;
@@ -87,7 +88,17 @@ date_default_timezone_set($conf->get('general.timezone', 'UTC'));
87 88
88$loginManager->checkLoginState(client_ip_id($_SERVER)); 89$loginManager->checkLoginState(client_ip_id($_SERVER));
89 90
90$containerBuilder = new ContainerBuilder($conf, $sessionManager, $cookieManager, $loginManager, $logger); 91$pluginManager = new PluginManager($conf);
92$pluginManager->load($conf->get('general.enabled_plugins', []));
93
94$containerBuilder = new ContainerBuilder(
95 $conf,
96 $sessionManager,
97 $cookieManager,
98 $loginManager,
99 $pluginManager,
100 $logger
101);
91$container = $containerBuilder->build(); 102$container = $containerBuilder->build();
92$app = new App($container); 103$app = new App($container);
93 104
@@ -154,6 +165,15 @@ $app->group('/admin', function () {
154 $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility'); 165 $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility');
155})->add('\Shaarli\Front\ShaarliAdminMiddleware'); 166})->add('\Shaarli\Front\ShaarliAdminMiddleware');
156 167
168$app->group('/plugin', function () use ($pluginManager) {
169 foreach ($pluginManager->getRegisteredRoutes() as $pluginName => $routes) {
170 $this->group('/' . $pluginName, function () use ($routes) {
171 foreach ($routes as $route) {
172 $this->{strtolower($route['method'])}('/' . ltrim($route['route'], '/'), $route['callable']);
173 }
174 });
175 }
176})->add('\Shaarli\Front\ShaarliMiddleware');
157 177
158// REST API routes 178// REST API routes
159$app->group('/api/v1', function () { 179$app->group('/api/v1', function () {
diff --git a/phpcs.xml b/phpcs.xml
index c559e35d..9bdc8720 100644
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -18,5 +18,6 @@
18 <rule ref="PSR1.Files.SideEffects.FoundWithSymbols"> 18 <rule ref="PSR1.Files.SideEffects.FoundWithSymbols">
19 <!-- index.php bootstraps everything, so yes mixed symbols with side effects --> 19 <!-- index.php bootstraps everything, so yes mixed symbols with side effects -->
20 <exclude-pattern>index.php</exclude-pattern> 20 <exclude-pattern>index.php</exclude-pattern>
21 <exclude-pattern>plugins/*</exclude-pattern>
21 </rule> 22 </rule>
22</ruleset> 23</ruleset>
diff --git a/plugins/demo_plugin/DemoPluginController.php b/plugins/demo_plugin/DemoPluginController.php
new file mode 100644
index 00000000..b8ace9c8
--- /dev/null
+++ b/plugins/demo_plugin/DemoPluginController.php
@@ -0,0 +1,24 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Shaarli\DemoPlugin;
6
7use Shaarli\Front\Controller\Admin\ShaarliAdminController;
8use Slim\Http\Request;
9use Slim\Http\Response;
10
11class DemoPluginController extends ShaarliAdminController
12{
13 public function index(Request $request, Response $response): Response
14 {
15 $this->assignView(
16 'content',
17 '<div class="center">' .
18 'This is a demo page. I have access to Shaarli container, so I\'m free to do whatever I want here.' .
19 '</div>'
20 );
21
22 return $response->write($this->render('pluginscontent'));
23 }
24}
diff --git a/plugins/demo_plugin/demo_plugin.php b/plugins/demo_plugin/demo_plugin.php
index 22d27b68..15cfc2c5 100644
--- a/plugins/demo_plugin/demo_plugin.php
+++ b/plugins/demo_plugin/demo_plugin.php
@@ -7,6 +7,8 @@
7 * Can be used by plugin developers to make their own plugin. 7 * Can be used by plugin developers to make their own plugin.
8 */ 8 */
9 9
10require_once __DIR__ . '/DemoPluginController.php';
11
10/* 12/*
11 * RENDER HEADER, INCLUDES, FOOTER 13 * RENDER HEADER, INCLUDES, FOOTER
12 * 14 *
@@ -60,6 +62,17 @@ function demo_plugin_init($conf)
60 return $errors; 62 return $errors;
61} 63}
62 64
65function demo_plugin_register_routes(): array
66{
67 return [
68 [
69 'method' => 'GET',
70 'route' => '/custom',
71 'callable' => 'Shaarli\DemoPlugin\DemoPluginController:index',
72 ],
73 ];
74}
75
63/** 76/**
64 * Hook render_header. 77 * Hook render_header.
65 * Executed on every page render. 78 * Executed on every page render.
@@ -304,7 +317,11 @@ function hook_demo_plugin_render_editlink($data)
304function hook_demo_plugin_render_tools($data) 317function hook_demo_plugin_render_tools($data)
305{ 318{
306 // field_plugin 319 // field_plugin
307 $data['tools_plugin'][] = 'tools_plugin'; 320 $data['tools_plugin'][] = '<div class="tools-item">
321 <a href="' . $data['_BASE_PATH_'] . '/plugin/demo_plugin/custom">
322 <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Demo Plugin Custom Route</span>
323 </a>
324 </div>';
308 325
309 return $data; 326 return $data;
310} 327}
diff --git a/tests/PluginManagerTest.php b/tests/PluginManagerTest.php
index efef5e87..8947f679 100644
--- a/tests/PluginManagerTest.php
+++ b/tests/PluginManagerTest.php
@@ -120,4 +120,43 @@ class PluginManagerTest extends \Shaarli\TestCase
120 $this->assertEquals('test plugin', $meta[self::$pluginName]['description']); 120 $this->assertEquals('test plugin', $meta[self::$pluginName]['description']);
121 $this->assertEquals($expectedParameters, $meta[self::$pluginName]['parameters']); 121 $this->assertEquals($expectedParameters, $meta[self::$pluginName]['parameters']);
122 } 122 }
123
124 /**
125 * Test plugin custom routes - note that there is no check on callable functions
126 */
127 public function testRegisteredRoutes(): void
128 {
129 PluginManager::$PLUGINS_PATH = self::$pluginPath;
130 $this->pluginManager->load([self::$pluginName]);
131
132 $expectedParameters = [
133 [
134 'method' => 'GET',
135 'route' => '/test',
136 'callable' => 'getFunction',
137 ],
138 [
139 'method' => 'POST',
140 'route' => '/custom',
141 'callable' => 'postFunction',
142 ],
143 ];
144 $meta = $this->pluginManager->getRegisteredRoutes();
145 static::assertSame($expectedParameters, $meta[self::$pluginName]);
146 }
147
148 /**
149 * Test plugin custom routes with invalid route
150 */
151 public function testRegisteredRoutesInvalid(): void
152 {
153 $plugin = 'test_route_invalid';
154 $this->pluginManager->load([$plugin]);
155
156 $meta = $this->pluginManager->getRegisteredRoutes();
157 static::assertSame([], $meta);
158
159 $errors = $this->pluginManager->getErrors();
160 static::assertSame(['test_route_invalid [plugin incompatibility]: trying to register invalid route.'], $errors);
161 }
123} 162}
diff --git a/tests/container/ContainerBuilderTest.php b/tests/container/ContainerBuilderTest.php
index 3d43c344..04d4ef01 100644
--- a/tests/container/ContainerBuilderTest.php
+++ b/tests/container/ContainerBuilderTest.php
@@ -43,11 +43,15 @@ class ContainerBuilderTest extends TestCase
43 /** @var CookieManager */ 43 /** @var CookieManager */
44 protected $cookieManager; 44 protected $cookieManager;
45 45
46 /** @var PluginManager */
47 protected $pluginManager;
48
46 public function setUp(): void 49 public function setUp(): void
47 { 50 {
48 $this->conf = new ConfigManager('tests/utils/config/configJson'); 51 $this->conf = new ConfigManager('tests/utils/config/configJson');
49 $this->sessionManager = $this->createMock(SessionManager::class); 52 $this->sessionManager = $this->createMock(SessionManager::class);
50 $this->cookieManager = $this->createMock(CookieManager::class); 53 $this->cookieManager = $this->createMock(CookieManager::class);
54 $this->pluginManager = $this->createMock(PluginManager::class);
51 55
52 $this->loginManager = $this->createMock(LoginManager::class); 56 $this->loginManager = $this->createMock(LoginManager::class);
53 $this->loginManager->method('isLoggedIn')->willReturn(true); 57 $this->loginManager->method('isLoggedIn')->willReturn(true);
@@ -57,6 +61,7 @@ class ContainerBuilderTest extends TestCase
57 $this->sessionManager, 61 $this->sessionManager,
58 $this->cookieManager, 62 $this->cookieManager,
59 $this->loginManager, 63 $this->loginManager,
64 $this->pluginManager,
60 $this->createMock(LoggerInterface::class) 65 $this->createMock(LoggerInterface::class)
61 ); 66 );
62 } 67 }
diff --git a/tests/front/controller/admin/ConfigureControllerTest.php b/tests/front/controller/admin/ConfigureControllerTest.php
index d82db0a7..13644df9 100644
--- a/tests/front/controller/admin/ConfigureControllerTest.php
+++ b/tests/front/controller/admin/ConfigureControllerTest.php
@@ -62,7 +62,7 @@ class ConfigureControllerTest extends TestCase
62 static::assertSame('privacy.hide_public_links', $assignedVariables['hide_public_links']); 62 static::assertSame('privacy.hide_public_links', $assignedVariables['hide_public_links']);
63 static::assertSame('api.enabled', $assignedVariables['api_enabled']); 63 static::assertSame('api.enabled', $assignedVariables['api_enabled']);
64 static::assertSame('api.secret', $assignedVariables['api_secret']); 64 static::assertSame('api.secret', $assignedVariables['api_secret']);
65 static::assertCount(5, $assignedVariables['languages']); 65 static::assertCount(6, $assignedVariables['languages']);
66 static::assertArrayHasKey('gd_enabled', $assignedVariables); 66 static::assertArrayHasKey('gd_enabled', $assignedVariables);
67 static::assertSame('thumbnails.mode', $assignedVariables['thumbnails_mode']); 67 static::assertSame('thumbnails.mode', $assignedVariables['thumbnails_mode']);
68 } 68 }
diff --git a/tests/plugins/test/test.php b/tests/plugins/test/test.php
index 03be4f4e..34cd339e 100644
--- a/tests/plugins/test/test.php
+++ b/tests/plugins/test/test.php
@@ -27,3 +27,19 @@ function hook_test_error()
27{ 27{
28 new Unknown(); 28 new Unknown();
29} 29}
30
31function test_register_routes(): array
32{
33 return [
34 [
35 'method' => 'GET',
36 'route' => '/test',
37 'callable' => 'getFunction',
38 ],
39 [
40 'method' => 'POST',
41 'route' => '/custom',
42 'callable' => 'postFunction',
43 ],
44 ];
45}
diff --git a/tests/plugins/test_route_invalid/test_route_invalid.php b/tests/plugins/test_route_invalid/test_route_invalid.php
new file mode 100644
index 00000000..0c5a5101
--- /dev/null
+++ b/tests/plugins/test_route_invalid/test_route_invalid.php
@@ -0,0 +1,12 @@
1<?php
2
3function test_route_invalid_register_routes(): array
4{
5 return [
6 [
7 'method' => 'GET',
8 'route' => 'not a route',
9 'callable' => 'getFunction',
10 ],
11 ];
12}
diff --git a/tpl/default/pluginscontent.html b/tpl/default/pluginscontent.html
new file mode 100644
index 00000000..1e4f6b80
--- /dev/null
+++ b/tpl/default/pluginscontent.html
@@ -0,0 +1,13 @@
1<!DOCTYPE html>
2<html{if="$language !== 'auto'"} lang="{$language}"{/if}>
3<head>
4 {include="includes"}
5</head>
6<body>
7 {include="page.header"}
8
9 {$content}
10
11 {include="page.footer"}
12</body>
13</html>
diff --git a/yarn.lock b/yarn.lock
index 55bd9827..97fb0fad 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3052,9 +3052,9 @@ inherits@2.0.3:
3052 integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 3052 integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
3053 3053
3054ini@^1.3.4, ini@^1.3.5: 3054ini@^1.3.4, ini@^1.3.5:
3055 version "1.3.5" 3055 version "1.3.7"
3056 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 3056 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84"
3057 integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 3057 integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
3058 3058
3059interpret@^1.4.0: 3059interpret@^1.4.0:
3060 version "1.4.0" 3060 version "1.4.0"