]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Merge pull request #1567 from ArthurHoaro/feature/async-title-retrieval
authorArthurHoaro <arthur@hoa.ro>
Tue, 20 Oct 2020 08:14:28 +0000 (10:14 +0200)
committerGitHub <noreply@github.com>
Tue, 20 Oct 2020 08:14:28 +0000 (10:14 +0200)
32 files changed:
application/bookmark/Bookmark.php
application/bookmark/BookmarkFileService.php
application/bookmark/BookmarkFilter.php
application/formatter/BookmarkDefaultFormatter.php
application/formatter/BookmarkFormatter.php
application/formatter/BookmarkMarkdownFormatter.php
application/front/controller/visitor/ShaarliVisitorController.php
application/plugin/PluginManager.php
application/render/PageBuilder.php
assets/default/js/base.js
assets/default/scss/shaarli.scss
doc/md/Server-configuration.md
doc/md/dev/Plugin-system.md
inc/languages/fr/LC_MESSAGES/shaarli.po
inc/languages/jp/LC_MESSAGES/shaarli.po
plugins/archiveorg/archiveorg.php
plugins/isso/isso.php
plugins/qrcode/qrcode.php
plugins/wallabag/wallabag.php
tests/api/controllers/links/GetLinksTest.php
tests/bookmark/BookmarkFileServiceTest.php
tests/bookmark/BookmarkFilterTest.php
tests/formatter/BookmarkDefaultFormatterTest.php
tests/legacy/LegacyLinkDBTest.php
tests/utils/ReferenceLinkDB.php
tpl/default/changetag.html
tpl/default/daily.html
tpl/default/includes.html
tpl/default/linklist.html
tpl/default/page.footer.html
tpl/default/picwall.html
tpl/default/pluginsadmin.html

index fa45d2fc04282a40e061dccfc4eaedbcdead75a1..ea565d1f689d0068b7327211025581546189a4d2 100644 (file)
@@ -54,6 +54,9 @@ class Bookmark
     /** @var bool True if the bookmark can only be seen while logged in */
     protected $private;
 
+    /** @var mixed[] Available to store any additional content for a bookmark. Currently used for search highlight. */
+    protected $additionalContent = [];
+
     /**
      * Initialize a link from array data. Especially useful to create a Bookmark from former link storage format.
      *
@@ -95,6 +98,8 @@ class Bookmark
      *   - the URL with the permalink
      *   - the title with the URL
      *
+     * Also make sure that we do not save search highlights in the datastore.
+     *
      * @throws InvalidBookmarkException
      */
     public function validate(): void
@@ -112,6 +117,9 @@ class Bookmark
         if (empty($this->title)) {
             $this->title = $this->url;
         }
+        if (array_key_exists('search_highlight', $this->additionalContent)) {
+            unset($this->additionalContent['search_highlight']);
+        }
     }
 
     /**
@@ -435,6 +443,44 @@ class Bookmark
         return $this;
     }
 
+    /**
+     * Get entire additionalContent array.
+     *
+     * @return mixed[]
+     */
+    public function getAdditionalContent(): array
+    {
+        return $this->additionalContent;
+    }
+
+    /**
+     * Set a single entry in additionalContent, by key.
+     *
+     * @param string     $key
+     * @param mixed|null $value Any type of value can be set.
+     *
+     * @return $this
+     */
+    public function addAdditionalContentEntry(string $key, $value): self
+    {
+        $this->additionalContent[$key] = $value;
+
+        return $this;
+    }
+
+    /**
+     * Get a single entry in additionalContent, by key.
+     *
+     * @param string $key
+     * @param mixed|null $default
+     *
+     * @return mixed|null can be any type or even null.
+     */
+    public function getAdditionalContentEntry(string $key, $default = null)
+    {
+        return array_key_exists($key, $this->additionalContent) ? $this->additionalContent[$key] : $default;
+    }
+
     /**
      * Rename a tag in tags list.
      *
index 804b25207a95bf1c698682bf49f009a58b35ea46..eb7899bf7edc24b85ed4462fbb0f24dd50dedd6c 100644 (file)
@@ -349,7 +349,7 @@ class BookmarkFileService implements BookmarkServiceInterface
         $bookmarkDays = array_keys($bookmarkDays);
         sort($bookmarkDays);
 
-        return $bookmarkDays;
+        return array_map('strval', $bookmarkDays);
     }
 
     /**
index 4232f11471148758f83fcd4f148c0b8cefcf9434..c79386ea7ba750db4d1d7d7974ea7564154e943a 100644 (file)
@@ -201,7 +201,7 @@ class BookmarkFilter
             return $this->noFilter($visibility);
         }
 
-        $filtered = array();
+        $filtered = [];
         $search = mb_convert_case(html_entity_decode($searchterms), MB_CASE_LOWER, 'UTF-8');
         $exactRegex = '/"([^"]+)"/';
         // Retrieve exact search terms.
@@ -213,8 +213,8 @@ class BookmarkFilter
         $explodedSearchAnd = array_values(array_filter($explodedSearchAnd));
 
         // Filter excluding terms and update andSearch.
-        $excludeSearch = array();
-        $andSearch = array();
+        $excludeSearch = [];
+        $andSearch = [];
         foreach ($explodedSearchAnd as $needle) {
             if ($needle[0] == '-' && strlen($needle) > 1) {
                 $excludeSearch[] = substr($needle, 1);
@@ -234,33 +234,38 @@ class BookmarkFilter
                 }
             }
 
-            // Concatenate link fields to search across fields.
-            // Adds a '\' separator for exact search terms.
-            $content  = mb_convert_case($link->getTitle(), MB_CASE_LOWER, 'UTF-8') .'\\';
-            $content .= mb_convert_case($link->getDescription(), MB_CASE_LOWER, 'UTF-8') .'\\';
-            $content .= mb_convert_case($link->getUrl(), MB_CASE_LOWER, 'UTF-8') .'\\';
-            $content .= mb_convert_case($link->getTagsString(), MB_CASE_LOWER, 'UTF-8') .'\\';
+            $lengths = [];
+            $content = $this->buildFullTextSearchableLink($link, $lengths);
 
             // Be optimistic
             $found = true;
+            $foundPositions = [];
 
             // First, we look for exact term search
-            for ($i = 0; $i < count($exactSearch) && $found; $i++) {
-                $found = strpos($content, $exactSearch[$i]) !== false;
-            }
-
-            // Iterate over keywords, if keyword is not found,
+            // Then iterate over keywords, if keyword is not found,
             // no need to check for the others. We want all or nothing.
-            for ($i = 0; $i < count($andSearch) && $found; $i++) {
-                $found = strpos($content, $andSearch[$i]) !== false;
+            foreach ([$exactSearch, $andSearch] as $search) {
+                for ($i = 0; $i < count($search) && $found !== false; $i++) {
+                    $found = mb_strpos($content, $search[$i]);
+                    if ($found === false) {
+                        break;
+                    }
+
+                    $foundPositions[] = ['start' => $found, 'end' => $found + mb_strlen($search[$i])];
+                }
             }
 
             // Exclude terms.
-            for ($i = 0; $i < count($excludeSearch) && $found; $i++) {
+            for ($i = 0; $i < count($excludeSearch) && $found !== false; $i++) {
                 $found = strpos($content, $excludeSearch[$i]) === false;
             }
 
-            if ($found) {
+            if ($found !== false) {
+                $link->addAdditionalContentEntry(
+                    'search_highlight',
+                    $this->postProcessFoundPositions($lengths, $foundPositions)
+                );
+
                 $filtered[$id] = $link;
             }
         }
@@ -477,4 +482,74 @@ class BookmarkFilter
 
         return preg_split('/\s+/', $tagsOut, -1, PREG_SPLIT_NO_EMPTY);
     }
+
+    /**
+     * This method finalize the content of the foundPositions array,
+     * by associated all search results to their associated bookmark field,
+     * making sure that there is no overlapping results, etc.
+     *
+     * @param array $fieldLengths   Start and end positions of every bookmark fields in the aggregated bookmark content.
+     * @param array $foundPositions Positions where the search results were found in the aggregated content.
+     *
+     * @return array Updated $foundPositions, by bookmark field.
+     */
+    protected function postProcessFoundPositions(array $fieldLengths, array $foundPositions): array
+    {
+        // Sort results by starting position ASC.
+        usort($foundPositions, function (array $entryA, array $entryB): int {
+            return $entryA['start'] > $entryB['start'] ? 1 : -1;
+        });
+
+        $out = [];
+        $currentMax = -1;
+        foreach ($foundPositions as $foundPosition) {
+            // we do not allow overlapping highlights
+            if ($foundPosition['start'] < $currentMax) {
+                continue;
+            }
+
+            $currentMax = $foundPosition['end'];
+            foreach ($fieldLengths as $part => $length) {
+                if ($foundPosition['start'] < $length['start'] || $foundPosition['start'] > $length['end']) {
+                    continue;
+                }
+
+                $out[$part][] = [
+                    'start' => $foundPosition['start'] - $length['start'],
+                    'end' => $foundPosition['end'] - $length['start'],
+                ];
+                break;
+            }
+        }
+
+        return $out;
+    }
+
+    /**
+     * Concatenate link fields to search across fields. Adds a '\' separator for exact search terms.
+     * Also populate $length array with starting and ending positions of every bookmark field
+     * inside concatenated content.
+     *
+     * @param Bookmark $link
+     * @param array    $lengths (by reference)
+     *
+     * @return string Lowercase concatenated fields content.
+     */
+    protected function buildFullTextSearchableLink(Bookmark $link, array &$lengths): string
+    {
+        $content  = mb_convert_case($link->getTitle(), MB_CASE_LOWER, 'UTF-8') .'\\';
+        $content .= mb_convert_case($link->getDescription(), MB_CASE_LOWER, 'UTF-8') .'\\';
+        $content .= mb_convert_case($link->getUrl(), MB_CASE_LOWER, 'UTF-8') .'\\';
+        $content .= mb_convert_case($link->getTagsString(), MB_CASE_LOWER, 'UTF-8') .'\\';
+
+        $lengths['title'] = ['start' => 0, 'end' => mb_strlen($link->getTitle())];
+        $nextField = $lengths['title']['end'] + 1;
+        $lengths['description'] = ['start' => $nextField, 'end' => $nextField + mb_strlen($link->getDescription())];
+        $nextField = $lengths['description']['end'] + 1;
+        $lengths['url'] = ['start' => $nextField, 'end' => $nextField + mb_strlen($link->getUrl())];
+        $nextField = $lengths['url']['end'] + 1;
+        $lengths['tags'] = ['start' => $nextField, 'end' => $nextField + mb_strlen($link->getTagsString())];
+
+        return $content;
+    }
 }
index 9d4a0fa0235c591be9a29d7ad3714d15b97c1e49..d58a5e39dde46ca5f5f0c71ac80e1f60fde8e55b 100644 (file)
@@ -12,10 +12,13 @@ namespace Shaarli\Formatter;
  */
 class BookmarkDefaultFormatter extends BookmarkFormatter
 {
+    const SEARCH_HIGHLIGHT_OPEN = '|@@HIGHLIGHT';
+    const SEARCH_HIGHLIGHT_CLOSE = 'HIGHLIGHT@@|';
+
     /**
      * @inheritdoc
      */
-    public function formatTitle($bookmark)
+    protected function formatTitle($bookmark)
     {
         return escape($bookmark->getTitle());
     }
@@ -23,10 +26,28 @@ class BookmarkDefaultFormatter extends BookmarkFormatter
     /**
      * @inheritdoc
      */
-    public function formatDescription($bookmark)
+    protected function formatTitleHtml($bookmark)
+    {
+        $title = $this->tokenizeSearchHighlightField(
+            $bookmark->getTitle() ?? '',
+            $bookmark->getAdditionalContentEntry('search_highlight')['title'] ?? []
+        );
+
+        return $this->replaceTokens(escape($title));
+    }
+
+    /**
+     * @inheritdoc
+     */
+    protected function formatDescription($bookmark)
     {
         $indexUrl = ! empty($this->contextData['index_url']) ? $this->contextData['index_url'] : '';
-        return format_description(escape($bookmark->getDescription()), $indexUrl);
+        $description = $this->tokenizeSearchHighlightField(
+            $bookmark->getDescription() ?? '',
+            $bookmark->getAdditionalContentEntry('search_highlight')['description'] ?? []
+        );
+
+        return $this->replaceTokens(format_description(escape($description), $indexUrl));
     }
 
     /**
@@ -40,7 +61,27 @@ class BookmarkDefaultFormatter extends BookmarkFormatter
     /**
      * @inheritdoc
      */
-    public function formatTagString($bookmark)
+    protected function formatTagListHtml($bookmark)
+    {
+        if (empty($bookmark->getAdditionalContentEntry('search_highlight')['tags'])) {
+            return $this->formatTagList($bookmark);
+        }
+
+        $tags = $this->tokenizeSearchHighlightField(
+            $bookmark->getTagsString(),
+            $bookmark->getAdditionalContentEntry('search_highlight')['tags']
+        );
+        $tags = $this->filterTagList(explode(' ', $tags));
+        $tags = escape($tags);
+        $tags = $this->replaceTokensArray($tags);
+
+        return $tags;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    protected function formatTagString($bookmark)
     {
         return implode(' ', $this->formatTagList($bookmark));
     }
@@ -48,7 +89,7 @@ class BookmarkDefaultFormatter extends BookmarkFormatter
     /**
      * @inheritdoc
      */
-    public function formatUrl($bookmark)
+    protected function formatUrl($bookmark)
     {
         if ($bookmark->isNote() && isset($this->contextData['index_url'])) {
             return rtrim($this->contextData['index_url'], '/') . '/' . escape(ltrim($bookmark->getUrl(), '/'));
@@ -77,6 +118,19 @@ class BookmarkDefaultFormatter extends BookmarkFormatter
         return escape($bookmark->getUrl());
     }
 
+    /**
+     * @inheritdoc
+     */
+    protected function formatUrlHtml($bookmark)
+    {
+        $url = $this->tokenizeSearchHighlightField(
+            $bookmark->getUrl() ?? '',
+            $bookmark->getAdditionalContentEntry('search_highlight')['url'] ?? []
+        );
+
+        return $this->replaceTokens(escape($url));
+    }
+
     /**
      * @inheritdoc
      */
@@ -84,4 +138,72 @@ class BookmarkDefaultFormatter extends BookmarkFormatter
     {
         return escape($bookmark->getThumbnail());
     }
+
+    /**
+     * Insert search highlight token in provided field content based on a list of search result positions
+     *
+     * @param string     $fieldContent
+     * @param array|null $positions    List of of search results with 'start' and 'end' positions.
+     *
+     * @return string Updated $fieldContent.
+     */
+    protected function tokenizeSearchHighlightField(string $fieldContent, ?array $positions): string
+    {
+        if (empty($positions)) {
+            return $fieldContent;
+        }
+
+        $insertedTokens = 0;
+        $tokenLength = strlen(static::SEARCH_HIGHLIGHT_OPEN);
+        foreach ($positions as $position) {
+            $position = [
+                'start' => $position['start'] + ($insertedTokens * $tokenLength),
+                'end' => $position['end'] + ($insertedTokens * $tokenLength),
+            ];
+
+            $content = mb_substr($fieldContent, 0, $position['start']);
+            $content .= static::SEARCH_HIGHLIGHT_OPEN;
+            $content .= mb_substr($fieldContent, $position['start'], $position['end'] - $position['start']);
+            $content .= static::SEARCH_HIGHLIGHT_CLOSE;
+            $content .= mb_substr($fieldContent, $position['end']);
+
+            $fieldContent = $content;
+
+            $insertedTokens += 2;
+        }
+
+        return $fieldContent;
+    }
+
+    /**
+     * Replace search highlight tokens with HTML highlighted span.
+     *
+     * @param string $fieldContent
+     *
+     * @return string updated content.
+     */
+    protected function replaceTokens(string $fieldContent): string
+    {
+        return str_replace(
+            [static::SEARCH_HIGHLIGHT_OPEN, static::SEARCH_HIGHLIGHT_CLOSE],
+            ['<span class="search-highlight">', '</span>'],
+            $fieldContent
+        );
+    }
+
+    /**
+     * Apply replaceTokens to an array of content strings.
+     *
+     * @param string[] $fieldContents
+     *
+     * @return array
+     */
+    protected function replaceTokensArray(array $fieldContents): array
+    {
+        foreach ($fieldContents as &$entry) {
+            $entry = $this->replaceTokens($entry);
+        }
+
+        return $fieldContents;
+    }
 }
index 0042dafe402958905b892cdb2617e767dfdb8d11..e1b7f705e29b0e87ee8841c9b2e298a807c4cc2c 100644 (file)
@@ -2,7 +2,7 @@
 
 namespace Shaarli\Formatter;
 
-use DateTime;
+use DateTimeInterface;
 use Shaarli\Bookmark\Bookmark;
 use Shaarli\Config\ConfigManager;
 
@@ -11,6 +11,29 @@ use Shaarli\Config\ConfigManager;
  *
  * Abstract class processing all bookmark attributes through methods designed to be overridden.
  *
+ * List of available formatted fields:
+ *   - id                 ID
+ *   - shorturl           Unique identifier, used in permalinks
+ *   - url                URL, can be altered in some way, e.g. passing through an HTTP reverse proxy
+ *   - real_url           (legacy) same as `url`
+ *   - url_html           URL to be displayed in HTML content (it can contain HTML tags)
+ *   - title              Title
+ *   - title_html         Title to be displayed in HTML content (it can contain HTML tags)
+ *   - description        Description content. It most likely contains HTML tags
+ *   - thumbnail          Thumbnail: path to local cache file, false if there is none, null if hasn't been retrieved
+ *   - taglist            List of tags (array)
+ *   - taglist_urlencoded List of tags (array) URL encoded: it must be used to create a link to a URL containing a tag
+ *   - taglist_html       List of tags (array) to be displayed in HTML content (it can contain HTML tags)
+ *   - tags               Tags separated by a single whitespace
+ *   - tags_urlencoded    Tags separated by a single whitespace, URL encoded: must be used to create a link
+ *   - sticky             Is sticky (bool)
+ *   - private            Is private (bool)
+ *   - class              Additional CSS class
+ *   - created            Creation DateTime
+ *   - updated            Last edit DateTime
+ *   - timestamp          Creation timestamp
+ *   - updated_timestamp  Last edit timestamp
+ *
  * @package Shaarli\Formatter
  */
 abstract class BookmarkFormatter
@@ -55,13 +78,16 @@ abstract class BookmarkFormatter
         $out['shorturl'] = $this->formatShortUrl($bookmark);
         $out['url'] = $this->formatUrl($bookmark);
         $out['real_url'] = $this->formatRealUrl($bookmark);
+        $out['url_html'] = $this->formatUrlHtml($bookmark);
         $out['title'] = $this->formatTitle($bookmark);
+        $out['title_html'] = $this->formatTitleHtml($bookmark);
         $out['description'] = $this->formatDescription($bookmark);
         $out['thumbnail'] = $this->formatThumbnail($bookmark);
-        $out['urlencoded_taglist'] = $this->formatUrlEncodedTagList($bookmark);
         $out['taglist'] = $this->formatTagList($bookmark);
-        $out['urlencoded_tags'] = $this->formatUrlEncodedTagString($bookmark);
+        $out['taglist_urlencoded'] = $this->formatTagListUrlEncoded($bookmark);
+        $out['taglist_html'] = $this->formatTagListHtml($bookmark);
         $out['tags'] = $this->formatTagString($bookmark);
+        $out['tags_urlencoded'] = $this->formatTagStringUrlEncoded($bookmark);
         $out['sticky'] = $bookmark->isSticky();
         $out['private'] = $bookmark->isPrivate();
         $out['class'] = $this->formatClass($bookmark);
@@ -69,6 +95,7 @@ abstract class BookmarkFormatter
         $out['updated'] = $this->formatUpdated($bookmark);
         $out['timestamp'] = $this->formatCreatedTimestamp($bookmark);
         $out['updated_timestamp'] = $this->formatUpdatedTimestamp($bookmark);
+
         return $out;
     }
 
@@ -135,6 +162,18 @@ abstract class BookmarkFormatter
         return $this->formatUrl($bookmark);
     }
 
+    /**
+     * Format Url Html: to be displayed in HTML content, it can contains HTML tags.
+     *
+     * @param Bookmark $bookmark instance
+     *
+     * @return string formatted Url HTML
+     */
+    protected function formatUrlHtml($bookmark)
+    {
+        return $this->formatUrl($bookmark);
+    }
+
     /**
      * Format Title
      *
@@ -147,6 +186,18 @@ abstract class BookmarkFormatter
         return $bookmark->getTitle();
     }
 
+    /**
+     * Format Title HTML: to be displayed in HTML content, it can contains HTML tags.
+     *
+     * @param Bookmark $bookmark instance
+     *
+     * @return string formatted Title
+     */
+    protected function formatTitleHtml($bookmark)
+    {
+        return $bookmark->getTitle();
+    }
+
     /**
      * Format Description
      *
@@ -190,11 +241,23 @@ abstract class BookmarkFormatter
      *
      * @return array formatted Tags
      */
-    protected function formatUrlEncodedTagList($bookmark)
+    protected function formatTagListUrlEncoded($bookmark)
     {
         return array_map('urlencode', $this->filterTagList($bookmark->getTags()));
     }
 
+    /**
+     * Format Tags HTML: to be displayed in HTML content, it can contains HTML tags.
+     *
+     * @param Bookmark $bookmark instance
+     *
+     * @return array formatted Tags
+     */
+    protected function formatTagListHtml($bookmark)
+    {
+        return $this->formatTagList($bookmark);
+    }
+
     /**
      * Format TagString
      *
@@ -214,9 +277,9 @@ abstract class BookmarkFormatter
      *
      * @return string formatted TagString
      */
-    protected function formatUrlEncodedTagString($bookmark)
+    protected function formatTagStringUrlEncoded($bookmark)
     {
-        return implode(' ', $this->formatUrlEncodedTagList($bookmark));
+        return implode(' ', $this->formatTagListUrlEncoded($bookmark));
     }
 
     /**
@@ -237,7 +300,7 @@ abstract class BookmarkFormatter
      *
      * @param Bookmark $bookmark instance
      *
-     * @return DateTime instance
+     * @return DateTimeInterface instance
      */
     protected function formatCreated(Bookmark $bookmark)
     {
@@ -249,7 +312,7 @@ abstract class BookmarkFormatter
      *
      * @param Bookmark $bookmark instance
      *
-     * @return DateTime instance
+     * @return DateTimeInterface instance
      */
     protected function formatUpdated(Bookmark $bookmark)
     {
index 5d244d4c92de249721f0c1c6e18ab79ba2222752..f7714be9ed34df27a70f971aa28aeef8e9c33b48 100644 (file)
@@ -56,7 +56,10 @@ class BookmarkMarkdownFormatter extends BookmarkDefaultFormatter
             return parent::formatDescription($bookmark);
         }
 
-        $processedDescription = $bookmark->getDescription();
+        $processedDescription = $this->tokenizeSearchHighlightField(
+            $bookmark->getDescription() ?? '',
+            $bookmark->getAdditionalContentEntry('search_highlight')['description'] ?? []
+        );
         $processedDescription = $this->filterProtocols($processedDescription);
         $processedDescription = $this->formatHashTags($processedDescription);
         $processedDescription = $this->reverseEscapedHtml($processedDescription);
@@ -65,6 +68,7 @@ class BookmarkMarkdownFormatter extends BookmarkDefaultFormatter
             ->setBreaksEnabled(true)
             ->text($processedDescription);
         $processedDescription = $this->sanitizeHtml($processedDescription);
+        $processedDescription = $this->replaceTokens($processedDescription);
 
         if (!empty($processedDescription)) {
             $processedDescription = '<div class="markdown">'. $processedDescription . '</div>';
index 55c075a2a87f7ae8c7cad95c5134bf78c53e3cf5..54f9fe03fc5bd4c506b04c7cfaae02b8afea0ee5 100644 (file)
@@ -106,6 +106,7 @@ abstract class ShaarliVisitorController
             'target' => $template,
             'loggedin' => $this->container->loginManager->isLoggedIn(),
             'basePath' => $this->container->basePath,
+            'rootPath' => preg_replace('#/index\.php$#', '', $this->container->basePath),
             'bookmarkService' => $this->container->bookmarkService
         ];
     }
index 1b2197c9d8d0aa1af56d44842ed18c3fa4f619de..da66dea3952ad3cb0086a4594858f392f3270ba0 100644 (file)
@@ -104,6 +104,7 @@ class PluginManager
             'target' => '_PAGE_',
             'loggedin' => '_LOGGEDIN_',
             'basePath' => '_BASE_PATH_',
+            'rootPath' => '_ROOT_PATH_',
             'bookmarkService' => '_BOOKMARK_SERVICE_',
         ];
 
index 41b357dd72caccc9fe0525b29d3dbc2a31876db2..2d6d2dbed983d4fe2d8f0d2db00003f118e55141 100644 (file)
@@ -174,10 +174,12 @@ class PageBuilder
             }
         }
 
+        $rootPath = preg_replace('#/index\.php$#', '', $basePath);
         $this->assign('base_path', $basePath);
+        $this->assign('root_path', $rootPath);
         $this->assign(
             'asset_path',
-            $basePath . '/' .
+            $rootPath . '/' .
             rtrim($this->conf->get('resource.raintpl_tpl', 'tpl'), '/') . '/' .
             $this->conf->get('resource.theme', 'default')
         );
index 3168881514595071111672d52959baa1976713aa..7f6b9637256787741e8a2bb63e306a4f6a697a8d 100644 (file)
@@ -294,7 +294,7 @@ function init(description) {
   const deleteLinks = document.querySelectorAll('.confirm-delete');
   [...deleteLinks].forEach((deleteLink) => {
     deleteLink.addEventListener('click', (event) => {
-      if (!confirm(document.getElementById('translation-delete-link').innerHTML)) {
+      if (!confirm(document.getElementById('translation-delete-tag').innerHTML)) {
         event.preventDefault();
       }
     });
index df9c867bb6b3bba0065af25c29e03271934ee5a6..286ac83b32b487a3d51837b54dd81b1282d6d76f 100644 (file)
@@ -671,6 +671,10 @@ body,
       content: '';
     }
   }
+
+  .search-highlight {
+    background-color: yellow;
+  }
 }
 
 .linklist-item-buttons {
index 14070c8abc7dfc443c630718f0fb024a734b6a13..8cb39934603c35aaa4b4b8ebb42fb6305052fab1 100644 (file)
@@ -362,7 +362,23 @@ sudo systemctl reload nginx
 
 If Shaarli is hosted on a server behind a [reverse proxy](https://en.wikipedia.org/wiki/Reverse_proxy) (i.e. there is a proxy server between clients and the web server hosting Shaarli), configure it accordingly. See [Reverse proxy](Reverse-proxy.md) configuration.
 
+## Using Shaarli without URL rewriting
 
+By default, Shaarli uses Slim framework's URL, which requires
+URL rewriting.
+
+If you can't use URL rewriting for any reason (not supported by
+your web server, shared hosting, etc.), you *can* use Shaarli
+without URL rewriting.
+
+You just need to prefix your URL by `/index.php/`.
+Example: instead of accessing `https://shaarli.mydomain.org/`,
+use `https://shaarli.mydomain.org/index.php/`.
+
+**Recommended:**
+  * after installation, in the configuration page, set your header link to `/index.php/`.
+  * in your configuration file `config.json.php` set `general.root_url` to
+    `https://shaarli.mydomain.org/index.php/`.
 
 ## Allow import of large browser bookmarks export
 
index c29774de05b46e47be8ed6c5b05b5aa539e68028..f09fadc2925db027873cd2d788ac6a239a6ffa68 100644 (file)
@@ -148,11 +148,16 @@ If a file needs to be included in server end, use simple relative path:
 `PluginManager::$PLUGINS_PATH . '/mything/template.html'`.
 
 If it needs to be included in front end side (e.g. an image),
-the relative path must be prefixed with special data `_BASE_PATH_`:
-`($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH . '/mything/picture.png`.
+the relative path must be prefixed with special data:
+
+  * if it's a link that will need to be processed by Shaarli, use `_BASE_PATH_`:
+    for e.g. `$data['_BASE_PATH_'] . '/admin/tools`.
+  * if you want to include an asset, you need to add the root URL (base path without `/index.php`, for people using Shaarli without URL rewriting), then use `_ROOT_PATH_`:
+    for e.g
+`$['_ROOT_PATH_'] . '/' . PluginManager::$PLUGINS_PATH . '/mything/picture.png`.
 
 Note that special placeholders for CSS and JS files (respectively `css_files` and `js_files`) are already prefixed
-with the base path in template files.
+with the root path in template files.
 
 ### It's not working!
 
index 9a6e3958ca2a571092ae4206178ca6546b8febfc..f7baedfb4c8cfac01728e8ed357eed95f9028253 100644 (file)
@@ -1,8 +1,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: Shaarli\n"
-"POT-Creation-Date: 2020-09-10 16:06+0200\n"
-"PO-Revision-Date: 2020-09-10 16:07+0200\n"
+"POT-Creation-Date: 2020-10-16 20:01+0200\n"
+"PO-Revision-Date: 2020-10-16 20:02+0200\n"
 "Last-Translator: \n"
 "Language-Team: Shaarli\n"
 "Language: fr_FR\n"
@@ -107,28 +107,22 @@ msgstr "Mo"
 msgid "GiB"
 msgstr "Go"
 
-#: application/bookmark/BookmarkFileService.php:174
-#: application/bookmark/BookmarkFileService.php:199
+#: application/bookmark/BookmarkFileService.php:180
+#: application/bookmark/BookmarkFileService.php:202
 #: application/bookmark/BookmarkFileService.php:224
-#: application/bookmark/BookmarkFileService.php:241
+#: application/bookmark/BookmarkFileService.php:238
 msgid "You're not authorized to alter the datastore"
 msgstr "Vous n'êtes pas autorisé à modifier les données"
 
-#: application/bookmark/BookmarkFileService.php:177
-#: application/bookmark/BookmarkFileService.php:202
-#: application/bookmark/BookmarkFileService.php:244
-msgid "Provided data is invalid"
-msgstr "Les informations fournies ne sont pas valides"
-
 #: application/bookmark/BookmarkFileService.php:205
 msgid "This bookmarks already exists"
 msgstr "Ce marque-page existe déjà."
 
-#: application/bookmark/BookmarkInitializer.php:37
+#: application/bookmark/BookmarkInitializer.php:39
 msgid "(private bookmark with thumbnail demo)"
 msgstr "(marque page privé avec une miniature)"
 
-#: application/bookmark/BookmarkInitializer.php:40
+#: application/bookmark/BookmarkInitializer.php:42
 msgid ""
 "Shaarli will automatically pick up the thumbnail for links to a variety of "
 "websites.\n"
@@ -151,11 +145,11 @@ msgstr ""
 "\n"
 "Maintenant, vous pouvez modifier ou supprimer les shaares créés par défaut.\n"
 
-#: application/bookmark/BookmarkInitializer.php:53
+#: application/bookmark/BookmarkInitializer.php:55
 msgid "Note: Shaare descriptions"
 msgstr "Note : Description des Shaares"
 
-#: application/bookmark/BookmarkInitializer.php:55
+#: application/bookmark/BookmarkInitializer.php:57
 msgid ""
 "Adding a shaare without entering a URL creates a text-only \"note\" post "
 "such as this one.\n"
@@ -219,7 +213,7 @@ msgstr ""
 "| Citron   | Fruit     | Jaune | 30    |\n"
 "| Carotte  | Légume | Orange    | 14    |\n"
 
-#: application/bookmark/BookmarkInitializer.php:89
+#: application/bookmark/BookmarkInitializer.php:91
 #: application/legacy/LegacyLinkDB.php:246
 #: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
 #: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:49
@@ -231,7 +225,7 @@ msgstr ""
 "Le gestionnaire de marque-pages personnel, minimaliste, et sans base de "
 "données"
 
-#: application/bookmark/BookmarkInitializer.php:92
+#: application/bookmark/BookmarkInitializer.php:94
 msgid ""
 "Welcome to Shaarli!\n"
 "\n"
@@ -463,11 +457,11 @@ msgstr "Votre mot de passe a été modifié"
 msgid "Plugin Administration"
 msgstr "Administration des plugins"
 
-#: application/front/controller/admin/PluginsController.php:75
+#: application/front/controller/admin/PluginsController.php:76
 msgid "Setting successfully saved."
 msgstr "Les paramètres ont été sauvegardés avec succès."
 
-#: application/front/controller/admin/PluginsController.php:78
+#: application/front/controller/admin/PluginsController.php:79
 msgid "Error while saving plugin configuration: "
 msgstr ""
 "Une erreur s'est produite lors de la sauvegarde de la configuration des "
@@ -484,7 +478,7 @@ msgstr "Mise à jour des miniatures"
 msgid "Tools"
 msgstr "Outils"
 
-#: application/front/controller/visitor/BookmarkListController.php:115
+#: application/front/controller/visitor/BookmarkListController.php:116
 msgid "Search: "
 msgstr "Recherche : "
 
@@ -506,6 +500,10 @@ msgstr "Quotidien"
 msgid "An unexpected error occurred."
 msgstr "Une erreur inattendue s'est produite."
 
+#: application/front/controller/visitor/ErrorNotFoundController.php:25
+msgid "Requested page could not be found."
+msgstr ""
+
 #: application/front/controller/visitor/InstallController.php:73
 #, php-format
 msgid ""
@@ -556,11 +554,9 @@ msgstr "Nom d'utilisateur ou mot de passe incorrect(s)."
 msgid "Picture wall"
 msgstr "Mur d'images"
 
-#: application/front/controller/visitor/TagCloudController.php:80
-#, fuzzy
-#| msgid "Tag list"
+#: application/front/controller/visitor/TagCloudController.php:88
 msgid "Tag "
-msgstr "Liste des tags"
+msgstr "Tag"
 
 #: application/front/exceptions/AlreadyInstalledException.php:11
 msgid "Shaarli has already been installed. Login to edit the configuration."
@@ -664,7 +660,7 @@ msgstr ""
 "a été importé avec succès en %d secondes : %d liens importés, %d liens "
 "écrasés, %d liens ignorés."
 
-#: application/plugin/PluginManager.php:122
+#: application/plugin/PluginManager.php:124
 msgid " [plugin incompatibility]: "
 msgstr " [incompatibilité de l'extension] : "
 
@@ -682,7 +678,7 @@ msgstr "Impossible de purger %s : le répertoire n'existe pas"
 msgid "An error occurred while running the update "
 msgstr "Une erreur s'est produite lors de l'exécution de la mise à jour "
 
-#: index.php:62
+#: index.php:65
 msgid "Shared bookmarks on "
 msgstr "Liens partagés sur "
 
@@ -699,11 +695,11 @@ msgstr "Shaare"
 msgid "Adds the addlink input on the linklist page."
 msgstr "Ajoute le formulaire d'ajout de liens sur la page principale."
 
-#: plugins/archiveorg/archiveorg.php:26
+#: plugins/archiveorg/archiveorg.php:28
 msgid "View on archive.org"
 msgstr "Voir sur archive.org"
 
-#: plugins/archiveorg/archiveorg.php:39
+#: plugins/archiveorg/archiveorg.php:41
 msgid "For each link, add an Archive.org icon."
 msgstr "Pour chaque lien, ajoute une icône pour Archive.org."
 
@@ -881,17 +877,13 @@ msgid "Case sensitive"
 msgstr "Sensible à la casse"
 
 #: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
-msgid "Rename"
-msgstr "Renommer"
+#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:68
+msgid "Rename tag"
+msgstr "Renommer le tag"
 
 #: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:93
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:147
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:147
-#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:67
-msgid "Delete"
-msgstr "Supprimer"
+msgid "Delete tag"
+msgstr "Supprimer le tag"
 
 #: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:39
 msgid "You can also edit tags in the"
@@ -1122,6 +1114,14 @@ msgstr "la syntaxe Markdown"
 msgid "Apply Changes"
 msgstr "Appliquer les changements"
 
+#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:93
+#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173
+#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:147
+#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:147
+#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:67
+msgid "Delete"
+msgstr "Supprimer"
+
 #: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
 msgid "Export Database"
 msgstr "Exporter les données"
@@ -1382,8 +1382,8 @@ msgstr "Déplier tout"
 
 #: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47
 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:47
-msgid "Are you sure you want to delete this link?"
-msgstr "Êtes-vous sûr de vouloir supprimer ce lien ?"
+msgid "Are you sure you want to delete this tag?"
+msgstr "Êtes-vous sûr de vouloir supprimer ce tag ?"
 
 #: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:11
 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:11
@@ -1525,10 +1525,6 @@ msgstr "Lister tous les liens avec ces tags"
 msgid "Tag list"
 msgstr "Liste des tags"
 
-#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:68
-msgid "Rename tag"
-msgstr "Renommer le tag"
-
 #: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:3
 #: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:3
 msgid "Sort by:"
@@ -1664,6 +1660,12 @@ msgstr ""
 "Glisser ce lien dans votre barre de favoris ou cliquer droit dessus et « "
 "Ajouter aux favoris »"
 
+#~ msgid "Provided data is invalid"
+#~ msgstr "Les informations fournies ne sont pas valides"
+
+#~ msgid "Rename"
+#~ msgstr "Renommer"
+
 #, fuzzy
 #~| msgid "Selection"
 #~ msgid ".ui-selecting"
index b420bb519d4caa105bedadc01ae12e238df04abc..57f42fc2af44bb44145e279d3ce82de5b230a2f3 100644 (file)
@@ -2,15 +2,15 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Shaarli\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-02-11 09:31+0900\n"
-"PO-Revision-Date: 2020-02-11 10:54+0900\n"
+"POT-Creation-Date: 2020-10-19 10:19+0900\n"
+"PO-Revision-Date: 2020-10-19 10:25+0900\n"
 "Last-Translator: yude <yudesleepy@gmail.com>\n"
 "Language-Team: Shaarli\n"
 "Language: ja\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.3\n"
+"X-Generator: Poedit 2.2.3\n"
 "X-Poedit-Basepath: ../../../..\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-SourceCharset: UTF-8\n"
@@ -19,7 +19,7 @@ msgstr ""
 "X-Poedit-SearchPathExcluded-0: node_modules\n"
 "X-Poedit-SearchPathExcluded-1: vendor\n"
 
-#: application/ApplicationUtils.php:153
+#: application/ApplicationUtils.php:161
 #, php-format
 msgid ""
 "Your PHP version is obsolete! Shaarli requires at least PHP %s, and thus "
@@ -30,200 +30,250 @@ msgstr ""
 "が必要です。 現在使用している PHP のバージョンには脆弱性があり、できるだけ速"
 "やかにアップデートするべきです。"
 
-#: application/ApplicationUtils.php:183 application/ApplicationUtils.php:195
+#: application/ApplicationUtils.php:192 application/ApplicationUtils.php:204
 msgid "directory is not readable"
 msgstr "ディレクトリを読み込めません"
 
-#: application/ApplicationUtils.php:198
+#: application/ApplicationUtils.php:207
 msgid "directory is not writable"
 msgstr "ディレクトリに書き込めません"
 
-#: application/ApplicationUtils.php:216
+#: application/ApplicationUtils.php:225
 msgid "file is not readable"
 msgstr "ファイルを読み取る権限がありません"
 
-#: application/ApplicationUtils.php:219
+#: application/ApplicationUtils.php:228
 msgid "file is not writable"
 msgstr "ファイルを書き込む権限がありません"
 
-#: application/Cache.php:16
-#, php-format
-msgid "Cannot purge %s: no directory"
-msgstr "%s を削除できません: ディレクトリが存在しません"
-
-#: application/FeedBuilder.php:151
-msgid "Direct link"
-msgstr "ダイレクトリンク"
-
-#: application/FeedBuilder.php:153
-#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:88
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:178
-msgid "Permalink"
-msgstr "パーマリンク"
-
-#: application/History.php:174
+#: application/History.php:179
 msgid "History file isn't readable or writable"
 msgstr "履歴ファイルを読み込む、または書き込むための権限がありません"
 
-#: application/History.php:185
+#: application/History.php:190
 msgid "Could not parse history file"
 msgstr "履歴ファイルを正常に復元できませんでした"
 
-#: application/Languages.php:177
+#: application/Languages.php:181
 msgid "Automatic"
 msgstr "自動"
 
-#: application/Languages.php:178
+#: application/Languages.php:182
+msgid "German"
+msgstr "ドイツ語"
+
+#: application/Languages.php:183
 msgid "English"
 msgstr "英語"
 
-#: application/Languages.php:179
+#: application/Languages.php:184
 msgid "French"
 msgstr "フランス語"
 
-#: application/Languages.php:180
-msgid "German"
-msgstr "ドイツ語"
-
-#: application/LinkDB.php:136
-msgid "You are not authorized to add a link."
-msgstr "リンクを追加するには、ログインする必要があります。"
-
-#: application/LinkDB.php:139
-msgid "Internal Error: A link should always have an id and URL."
-msgstr "エラー: リンクにはIDとURLを登録しなければなりません。"
-
-#: application/LinkDB.php:142
-msgid "You must specify an integer as a key."
-msgstr "正常なキーの値ではありません。"
-
-#: application/LinkDB.php:145
-msgid "Array offset and link ID must be equal."
-msgstr "Array オフセットとリンクのIDは同じでなければなりません。"
-
-#: application/LinkDB.php:251
-#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
-#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
-#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:14
-#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48
-msgid ""
-"The personal, minimalist, super-fast, database free, bookmarking service"
-msgstr ""
-"個人向けの、ミニマムで高速でかつデータベースのいらないブックマークサービス"
-
-#: application/LinkDB.php:253
-msgid ""
-"Welcome to Shaarli! This is your first public bookmark. To edit or delete "
-"me, you must first login.\n"
-"\n"
-"To learn how to use Shaarli, consult the link \"Documentation\" at the "
-"bottom of this page.\n"
-"\n"
-"You use the community supported version of the original Shaarli project, by "
-"Sebastien Sauvage."
-msgstr ""
-"Shaarli へようこそ! これはあなたの最初の公開ブックマークです。これを編集した"
-"り削除したりするには、ログインする必要があります。\n"
-"\n"
-"Shaarli の使い方を知るには、このページの下にある「ドキュメント」のリンクを開"
-"いてください。\n"
-"\n"
-"あなたは Sebastien Sauvage による、コミュニティーサポートのあるバージョンのオ"
-"リジナルのShaarli プロジェクトを使用しています。"
-
-#: application/LinkDB.php:267
-msgid "My secret stuff... - Pastebin.com"
-msgstr "わたしのひ💗み💗つ💗 - Pastebin.com"
-
-#: application/LinkDB.php:269
-msgid "Shhhh! I'm a private link only YOU can see. You can delete me too."
-msgstr ""
-"シーッ! これはあなたしか見られないプライベートリンクです。消すこともできま"
-"す。"
-
-#: application/LinkFilter.php:452
-msgid "The link you are trying to reach does not exist or has been deleted."
-msgstr "開こうとしたリンクは存在しないか、削除されています。"
-
-#: application/NetscapeBookmarkUtils.php:35
-msgid "Invalid export selection:"
-msgstr "不正なエクスポートの選択:"
-
-#: application/NetscapeBookmarkUtils.php:81
-#, php-format
-msgid "File %s (%d bytes) "
-msgstr "ファイル %s (%d バイト) "
-
-#: application/NetscapeBookmarkUtils.php:83
-msgid "has an unknown file format. Nothing was imported."
-msgstr "は不明なファイル形式です。インポートは中止されました。"
+#: application/Languages.php:185
+msgid "Japanese"
+msgstr "日本語"
 
-#: application/NetscapeBookmarkUtils.php:86
-#, php-format
+#: application/Thumbnailer.php:62
 msgid ""
-"was successfully processed in %d seconds: %d links imported, %d links "
-"overwritten, %d links skipped."
+"php-gd extension must be loaded to use thumbnails. Thumbnails are now "
+"disabled. Please reload the page."
 msgstr ""
-"が %d 秒で処理され、%d 件のリンクがインポートされ、%d 件のリンクが上書きさ"
-"れ、%d 件のリンクがスキップされました。"
-
-#: application/PageBuilder.php:168
-msgid "The page you are trying to reach does not exist or has been deleted."
-msgstr "あなたが開こうとしたページは存在しないか、削除されています。"
-
-#: application/PageBuilder.php:170
-msgid "404 Not Found"
-msgstr "404 ページが存在しません"
-
-#: application/PluginManager.php:243
-#, php-format
-msgid "Plugin \"%s\" files not found."
-msgstr "プラグイン「%s」のファイルが存在しません。"
-
-#: application/Updater.php:76
-msgid "Couldn't retrieve Updater class methods."
-msgstr "アップデーターのクラスメゾットを受信できませんでした。"
-
-#: application/Updater.php:532
-msgid "An error occurred while running the update "
-msgstr "更新中に問題が発生しました "
-
-#: application/Updater.php:572
-msgid "Updates file path is not set, can't write updates."
-msgstr "更新するファイルのパスが指定されていないため、更新を書き込めません。"
+"サムネイルを使用するには、php-gd エクステンションが読み込まれている必要があり"
+"ます。サムネイルは無効化されました。ページを再読込してください。"
 
-#: application/Updater.php:577
-msgid "Unable to write updates in "
-msgstr "更新を次の項目に書き込めませんでした: "
-
-#: application/Utils.php:376 tests/UtilsTest.php:340
+#: application/Utils.php:383 tests/UtilsTest.php:343
 msgid "Setting not set"
 msgstr "未設定"
 
-#: application/Utils.php:383 tests/UtilsTest.php:338 tests/UtilsTest.php:339
+#: application/Utils.php:390 tests/UtilsTest.php:341 tests/UtilsTest.php:342
 msgid "Unlimited"
 msgstr "無制限"
 
-#: application/Utils.php:386 tests/UtilsTest.php:335 tests/UtilsTest.php:336
-#: tests/UtilsTest.php:350
+#: application/Utils.php:393 tests/UtilsTest.php:338 tests/UtilsTest.php:339
+#: tests/UtilsTest.php:353
 msgid "B"
 msgstr "B"
 
-#: application/Utils.php:386 tests/UtilsTest.php:329 tests/UtilsTest.php:330
-#: tests/UtilsTest.php:337
+#: application/Utils.php:393 tests/UtilsTest.php:332 tests/UtilsTest.php:333
+#: tests/UtilsTest.php:340
 msgid "kiB"
 msgstr "kiB"
 
-#: application/Utils.php:386 tests/UtilsTest.php:331 tests/UtilsTest.php:332
-#: tests/UtilsTest.php:348 tests/UtilsTest.php:349
+#: application/Utils.php:393 tests/UtilsTest.php:334 tests/UtilsTest.php:335
+#: tests/UtilsTest.php:351 tests/UtilsTest.php:352
 msgid "MiB"
 msgstr "MiB"
 
-#: application/Utils.php:386 tests/UtilsTest.php:333 tests/UtilsTest.php:334
+#: application/Utils.php:393 tests/UtilsTest.php:336 tests/UtilsTest.php:337
 msgid "GiB"
 msgstr "GiB"
 
-#: application/config/ConfigJson.php:52 application/config/ConfigPhp.php:121
+#: application/bookmark/BookmarkFileService.php:180
+#: application/bookmark/BookmarkFileService.php:202
+#: application/bookmark/BookmarkFileService.php:224
+#: application/bookmark/BookmarkFileService.php:238
+msgid "You're not authorized to alter the datastore"
+msgstr "設定を変更する権限がありません"
+
+#: application/bookmark/BookmarkFileService.php:205
+msgid "This bookmarks already exists"
+msgstr "このブックマークは既に存在します。"
+
+#: application/bookmark/BookmarkInitializer.php:39
+msgid "(private bookmark with thumbnail demo)"
+msgstr "(サムネイルデモが付属しているプライベートブックマーク)"
+
+#: application/bookmark/BookmarkInitializer.php:42
+msgid ""
+"Shaarli will automatically pick up the thumbnail for links to a variety of "
+"websites.\n"
+"\n"
+"Explore your new Shaarli instance by trying out controls and menus.\n"
+"Visit the project on [Github](https://github.com/shaarli/Shaarli) or [the "
+"documentation](https://shaarli.readthedocs.io/en/master/) to learn more "
+"about Shaarli.\n"
+"\n"
+"Now you can edit or delete the default shaares.\n"
+msgstr ""
+"Shaarli は自動的に多様なウェブサイトのサムネイルを取得します。\n"
+"\n"
+"あなたの新しい Shaarli インスタンスをコントロールやメニューを試したりして、探"
+"検してください。\n"
+" [Github](https://github.com/shaarli/Shaarli) または [the documentation]"
+"(https://shaarli.readthedocs.io/en/master/) でプロジェクトを訪問して、"
+"Shaarli をもっとよく知ることができます。\n"
+"\n"
+"今から、既定の shaares を編集したり、削除したりすることができます。\n"
+
+#: application/bookmark/BookmarkInitializer.php:55
+msgid "Note: Shaare descriptions"
+msgstr "説明: Shaare の概要"
+
+#: application/bookmark/BookmarkInitializer.php:57
+msgid ""
+"Adding a shaare without entering a URL creates a text-only \"note\" post "
+"such as this one.\n"
+"This note is private, so you are the only one able to see it while logged "
+"in.\n"
+"\n"
+"You can use this to keep notes, post articles, code snippets, and much "
+"more.\n"
+"\n"
+"The Markdown formatting setting allows you to format your notes and bookmark "
+"description:\n"
+"\n"
+"### Title headings\n"
+"\n"
+"#### Multiple headings levels\n"
+"  * bullet lists\n"
+"  * _italic_ text\n"
+"  * **bold** text\n"
+"  * ~~strike through~~ text\n"
+"  * `code` blocks\n"
+"  * images\n"
+"  * [links](https://en.wikipedia.org/wiki/Markdown)\n"
+"\n"
+"Markdown also supports tables:\n"
+"\n"
+"| Name    | Type      | Color  | Qty   |\n"
+"| ------- | --------- | ------ | ----- |\n"
+"| Orange  | Fruit     | Orange | 126   |\n"
+"| Apple   | Fruit     | Any    | 62    |\n"
+"| Lemon   | Fruit     | Yellow | 30    |\n"
+"| Carrot  | Vegetable | Red    | 14    |\n"
+msgstr ""
+"URL を追加せずに shaare を作成すると、テキストのみのこのような \"ノート\" が"
+"作成されます。\n"
+"このノートはプライベートなので、ログイン中のあなたしか見ることはできませ"
+"ん。\n"
+"\n"
+"あなたはこれをメモ帳として使ったり、記事を投稿したり、コード スニペットとした"
+"りするなどといったことに使えます。\n"
+"\n"
+"Markdown フォーマットの設定により、ノートやブックマークの概要を以下のように"
+"フォーマットできます:\n"
+"\n"
+"### タイトル ヘッダー\n"
+"\n"
+"#### 複数の見出し\n"
+" * 箇条書きリスト\n"
+" * _イタリック_ 文字\n"
+" * **ボールド** 文字\n"
+" * ~~打ち消し~~ 文字\n"
+" * `コード` ブロック\n"
+" * 画像\n"
+" * [リンク](https://en.wikipedia.org/wiki/Markdown)\n"
+"\n"
+"Markdown は表もサポートします:\n"
+"\n"
+"| 名前    | 種類      | 色  | 数量   |\n"
+"| ------- | --------- | ------ | ----- |\n"
+"| オレンジ  | 果物     | 橙 | 126   |\n"
+"| リンゴ   | 果物     | 任意    | 62    |\n"
+"| レモン   | 果物     | 黄 | 30    |\n"
+"| 人参  | 野菜 | 赤    | 14    |\n"
+
+#: application/bookmark/BookmarkInitializer.php:91
+#: application/legacy/LegacyLinkDB.php:246
+msgid ""
+"The personal, minimalist, super-fast, database free, bookmarking service"
+msgstr ""
+"個人向けの、ミニマムで高速でかつデータベースのいらないブックマークサービス"
+
+#: application/bookmark/BookmarkInitializer.php:94
+msgid ""
+"Welcome to Shaarli!\n"
+"\n"
+"Shaarli allows you to bookmark your favorite pages, and share them with "
+"others or store them privately.\n"
+"You can add a description to your bookmarks, such as this one, and tag "
+"them.\n"
+"\n"
+"Create a new shaare by clicking the `+Shaare` button, or using any of the "
+"recommended tools (browser extension, mobile app, bookmarklet, REST API, "
+"etc.).\n"
+"\n"
+"You can easily retrieve your links, even with thousands of them, using the "
+"internal search engine, or search through tags (e.g. this Shaare is tagged "
+"with `shaarli` and `help`).\n"
+"Hashtags such as #shaarli #help are also supported.\n"
+"You can also filter the available [RSS feed](/feed/atom) and picture wall by "
+"tag or plaintext search.\n"
+"\n"
+"We hope that you will enjoy using Shaarli, maintained with ❤️ by the "
+"community!\n"
+"Feel free to open [an issue](https://github.com/shaarli/Shaarli/issues) if "
+"you have a suggestion or encounter an issue.\n"
+msgstr ""
+"Shaarli へようこそ!\n"
+"\n"
+"Shaarli では、あなたのお気に入りのページをブックマークしたり、それを他の人と"
+"共有するか、またはプライベートなものとして保管することができます。\n"
+"加えて、あなたのブックマークにこの項目のように概要を追加したり、タグ付けした"
+"りすることができます。\n"
+"\n"
+"`+Shaare` ボタンをクリックすることで新しい shaare を作成できます。また、推奨"
+"されたツールを使うこともできます (ブラウザー 拡張機能、モバイル アプリ、ブッ"
+"クマークレット、REST API など...)。\n"
+"\n"
+"また、簡単にあなたのリンクを取得できます。それが何千と登る数であっても、内部"
+"の検索エンジンや、タグを使って検索できます (例えば、この Shaare は `shaarli` "
+"と `help` というタグが付いています)。\n"
+"#shaarli や #help といったハッシュタグもサポートされています。\n"
+"タグやテキスト検索による [RSS フィード](/feed/atom) や ピクチャー ウォール で"
+"項目を絞ることもできます。\n"
+"\n"
+"私たちはあなたが Shaarli を楽しんでくれることを願っています。Shaarli はコミュ"
+"ニティーによって ♡ と共にメンテナンスされています!\n"
+"何か問題に遭遇したり、提案があれば、気軽に  [Issue](https://github.com/"
+"shaarli/Shaarli/issues) を開いてください。\n"
+
+#: application/bookmark/exception/BookmarkNotFoundException.php:13
+msgid "The link you are trying to reach does not exist or has been deleted."
+msgstr "開こうとしたリンクは存在しないか、削除されています。"
+
+#: application/config/ConfigJson.php:52 application/config/ConfigPhp.php:129
 msgid ""
 "Shaarli could not create the config file. Please make sure Shaarli has the "
 "right to write in the folder is it installed in."
@@ -232,7 +282,8 @@ msgstr ""
 "ていて、インストールされているディレクトリに書き込みできることを確認してくだ"
 "さい。"
 
-#: application/config/ConfigManager.php:135
+#: application/config/ConfigManager.php:136
+#: application/config/ConfigManager.php:163
 msgid "Invalid setting key parameter. String expected, got: "
 msgstr ""
 "不正なキーの値です。文字列が想定されていますが、次のように入力されました: "
@@ -250,159 +301,185 @@ msgstr "プラグインの読込順を変更する際にエラーが発生しま
 msgid "You are not authorized to alter config."
 msgstr "設定を変更する権限がありません。"
 
-#: application/exceptions/IOException.php:19
+#: application/exceptions/IOException.php:22
 msgid "Error accessing"
 msgstr "読込中にエラーが発生しました"
 
-#: index.php:142
-msgid "Shared links on "
-msgstr "次において共有されたリンク:"
+#: application/feed/FeedBuilder.php:179
+msgid "Direct link"
+msgstr "ダイレクトリンク"
 
-#: index.php:164
-msgid "Insufficient permissions:"
-msgstr "権限がありません:"
+#: application/feed/FeedBuilder.php:181
+msgid "Permalink"
+msgstr "パーマリンク"
 
-#: index.php:303
-msgid "I said: NO. You are banned for the moment. Go away."
-msgstr "あなたはこのサーバーからBANされています。"
+#: application/front/controller/admin/ConfigureController.php:54
+msgid "Configure"
+msgstr "設定"
 
-#: index.php:368
-msgid "Wrong login/password."
-msgstr "不正なユーザー名、またはパスワードです。"
+#: application/front/controller/admin/ConfigureController.php:102
+#: application/legacy/LegacyUpdater.php:537
+msgid "You have enabled or changed thumbnails mode."
+msgstr "サムネイルのモードを有効化、または変更しました。"
 
-#: index.php:576 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:42
-msgid "Daily"
-msgstr "ã\83\87ã\82¤ã\83ªã\83¼"
+#: application/front/controller/admin/ConfigureController.php:103
+#: application/legacy/LegacyUpdater.php:538
+msgid "Please synchronize them."
+msgstr "ã\81\9dã\82\8cã\82\89ã\82\92å\90\8cæ\9c\9fã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82"
 
-#: index.php:681 tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
-#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:71
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:95
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:71
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:95
-msgid "Login"
-msgstr "ログイン"
+#: application/front/controller/admin/ConfigureController.php:113
+#: application/front/controller/visitor/InstallController.php:136
+msgid "Error while writing config file after configuration update."
+msgstr "設定ファイルを更新した後の書き込みに失敗しました。"
 
-#: index.php:722 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:39
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:39
-msgid "Picture wall"
-msgstr "ピクチャウォール"
+#: application/front/controller/admin/ConfigureController.php:122
+msgid "Configuration was saved."
+msgstr "設定は保存されました。"
 
-#: index.php:770 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:36
-#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
-msgid "Tag cloud"
-msgstr "タグクラウド"
+#: application/front/controller/admin/ExportController.php:26
+msgid "Export"
+msgstr "エクスポート"
 
-#: index.php:803 tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
-msgid "Tag list"
-msgstr "ã\82¿ã\82°ä¸\80覧"
+#: application/front/controller/admin/ExportController.php:42
+msgid "Please select an export mode."
+msgstr "ã\82¨ã\82¯ã\82¹ã\83\9dã\83¼ã\83\88 ã\83¢ã\83¼ã\83\89ã\82\92æ\8c\87å®\9aã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82"
 
-#: index.php:1028 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:31
-msgid "Tools"
-msgstr "ツール"
+#: application/front/controller/admin/ImportController.php:41
+msgid "Import"
+msgstr "インポート"
 
-#: index.php:1037
-msgid "You are not supposed to change a password on an Open Shaarli."
+#: application/front/controller/admin/ImportController.php:55
+msgid "No import file provided."
+msgstr "何のインポート元ファイルも指定されませんでした。"
+
+#: application/front/controller/admin/ImportController.php:66
+#, php-format
+msgid ""
+"The file you are trying to upload is probably bigger than what this "
+"webserver can accept (%s). Please upload in smaller chunks."
 msgstr ""
-"公開されている Shaarli において、パスワードを変更することは想定されていませ"
-"ん。"
+"あなたがアップロードしようとしているファイルは、サーバーが許可しているファイ"
+"ルサイズ (%s) よりも大きいです。もう少し小さいものをアップロードしてくださ"
+"い。"
 
-#: index.php:1042 index.php:1084 index.php:1160 index.php:1191 index.php:1291
-msgid "Wrong token."
-msgstr "不正なトークンです。"
+#: application/front/controller/admin/ManageShaareController.php:29
+msgid "Shaare a new link"
+msgstr "新しいリンクを追加"
 
-#: index.php:1047
-msgid "The old password is not correct."
-msgstr "元のパスワードが正しくありません。"
+#: application/front/controller/admin/ManageShaareController.php:78
+msgid "Note: "
+msgstr "注: "
 
-#: index.php:1067
-msgid "Your password has been changed"
-msgstr "あなたのパスワードは変更されました"
+#: application/front/controller/admin/ManageShaareController.php:109
+#: application/front/controller/admin/ManageShaareController.php:206
+#: application/front/controller/admin/ManageShaareController.php:275
+#: application/front/controller/admin/ManageShaareController.php:315
+#, php-format
+msgid "Bookmark with identifier %s could not be found."
+msgstr "%s という識別子を持ったブックマークは見つかりませんでした。"
 
-#: index.php:1072
-#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
-msgid "Change password"
-msgstr "パスワードを変更"
+#: application/front/controller/admin/ManageShaareController.php:194
+#: application/front/controller/admin/ManageShaareController.php:252
+msgid "Invalid bookmark ID provided."
+msgstr "不正なブックマーク ID が入力されました。"
 
-#: index.php:1120
-msgid "Configuration was saved."
-msgstr "設定は保存されました。"
+#: application/front/controller/admin/ManageShaareController.php:260
+msgid "Invalid visibility provided."
+msgstr "不正な公開設定が入力されました。"
 
-#: index.php:1143 tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
-msgid "Configure"
-msgstr "設定"
+#: application/front/controller/admin/ManageShaareController.php:363
+msgid "Edit"
+msgstr "共有"
+
+#: application/front/controller/admin/ManageShaareController.php:366
+msgid "Shaare"
+msgstr "Shaare"
 
-#: index.php:1154 tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
+#: application/front/controller/admin/ManageTagController.php:29
 msgid "Manage tags"
 msgstr "タグを設定"
 
-#: index.php:1172
+#: application/front/controller/admin/ManageTagController.php:48
+msgid "Invalid tags provided."
+msgstr "不正なタグが入力されました。"
+
+#: application/front/controller/admin/ManageTagController.php:72
 #, php-format
-msgid "The tag was removed from %d link."
-msgid_plural "The tag was removed from %d links."
+msgid "The tag was removed from %d bookmark."
+msgid_plural "The tag was removed from %d bookmarks."
 msgstr[0] "%d 件のリンクからタグが削除されました。"
-msgstr[1] "The tag was removed from %d links."
+msgstr[1] "%d 件のリンクからタグが削除されました。"
 
-#: index.php:1173
+#: application/front/controller/admin/ManageTagController.php:77
 #, php-format
-msgid "The tag was renamed in %d link."
-msgid_plural "The tag was renamed in %d links."
-msgstr[0] "ã\82¿ã\82°ã\81\8c %d 件のリンクにおいて、名前が変更されました。"
-msgstr[1] "ã\82¿ã\82°ã\81\8c %d 件のリンクにおいて、名前が変更されました。"
+msgid "The tag was renamed in %d bookmark."
+msgid_plural "The tag was renamed in %d bookmarks."
+msgstr[0] "ã\81\93ã\81®ã\82¿ã\82°ã\82\92æ\8c\81ã\81¤ %d 件のリンクにおいて、名前が変更されました。"
+msgstr[1] "ã\81\93ã\81®ã\82¿ã\82°ã\82\92æ\8c\81ã\81¤ %d 件のリンクにおいて、名前が変更されました。"
 
-#: index.php:1181 tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
-msgid "Shaare a new link"
-msgstr "新しいリンクを追加"
+#: application/front/controller/admin/PasswordController.php:28
+msgid "Change password"
+msgstr "パスワードを変更"
 
-#: index.php:1351 tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:170
-msgid "Edit"
-msgstr "共有"
+#: application/front/controller/admin/PasswordController.php:55
+msgid "You must provide the current and new password to change it."
+msgstr ""
+"パスワードを変更するには、現在のパスワードと、新しいパスワードを入力する必要"
+"があります。"
 
-#: index.php:1351 index.php:1421
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:26
-msgid "Shaare"
-msgstr "Shaare"
+#: application/front/controller/admin/PasswordController.php:71
+msgid "The old password is not correct."
+msgstr "元のパスワードが正しくありません。"
 
-#: index.php:1390
-msgid "Note: "
-msgstr "注: "
+#: application/front/controller/admin/PasswordController.php:97
+msgid "Your password has been changed"
+msgstr "あなたのパスワードは変更されました"
 
-#: index.php:1430 tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:65
-msgid "Export"
-msgstr "ã\82¨ã\82¯ã\82¹ã\83\9dã\83¼ã\83\88"
+#: application/front/controller/admin/PluginsController.php:45
+msgid "Plugin Administration"
+msgstr "ã\83\97ã\83©ã\82°ã\82¤ã\83³ç®¡ç\90\86"
 
-#: index.php:1492 tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83
-msgid "Import"
-msgstr "インポート"
+#: application/front/controller/admin/PluginsController.php:76
+msgid "Setting successfully saved."
+msgstr "設定が正常に保存されました。"
 
-#: index.php:1502
-#, php-format
-msgid ""
-"The file you are trying to upload is probably bigger than what this "
-"webserver can accept (%s). Please upload in smaller chunks."
-msgstr ""
-"あなたがアップロードしようとしているファイルは、サーバーが許可しているファイ"
-"ルサイズ (%s) よりも大きいです。もう少し小さいものをアップロードしてくださ"
-"い。"
+#: application/front/controller/admin/PluginsController.php:79
+msgid "Error while saving plugin configuration: "
+msgstr "プラグインの設定ファイルを保存するときにエラーが発生しました: "
 
-#: index.php:1541 tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22
-msgid "Plugin administration"
-msgstr "プラグイン管理"
+#: application/front/controller/admin/ThumbnailsController.php:37
+msgid "Thumbnails update"
+msgstr "サムネイルの更新"
+
+#: application/front/controller/admin/ToolsController.php:31
+msgid "Tools"
+msgstr "ツール"
 
-#: index.php:1706
+#: application/front/controller/visitor/BookmarkListController.php:116
 msgid "Search: "
 msgstr "検索: "
 
-#: index.php:1933
+#: application/front/controller/visitor/DailyController.php:45
+msgid "Today"
+msgstr "今日"
+
+#: application/front/controller/visitor/DailyController.php:47
+msgid "Yesterday"
+msgstr "昨日"
+
+#: application/front/controller/visitor/DailyController.php:85
+msgid "Daily"
+msgstr "デイリー"
+
+#: application/front/controller/visitor/ErrorController.php:36
+msgid "An unexpected error occurred."
+msgstr "予期しないエラーが発生しました。"
+
+#: application/front/controller/visitor/ErrorNotFoundController.php:25
+msgid "Requested page could not be found."
+msgstr "リクエストされたページは存在しません。"
+
+#: application/front/controller/visitor/InstallController.php:73
 #, php-format
 msgid ""
 "<pre>Sessions do not seem to work correctly on your server.<br>Make sure the "
@@ -420,32 +497,205 @@ msgstr ""
 "ります。IP アドレスや完全なドメイン名でサーバーにアクセスすることをおすすめし"
 "ます。<br>"
 
-#: index.php:1943
-msgid "Click to try again."
-msgstr "クリックして再度試します。"
+#: application/front/controller/visitor/InstallController.php:144
+msgid ""
+"Shaarli is now configured. Please login and start shaaring your bookmarks!"
+msgstr ""
+"Shaarli の設定が完了しました。ログインして、あなたのブックマークを登録しま"
+"しょう!"
+
+#: application/front/controller/visitor/InstallController.php:158
+msgid "Insufficient permissions:"
+msgstr "権限がありません:"
+
+#: application/front/controller/visitor/LoginController.php:46
+msgid "Login"
+msgstr "ログイン"
+
+#: application/front/controller/visitor/LoginController.php:78
+msgid "Wrong login/password."
+msgstr "不正なユーザー名、またはパスワードです。"
+
+#: application/front/controller/visitor/PictureWallController.php:29
+msgid "Picture wall"
+msgstr "ピクチャウォール"
+
+#: application/front/controller/visitor/TagCloudController.php:88
+msgid "Tag "
+msgstr "タグ "
+
+#: application/front/exceptions/AlreadyInstalledException.php:11
+msgid "Shaarli has already been installed. Login to edit the configuration."
+msgstr "Shaarli がインストールされました。ログインして設定を変更できます。"
+
+#: application/front/exceptions/LoginBannedException.php:11
+msgid ""
+"You have been banned after too many failed login attempts. Try again later."
+msgstr "複数回に渡るログインへの失敗を検出しました。後でまた試してください。"
+
+#: application/front/exceptions/OpenShaarliPasswordException.php:16
+msgid "You are not supposed to change a password on an Open Shaarli."
+msgstr ""
+"公開されている Shaarli において、パスワードを変更することは想定されていませ"
+"ん。"
+
+#: application/front/exceptions/ThumbnailsDisabledException.php:11
+msgid "Picture wall unavailable (thumbnails are disabled)."
+msgstr "ピクチャ ウォールは利用できません (サムネイルが無効化されています)。"
+
+#: application/front/exceptions/WrongTokenException.php:16
+msgid "Wrong token."
+msgstr "不正なトークンです。"
+
+#: application/legacy/LegacyLinkDB.php:131
+msgid "You are not authorized to add a link."
+msgstr "リンクを追加するには、ログインする必要があります。"
+
+#: application/legacy/LegacyLinkDB.php:134
+msgid "Internal Error: A link should always have an id and URL."
+msgstr "エラー: リンクにはIDとURLを登録しなければなりません。"
+
+#: application/legacy/LegacyLinkDB.php:137
+msgid "You must specify an integer as a key."
+msgstr "正常なキーの値ではありません。"
+
+#: application/legacy/LegacyLinkDB.php:140
+msgid "Array offset and link ID must be equal."
+msgstr "Array オフセットとリンクのIDは同じでなければなりません。"
+
+#: application/legacy/LegacyLinkDB.php:249
+msgid ""
+"Welcome to Shaarli! This is your first public bookmark. To edit or delete "
+"me, you must first login.\n"
+"\n"
+"To learn how to use Shaarli, consult the link \"Documentation\" at the "
+"bottom of this page.\n"
+"\n"
+"You use the community supported version of the original Shaarli project, by "
+"Sebastien Sauvage."
+msgstr ""
+"Shaarli へようこそ! これはあなたの最初の公開ブックマークです。これを編集した"
+"り削除したりするには、ログインする必要があります。\n"
+"\n"
+"Shaarli の使い方を知るには、このページの下にある「ドキュメント」のリンクを開"
+"いてください。\n"
+"\n"
+"あなたは Sebastien Sauvage による、コミュニティーサポートのあるバージョンのオ"
+"リジナルのShaarli プロジェクトを使用しています。"
+
+#: application/legacy/LegacyLinkDB.php:266
+msgid "My secret stuff... - Pastebin.com"
+msgstr "わたしのひ💗み💗つ💗 - Pastebin.com"
+
+#: application/legacy/LegacyLinkDB.php:268
+msgid "Shhhh! I'm a private link only YOU can see. You can delete me too."
+msgstr ""
+"シーッ! これはあなたしか見られないプライベートリンクです。消すこともできま"
+"す。"
+
+#: application/legacy/LegacyUpdater.php:104
+#, fuzzy
+#| msgid "Couldn't retrieve Updater class methods."
+msgid "Couldn't retrieve updater class methods."
+msgstr "アップデーターのクラスメゾットを受信できませんでした。"
+
+#: application/legacy/LegacyUpdater.php:538
+msgid "<a href=\"./admin/thumbnails\">"
+msgstr "<a href=\"./admin/thumbnails\">"
+
+#: application/netscape/NetscapeBookmarkUtils.php:63
+msgid "Invalid export selection:"
+msgstr "不正なエクスポートの選択:"
+
+#: application/netscape/NetscapeBookmarkUtils.php:215
+#, php-format
+msgid "File %s (%d bytes) "
+msgstr "ファイル %s (%d バイト) "
+
+#: application/netscape/NetscapeBookmarkUtils.php:217
+msgid "has an unknown file format. Nothing was imported."
+msgstr "は不明なファイル形式です。インポートは中止されました。"
+
+#: application/netscape/NetscapeBookmarkUtils.php:221
+#, fuzzy, php-format
+#| msgid ""
+#| "was successfully processed in %d seconds: %d links imported, %d links "
+#| "overwritten, %d links skipped."
+msgid ""
+"was successfully processed in %d seconds: %d bookmarks imported, %d "
+"bookmarks overwritten, %d bookmarks skipped."
+msgstr ""
+"が %d 秒で処理され、%d 件のリンクがインポートされ、%d 件のリンクが上書きさ"
+"れ、%d 件のリンクがスキップされました。"
+
+#: application/plugin/PluginManager.php:124
+msgid " [plugin incompatibility]: "
+msgstr "[非対応のプラグイン]: "
+
+#: application/plugin/exception/PluginFileNotFoundException.php:21
+#, php-format
+msgid "Plugin \"%s\" files not found."
+msgstr "プラグイン「%s」のファイルが存在しません。"
+
+#: application/render/PageCacheManager.php:32
+#, php-format
+msgid "Cannot purge %s: no directory"
+msgstr "%s を削除できません: ディレクトリが存在しません"
+
+#: application/updater/exception/UpdaterException.php:51
+msgid "An error occurred while running the update "
+msgstr "更新中に問題が発生しました "
+
+#: index.php:65
+msgid "Shared bookmarks on "
+msgstr "次において共有されたリンク "
 
-#: plugins/addlink_toolbar/addlink_toolbar.php:29
+#: plugins/addlink_toolbar/addlink_toolbar.php:31
 msgid "URI"
 msgstr "URI"
 
-#: plugins/addlink_toolbar/addlink_toolbar.php:33
-#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
+#: plugins/addlink_toolbar/addlink_toolbar.php:35
 msgid "Add link"
 msgstr "リンクを追加"
 
-#: plugins/addlink_toolbar/addlink_toolbar.php:50
+#: plugins/addlink_toolbar/addlink_toolbar.php:52
 msgid "Adds the addlink input on the linklist page."
 msgstr "リンク一覧のページに、リンクを追加するためのフォームを表示する。"
 
-#: plugins/archiveorg/archiveorg.php:23
+#: plugins/archiveorg/archiveorg.php:28
 msgid "View on archive.org"
 msgstr "archive.org 上で表示する"
 
-#: plugins/archiveorg/archiveorg.php:36
+#: plugins/archiveorg/archiveorg.php:41
 msgid "For each link, add an Archive.org icon."
 msgstr "それぞれのリンクに、Archive.org のアイコンを追加する。"
 
-#: plugins/demo_plugin/demo_plugin.php:465
+#: plugins/default_colors/default_colors.php:38
+msgid ""
+"Default colors plugin error: This plugin is active and no custom color is "
+"configured."
+msgstr ""
+"既定の色のプラグインにおけるエラー: このプラグインは有効なので、カスタム カ"
+"ラーは適用されません。"
+
+#: plugins/default_colors/default_colors.php:113
+msgid "Override default theme colors. Use any CSS valid color."
+msgstr ""
+"既定のテーマの色を上書きします。どのような CSS カラーコードでも使えます。"
+
+#: plugins/default_colors/default_colors.php:114
+msgid "Main color (navbar green)"
+msgstr "メイン カラー (ナビバーの緑)"
+
+#: plugins/default_colors/default_colors.php:115
+msgid "Background color (light grey)"
+msgstr "背景色 (灰色)"
+
+#: plugins/default_colors/default_colors.php:116
+msgid "Dark main color (e.g. visited links)"
+msgstr "暗い方の メイン カラー (例: 閲覧済みリンク)"
+
+#: plugins/demo_plugin/demo_plugin.php:477
 msgid ""
 "A demo plugin covering all use cases for template designers and plugin "
 "developers."
@@ -453,7 +703,15 @@ msgstr ""
 "テンプレートのデザイナーや、プラグインの開発者のためのすべての状況に対応でき"
 "るデモプラグインです。"
 
-#: plugins/isso/isso.php:20
+#: plugins/demo_plugin/demo_plugin.php:478
+msgid "This is a parameter dedicated to the demo plugin. It'll be suffixed."
+msgstr "これはデモプラグイン専用のパラメーターです。末尾に追加されます。"
+
+#: plugins/demo_plugin/demo_plugin.php:479
+msgid "Other demo parameter"
+msgstr "他のデモ パラメーター"
+
+#: plugins/isso/isso.php:22
 msgid ""
 "Isso plugin error: Please define the \"ISSO_SERVER\" setting in the plugin "
 "administration page."
@@ -461,45 +719,17 @@ msgstr ""
 "Isso プラグインエラー: \"ISSO_SERVER\" の値をプラグイン管理ページにて指定して"
 "ください。"
 
-#: plugins/isso/isso.php:63
+#: plugins/isso/isso.php:92
 msgid "Let visitor comment your shaares on permalinks with Isso."
 msgstr ""
 "Isso を使って、あなたのパーマリンク上のリンクに第三者がコメントを残すことがで"
 "きます。"
 
-#: plugins/isso/isso.php:64
+#: plugins/isso/isso.php:93
 msgid "Isso server URL (without 'http://')"
 msgstr "Isso server URL ('http://' 抜き)"
 
-#: plugins/markdown/markdown.php:158
-msgid "Description will be rendered with"
-msgstr "説明は次の方法で描画されます:"
-
-#: plugins/markdown/markdown.php:159
-msgid "Markdown syntax documentation"
-msgstr "マークダウン形式のドキュメント"
-
-#: plugins/markdown/markdown.php:160
-msgid "Markdown syntax"
-msgstr "マークダウン形式"
-
-#: plugins/markdown/markdown.php:339
-msgid ""
-"Render shaare description with Markdown syntax.<br><strong>Warning</"
-"strong>:\n"
-"If your shaared descriptions contained HTML tags before enabling the "
-"markdown plugin,\n"
-"enabling it might break your page.\n"
-"See the <a href=\"https://github.com/shaarli/Shaarli/tree/master/plugins/"
-"markdown#html-rendering\">README</a>."
-msgstr ""
-"リンクの説明をマークダウン形式で表示します。<br><strong>警告</strong>:\n"
-"リンクの説明にHTMLタグがこのプラグインを有効にする前に含まれていた場合、\n"
-"正常にページを表示できなくなるかもしれません。\n"
-"詳しくは <a href=\"https://github.com/shaarli/Shaarli/tree/master/plugins/"
-"markdown#html-rendering\">README</a> をご覧ください。"
-
-#: plugins/piwik/piwik.php:21
+#: plugins/piwik/piwik.php:23
 msgid ""
 "Piwik plugin error: Please define PIWIK_URL and PIWIK_SITEID in the plugin "
 "administration page."
@@ -507,27 +737,27 @@ msgstr ""
 "Piwik プラグインエラー: PIWIK_URL と PIWIK_SITEID の値をプラグイン管理ページ"
 "で指定してください。"
 
-#: plugins/piwik/piwik.php:70
+#: plugins/piwik/piwik.php:72
 msgid "A plugin that adds Piwik tracking code to Shaarli pages."
 msgstr "Piwik のトラッキングコードをShaarliに追加するプラグインです。"
 
-#: plugins/piwik/piwik.php:71
+#: plugins/piwik/piwik.php:73
 msgid "Piwik URL"
 msgstr "Piwik URL"
 
-#: plugins/piwik/piwik.php:72
+#: plugins/piwik/piwik.php:74
 msgid "Piwik site ID"
 msgstr "Piwik サイトID"
 
-#: plugins/playvideos/playvideos.php:22
+#: plugins/playvideos/playvideos.php:25
 msgid "Video player"
 msgstr "動画プレイヤー"
 
-#: plugins/playvideos/playvideos.php:25
+#: plugins/playvideos/playvideos.php:28
 msgid "Play Videos"
 msgstr "動画を再生"
 
-#: plugins/playvideos/playvideos.php:56
+#: plugins/playvideos/playvideos.php:59
 msgid "Add a button in the toolbar allowing to watch all videos."
 msgstr "すべての動画を閲覧するボタンをツールバーに追加します。"
 
@@ -535,26 +765,26 @@ msgstr "すべての動画を閲覧するボタンをツールバーに追加し
 msgid "plugins/playvideos/jquery-1.11.2.min.js"
 msgstr "plugins/playvideos/jquery-1.11.2.min.js"
 
-#: plugins/pubsubhubbub/pubsubhubbub.php:69
+#: plugins/pubsubhubbub/pubsubhubbub.php:72
 #, php-format
 msgid "Could not publish to PubSubHubbub: %s"
 msgstr "PubSubHubbub に登録できませんでした: %s"
 
-#: plugins/pubsubhubbub/pubsubhubbub.php:95
+#: plugins/pubsubhubbub/pubsubhubbub.php:99
 #, php-format
 msgid "Could not post to %s"
 msgstr "%s に登録できませんでした"
 
-#: plugins/pubsubhubbub/pubsubhubbub.php:99
+#: plugins/pubsubhubbub/pubsubhubbub.php:103
 #, php-format
 msgid "Bad response from the hub %s"
 msgstr "ハブ %s からの不正なレスポンス"
 
-#: plugins/pubsubhubbub/pubsubhubbub.php:110
+#: plugins/pubsubhubbub/pubsubhubbub.php:114
 msgid "Enable PubSubHubbub feed publishing."
 msgstr "PubSubHubbub へのフィードを公開する。"
 
-#: plugins/qrcode/qrcode.php:69 plugins/wallabag/wallabag.php:68
+#: plugins/qrcode/qrcode.php:73 plugins/wallabag/wallabag.php:70
 msgid "For each link, add a QRCode icon."
 msgstr "それぞれのリンクについて、QRコードのアイコンを追加する。"
 
@@ -570,724 +800,534 @@ msgstr ""
 msgid "Save to wallabag"
 msgstr "Wallabag に保存"
 
-#: plugins/wallabag/wallabag.php:69
+#: plugins/wallabag/wallabag.php:71
 msgid "Wallabag API URL"
 msgstr "Wallabag のAPIのURL"
 
-#: plugins/wallabag/wallabag.php:70
+#: plugins/wallabag/wallabag.php:72
 msgid "Wallabag API version (1 or 2)"
 msgstr "Wallabag のAPIのバージョン (1 または 2)"
 
 #: tests/LanguagesTest.php:214 tests/LanguagesTest.php:227
-#: tests/languages/fr/LanguagesFrTest.php:160
-#: tests/languages/fr/LanguagesFrTest.php:173
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:81
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:81
+#: tests/languages/fr/LanguagesFrTest.php:159
+#: tests/languages/fr/LanguagesFrTest.php:172
 msgid "Search"
 msgid_plural "Search"
 msgstr[0] "検索"
 msgstr[1] "検索"
 
-#: tmp/404.b91ef64efc3688266305ea9b42e5017e.rtpl.php:12
-msgid "Sorry, nothing to see here."
-msgstr "すみませんが、ここには何もありません。"
-
-#: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
-msgid "URL or leave empty to post a note"
-msgstr "URL を入力するか、空欄にするとノートを投稿します"
-
-#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
-msgid "Current password"
-msgstr "現在のパスワード"
-
-#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
-msgid "New password"
-msgstr "新しいパスワード"
-
-#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23
-msgid "Change"
-msgstr "変更"
-
-#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
-#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:77
-msgid "Tag"
-msgstr "タグ"
-
-#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
-msgid "New name"
-msgstr "変更先の名前"
-
-#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31
-msgid "Case sensitive"
-msgstr "大文字と小文字を区別"
-
-#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
-msgid "Rename"
-msgstr "名前を変更"
-
-#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:79
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:172
-msgid "Delete"
-msgstr "削除"
-
-#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:39
-msgid "You can also edit tags in the"
-msgstr "次に含まれるタグを編集することもできます:"
-
-#: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:39
-msgid "tag list"
-msgstr "タグ一覧"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
-msgid "title"
-msgstr "タイトル"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43
-msgid "Home link"
-msgstr "ホームのリンク先"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
-msgid "Default value"
-msgstr "既定の値"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58
-msgid "Theme"
-msgstr "テーマ"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:87
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:78
-msgid "Language"
-msgstr "言語"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:116
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:102
-msgid "Timezone"
-msgstr "タイムゾーン"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103
-msgid "Continent"
-msgstr "大陸"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103
-msgid "City"
-msgstr "町"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:164
-msgid "Disable session cookie hijacking protection"
-msgstr "不正ログイン防止のためのセッションクッキーを無効化"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:166
-msgid "Check this if you get disconnected or if your IP address changes often"
-msgstr ""
-"あなたが切断されたり、IPアドレスが頻繁に変わる環境下であるならチェックを入れ"
-"てください"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:183
-msgid "Private links by default"
-msgstr "既定でプライベートリンク"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:184
-msgid "All new links are private by default"
-msgstr "すべての新規リンクをプライベートで作成"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:199
-msgid "RSS direct links"
-msgstr "RSS 直リンク"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:200
-msgid "Check this to use direct URL instead of permalink in feeds"
-msgstr "フィードでパーマリンクの代わりに直リンクを使う"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:215
-msgid "Hide public links"
-msgstr "公開リンクを隠す"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:216
-msgid "Do not show any links if the user is not logged in"
-msgstr "ログインしていないユーザーには何のリンクも表示しない"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:231
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:150
-msgid "Check updates"
-msgstr "更新を確認"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:232
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:152
-msgid "Notify me when a new release is ready"
-msgstr "新しいバージョンがリリースされたときに通知"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:247
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169
-msgid "Enable REST API"
-msgstr "REST API を有効化"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:248
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:170
-msgid "Allow third party software to use Shaarli such as mobile application"
-msgstr ""
-"モバイルアプリといったサードパーティーのソフトウェアにShaarliを使用することを"
-"許可"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:263
-msgid "API secret"
-msgstr "API シークレット"
-
-#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:274
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:74
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:199
-msgid "Save"
-msgstr "保存"
-
-#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
-msgid "The Daily Shaarli"
-msgstr "デイリーSharli"
-
-#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:17
-msgid "1 RSS entry per day"
-msgstr "各日1つずつのRSS項目"
-
-#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:37
-msgid "Previous day"
-msgstr "前日"
-
-#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
-msgid "All links of one day in a single page."
-msgstr "1日に作成されたすべてのリンクです。"
-
-#: tmp/daily.b91ef64efc3688266305ea9b42e5017e.rtpl.php:51
-msgid "Next day"
-msgstr "翌日"
-
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:25
-msgid "Created:"
-msgstr "作成:"
-
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
-msgid "URL"
-msgstr "URL"
-
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
-msgid "Title"
-msgstr "タイトル"
-
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:40
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:75
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:99
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:124
-msgid "Description"
-msgstr "説明"
-
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
-msgid "Tags"
-msgstr "タグ"
-
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:59
-#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:168
-msgid "Private"
-msgstr "プライベート"
-
-#: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:74
-msgid "Apply Changes"
-msgstr "変更を適用"
-
-#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
-msgid "Export Database"
-msgstr "データベースをエクスポート"
-
-#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
-msgid "Selection"
-msgstr "選択済み"
-
-#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31
-msgid "All"
-msgstr "すべて"
-
-#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
-msgid "Public"
-msgstr "公開"
-
-#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:52
-msgid "Prepend note permalinks with this Shaarli instance's URL"
-msgstr "この Shaarli のインスタンスのURL にノートへのパーマリンクを付け加える"
-
-#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:53
-msgid "Useful to import bookmarks in a web browser"
-msgstr "ウェブブラウザーのリンクをインポートするのに有効です"
-
-#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
-msgid "Import Database"
-msgstr "データベースをインポート"
-
-#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23
-msgid "Maximum size allowed:"
-msgstr "最大サイズ:"
-
-#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
-msgid "Visibility"
-msgstr "可視性"
-
-#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
-msgid "Use values from the imported file, default to public"
-msgstr "インポート元のファイルの値を使用 (既定は公開リンクとなります)"
-
-#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
-msgid "Import all bookmarks as private"
-msgstr "すべてのブックマーク項目をプライベートリンクとしてインポート"
-
-#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
-msgid "Import all bookmarks as public"
-msgstr "すべてのブックマーク項目を公開リンクとしてインポート"
-
-#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:57
-msgid "Overwrite existing bookmarks"
-msgstr "既に存在しているブックマークを上書き"
-
-#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58
-msgid "Duplicates based on URL"
-msgstr "URL による重複"
-
-#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72
-msgid "Add default tags"
-msgstr "既定のタグを追加"
-
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22
-msgid "Install Shaarli"
-msgstr "Shaarli をインストール"
-
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:25
-msgid "It looks like it's the first time you run Shaarli. Please configure it."
-msgstr "どうやら Shaarli を初めて起動しているようです。設定してください。"
-
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:33
-#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:147
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:147
-msgid "Username"
-msgstr "ユーザー名"
-
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
-#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:148
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:148
-msgid "Password"
-msgstr "パスワード"
-
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:63
-msgid "Shaarli title"
-msgstr "Shaarli のタイトル"
-
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:69
-msgid "My links"
-msgstr "自分のリンク"
-
-#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:182
-msgid "Install"
-msgstr "インストール"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:80
-msgid "shaare"
-msgid_plural "shaares"
-msgstr[0] "共有"
-msgstr[1] "共有"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:18
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:84
-msgid "private link"
-msgid_plural "private links"
-msgstr[0] "プライベートリンク"
-msgstr[1] "プライベートリンク"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:117
-msgid "Search text"
-msgstr "文字列で検索"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:38
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:124
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:124
-#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
-#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:64
-#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36
-#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:74
-msgid "Filter by tag"
-msgstr "タグによって分類"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:111
-msgid "Nothing found."
-msgstr "何も見つかりませんでした。"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:119
-#, php-format
-msgid "%s result"
-msgid_plural "%s results"
-msgstr[0] "%s 件の結果"
-msgstr[1] "%s 件の結果"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:123
-msgid "for"
-msgstr "for"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:130
-msgid "tagged"
-msgstr "タグ付けされた"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:134
-msgid "Remove tag"
-msgstr "タグを削除"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:143
-msgid "with status"
-msgstr "with status"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:154
-msgid "without any tag"
-msgstr "タグなし"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:174
-#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
-#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:42
-msgid "Fold"
-msgstr "畳む"
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:176
-msgid "Edited: "
-msgstr "編集済み: "
-
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:180
-msgid "permalink"
-msgstr "パーマリンク"
+#~ msgid "The page you are trying to reach does not exist or has been deleted."
+#~ msgstr "あなたが開こうとしたページは存在しないか、削除されています。"
 
-#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:182
-msgid "Add tag"
-msgstr "タグを追加"
-
-#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7
-#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:7
-msgid "Filters"
-msgstr "分類"
-
-#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:12
-#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:12
-msgid "Only display private links"
-msgstr "プライベートリンクのみを表示"
-
-#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
-#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:15
-msgid "Only display public links"
-msgstr "公開リンクのみを表示"
-
-#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:20
-#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:20
-msgid "Filter untagged links"
-msgstr "タグ付けされていないリンクで分類"
-
-#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
-#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:76
-#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:24
-#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:76
-#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43
-#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:43
-msgid "Fold all"
-msgstr "すべて畳む"
-
-#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:69
-#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:69
-msgid "Links per page"
-msgstr "各ページをリンク"
-
-#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
-msgid ""
-"You have been banned after too many failed login attempts. Try again later."
-msgstr "複数回に渡るログインへの失敗を検出しました。後でまた試してください。"
+#~ msgid "404 Not Found"
+#~ msgstr "404 ページが存在しません"
 
-#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:151
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:151
-msgid "Remember me"
-msgstr "パスワードを保存"
-
-#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
-#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
-#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:14
-#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48
-msgid "by the Shaarli community"
-msgstr "by Shaarli コミュニティ"
-
-#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
-#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15
-msgid "Documentation"
-msgstr "ドキュメント"
-
-#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
-#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:44
-msgid "Expand"
-msgstr "展開する"
-
-#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:45
-#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:45
-msgid "Expand all"
-msgstr "すべて展開する"
-
-#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46
-#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:46
-msgid "Are you sure you want to delete this link?"
-msgstr "本当にこのリンクを削除しますか?"
-
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:61
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:86
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:61
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:86
-msgid "RSS Feed"
-msgstr "RSS フィード"
-
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:66
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:102
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:66
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:102
-msgid "Logout"
-msgstr "ログアウト"
-
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:169
-msgid "is available"
-msgstr "が利用可能"
-
-#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:176
-#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:176
-msgid "Error"
-msgstr "エラー"
-
-#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
-msgid "Picture Wall"
-msgstr "ピクチャーウォール"
-
-#: tmp/picwall.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
-msgid "pics"
-msgstr "画像"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
-msgid "You need to enable Javascript to change plugin loading order."
-msgstr ""
-"プラグインを読み込む順番を変更するには、Javascriptを有効にする必要がありま"
-"す。"
+#~ msgid "Updates file path is not set, can't write updates."
+#~ msgstr ""
+#~ "更新するファイルのパスが指定されていないため、更新を書き込めません。"
 
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
-msgid "Enabled Plugins"
-msgstr "有効なプラグイン"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:155
-msgid "No plugin enabled."
-msgstr "有効なプラグインはありません。"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:40
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:73
-msgid "Disable"
-msgstr "無効化"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:74
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:98
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:123
-msgid "Name"
-msgstr "名前"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:76
-msgid "Order"
-msgstr "順序"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:86
-msgid "Disabled Plugins"
-msgstr "無効なプラグイン"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:91
-msgid "No plugin disabled."
-msgstr "無効なプラグインはありません。"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:97
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:122
-msgid "Enable"
-msgstr "有効化"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:134
-msgid "More plugins available"
-msgstr "さらに利用できるプラグインがあります"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:136
-msgid "in the documentation"
-msgstr "ドキュメント内"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:150
-msgid "Plugin configuration"
-msgstr "プラグイン設定"
-
-#: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:195
-msgid "No parameter available."
-msgstr "利用可能な設定項目はありません。"
-
-#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
-#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19
-msgid "tags"
-msgstr "タグ"
-
-#: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
-#: tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24
-msgid "List all links with those tags"
-msgstr "このタグが付いているリンクをリスト化する"
-
-#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:3
-#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:3
-msgid "Sort by:"
-msgstr "分類:"
-
-#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:5
-#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:5
-msgid "Cloud"
-msgstr "クラウド"
-
-#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:6
-#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:6
-msgid "Most used"
-msgstr "もっとも使われた"
-
-#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7
-#: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:7
-msgid "Alphabetical"
-msgstr "アルファベット順"
-
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14
-msgid "Settings"
-msgstr "設定"
+#~ msgid "Unable to write updates in "
+#~ msgstr "更新を次の項目に書き込めませんでした: "
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16
-msgid "Change Shaarli settings: title, timezone, etc."
-msgstr "Shaarli の設定を変更: タイトル、タイムゾーンなど。"
+#~ msgid "I said: NO. You are banned for the moment. Go away."
+#~ msgstr "あなたはこのサーバーからBANされています。"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:17
-msgid "Configure your Shaarli"
-msgstr "あなたの Shaarli を設定"
+#~ msgid "Tag cloud"
+#~ msgstr "タグクラウド"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:21
-msgid "Enable, disable and configure plugins"
-msgstr "プラグインを有効化、無効化、設定する"
+#~ msgid "Click to try again."
+#~ msgstr "クリックして再度試します。"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28
-msgid "Change your password"
-msgstr "パスワードを変更"
+#~ msgid "Description will be rendered with"
+#~ msgstr "説明は次の方法で描画されます:"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:35
-msgid "Rename or delete a tag in all links"
-msgstr "すべてのリンクのタグの名前を変更する、または削除する"
+#~ msgid "Markdown syntax documentation"
+#~ msgstr "マークダウン形式のドキュメント"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
-msgid ""
-"Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, "
-"delicious...)"
-msgstr ""
-"Netscape HTML 形式のブックマークをインポートする (Firefox、Chrome、Operaと"
-"いったブラウザーが含まれます)"
+#~ msgid "Markdown syntax"
+#~ msgstr "マークダウン形式"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
-msgid "Import links"
-msgstr "リンクをインポート"
+#~ msgid ""
+#~ "Render shaare description with Markdown syntax.<br><strong>Warning</"
+#~ "strong>:\n"
+#~ "If your shaared descriptions contained HTML tags before enabling the "
+#~ "markdown plugin,\n"
+#~ "enabling it might break your page.\n"
+#~ "See the <a href=\"https://github.com/shaarli/Shaarli/tree/master/plugins/"
+#~ "markdown#html-rendering\">README</a>."
+#~ msgstr ""
+#~ "リンクの説明をマークダウン形式で表示します。<br><strong>警告</strong>:\n"
+#~ "リンクの説明にHTMLタグがこのプラグインを有効にする前に含まれていた場合、\n"
+#~ "正常にページを表示できなくなるかもしれません。\n"
+#~ "詳しくは <a href=\"https://github.com/shaarli/Shaarli/tree/master/plugins/"
+#~ "markdown#html-rendering\">README</a> をご覧ください。"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47
-msgid ""
-"Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, "
-"Opera, delicious...)"
-msgstr ""
-"Netscape HTML 形式のブックマークをエクスポートする (Firefox、Chrome、Operaと"
-"いったブラウザーが含まれます)"
+#~ msgid "Sorry, nothing to see here."
+#~ msgstr "すみませんが、ここには何もありません。"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
-msgid "Export database"
-msgstr "リンクをエクスポート"
+#~ msgid "URL or leave empty to post a note"
+#~ msgstr "URL を入力するか、空欄にするとノートを投稿します"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:71
-msgid ""
-"Drag one of these button to your bookmarks toolbar or right-click it and "
-"\"Bookmark This Link\""
-msgstr ""
-"これらのボタンのうち1つををブックマークバーにドラッグするか、右クリックして"
-"「このリンクをブックマークに追加」してください"
+#~ msgid "Current password"
+#~ msgstr "現在のパスワード"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72
-msgid "then click on the bookmarklet in any page you want to share."
-msgstr "共有したいページでブックマークレットをクリックしてください。"
+#~ msgid "New password"
+#~ msgstr "新しいパスワード"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:76
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:100
-msgid ""
-"Drag this link to your bookmarks toolbar or right-click it and Bookmark This "
-"Link"
-msgstr ""
-"このリンクをブックマークバーにドラッグするか、右クリックして「このリンクを"
-"ブックマークに追加」してください"
+#~ msgid "Change"
+#~ msgstr "変更"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:77
-msgid "then click ✚Shaare link button in any page you want to share"
-msgstr "✚リンクを共有 ボタンをクリックすることで、どこでもリンクを共有できます"
+#~ msgid "Tag"
+#~ msgstr "タグ"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:86
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:108
-msgid "The selected text is too long, it will be truncated."
-msgstr "選択された文字列は長すぎるので、一部が切り捨てられます。"
+#~ msgid "New name"
+#~ msgstr "変更先の名前"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:96
-msgid "Shaare link"
-msgstr "共有リンク"
+#~ msgid "Case sensitive"
+#~ msgstr "大文字と小文字を区別"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:101
-msgid ""
-"Then click ✚Add Note button anytime to start composing a private Note (text "
-"post) to your Shaarli"
-msgstr ""
-"✚ノートを追加 ボタンをクリックすることで、いつでもプライベートノート(テキスト"
-"形式)をShaarli上に作成できます"
+#~ msgid "Rename"
+#~ msgstr "名前を変更"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117
-msgid "Add Note"
-msgstr "ノートを追加"
+#~ msgid "Delete"
+#~ msgstr "削除"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:129
-msgid ""
-"You need to browse your Shaarli over <strong>HTTPS</strong> to use this "
-"functionality."
-msgstr ""
-"この機能を使用するには、<strong>HTTPS</strong> 経由でShaarliに接続してくださ"
-"い。"
+#~ msgid "You can also edit tags in the"
+#~ msgstr "次に含まれるタグを編集することもできます:"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:134
-msgid "Add to"
-msgstr "次に追加:"
+#~ msgid "tag list"
+#~ msgstr "タグ一覧"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:145
-msgid "3rd party"
-msgstr "サードパーティー"
+#~ msgid "title"
+#~ msgstr "タイトル"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:147
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:153
-msgid "Plugin"
-msgstr "プラグイン"
+#~ msgid "Home link"
+#~ msgstr "ホームのリンク先"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:148
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:154
-msgid "plugin"
-msgstr "プラグイン"
+#~ msgid "Default value"
+#~ msgstr "既定の値"
 
-#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:175
-msgid ""
-"Drag this link to your bookmarks toolbar, or right-click it and choose "
-"Bookmark This Link"
-msgstr ""
-"このリンクをブックマークバーにドラッグするか、右クリックして「このリンクを"
-"ブックマークに追加」してください"
+#~ msgid "Theme"
+#~ msgstr "テーマ"
+
+#~ msgid "Language"
+#~ msgstr "言語"
+
+#~ msgid "Timezone"
+#~ msgstr "タイムゾーン"
+
+#~ msgid "Continent"
+#~ msgstr "大陸"
+
+#~ msgid "City"
+#~ msgstr "町"
+
+#~ msgid "Disable session cookie hijacking protection"
+#~ msgstr "不正ログイン防止のためのセッションクッキーを無効化"
+
+#~ msgid ""
+#~ "Check this if you get disconnected or if your IP address changes often"
+#~ msgstr ""
+#~ "あなたが切断されたり、IPアドレスが頻繁に変わる環境下であるならチェックを入"
+#~ "れてください"
+
+#~ msgid "Private links by default"
+#~ msgstr "既定でプライベートリンク"
+
+#~ msgid "All new links are private by default"
+#~ msgstr "すべての新規リンクをプライベートで作成"
+
+#~ msgid "RSS direct links"
+#~ msgstr "RSS 直リンク"
+
+#~ msgid "Check this to use direct URL instead of permalink in feeds"
+#~ msgstr "フィードでパーマリンクの代わりに直リンクを使う"
+
+#~ msgid "Hide public links"
+#~ msgstr "公開リンクを隠す"
+
+#~ msgid "Do not show any links if the user is not logged in"
+#~ msgstr "ログインしていないユーザーには何のリンクも表示しない"
+
+#~ msgid "Check updates"
+#~ msgstr "更新を確認"
+
+#~ msgid "Notify me when a new release is ready"
+#~ msgstr "新しいバージョンがリリースされたときに通知"
+
+#~ msgid "Enable REST API"
+#~ msgstr "REST API を有効化"
+
+#~ msgid "Allow third party software to use Shaarli such as mobile application"
+#~ msgstr ""
+#~ "モバイルアプリといったサードパーティーのソフトウェアにShaarliを使用するこ"
+#~ "とを許可"
+
+#~ msgid "API secret"
+#~ msgstr "API シークレット"
+
+#~ msgid "Save"
+#~ msgstr "保存"
+
+#~ msgid "The Daily Shaarli"
+#~ msgstr "デイリーSharli"
+
+#~ msgid "1 RSS entry per day"
+#~ msgstr "各日1つずつのRSS項目"
+
+#~ msgid "Previous day"
+#~ msgstr "前日"
+
+#~ msgid "All links of one day in a single page."
+#~ msgstr "1日に作成されたすべてのリンクです。"
+
+#~ msgid "Next day"
+#~ msgstr "翌日"
+
+#~ msgid "Created:"
+#~ msgstr "作成:"
+
+#~ msgid "URL"
+#~ msgstr "URL"
+
+#~ msgid "Title"
+#~ msgstr "タイトル"
+
+#~ msgid "Description"
+#~ msgstr "説明"
+
+#~ msgid "Tags"
+#~ msgstr "タグ"
+
+#~ msgid "Private"
+#~ msgstr "プライベート"
+
+#~ msgid "Apply Changes"
+#~ msgstr "変更を適用"
+
+#~ msgid "Export Database"
+#~ msgstr "データベースをエクスポート"
+
+#~ msgid "Selection"
+#~ msgstr "選択済み"
+
+#~ msgid "All"
+#~ msgstr "すべて"
+
+#~ msgid "Public"
+#~ msgstr "公開"
+
+#~ msgid "Prepend note permalinks with this Shaarli instance's URL"
+#~ msgstr ""
+#~ "この Shaarli のインスタンスのURL にノートへのパーマリンクを付け加える"
+
+#~ msgid "Useful to import bookmarks in a web browser"
+#~ msgstr "ウェブブラウザーのリンクをインポートするのに有効です"
+
+#~ msgid "Import Database"
+#~ msgstr "データベースをインポート"
+
+#~ msgid "Maximum size allowed:"
+#~ msgstr "最大サイズ:"
+
+#~ msgid "Visibility"
+#~ msgstr "可視性"
+
+#~ msgid "Use values from the imported file, default to public"
+#~ msgstr "インポート元のファイルの値を使用 (既定は公開リンクとなります)"
+
+#~ msgid "Import all bookmarks as public"
+#~ msgstr "すべてのブックマーク項目を公開リンクとしてインポート"
+
+#~ msgid "Overwrite existing bookmarks"
+#~ msgstr "既に存在しているブックマークを上書き"
+
+#~ msgid "Duplicates based on URL"
+#~ msgstr "URL による重複"
+
+#~ msgid "Add default tags"
+#~ msgstr "既定のタグを追加"
+
+#~ msgid "Install Shaarli"
+#~ msgstr "Shaarli をインストール"
+
+#~ msgid ""
+#~ "It looks like it's the first time you run Shaarli. Please configure it."
+#~ msgstr "どうやら Shaarli を初めて起動しているようです。設定してください。"
+
+#~ msgid "Username"
+#~ msgstr "ユーザー名"
+
+#~ msgid "Password"
+#~ msgstr "パスワード"
+
+#~ msgid "Shaarli title"
+#~ msgstr "Shaarli のタイトル"
+
+#~ msgid "My links"
+#~ msgstr "自分のリンク"
+
+#~ msgid "Install"
+#~ msgstr "インストール"
+
+#~ msgid "shaare"
+#~ msgid_plural "shaares"
+#~ msgstr[0] "共有"
+#~ msgstr[1] "共有"
+
+#~ msgid "private link"
+#~ msgid_plural "private links"
+#~ msgstr[0] "プライベートリンク"
+#~ msgstr[1] "プライベートリンク"
+
+#~ msgid "Search text"
+#~ msgstr "文字列で検索"
+
+#~ msgid "Filter by tag"
+#~ msgstr "タグによって分類"
+
+#~ msgid "Nothing found."
+#~ msgstr "何も見つかりませんでした。"
+
+#~ msgid "%s result"
+#~ msgid_plural "%s results"
+#~ msgstr[0] "%s 件の結果"
+#~ msgstr[1] "%s 件の結果"
+
+#~ msgid "for"
+#~ msgstr "for"
+
+#~ msgid "tagged"
+#~ msgstr "タグ付けされた"
+
+#~ msgid "Remove tag"
+#~ msgstr "タグを削除"
+
+#~ msgid "with status"
+#~ msgstr "with status"
+
+#~ msgid "without any tag"
+#~ msgstr "タグなし"
+
+#~ msgid "Fold"
+#~ msgstr "畳む"
+
+#~ msgid "Edited: "
+#~ msgstr "編集済み: "
+
+#~ msgid "permalink"
+#~ msgstr "パーマリンク"
+
+#~ msgid "Add tag"
+#~ msgstr "タグを追加"
+
+#~ msgid "Filters"
+#~ msgstr "分類"
+
+#~ msgid "Only display private links"
+#~ msgstr "プライベートリンクのみを表示"
+
+#~ msgid "Only display public links"
+#~ msgstr "公開リンクのみを表示"
+
+#~ msgid "Filter untagged links"
+#~ msgstr "タグ付けされていないリンクで分類"
+
+#~ msgid "Fold all"
+#~ msgstr "すべて畳む"
+
+#~ msgid "Links per page"
+#~ msgstr "各ページをリンク"
+
+#~ msgid "Remember me"
+#~ msgstr "パスワードを保存"
+
+#~ msgid "by the Shaarli community"
+#~ msgstr "by Shaarli コミュニティ"
+
+#~ msgid "Documentation"
+#~ msgstr "ドキュメント"
+
+#~ msgid "Expand"
+#~ msgstr "展開する"
+
+#~ msgid "Expand all"
+#~ msgstr "すべて展開する"
+
+#~ msgid "Are you sure you want to delete this link?"
+#~ msgstr "本当にこのリンクを削除しますか?"
+
+#~ msgid "RSS Feed"
+#~ msgstr "RSS フィード"
+
+#~ msgid "Logout"
+#~ msgstr "ログアウト"
+
+#~ msgid "is available"
+#~ msgstr "が利用可能"
+
+#~ msgid "Error"
+#~ msgstr "エラー"
+
+#~ msgid "Picture Wall"
+#~ msgstr "ピクチャーウォール"
+
+#~ msgid "pics"
+#~ msgstr "画像"
+
+#~ msgid "You need to enable Javascript to change plugin loading order."
+#~ msgstr ""
+#~ "プラグインを読み込む順番を変更するには、Javascriptを有効にする必要がありま"
+#~ "す。"
+
+#~ msgid "Enabled Plugins"
+#~ msgstr "有効なプラグイン"
+
+#~ msgid "No plugin enabled."
+#~ msgstr "有効なプラグインはありません。"
+
+#~ msgid "Disable"
+#~ msgstr "無効化"
+
+#~ msgid "Name"
+#~ msgstr "名前"
+
+#~ msgid "Order"
+#~ msgstr "順序"
+
+#~ msgid "Disabled Plugins"
+#~ msgstr "無効なプラグイン"
+
+#~ msgid "No plugin disabled."
+#~ msgstr "無効なプラグインはありません。"
+
+#~ msgid "Enable"
+#~ msgstr "有効化"
+
+#~ msgid "More plugins available"
+#~ msgstr "さらに利用できるプラグインがあります"
+
+#~ msgid "in the documentation"
+#~ msgstr "ドキュメント内"
+
+#~ msgid "No parameter available."
+#~ msgstr "利用可能な設定項目はありません。"
+
+#~ msgid "tags"
+#~ msgstr "タグ"
+
+#~ msgid "List all links with those tags"
+#~ msgstr "このタグが付いているリンクをリスト化する"
+
+#~ msgid "Sort by:"
+#~ msgstr "分類:"
+
+#~ msgid "Cloud"
+#~ msgstr "クラウド"
+
+#~ msgid "Most used"
+#~ msgstr "もっとも使われた"
+
+#~ msgid "Alphabetical"
+#~ msgstr "アルファベット順"
+
+#~ msgid "Settings"
+#~ msgstr "設定"
+
+#~ msgid "Change Shaarli settings: title, timezone, etc."
+#~ msgstr "Shaarli の設定を変更: タイトル、タイムゾーンなど。"
+
+#~ msgid "Configure your Shaarli"
+#~ msgstr "あなたの Shaarli を設定"
+
+#~ msgid "Enable, disable and configure plugins"
+#~ msgstr "プラグインを有効化、無効化、設定する"
+
+#~ msgid "Change your password"
+#~ msgstr "パスワードを変更"
+
+#~ msgid "Rename or delete a tag in all links"
+#~ msgstr "すべてのリンクのタグの名前を変更する、または削除する"
+
+#~ msgid ""
+#~ "Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, "
+#~ "delicious...)"
+#~ msgstr ""
+#~ "Netscape HTML 形式のブックマークをインポートする (Firefox、Chrome、Operaと"
+#~ "いったブラウザーが含まれます)"
+
+#~ msgid "Import links"
+#~ msgstr "リンクをインポート"
+
+#~ msgid ""
+#~ "Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, "
+#~ "Opera, delicious...)"
+#~ msgstr ""
+#~ "Netscape HTML 形式のブックマークをエクスポートする (Firefox、Chrome、Opera"
+#~ "といったブラウザーが含まれます)"
+
+#~ msgid "Export database"
+#~ msgstr "リンクをエクスポート"
+
+#~ msgid ""
+#~ "Drag one of these button to your bookmarks toolbar or right-click it and "
+#~ "\"Bookmark This Link\""
+#~ msgstr ""
+#~ "これらのボタンのうち1つををブックマークバーにドラッグするか、右クリックし"
+#~ "て「このリンクをブックマークに追加」してください"
+
+#~ msgid "then click on the bookmarklet in any page you want to share."
+#~ msgstr "共有したいページでブックマークレットをクリックしてください。"
+
+#~ msgid ""
+#~ "Drag this link to your bookmarks toolbar or right-click it and Bookmark "
+#~ "This Link"
+#~ msgstr ""
+#~ "このリンクをブックマークバーにドラッグするか、右クリックして「このリンクを"
+#~ "ブックマークに追加」してください"
+
+#~ msgid "then click ✚Shaare link button in any page you want to share"
+#~ msgstr ""
+#~ "✚リンクを共有 ボタンをクリックすることで、どこでもリンクを共有できます"
+
+#~ msgid "The selected text is too long, it will be truncated."
+#~ msgstr "選択された文字列は長すぎるので、一部が切り捨てられます。"
+
+#~ msgid "Shaare link"
+#~ msgstr "共有リンク"
+
+#~ msgid ""
+#~ "Then click ✚Add Note button anytime to start composing a private Note "
+#~ "(text post) to your Shaarli"
+#~ msgstr ""
+#~ "✚ノートを追加 ボタンをクリックすることで、いつでもプライベートノート(テキ"
+#~ "スト形式)をShaarli上に作成できます"
+
+#~ msgid "Add Note"
+#~ msgstr "ノートを追加"
+
+#~ msgid ""
+#~ "You need to browse your Shaarli over <strong>HTTPS</strong> to use this "
+#~ "functionality."
+#~ msgstr ""
+#~ "この機能を使用するには、<strong>HTTPS</strong> 経由でShaarliに接続してくだ"
+#~ "さい。"
+
+#~ msgid "Add to"
+#~ msgstr "次に追加:"
+
+#~ msgid "3rd party"
+#~ msgstr "サードパーティー"
+
+#~ msgid "Plugin"
+#~ msgstr "プラグイン"
+
+#~ msgid "plugin"
+#~ msgstr "プラグイン"
+
+#~ msgid ""
+#~ "Drag this link to your bookmarks toolbar, or right-click it and choose "
+#~ "Bookmark This Link"
+#~ msgstr ""
+#~ "このリンクをブックマークバーにドラッグするか、右クリックして「このリンクを"
+#~ "ブックマークに追加」してください"
index 922b5966fe3340b203b8c98cc6f970555e4b43a5..ed2715322686e82ca4a9373d3417f57babc67da1 100644 (file)
@@ -17,7 +17,7 @@ use Shaarli\Plugin\PluginManager;
 function hook_archiveorg_render_linklist($data)
 {
     $archive_html = file_get_contents(PluginManager::$PLUGINS_PATH . '/archiveorg/archiveorg.html');
-    $path = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH;
+    $path = ($data['_ROOT_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH;
 
     foreach ($data['links'] as &$value) {
         $isNote = startsWith($value['real_url'], '/shaare/');
index 79e7380b66f543ade34bb080e027cba26990a7bf..d46321633e9fabdc15d714a7356af2dfc23767d3 100644 (file)
@@ -54,7 +54,7 @@ function hook_isso_render_linklist($data, $conf)
         if ($conf->get('resource.theme') === 'default') {
             $button .= '<i class="linklist-plugin-icon fa fa-comment"></i>';
         } else {
-            $button .= '<img class="linklist-plugin-icon" src="plugins/isso/comment.png" ';
+            $button .= '<img class="linklist-plugin-icon" src="'. $data['_ROOT_PATH_'].'/plugins/isso/comment.png" ';
             $button .= 'title="Comment on this shaare" alt="Comments" />';
         }
         $button .= '</a></span>';
index 95499e39f5a9618cfec8bcb4f0a28ed8922537ca..24fd18baf99aefe2f6f58c7a9225735f6b54ad7e 100644 (file)
@@ -19,7 +19,7 @@ function hook_qrcode_render_linklist($data)
 {
     $qrcode_html = file_get_contents(PluginManager::$PLUGINS_PATH . '/qrcode/qrcode.html');
 
-    $path = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH;
+    $path = ($data['_ROOT_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH;
     foreach ($data['links'] as &$value) {
         $qrcode = sprintf(
             $qrcode_html,
index 805c1ad986aa9bc4c37b2531ca521f891e6cffd6..d0df3501d6389b40ce2e1c340675f4debada71ea 100644 (file)
@@ -45,7 +45,7 @@ function hook_wallabag_render_linklist($data, $conf)
     $wallabagHtml = file_get_contents(PluginManager::$PLUGINS_PATH . '/wallabag/wallabag.html');
 
     $linkTitle = t('Save to wallabag');
-    $path = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH;
+    $path = ($data['_ROOT_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH;
 
     foreach ($data['links'] as &$value) {
         $wallabag = sprintf(
index 0f5073b47197470491982856b167529b86310bec..b1c46ee2816853b45a5a8abfcac28f8c71f4b973 100644 (file)
@@ -398,7 +398,7 @@ class GetLinksTest extends \Shaarli\TestCase
         $response = $this->controller->getLinks($request, new Response());
         $this->assertEquals(200, $response->getStatusCode());
         $data = json_decode((string) $response->getBody(), true);
-        $this->assertEquals(4, count($data));
+        $this->assertEquals(5, count($data));
         $this->assertEquals(6, $data[0]['id']);
 
         // wildcard: placeholder at the middle
index 59c0608c5a7c701db3a363733d7492563df27718..daafd2503369169500923895a1f5c6d625e5875a 100644 (file)
@@ -690,12 +690,12 @@ class BookmarkFileServiceTest extends TestCase
      */
     public function testDays()
     {
-        $this->assertEquals(
+        $this->assertSame(
             ['20100309', '20100310', '20121206', '20121207', '20130614', '20150310'],
             $this->publicLinkDB->days()
         );
 
-        $this->assertEquals(
+        $this->assertSame(
             ['20100309', '20100310', '20121206', '20121207', '20130614', '20141125', '20150310'],
             $this->privateLinkDB->days()
         );
@@ -748,6 +748,10 @@ class BookmarkFileServiceTest extends TestCase
                 // They need to be grouped with the first case found - order by date DESC: `sTuff`.
                 'sTuff' => 2,
                 'ut' => 1,
+                'assurance' => 1,
+                'coding-style' => 1,
+                'quality' => 1,
+                'standards' => 1,
             ],
             $this->publicLinkDB->bookmarksCountPerTag()
         );
@@ -776,6 +780,10 @@ class BookmarkFileServiceTest extends TestCase
                 'tag3' => 1,
                 'tag4' => 1,
                 'ut' => 1,
+                'assurance' => 1,
+                'coding-style' => 1,
+                'quality' => 1,
+                'standards' => 1,
             ],
             $this->privateLinkDB->bookmarksCountPerTag()
         );
@@ -918,6 +926,10 @@ class BookmarkFileServiceTest extends TestCase
             'tag4' => 1,
             'ut' => 1,
             'w3c' => 1,
+            'assurance' => 1,
+            'coding-style' => 1,
+            'quality' => 1,
+            'standards' => 1,
         ];
         $tags = $this->privateLinkDB->bookmarksCountPerTag();
 
@@ -1016,6 +1028,10 @@ class BookmarkFileServiceTest extends TestCase
             'stallman' => 1,
             'ut' => 1,
             'w3c' => 1,
+            'assurance' => 1,
+            'coding-style' => 1,
+            'quality' => 1,
+            'standards' => 1,
         ];
         $bookmark = new Bookmark();
         $bookmark->setTags(['newTagToCount', BookmarkMarkdownFormatter::NO_MD_TAG]);
index 644abbc8429f18b51c64c6a64a6cac7d50fc7598..574d8e3f270e5a4f80638dfc78db4779860eb39d 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace Shaarli\Bookmark;
 
-use Exception;
 use malkusch\lock\mutex\NoMutex;
 use ReferenceLinkDB;
 use Shaarli\Config\ConfigManager;
@@ -525,4 +524,43 @@ class BookmarkFilterTest extends TestCase
             ))
         );
     }
+
+    /**
+     * Test search result highlights in every field of bookmark reference #9.
+     */
+    public function testFullTextSearchHighlight(): void
+    {
+        $bookmarks = self::$linkFilter->filter(
+            BookmarkFilter::$FILTER_TEXT,
+            '"psr-2" coding guide http fig "psr-2/" "This guide" basic standard. coding-style quality assurance'
+        );
+
+        static::assertCount(1, $bookmarks);
+        static::assertArrayHasKey(9, $bookmarks);
+
+        $bookmark = $bookmarks[9];
+        $expectedHighlights = [
+            'title' => [
+                ['start' => 0, 'end' => 5], // "psr-2"
+                ['start' => 7, 'end' => 13], // coding
+                ['start' => 20, 'end' => 25], // guide
+            ],
+            'description' => [
+                ['start' => 0, 'end' => 10], // "This guide"
+                ['start' => 45, 'end' => 50], // basic
+                ['start' => 58, 'end' => 67], // standard.
+            ],
+            'url' => [
+                ['start' => 0, 'end' => 4], // http
+                ['start' => 15, 'end' => 18], // fig
+                ['start' => 27, 'end' => 33], // "psr-2/"
+            ],
+            'tags' => [
+                ['start' => 0, 'end' => 12], // coding-style
+                ['start' => 23, 'end' => 30], // quality
+                ['start' => 31, 'end' => 40], // assurance
+            ],
+        ];
+        static::assertSame($expectedHighlights, $bookmark->getAdditionalContentEntry('search_highlight'));
+    }
 }
index 9534436e3f7e7150c19a50022be476a36754f6b2..3fc6f8dc58f4c8f38e877f1c49c18d2d083cbcde 100644 (file)
@@ -174,4 +174,119 @@ class BookmarkDefaultFormatterTest extends TestCase
         $this->assertSame($tags, $link['taglist']);
         $this->assertSame(implode(' ', $tags), $link['tags']);
     }
+
+    /**
+     * Test formatTitleHtml with search result highlight.
+     */
+    public function testFormatTitleHtmlWithSearchHighlight(): void
+    {
+        $this->formatter = new BookmarkDefaultFormatter($this->conf, false);
+
+        $bookmark = new Bookmark();
+        $bookmark->setTitle('PSR-2: Coding Style Guide');
+        $bookmark->addAdditionalContentEntry(
+            'search_highlight',
+            ['title' => [
+                ['start' => 0, 'end' => 5], // "psr-2"
+                ['start' => 7, 'end' => 13], // coding
+                ['start' => 20, 'end' => 25], // guide
+            ]]
+        );
+
+        $link = $this->formatter->format($bookmark);
+
+        $this->assertSame(
+            '<span class="search-highlight">PSR-2</span>: ' .
+            '<span class="search-highlight">Coding</span> Style ' .
+            '<span class="search-highlight">Guide</span>',
+            $link['title_html']
+        );
+    }
+
+    /**
+     * Test formatDescription with search result highlight.
+     */
+    public function testFormatDescriptionWithSearchHighlight(): void
+    {
+        $this->formatter = new BookmarkDefaultFormatter($this->conf, false);
+
+        $bookmark = new Bookmark();
+        $bookmark->setDescription('This guide extends and expands on PSR-1, the basic coding standard.');
+        $bookmark->addAdditionalContentEntry(
+            'search_highlight',
+            ['description' => [
+                ['start' => 0, 'end' => 10], // "This guide"
+                ['start' => 45, 'end' => 50], // basic
+                ['start' => 58, 'end' => 67], // standard.
+            ]]
+        );
+
+        $link = $this->formatter->format($bookmark);
+
+        $this->assertSame(
+            '<span class="search-highlight">This guide</span> extends and expands on PSR-1, the ' .
+            '<span class="search-highlight">basic</span> coding ' .
+            '<span class="search-highlight">standard.</span>',
+            $link['description']
+        );
+    }
+
+    /**
+     * Test formatUrlHtml with search result highlight.
+     */
+    public function testFormatUrlHtmlWithSearchHighlight(): void
+    {
+        $this->formatter = new BookmarkDefaultFormatter($this->conf, false);
+
+        $bookmark = new Bookmark();
+        $bookmark->setUrl('http://www.php-fig.org/psr/psr-2/');
+        $bookmark->addAdditionalContentEntry(
+            'search_highlight',
+            ['url' => [
+                ['start' => 0, 'end' => 4], // http
+                ['start' => 15, 'end' => 18], // fig
+                ['start' => 27, 'end' => 33], // "psr-2/"
+            ]]
+        );
+
+        $link = $this->formatter->format($bookmark);
+
+        $this->assertSame(
+            '<span class="search-highlight">http</span>://www.php-' .
+            '<span class="search-highlight">fig</span>.org/psr/' .
+            '<span class="search-highlight">psr-2/</span>',
+            $link['url_html']
+        );
+    }
+
+    /**
+     * Test formatTagListHtml with search result highlight.
+     */
+    public function testFormatTagListHtmlWithSearchHighlight(): void
+    {
+        $this->formatter = new BookmarkDefaultFormatter($this->conf, false);
+
+        $bookmark = new Bookmark();
+        $bookmark->setTagsString('coding-style standards quality assurance');
+        $bookmark->addAdditionalContentEntry(
+            'search_highlight',
+            ['tags' => [
+                ['start' => 0, 'end' => 12], // coding-style
+                ['start' => 23, 'end' => 30], // quality
+                ['start' => 31, 'end' => 40], // assurance
+            ],]
+        );
+
+        $link = $this->formatter->format($bookmark);
+
+        $this->assertSame(
+            [
+                '<span class="search-highlight">coding-style</span>',
+                'standards',
+                '<span class="search-highlight">quality</span>',
+                '<span class="search-highlight">assurance</span>',
+            ],
+            $link['taglist_html']
+        );
+    }
 }
index df2cad62295594145843eac725bff46bec8068e3..5c3fd425f968c856b31d1e76dc96c47666be55d7 100644 (file)
@@ -296,6 +296,10 @@ class LegacyLinkDBTest extends \Shaarli\TestCase
                 // They need to be grouped with the first case found - order by date DESC: `sTuff`.
                 'sTuff' => 2,
                 'ut' => 1,
+                'assurance' => 1,
+                'coding-style' => 1,
+                'quality' => 1,
+                'standards' => 1,
             ),
             self::$publicLinkDB->linksCountPerTag()
         );
@@ -324,6 +328,10 @@ class LegacyLinkDBTest extends \Shaarli\TestCase
                 'tag3' => 1,
                 'tag4' => 1,
                 'ut' => 1,
+                'assurance' => 1,
+                'coding-style' => 1,
+                'quality' => 1,
+                'standards' => 1,
             ),
             self::$privateLinkDB->linksCountPerTag()
         );
@@ -544,6 +552,10 @@ class LegacyLinkDBTest extends \Shaarli\TestCase
             'tag4' => 1,
             'ut' => 1,
             'w3c' => 1,
+            'assurance' => 1,
+            'coding-style' => 1,
+            'quality' => 1,
+            'standards' => 1,
         ];
         $tags = self::$privateLinkDB->linksCountPerTag();
 
index fc3cb1094930eb28f8c0aefa3f6b17e75654b3c3..1f53dc3cd60337d2c6cbda01616ef88e7fad014b 100644 (file)
@@ -82,7 +82,7 @@ class ReferenceLinkDB
             'This guide extends and expands on PSR-1, the basic coding standard.',
             0,
             DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20121206_152312'),
-            ''
+            'coding-style standards quality assurance'
         );
 
         $this->addLink(
index 16c558969a085dd5549cf6a64a53da60177a7f33..89d08e2cab7e16c9a2658a17b6093e72476d896c 100644 (file)
@@ -27,8 +27,8 @@
       <div><i class="fa fa-info-circle" aria-hidden="true"></i> {'Case sensitive'|t}</div>
       <input type="hidden" name="token" value="{$token}">
       <div>
-        <input type="submit" value="{'Rename'|t}" name="renametag">
-        <input type="submit" value="{'Delete'|t}" name="deletetag" class="button button-red confirm-delete">
+        <input type="submit" value="{'Rename tag'|t}" name="renametag">
+        <input type="submit" value="{'Delete tag'|t}" name="deletetag" class="button button-red confirm-delete">
       </div>
     </form>
 
index 3ab8053f753280d348a00b31da3cd5c00e4d2f44..3749bffb620a317c276c4b63a2e9aa42b031a67d 100644 (file)
@@ -76,7 +76,7 @@
                   </div>
                   {if="$thumbnails_enabled && !empty($link.thumbnail)"}
                     <div class="daily-entry-thumbnail">
-                      <img data-src="{$link.thumbnail}#" class="b-lazy"
+                      <img data-src="{$root_path}/{$link.thumbnail}#" class="b-lazy"
                            src=""
                            alt="thumbnail" width="{$thumbnails_width}" height="{$thumbnails_height}" />
                     </div>
index 09768ac47905908bc5cbc274e230a407541bd946..3e3fb6640a52b366af7c3ad96b23484c5000f9b4 100644 (file)
   <link type="text/css" rel="stylesheet" href="{$asset_path}/css/markdown.min.css?v={$version_hash}#" />
 {/if}
 {loop="$plugins_includes.css_files"}
-  <link type="text/css" rel="stylesheet" href="{$base_path}/{$value}?v={$version_hash}#"/>
+  <link type="text/css" rel="stylesheet" href="{$root_path}/{$value}?v={$version_hash}#"/>
 {/loop}
 {if="is_file('data/user.css')"}
-  <link type="text/css" rel="stylesheet" href="{$base_path}/data/user.css#" />
+  <link type="text/css" rel="stylesheet" href="{$root_path}/data/user.css#" />
 {/if}
 <link rel="search" type="application/opensearchdescription+xml" href="{$base_path}/open-search#"
       title="Shaarli search - {$shaarlititle}" />
index b08773d8576162861561f359710d89346a69d509..beab0eac81ba8d0912d09ec329dba5246a87b8b1 100644 (file)
                 <div class="thumbnail">
                   {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore}
                   <a href="{$value.real_url}" aria-hidden="true" tabindex="-1">
-                  <img data-src="{$base_path}/{$value.thumbnail}#" class="b-lazy"
+                  <img data-src="{$root_path}/{$value.thumbnail}#" class="b-lazy"
                     src=""
                     alt="" width="{$thumbnails_width}" height="{$thumbnails_height}" />
                   </a>
                   <i class="fa fa-sticky-note" aria-hidden="true"></i>
                 {/if}
 
-                <span class="linklist-link">{$value.title}</span>
+                <span class="linklist-link">{$value.title_html}</span>
               </a>
             </h2>
           </div>
                 {$tag_counter=count($value.taglist)}
                 {loop="value.taglist"}
                   <span class="label label-tag" title="{$strAddTag}">
-                    <a href="{$base_path}/add-tag/{$value1.urlencoded_taglist.$key2}">{$value}</a>
+                    <a href="{$base_path}/add-tag/{$value1.taglist_urlencoded.$key2}">{$value1.taglist_html.$key2}</a>
                   </span>
                   {if="$tag_counter - 1 != $counter"}&middot;{/if}
                 {/loop}
                 {ignore}do not add space or line break between these div - Firefox issue{/ignore}
                 class="linklist-item-infos-url pure-u-lg-5-12 pure-u-1">
                 <a href="{$value.real_url}" aria-label="{$value.title}" title="{$value.title}">
-                  <i class="fa fa-link" aria-hidden="true"></i> {$value.url}
+                  <i class="fa fa-link" aria-hidden="true"></i> {$value.url_html}
                 </a>
                 <div class="linklist-item-buttons pure-u-0 pure-u-lg-visible">
                   <a href="#" aria-label="{$strFold}" title="{$strFold}" class="fold-button"><i class="fa fa-chevron-up" aria-hidden="true"></i></a>
index 51bdb2f0b0eb0569f0b42e8d2255ccafb3a334d8..c153def0450419477dccc8c56cf19c3f146f35e8 100644 (file)
@@ -10,7 +10,7 @@
     {/if}
     &middot;
     {'The personal, minimalist, super-fast, database free, bookmarking service'|t} {'by the Shaarli community'|t} &middot;
-    <a href="{$base_path}/doc/html/index.html" rel="nofollow">{'Documentation'|t}</a>
+    <a href="{$root_path}/doc/html/index.html" rel="nofollow">{'Documentation'|t}</a>
       {loop="$plugins_footer.text"}
           {$value}
       {/loop}
@@ -25,7 +25,7 @@
 {/loop}
 
 {loop="$plugins_footer.js_files"}
-       <script src="{$base_path}/{$value}#"></script>
+       <script src="{$root_path}/{$value}#"></script>
 {/loop}
 
 <div id="js-translations" class="hidden">
@@ -33,7 +33,7 @@
   <span id="translation-fold-all">{'Fold all'|t}</span>
   <span id="translation-expand">{'Expand'|t}</span>
   <span id="translation-expand-all">{'Expand all'|t}</span>
-  <span id="translation-delete-link">{'Are you sure you want to delete this link?'|t}</span>
+  <span id="translation-delete-link">{'Are you sure you want to delete this tag?'|t}</span>
   <span id="translation-shaarli-desc">
     {'The personal, minimalist, super-fast, database free, bookmarking service'|t} {'by the Shaarli community'|t}
   </span>
index b7a56c89b17fb56540e1127acff994122286d035..ac613b35d56080bf0c4a0f303324871082d2e9d4 100644 (file)
@@ -31,7 +31,7 @@
       {loop="$linksToDisplay"}
         <div class="picwall-pictureframe" role="listitem">
           {ignore}RainTPL hack: put the 2 src on two different line to avoid path replace bug{/ignore}
-          <img data-src="{$value.thumbnail}#" class="b-lazy"
+          <img data-src="{$root_path}/{$value.thumbnail}#" class="b-lazy"
                src=""
                alt="" width="{$thumbnails_width}" height="{$thumbnails_height}" />
           <a href="{$value.real_url}"><span class="info">{$value.title}</span></a>
index 05d13556231418de5528e8053a7413f14f239d9d..5c073da645d4dcf0934dfce24773d4990f2dac19 100644 (file)
 
       <div class="center more">
         {"More plugins available"|t}
-        <a href="doc/html/Community-&-Related-software/#third-party-plugins">{"in the documentation"|t}</a>.
+        <a href="{$root_path}/doc/html/Community-&-Related-software/#third-party-plugins">{"in the documentation"|t}</a>.
       </div>
       <div class="center">
         <input type="submit" value="{'Save'|t}" name="save">