]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #1805 from wallabag/v2-assign-comma-tags
authorNicolas Lœuillet <nicolas@loeuillet.org>
Mon, 28 Mar 2016 07:42:13 +0000 (09:42 +0200)
committerNicolas Lœuillet <nicolas@loeuillet.org>
Mon, 28 Mar 2016 07:42:13 +0000 (09:42 +0200)
Fix #1768 Split tags with commas from UI

29 files changed:
.travis.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.de.yml [new file with mode: 0644]
app/Resources/FOSUserBundle/translations/FOSUserBundle.de.yml [new file with mode: 0644]
app/Resources/FOSUserBundle/translations/FOSUserBundle.pl.yml [new file with mode: 0644]
docs/en/user/migration.rst [new file with mode: 0644]
docs/fr/user/migration.rst [new file with mode: 0644]
docs/img/user/export_v1.png [new file with mode: 0644]
docs/img/user/export_v2.png [new file with mode: 0644]
docs/img/user/import_wallabagv1.png [new file with mode: 0644]
src/Wallabag/AnnotationBundle/Entity/Annotation.php
src/Wallabag/CoreBundle/Command/InstallCommand.php
src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Helper/ContentProxy.php
src/Wallabag/CoreBundle/Helper/EntriesExport.php
src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
src/Wallabag/CoreBundle/Tests/Helper/ContentProxyTest.php
src/Wallabag/ImportBundle/Controller/PocketController.php
src/Wallabag/ImportBundle/Import/PocketImport.php
src/Wallabag/ImportBundle/Import/WallabagV1Import.php
src/Wallabag/ImportBundle/Import/WallabagV2Import.php
src/Wallabag/ImportBundle/Tests/Controller/PocketControllerTest.php
src/Wallabag/ImportBundle/Tests/Controller/WallabagV2ControllerTest.php
src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php
src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php
src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json

index e2bf90cab5be8a83772a2d51c5a66d5dafe783e5..fc9a38c26b2d8c1c91997aa7902a6158cb6687b4 100644 (file)
@@ -23,9 +23,9 @@ php:
     - hhvm
 
 env:
-  - DB=mysql
-  - DB=pgsql
-  - DB=sqlite
+    - DB=mysql
+    - DB=pgsql
+    - DB=sqlite
 
 matrix:
     fast_finish: true
diff --git a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.de.yml b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.de.yml
new file mode 100644 (file)
index 0000000..fa2093b
--- /dev/null
@@ -0,0 +1,29 @@
+download_pictures: Bilder auf den Server herunterladen
+carrot: Teilen zu Carrot aktivieren
+diaspora_url: Diaspora-URL, sofern der Service aktiviert ist
+export_epub: ePUB-Export aktivieren
+export_mobi: .mobi-Export aktivieren
+export_pdf: PDF-Export aktivieren
+export_csv: CSV-Export aktivieren
+export_json: JSON-Export aktivieren
+export_txt: TXT-Export aktivieren
+export_xml: XML-Export aktivieren
+pocket_consumer_key: Consumer-Key für Pocket, um Inhalte zu importieren (https://getpocket.com/developer/docs/authentication)
+shaarli_url: Shaarli-URL, sofern der Service aktiviert ist
+share_diaspora: Teilen zu Diaspora aktiveren
+share_mail: Teilen via E-Mail aktiveren
+share_shaarli: Teilen zu Shaarli aktiveren
+share_twitter: Teilen zu Twitter aktiveren
+show_printlink: Link anzeigen, um den Inhalt auszudrucken
+wallabag_support_url: Support-URL für wallabag
+wallabag_url: URL von *deiner* wallabag-Instanz
+entry: "Artikel"
+export: "Export"
+import: "Import"
+misc: "Verschiedenes"
+modify_settings: "Übernehmen"
+piwik_host: Host deiner Webseite in Piwik
+piwik_site_id: ID deiner Webseite in Piwik
+piwik_enabled: Piwik aktivieren
+demo_mode_enabled: "Test-Modus aktivieren? (nur für die öffentliche wallabag-Demo genutzt)"
+demo_mode_username: "Test-Benutzer"
diff --git a/app/Resources/FOSUserBundle/translations/FOSUserBundle.de.yml b/app/Resources/FOSUserBundle/translations/FOSUserBundle.de.yml
new file mode 100644 (file)
index 0000000..944a0d4
--- /dev/null
@@ -0,0 +1,2 @@
+Login: "Anmelden"
+Enter your email address below and we'll send you password reset instructions.: "Tippe deine E-Mail-Adresse unten ein und wir senden dir die Anweisungen, wie du dein Kennwort zurücksetzen kannst."
diff --git a/app/Resources/FOSUserBundle/translations/FOSUserBundle.pl.yml b/app/Resources/FOSUserBundle/translations/FOSUserBundle.pl.yml
new file mode 100644 (file)
index 0000000..7e0a249
--- /dev/null
@@ -0,0 +1,2 @@
+Login: "Logowanie"
+Enter your email address below and we'll send you password reset instructions.: "Wpisz poniżej swój adres email, abyśmy mogli wysłać ci instrukcję resetowania hasła."
diff --git a/docs/en/user/migration.rst b/docs/en/user/migration.rst
new file mode 100644 (file)
index 0000000..9e7d1a1
--- /dev/null
@@ -0,0 +1,40 @@
+Migrate wallabag
+================
+
+From wallabag 1.x
+-----------------
+
+If you were using wallabag v1.x, you need to export your data before migrating to wallabag v2.x, because the application and its database changed a lot. In your old wallabag installation, you can export your data, which can be done on the Config page of your old wallabag installation.
+
+.. image:: ../../img/user/export_v1.png
+   :alt: Exporting from wallabag v1
+   :align: center
+
+.. note::
+    If you have multiple accounts on the same instance of wallabag, each user must export from v1 and import into v2 its data.
+
+.. note::
+    If you encounter issues during the export or the import, don't hesitate to `ask for support <https://www.wallabag.org/pages/support.html>`__.
+
+When you have retrieved the json file containing your entries, you can install wallabag v2 if needed by following `the standard procedure <http://doc.wallabag.org/en/v2/user/installation.html>`__.
+
+After creating an user account on your new wallabag v2 instance, you must head over to the `Import` section and select `Import from wallabag v1`. Select your json file and upload it.
+
+.. image:: ../../img/user/import_wallabagv1.png
+   :alt: Import from wallabag v1
+   :align: center
+
+
+From wallabag 2.x
+-----------------
+
+From the previous wallabag instance on which you were before, go to `All articles`, then export these articles as json.
+
+.. image:: ../../img/user/export_v2.png
+   :alt: Export depuis wallabag v2
+   :align: center
+
+From your new wallabag instance, create your user account and click on the link in the menu to proceed to import. Choose import from wallabag v2 and select your json file to upload it.
+
+.. note::
+    If you encounter issues during the export or the import, don't hesitate to `ask for support <https://www.wallabag.org/pages/support.html>`__.
diff --git a/docs/fr/user/migration.rst b/docs/fr/user/migration.rst
new file mode 100644 (file)
index 0000000..b315ff5
--- /dev/null
@@ -0,0 +1,40 @@
+Migrer wallabag
+===============
+
+Depuis wallabag 1.x
+-------------------
+
+Si vous utilisiez wallabag v1.x, vous devez exporter vos données avant de migrer à wallabag v2.x, à cause du changement complet de l'application et de sa base de données. Sur votre ancienne instance de wallabag v1, vous pouvez exporter vos données en allant sur la page de configuration de l'application.
+
+.. image:: ../../img/user/export_v1.png
+   :alt: Export depuis wallabag v1
+   :align: center
+
+.. note::
+    Si vous avez plusieurs comptes sur la même instance de wallabag, chaque utilisateur doit exporter ses données depuis wallabag v1 et les importer dans la v2.
+
+.. note::
+    S'il vous arrive des problèmes durant l'export ou l'import, n'hésitez pas à `demander de l'aide <https://www.wallabag.org/pages/support.html>`__.
+
+Une fois que vous avez récupéré le fichier json contenant vos données, vous pouvez installer wallabag v2 si c'est nécessaire en suivant `la procédure standard <http://doc.wallabag.org/fr/v2/user/installation.html>`__.
+
+Une fois que vous avez créé un compte utilisateur sur votre nouvelle instance de wallabag v2, rendez-vous dans la section `Import`. Vous devez choisir l'import depuis wallabag v1 puis sélectionner votre fichier json récupéré précédemment.
+
+.. image:: ../../img/user/import_wallabagv1.png
+   :alt: Import depuis wallabag v1
+   :align: center
+
+
+Depuis wallabag 2.x
+-------------------
+
+Depuis l'instance sur laquelle vous étiez, rendez-vous dans la section `Tous les articles`, puis exportez ces articles au format json.
+
+.. image:: ../../img/user/export_v2.png
+   :alt: Export depuis wallabag v2
+   :align: center
+
+Depuis votre nouvelle instance de wallabag, créez votre compte utilisateur puis cliquez sur le lien dans le menu pour accéder à l'import. Choisissez l'import depuis wallabag v2 puis sélectionnez votre fichier json pour l'uploader.
+
+.. note::
+    S'il vous arrive des problèmes durant l'export ou l'import, n'hésitez pas à `demander de l'aide <https://www.wallabag.org/pages/support.html>`__.
diff --git a/docs/img/user/export_v1.png b/docs/img/user/export_v1.png
new file mode 100644 (file)
index 0000000..ad2098a
Binary files /dev/null and b/docs/img/user/export_v1.png differ
diff --git a/docs/img/user/export_v2.png b/docs/img/user/export_v2.png
new file mode 100644 (file)
index 0000000..e66967d
Binary files /dev/null and b/docs/img/user/export_v2.png differ
diff --git a/docs/img/user/import_wallabagv1.png b/docs/img/user/import_wallabagv1.png
new file mode 100644 (file)
index 0000000..4ea1e1d
Binary files /dev/null and b/docs/img/user/import_wallabagv1.png differ
index db9590b076c526aea25a93efc6d617eb00d6ccc3..90ee7c2d7e2200b484ae3c0d0550c15279390b38 100644 (file)
@@ -82,7 +82,7 @@ class Annotation
     /*
      * @param User     $user
      */
-    public function __construct(\Wallabag\UserBundle\Entity\User $user)
+    public function __construct(User $user)
     {
         $this->user = $user;
     }
@@ -204,7 +204,7 @@ class Annotation
     /**
      * Set user.
      *
-     * @param string $user
+     * @param User $user
      *
      * @return Annotation
      */
@@ -218,7 +218,7 @@ class Annotation
     /**
      * Get user.
      *
-     * @return string
+     * @return User
      */
     public function getUser()
     {
index c9dad0df71eff039030eb6aea08ac663ec1325f6..2d73a9add8cafc66412a6da9ad1b2c61c4e62b69 100644 (file)
@@ -83,7 +83,8 @@ class InstallCommand extends ContainerAwareCommand
             $help = 'Needs one of sqlite, mysql or pgsql PDO drivers';
         }
 
-        $rows[] = array($label, $status, $help);
+        $rows = [];
+        $rows[] = [$label, $status, $help];
 
         foreach ($this->functionExists as $functionRequired) {
             $label = '<comment>'.$functionRequired.'</comment>';
@@ -97,12 +98,12 @@ class InstallCommand extends ContainerAwareCommand
                 $help = 'You need the '.$functionRequired.' function activated';
             }
 
-            $rows[] = array($label, $status, $help);
+            $rows[] = [$label, $status, $help];
         }
 
         $table = new Table($this->defaultOutput);
         $table
-            ->setHeaders(array('Checked', 'Status', 'Recommendation'))
+            ->setHeaders(['Checked', 'Status', 'Recommendation'])
             ->setRows($rows)
             ->render();
 
@@ -126,7 +127,7 @@ class InstallCommand extends ContainerAwareCommand
             $this->defaultOutput->writeln('Droping database, creating database and schema, clearing the cache');
 
             $this
-                ->runCommand('doctrine:database:drop', array('--force' => true))
+                ->runCommand('doctrine:database:drop', ['--force' => true])
                 ->runCommand('doctrine:database:create')
                 ->runCommand('doctrine:schema:create')
                 ->runCommand('cache:clear')
@@ -158,7 +159,7 @@ class InstallCommand extends ContainerAwareCommand
             $this->defaultOutput->writeln('Droping database, creating database and schema');
 
             $this
-                ->runCommand('doctrine:database:drop', array('--force' => true))
+                ->runCommand('doctrine:database:drop', ['--force' => true])
                 ->runCommand('doctrine:database:create')
                 ->runCommand('doctrine:schema:create')
             ;
@@ -168,7 +169,7 @@ class InstallCommand extends ContainerAwareCommand
                 $this->defaultOutput->writeln('Droping schema and creating schema');
 
                 $this
-                    ->runCommand('doctrine:schema:drop', array('--force' => true))
+                    ->runCommand('doctrine:schema:drop', ['--force' => true])
                     ->runCommand('doctrine:schema:create')
                 ;
             }
@@ -388,19 +389,19 @@ class InstallCommand extends ContainerAwareCommand
      * @param string $command
      * @param array  $parameters Parameters to this command (usually 'force' => true)
      */
-    protected function runCommand($command, $parameters = array())
+    protected function runCommand($command, $parameters = [])
     {
         $parameters = array_merge(
-            array('command' => $command),
+            ['command' => $command],
             $parameters,
-            array(
+            [
                 '--no-debug' => true,
                 '--env' => $this->defaultInput->getOption('env') ?: 'dev',
-            )
+            ]
         );
 
         if ($this->defaultInput->getOption('no-interaction')) {
-            $parameters = array_merge($parameters, array('--no-interaction' => true));
+            $parameters = array_merge($parameters, ['--no-interaction' => true]);
         }
 
         $this->getApplication()->setAutoExit(false);
index 1a0b80ac589fd8eed9b3c363274640d7c5316171..fa6330314209c36872e1b1b9d2100ea1f05d074c 100644 (file)
@@ -92,13 +92,11 @@ class EntryController extends Controller
     }
 
     /**
-     * @param Request $request
-     *
      * @Route("/new", name="new")
      *
      * @return \Symfony\Component\HttpFoundation\Response
      */
-    public function addEntryAction(Request $request)
+    public function addEntryAction()
     {
         return $this->render('WallabagCoreBundle:Entry:new.html.twig');
     }
index 8f4ddf613212d96fc640589f95646fce805ec87b..1271f1f5f2657941c497f47f07b18a468db402ca 100644 (file)
@@ -187,7 +187,7 @@ class Entry
     /*
      * @param User     $user
      */
-    public function __construct(\Wallabag\UserBundle\Entity\User $user)
+    public function __construct(User $user)
     {
         $this->user = $user;
         $this->tags = new ArrayCollection();
index ba90b7310af83fd13774a1d87b38fb8fb241736a..ed4a220dcdbb33e265b6ea2606ef6dbfb1c5d376 100644 (file)
@@ -32,14 +32,21 @@ class ContentProxy
      * Fetch content using graby and hydrate given entry with results information.
      * In case we couldn't find content, we'll try to use Open Graph data.
      *
-     * @param Entry  $entry Entry to update
-     * @param string $url   Url to grab content for
+     * We can also force the content, in case of an import from the v1 for example, so the function won't
+     * fetch the content from the website but rather use information given with the $content parameter.
+     *
+     * @param Entry  $entry   Entry to update
+     * @param string $url     Url to grab content for
+     * @param array  $content An array with AT LEAST keys title, html, url, language & content_type to skip the fetchContent from the url
      *
      * @return Entry
      */
-    public function updateEntry(Entry $entry, $url)
+    public function updateEntry(Entry $entry, $url, array $content = [])
     {
-        $content = $this->graby->fetchContent($url);
+        // do we have to fetch the content or the provided one is ok?
+        if (empty($content) || false === $this->validateContent($content)) {
+            $content = $this->graby->fetchContent($url);
+        }
 
         $title = $content['title'];
         if (!$title && isset($content['open_graph']['og_title'])) {
@@ -62,7 +69,11 @@ class ContentProxy
         $entry->setLanguage($content['language']);
         $entry->setMimetype($content['content_type']);
         $entry->setReadingTime(Utils::getReadingTime($html));
-        $entry->setDomainName(parse_url($entry->getUrl(), PHP_URL_HOST));
+
+        $domainName = parse_url($entry->getUrl(), PHP_URL_HOST);
+        if (false !== $domainName) {
+            $entry->setDomainName($domainName);
+        }
 
         if (isset($content['open_graph']['og_image'])) {
             $entry->setPreviewPicture($content['open_graph']['og_image']);
@@ -113,4 +124,17 @@ class ContentProxy
             }
         }
     }
+
+    /**
+     * Validate that the given content as enough value to be used
+     * instead of fetch the content from the url.
+     *
+     * @param array $content
+     *
+     * @return bool true if valid otherwise false
+     */
+    private function validateContent(array $content)
+    {
+        return isset($content['title']) && isset($content['html']) && isset($content['url']) && isset($content['language']) && isset($content['content_type']);
+    }
 }
index 6ecdf019672a65ac003f28ab320f145c7ddf7e13..82004a6d51371c348a012cae99dc11b7b49adbf8 100644 (file)
@@ -81,27 +81,9 @@ class EntriesExport
      */
     public function exportAs($format)
     {
-        switch ($format) {
-            case 'epub':
-                return $this->produceEpub();
-
-            case 'mobi':
-                return $this->produceMobi();
-
-            case 'pdf':
-                return $this->producePDF();
-
-            case 'csv':
-                return $this->produceCSV();
-
-            case 'json':
-                return $this->produceJSON();
-
-            case 'xml':
-                return $this->produceXML();
-
-            case 'txt':
-                return $this->produceTXT();
+        $functionName = 'produce'.ucfirst($format);
+        if (method_exists($this, $functionName)) {
+            return $this->$functionName();
         }
 
         throw new \InvalidArgumentException(sprintf('The format "%s" is not yet supported.', $format));
@@ -242,7 +224,7 @@ class EntriesExport
     /**
      * Use TCPDF to dump a .pdf file.
      */
-    private function producePDF()
+    private function producePdf()
     {
         $pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
 
@@ -296,7 +278,7 @@ class EntriesExport
     /**
      * Inspired from CsvFileDumper.
      */
-    private function produceCSV()
+    private function produceCsv()
     {
         $delimiter = ';';
         $enclosure = '"';
@@ -336,7 +318,7 @@ class EntriesExport
         );
     }
 
-    private function produceJSON()
+    private function produceJson()
     {
         return Response::create(
             $this->prepareSerializingContent('json'),
@@ -349,7 +331,7 @@ class EntriesExport
         );
     }
 
-    private function produceXML()
+    private function produceXml()
     {
         return Response::create(
             $this->prepareSerializingContent('xml'),
@@ -362,7 +344,7 @@ class EntriesExport
         );
     }
 
-    private function produceTXT()
+    private function produceTxt()
     {
         $content = '';
         $bar = str_repeat('=', 100);
index 34f567b1e74c5e3c1fe41ebd1ba6d448c67d4e5f..ff6255b755c76a5fc73021c02c90298d3dcb99cd 100644 (file)
@@ -1,59 +1,59 @@
 security:
     login:
-        # page_title: 'Welcome to wallabag!'
+        page_title: 'Willkommen bei wallabag!'
         keep_logged_in: 'Angemeldet bleiben'
         forgot_password: 'Kennwort vergessen?'
         submit: 'Anmelden'
-        # register: 'Register'
+        register: 'Registrieren'
         username: 'Benutzername'
         password: 'Kennwort'
-        # cancel: 'Cancel'
+        cancel: 'Abbrechen'
     resetting:
         description: "Gib unten deine E-Mail-Adresse ein und wir senden dir eine Anleitung für das Zurücksetzen deines Kennworts."
     register:
-        # page_title: 'Create an account'
-        # go_to_account: 'Go to your account'
+        page_title: 'Account erstellen'
+        go_to_account: 'Gehe zu deinem Account'
 
 menu:
     left:
         unread: 'Ungelesen'
         starred: 'Favoriten'
         archive: 'Archiv'
-        all_articles: 'Alle artikel'
+        all_articles: 'Alle Artikel'
         config: 'Konfiguration'
         tags: 'Tags'
-        # internal_settings: 'Internal Settings'
-        # import: 'Import'
-        howto: 'How-to'
-        # developer: 'Developer'
+        internal_settings: 'Interne Einstellungen'
+        import: 'Importieren'
+        howto: 'How-To'
+        developer: 'Entwickler'
         logout: 'Abmelden'
         about: 'Über'
         search: 'Suche'
-        # save_link: 'Save a link'
+        save_link: 'Link speichern'
         back_to_unread: 'Zurück zu ungelesenen Artikeln'
     top:
         add_new_entry: 'Neuen Artikel hinzufügen'
         search: 'Suche'
         filter_entries: 'Artikel filtern'
-        # export: 'Export'
+        export: 'Exportieren'
     search_form:
         input_label: 'Suchbegriff hier eingeben'
 
 footer:
     wallabag:
-        # elsewhere: 'Take wallabag with you'
-        # social: 'Social'
-        # powered_by: 'powered by'
+        elsewhere: 'Nimm wallabag mit dir mit'
+        social: 'Soziales'
+        powered_by: 'angetrieben von'
         about: 'Über'
 
 config:
-    page_title: 'Config'
+    page_title: 'Einstellungen'
     tab_menu:
         settings: 'Einstellungen'
         rss: 'RSS'
         user_info: 'Benutzer-Information'
         password: 'Kennwort'
-        # rules: 'Tagging rules'
+        rules: 'Tagging-Regeln'
         new_user: 'Benutzer hinzufügen'
     form:
         save: 'Speichern'
@@ -62,12 +62,12 @@ config:
         items_per_page_label: 'Einträge pro Seite'
         language_label: 'Sprache'
         reading_speed:
-            # label: 'Reading speed'
-            # help_message: 'You can use online tools to estimate your reading speed:'
-            # 100_word: 'I read ~100 words per minute'
-            # 200_word: 'I read ~200 words per minute'
-            # 300_word: 'I read ~300 words per minute'
-            # 400_word: 'I read ~400 words per minute'
+            label: 'Lesegeschwindigkeit'
+            help_message: 'Du kannst Online-Tools nutzen, um deine Lesegeschwindigkeit herauszufinden.'
+            100_word: 'Ich lese ~100 Wörter pro Minute'
+            200_word: 'Ich lese ~200 Wörter pro Minute'
+            300_word: 'Ich lese ~300 Wörter pro Minute'
+            400_word: 'Ich lese ~400 Wörter pro Minute'
     form_rss:
         description: 'Die RSS-Feeds von wallabag erlauben es dir, deine gespeicherten Artikel mit deinem bevorzugten RSS-Reader zu lesen. Vorher musst du jedoch einen Token erstellen.'
         token_label: 'RSS-token'
@@ -79,53 +79,53 @@ config:
             unread: 'ungelesen'
             starred: 'favoriten'
             archive: 'archiv'
-        # rss_limit: 'Number of items in the feed'
+        rss_limit: 'Anzahl der Einträge im Feed'
     form_user:
-        # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code on every new untrusted connexion"
+        two_factor_description: "Wenn du die Zwei-Faktor-Authentifizierung aktivierst, erhältst du eine E-Mail mit einem Code bei jeder nicht vertraulichen Verbindung"
         name_label: 'Name'
         email_label: 'E-Mail-Adresse'
-        # twoFactorAuthentication_label: 'Two factor authentication'
+        twoFactorAuthentication_label: 'Zwei-Faktor-Authentifizierung'
     form_password:
         old_password_label: 'Altes Kennwort'
         new_password_label: 'Neues Kennwort'
         repeat_new_password_label: 'Neues Kennwort wiederholen'
     form_rules:
-        # if_label: 'if'
-        # then_tag_as_label: 'then tag as'
-        # delete_rule_label: 'delete'
-        # rule_label: 'Rule'
-        tags_label: 'Tags'
-        faq:
-            title: 'FAQ'
-        #     tagging_rules_definition_title: 'What does « tagging rules » mean?'
-        #     tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.'
-        #     how_to_use_them_title: 'How do I use them?'
-        #     how_to_use_them_description: 'Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »'
-        #     variables_available_title: 'Which variables and operators can I use to write rules?'
-        #     variables_available_description: 'The following variables and operators can be used to create tagging rules:'
-        #     meaning: 'Meaning'
-            variable_description:
-                label: 'Variable'
-        #         title: 'Title of the entry'
-        #         url: 'URL of the entry'
-        #         isArchived: 'Whether the entry is archived or not'
-        #         isStarred: 'Whether the entry is starred or not'
-        #         content: "The entry's content"
-        #         language: "The entry's language"
-        #         mimetype: "The entry's mime-type"
-        #         readingTime: "The estimated entry's reading time, in minutes"
-        #         domainName: 'The domain name of the entry'
-            operator_description:
-                label: 'Operator'
-        #         less_than: 'Less than...'
-        #         strictly_less_than: 'Strictly less than...'
-        #         greater_than: 'Greater than...'
-        #         strictly_greater_than: 'Strictly greater than...'
-        #         equal_to: 'Equal to...'
-        #         not_equal_to: 'Not equal to...'
-        #         or: 'One rule OR another'
-        #         and: 'One rule AND another'
-        #         matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>'
+        if_label: 'Wenn'
+        then_tag_as_label: 'dann tagge als'
+        delete_rule_label: 'löschen'
+        rule_label: 'Regel'
+        tags_label: 'Tags'
+        faq:
+            title: 'FAQ'
+            tagging_rules_definition_title: 'Was bedeuten die "Tagging-Regeln"?'
+            tagging_rules_definition_description: 'Dies sind Regeln von wallabag, um neu hinzugefügte Einträge autmatisch zu taggen.<br />Jedes Mal, wenn ein neuer Eintrag hinzufügt wird, werden die Tagging-Regeln angewandt. Dies erleichtert dir die Arbeit, deine Einträge manuell zu klassifizieren.'
+            how_to_use_them_title: 'Wie nutze ich sie?'
+            how_to_use_them_description: 'Nehmen wir an, du möchtest deine Einträge als "<i>schnell lesbar</i>" taggen, wenn die Lesezeit kürzer als drei Minuten ist.<br />In diesem Falle solltest du "readingTime &lt;= 3" in das <i>Regel</i>-Feld und "<i>schnell lesbar</i>" in das <i>Tags</i>-Feld schreiben.<br />Mehrere Tags können gleichzeitig hinzugefügt werden, indem sie durch ein Kommata getrennt werden: "<i>schnell lesbar, interessant</i>"<br />Komplexe Regeln können durch vordefinierte Operatoren geschrieben werden: if "<i>readingTime &gt;= 5 AND domainName = "github.com"</i>" then tag as "<i>long reading, github </i>"'
+            variables_available_title: 'Welche Variablen und Operatoren kann ich nutzen, um Regeln zu schreiben?'
+            variables_available_description: 'Die folgenden Variablen und Operatoren können genutzt werden, um Tagging-Regeln zu erstellen:'
+            meaning: 'Bedeutung'
+            variable_description:
+                label: 'Variable'
+                title: 'Titel des Eintrags'
+                url: 'URL des Eintrags'
+                isArchived: 'gibt an, ob der Eintrag archiviert ist oder nicht'
+                isStarred: 'gibt an, ob der Eintrag favorisiert ist oder nicht'
+                content: "Inhalt des Eintrags"
+                language: "Sprache des Eintrags"
+                mimetype: "MIME-Typ des Eintrags"
+                readingTime: "Die geschätzte Lesezeit in Minuten"
+                domainName: 'Der Domain-Name des Eintrags'
+            operator_description:
+                label: 'Operator'
+                less_than: 'Weniger oder gleich als…'
+                strictly_less_than: 'Weniger als…'
+                greater_than: 'Größer oder gleich als…'
+                strictly_greater_than: 'Größer als…'
+                equal_to: 'gleich'
+                not_equal_to: 'ungleich'
+                or: 'Eine Regel ODER die andere'
+                and: 'Eine Regel UND eine andere'
+                matches: 'Tests, ob eine <i>Variable</i> auf eine <i>Suche</i> zutrifft (Groß- und Kleinschreibung wird nicht berücksichtigt).<br />Beispiel: <code>title matches "Fußball"</code>'
     form_new_user:
         username_label: 'Benutzername'
         password_label: 'Kennwort'
@@ -135,12 +135,12 @@ config:
 
 entry:
     page_titles:
-        # unread: 'Unread entries'
-        # starred: 'Starred entries'
-        # archive: 'Archived entries'
-        # filtered: 'Filtered entries'
+        unread: 'Ungelesene Einträge'
+        starred: 'Favorisierte Einträge'
+        archive: 'Archivierte Einträge'
+        filtered: 'Gefilterte Einträge'
     list:
-        # number_on_the_page: '{0} There is no entry.|{1} There is one entry.|]1,Inf[ There are %count% entries.'
+        number_on_the_page: '{0} Es gibt keine Einträge.|{1} Es gibt einen Eintrag.|]1,Inf[ Es gibt %count% Einträge.'
         reading_time: 'geschätzte Lesezeit'
         reading_time_minutes: 'geschätzte Lesezeit: %readingTime% min'
         reading_time_less_one_minute: 'geschätzte Lesezeit: <small class="inferieur">&lt;</small> 1 min'
@@ -148,7 +148,7 @@ entry:
         toogle_as_read: 'Gelesen-Status ändern'
         toogle_as_star: 'Favoriten-Status ändern'
         delete: 'Löschen'
-        # export_title: 'Export'
+        export_title: 'Exportieren'
     filters:
         title: 'Filters'
         status_label: 'Status'
@@ -171,35 +171,35 @@ entry:
             filter: 'Filter'
     view:
         left_menu:
-            # back_to_top: 'Back to top'
+            back_to_top: 'Nach oben'
             back_to_homepage: 'Zurück'
             set_as_read: 'Als gelesen markieren'
-            # set_as_unread: 'Mark as unread'
+            set_as_unread: 'Als ungelesen markieren'
             set_as_favorite: 'Favorisieren'
             view_original_article: 'Original-Artikel'
-            # re_fetch_content: 'Re-fetch content'
+            re_fetch_content: 'Inhalt neu laden'
             delete: 'Löschen'
             add_a_tag: 'Tag hinzufügen'
             share_content: 'Teilen'
-            # share_email_label: 'Email'
+            share_email_label: 'E-Mail'
             download: 'Herunterladen'
-            # print: 'Print'
+            print: 'Drucken'
             problem:
                 label: 'Probleme?'
                 description: 'Erscheint dieser Artikel falsch?'
         edit_title: 'Titel ändern'
         original_article: 'original'
-        # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations'
+        annotations_on_the_entry: '{0} Keine Anmerkungen|{1} Eine Anmerkung|]1,Inf[ %nbAnnotations% Anmerkungen'
     new:
         page_title: 'Neuen Artikel speichern'
-        placeholder: 'http://website.com'
+        placeholder: 'https://website.de'
         form_new:
-            url_label: Url
+            url_label: URL
     edit:
-        # page_title: 'Edit an entry'
-        # title_label: 'Title'
-        # url_label: 'Url'
-        # is_public_label: 'Public'
+        page_title: 'Eintrag bearbeiten'
+        title_label: 'Titel'
+        url_label: 'URL'
+        is_public_label: 'Öffentlich'
         save_label: 'Speichern'
 
 about:
@@ -208,7 +208,7 @@ about:
         who_behind_wallabag: 'Wer steht hinter wallabag'
         getting_help: 'Hilfe bekommen'
         helping: 'wallabag unterstützen'
-        contributors: 'Contributors'
+        contributors: 'Unterstützer'
         third_party: 'Third-party libraries'
     who_behind_wallabag:
         developped_by: 'Entwickelt von'
@@ -225,17 +225,17 @@ about:
         description: 'wallabag ist kostenlos und Open-Source. Du kannst uns helfen:'
         by_contributing: 'indem du zu dem Projekt beiträgst:'
         by_contributing_2: 'ein Issue listet alle unsere Bedürfnisse:'
-        by_paypal: 'via Paypal'
+        by_paypal: 'via PayPal'
     contributors:
-        # description: 'Thank you to contributors on wallabag web application'
+        description: 'Ein Dankeschön an die Unterstützer von wallabag'
     third_party:
-        # description: 'Here are the list of third-party libraries used in wallabag (with their licenses):'
-        # package: 'Package'
+        description: 'Hier ist eine Liste der verwendeten Bibliotheken in wallabag (mit den jeweiligen Lizenzen):'
+        package: 'Paket'
         license: 'Lizenz'
 
 howto:
-    page_title: 'How-to'
-    # page_description: 'There are several ways to save an article:'
+    page_title: 'How-To'
+    page_description: 'Es gibt mehrere Möglichkeiten, einen Artikel zu speichern:'
     top_menu:
         browser_addons: 'Browser-Addons'
         mobile_apps: 'Apps'
@@ -249,162 +249,162 @@ howto:
         android:
             via_f_droid: 'via F-Droid'
             via_google_play: 'via Google Play'
-        # ios: 'on the iTunes Store'
-        # windows: 'on the Microsoft Store'
+        ios: 'im iTunes-Store'
+        windows: 'im Microsoft-Store'
     bookmarklet:
         description: 'Ziehe diesen Link in deine Lesezeichenleiste:'
 
 quickstart:
-    # page_title: 'Quickstart'
-    intro:
-    #     title: 'Welcome to wallabag!'
-    #     paragraph_1: "We'll accompany you to visit wallabag and show you some features which can interest you."
-    #     paragraph_2: 'Follow us!'
-    configure:
-    #     title: 'Configure the application'
-    #     language: 'Change language and design'
-    #     rss: 'Enable RSS feeds'
-    #     tagging_rules: 'Write rules to automatically tag your articles'
-    admin:
-        title: 'Administration'
-    #     description: 'As an administrator, you have privileges on wallabag. You can:'
-    #     new_user: 'Create a new user'
-    #     analytics: 'Configure analytics'
-    #     sharing: 'Enable some parameters about article sharing'
-    #     export: 'Configure export'
-    #     import: 'Configure import'
-    first_steps:
-    #     title: 'First steps'
-    #     new_article: 'Save your first article'
-    #     unread_articles: 'And classify it!'
-    migrate:
-    #     title: 'Migrate from an existing service'
-    #     description: "Are you using another service? We'll help you to retrieve your data on wallabag."
-    #     pocket: 'Migrate from Pocket'
-    #     wallabag_v1: 'Migrate from wallabag v1'
-    #     wallabag_v2: 'Migrate from wallabag v2'
-    developer:
-    #     title: 'Developers'
-    #     create_application: 'Create your third application'
-    docs:
-    #     title: 'Full documentation'
-    #     annotate: 'Annotate your article'
-    #     export: 'Convert your articles into ePUB or PDF'
-    #     search_filters: 'See how you can look for an article by using search engine and filters'
-    #     fetching_errors: 'What can I do if an article encounters errors during fetching?'
-    #     all_docs: 'And so many other articles!'
-    support:
-        title: 'Support'
-    #     description: 'If you need some help, we are here for you.'
-    #     github: 'On GitHub'
-    #     email: 'By email'
-    #     gitter: 'On Gitter'
+    page_title: 'Schnelleinstieg'
+    intro:
+        title: 'Willkommen zu wallabag!'
+        paragraph_1: "Wir werden dich bei der Benutzung von wallabag begleiten und dir einige Funktionen zeigen, die dich interessieren könnten."
+        paragraph_2: 'Folge uns!'
+    configure:
+        title: 'Anwendung konfigurieren'
+        language: 'Sprache und Design ändern'
+        rss: 'RSS-Feeds aktivieren'
+        tagging_rules: 'Schreibe Regeln, um deine Beiträge automatisch zu taggen (verschlagworten)'
+    admin:
+        title: 'Administration'
+        description: 'Als Adminstrator hast du einige Privilegien. Du kannst:'
+        new_user: 'Einen neuen Nutzer anlegen'
+        analytics: 'das Tracking konfigurieren'
+        sharing: 'Einige Parameter für das Teilen von Artikel setzen'
+        export: 'Export-Einstellungen ändern'
+        import: 'Import-Einstellungen ändern'
+    first_steps:
+        title: 'Erste Schritte'
+        new_article: 'Speichere deinen ersten Artikel'
+        unread_articles: 'Und klassifiziere ihn!'
+    migrate:
+        title: 'Von einem anderen Dienst migrieren'
+        description: "Du nutzt einen anderen Dienst? Wir helfen dir, um deine Daten zu wallabag zu transportieren."
+        pocket: 'von Pocket migrieren'
+        wallabag_v1: 'von wallabag v1 migrieren'
+        wallabag_v2: 'von wallabag v2 migrieren'
+    developer:
+        title: 'Entwickler'
+        create_application: 'Erstelle eine Anwendung und nutze die wallabag API'
+    docs:
+        title: 'Komplette Dokumentation'
+        annotate: 'Anmerkungen zu Artikeln hinzufügen'
+        export: 'Artikel nach ePUB oder PDF konvertieren'
+        search_filters: 'Schau nach, wie du nach einem Artikel über die Such- und Filterfunktion suchen kannst'
+        fetching_errors: 'Was kann ich machen, wenn ein Artikel Fehler beim Herunterladen des Inhalts zeigt?'
+        all_docs: 'Und viele weitere Artikel!'
+    support:
+        title: 'Support'
+        description: 'Wenn du Hilfe brauchst, wir sind für dich da.'
+        github: 'Auf GitHub'
+        email: 'Über E-Mail'
+        gitter: 'Auf Gitter'
 
 tag:
     page_title: 'Tags'
     list:
-        # number_on_the_page: '{0} There is no tag.|{1} There is one tag.|]1,Inf[ There are %count% tags.'
+        number_on_the_page: '{0} Es gibt keine Tags.|{1} Es gibt einen Tag.|]1,Inf[ Es gibt %count% Tags.'
 
 import:
-    # page_title: 'Import'
-    # page_description: 'Welcome to wallabag importer. Please select your previous service that you want to migrate.'
-    action:
-    #     import_contents: 'Import contents'
-    form:
-    #     mark_as_read_title: 'Mark all as read?'
-    #     mark_as_read_label: 'Mark all imported entries as read'
-    #     file_label: 'File'
-    #     save_label: 'Upload file'
-    pocket:
-    #     page_title: 'Import > Pocket'
-    #     description: "This importer will import all your Pocket data. Pocket doesn't allow us to retrieve content from their service, so the readable content of each article will be re-fetched by wallabag."
-        config_missing:
-    #         description: "Pocket import isn't configured."
-    #         admin_message: 'You need to define %keyurls%a pocket_consumer_key%keyurle%.'
-    #         user_message: 'Your server admin needs to define an API Key for Pocket.'
-    #     authorize_message: 'You can import your data from your Pocket account. You just have to click on the below button and authorize the application to connect to getpocket.com.'
-    #     connect_to_pocket: 'Connect to Pocket and import data'
-    wallabag_v1:
-    #     page_title: 'Import > Wallabag v1'
-    #     description: 'This importer will import all your wallabag v1 articles. On your config page, click on "JSON export" in the "Export your wallabag data" section. You will have a "wallabag-export-1-xxxx-xx-xx.json" file.'
-    #     how_to: 'Please select your wallabag export and click on the below button to upload and import it.'
-    wallabag_v2:
-    #     page_title: 'Import > Wallabag v2'
-    #     description: 'This importer will import all your wallabag v2 articles. Go to All articles, then, on the export sidebar, click on "JSON". You will have a "All articles.json" file.'
+    page_title: 'Importieren'
+    page_description: 'Willkommen beim wallabag-Importer. Wähle deinen vorherigen Service aus, von dem du die Daten migrieren willst.'
+    action:
+        import_contents: 'Inhalte importieren'
+    form:
+        mark_as_read_title: 'Alle als gelesen markieren?'
+        mark_as_read_label: 'Alle importierten Einträge als gelesen markieren'
+        file_label: 'Datei'
+        save_label: 'Datei hochladen'
+    pocket:
+        page_title: 'Aus Pocket importieren'
+        description: "Dieser Importer wird all deine Pocket-Daten importieren. Pocket erlaubt es uns nicht, den Inhalt zu migrieren, daher wird der lesbare Inhalt erneut von wallabag heruntergeladen."
+        config_missing:
+            description: "Pocket-Import ist nicht konfiguriert."
+            admin_message: 'Du musst noch den %keyurls%a pocket_consumer_key%keyurle% definieren.'
+            user_message: 'Der Server-Administrator muss noch einen API-Key für Pocket konfigurieren.'
+        authorize_message: 'Du kannst deine Daten von deinem Pocket-Account importieren. Dazu musst du nur den nachfolgenden Button klicken und die Anwendung authentifizieren, sich mit getpocket.com zu verbinden.'
+        connect_to_pocket: 'Mit Pocket verbinden und Daten importieren'
+    wallabag_v1:
+        page_title: 'Aus wallabag v1 importieren'
+        description: 'Dieser Import wird all deine Artikel aus wallabag v1 importieren. Klicke auf der Konfigurations-Seite auf "JSON-Export" im "wallabag-Daten exportieren"-Abschnitt. Du erhältst eine "wallabag-export-1-xxxx-xx-xx.json"-Datei.'
+        how_to: 'Wähle die Export-Datei aus und klicke den nachfolgenden Button, um diese hochzuladen und zu importieren.'
+    wallabag_v2:
+        page_title: 'Aus wallabag v2 importieren'
+        description: 'Dieser Import wird all deine Artikel aus wallabag v2 importieren. Gehe auf "Alle Artikel" und dann, in der Exportieren-Seitenleiste auf "JSON". Dabei erhältst du eine "All articles.json"-Datei.'
 
 developer:
-    # page_title: 'Developer'
-    # welcome_message: 'Welcome to the wallabag API'
-    # documentation: 'Documentation'
-    # how_to_first_app: 'How to create my first application'
-    # full_documentation: 'View full API documentation'
-    clients:
-        title: 'Clients'
-    #     create_new: 'Create a new client'
-    existing_clients:
-    #     title: 'Existing clients'
-    #     field_id: 'Client ID'
-    #     field_secret: 'Client secret'
-    #     field_uris: 'Redirect URIs'
-    #     field_grant_types: 'Grant type allowed'
-    #     no_client: 'No client yet.'
-    remove:
-    #     warn_message_1: 'You have the ability to remove this client. This action is IRREVERSIBLE !'
-    #     warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag."
-    #     action: 'Remove this client'
-    client:
-    #     page_title: 'Developer > New client'
-    #     page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.'
-        form:
-    #         redirect_uris_label: 'Redirect URIs'
-    #         save_label: 'Create a new client'
-    #     action_back: 'Back'
-    client_parameter:
-    #     page_title: 'Developer > Client parameters'
-    #     page_description: 'Here are your client parameters.'
-    #     field_id: 'Client ID'
-    #     field_secret: 'Client secret'
-    #     back: 'Back'
-    #     read_howto: 'Read the howto "Create my first application"'
-    howto:
-    #     page_title: 'Developer > How to create my first application'
-        description:
-    #         paragraph_1: 'The following commands make use of the <a href="https://github.com/jkbrzt/httpie">HTTPie library</a>. Make sure it is installed on your system before using it.'
-    #         paragraph_2: 'You need a token to communicate between your 3rd application and wallabag API.'
-    #         paragraph_3: 'To create this token, you need <a href="%link%">to create a new client</a>.'
-    #         paragraph_4: 'Now, create your token (replace client_id, client_secret, username and password with the good values):'
-    #         paragraph_5: 'The API will return a response like this:'
-    #         paragraph_6: 'The access_token is useful to do a call to the API endpoint. For example:'
-    #         paragraph_7: 'This call will return all the entries for your user.'
-    #         paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.'
-    #     back: 'Back'
+    page_title: 'Entwickler'
+    welcome_message: 'Willkomen zur wallabag-API'
+    documentation: 'Dokumentation'
+    how_to_first_app: 'Wie erstelle ich meine erste Anwendung'
+    full_documentation: 'Komplette API-Dokumentation einsehen'
+    clients:
+        title: 'Clients'
+        create_new: 'Neuen Client erstellen'
+    existing_clients:
+        title: 'Bestehende Clients'
+        field_id: 'Client-ID'
+        field_secret: 'Client-Secret'
+        field_uris: 'Weiterleitungs-URIs'
+        field_grant_types: "Erlaubte grant_types"
+        no_client: 'Bisher kein Client.'
+    remove:
+        warn_message_1: 'Du hast die Möglichkeit, diesen Client zu entfernen. DIESE AKTION IST NICHT WIDERRUFBAR!'
+        warn_message_2: "Wenn du ihn entfernst, hat keine der damit konfigurierten Anwendungen mehr die Möglichkeit, sich in deinen wallabag-Account anzumelden."
+        action: 'Client entfernen'
+    client:
+        page_title: 'Entwickler > Neuer Client'
+        page_description: 'Du bist dabei, einen neuen Client zu erstellen. Fülle das nachfolgende Feld für die Weiterleitungs-URIs deiner Anwendung aus.'
+        form:
+            redirect_uris_label: 'Weiterleitungs-URIs'
+            save_label: 'Neuen Client erstellen'
+        action_back: 'Zurück'
+    client_parameter:
+        page_title: 'Entwickler > Client-Parameter'
+        page_description: 'Dies sind deine Client-Parameter.'
+        field_id: 'Client-ID'
+        field_secret: 'Client-Secret'
+        back: 'Zurück'
+        read_howto: 'Lese des How-To zu "Wie erstelle ich meine erste Anwendung"'
+    howto:
+        page_title: 'Entwickler > Wie erstelle ich meine erste Anwendung'
+        description:
+            paragraph_1: 'Die folgenden Befehle machen Gebrauch von der <a href="https://github.com/jkbrzt/httpie">HTTPie-Bibliothek</a>. Stelle sicher, dass sie auf deinem System installiert ist, bevor du fortfährst.'
+            paragraph_2: 'Du benötigst einen Token, damit deine Anwendung mit der wallabag-API kommunizieren kann.'
+            paragraph_3: 'Um diesen Token zu erstellen, muss <a href="%link%">ein neuer Client erstellt werden</a>.'
+            paragraph_4: 'Nun erstelle deinen Token (ersetze client_id, client_secret, username und password mit deinen Werten):'
+            paragraph_5: 'Die API wird eine Antwort der folgenden Art zurückgeben:'
+            paragraph_6: 'Der access_token ist nützlich, um die API aufzurufen. Beispiel:'
+            paragraph_7: 'Dieser Aufruf wird alle Einträge für den Nutzer zurückgeben.'
+            paragraph_8: 'Wenn du alle API-Endpunkte sehen willst, werfe einen Blick auf die <a href="%link%">API-Dokumentation</a>.'
+        back: 'Zurück'
 
 validator:
-    # password_must_match: 'The password fields must match.'
-    # password_too_short: 'Password should by at least 8 chars long'
-    # password_wrong_value: 'Wrong value for your current password'
-    # item_per_page_too_high: 'This will certainly kill the app'
-    # rss_limit_too_hight: 'This will certainly kill the app'
+    password_must_match: 'Die Kennwort-Felder müssen übereinstimmen.'
+    password_too_short: 'Kennwort-Mindestlänge von acht Zeichen nicht erfüllt'
+    password_wrong_value: 'Falscher Wert für dein aktuelles Kennwort'
+    item_per_page_too_high: 'Dies wird die Anwendung möglicherweise beenden'
+    rss_limit_too_hight: 'Dies wird die Anwendung möglicherweise beenden'
 
 flashes:
     config:
         notice:
             config_saved: 'Konfiguration gespeichert. Einige Einstellungen werden erst nach einer erneuten Anmeldung übernommen.'
             password_updated: 'Kennwort aktualisiert'
-            # password_not_updated_demo: "In demonstration mode, you can't change password for this user."
+            password_not_updated_demo: "Im Test-Modus kannst du das Kennwort nicht ändern."
             user_updated: 'Information aktualisiert'
             rss_updated: 'RSS-Informationen aktualisiert'
-            # tagging_rules_updated: 'Tagging rules updated'
-            # tagging_rules_deleted: 'Tagging rule deleted'
-            # user_added: 'User "%username%" added'
-            # rss_token_updated: 'RSS token updated'
+            tagging_rules_updated: 'Tagging-Regeln aktualisiert'
+            tagging_rules_deleted: 'Tagging-Regel gelöscht'
+            user_added: 'Benutzer "%username%" erstellt'
+            rss_token_updated: 'RSS-Token aktualisiert'
     entry:
         notice:
-            # entry_already_saved: 'Entry already saved on %date%'
-            # entry_saved: 'Entry saved'
-            # entry_updated: 'Entry updated'
-            # entry_reloaded: 'Entry reloaded'
-            # entry_reload_failed: 'Failed to reload entry'
+            entry_already_saved: 'Eintrag bereits am %date% gespeichert'
+            entry_saved: 'Eintag gespeichert'
+            entry_updated: 'Eintrag aktualisiert'
+            entry_reloaded: 'Eintrag neugeladen'
+            entry_reload_failed: 'Neuladen des Eintrags fehlgeschlagen'
             entry_archived: 'Artikel archiviert'
             entry_unarchived: 'Artikel dearchiviert'
             entry_starred: 'Artikel favorisiert'
@@ -412,13 +412,13 @@ flashes:
             entry_deleted: 'Artikel gelöscht'
     tag:
         notice:
-            # tag_added: 'Tag added'
+            tag_added: 'Tag hinzugefügt'
     import:
         notice:
-            # failed: 'Import failed, please try again.'
-            # failed_on_file: 'Error while processing import. Please verify your import file.'
-            # summary: 'Import summary: %imported% imported, %skipped% already saved.'
+            failed: 'Import fehlgeschlagen, bitte erneut probieren.'
+            failed_on_file: 'Fehler während des Imports. Bitte überprüfe deine Import-Datei.'
+            summary: 'Import-Zusammenfassung: %imported% importiert, %skipped% bereits gespeichert.'
     developer:
         notice:
-            # client_created: 'New client created.'
-            # client_deleted: 'Client deleted'
+            client_created: 'Neuer Client erstellt.'
+            client_deleted: 'Client gelöscht'
index daeac4bf8148c776d78c9fcdc857f9bab5453645..1ca3e6b04e2306d3d308209cad47da269660836f 100644 (file)
@@ -1,18 +1,18 @@
 security:
     login:
-        # page_title: 'Welcome to wallabag!'
+        page_title: 'Witaj w wallabag!'
         keep_logged_in: 'Zapamiętaj mnie'
         forgot_password: 'Zapomniałeś hasła'
         submit: 'Loguj'
-        # register: 'Register'
+        register: 'Zarejestruj'
         username: 'Nazwa użytkownika'
         password: 'Hasło'
-        # cancel: 'Cancel'
+        cancel: 'Anuluj'
     resetting:
         description: "Wpisz swój adres email poniżej. Wyślemy Ci instrukcję resetowania hasła"
     register:
-        # page_title: 'Create an account'
-        # go_to_account: 'Go to your account'
+        page_title: 'Utwórz konto'
+        go_to_account: 'Idź do konta'
 
 menu:
     left:
@@ -22,38 +22,38 @@ menu:
         all_articles: 'Wszystkie'
         config: 'Konfiguracja'
         tags: 'Tagi'
-        # internal_settings: 'Internal Settings'
-        # import: 'Import'
+        internal_settings: 'Wewnętrzne ustawienia'
+        import: 'Importuj'
         howto: 'Howto'
-        # developer: 'Developer'
+        developer: 'Deweloper'
         logout: 'Wyloguj'
         about: 'O nas'
         search: 'Szukaj'
-        # save_link: 'Save a link'
+        save_link: 'Zapisz link'
         back_to_unread: 'Powrót do nieprzeczytanych artykułów'
     top:
         add_new_entry: 'Dodaj nowy wpis'
         search: 'Szukaj'
         filter_entries: 'Filtruj wpisy'
-        # export: 'Export'
+        export: 'Eksportuj'
     search_form:
         input_label: 'Wpisz swoje zapytanie tutaj'
 
 footer:
     wallabag:
-        # elsewhere: 'Take wallabag with you'
-        # social: 'Social'
-        # powered_by: 'powered by'
+        elsewhere: 'Weż wallabag ze sobą'
+        social: 'Społeczność'
+        powered_by: 'Kontrolowany przez'
         about: 'O nas'
 
 config:
     page_title: 'Konfiguracja'
     tab_menu:
-        # settings: 'Settings'
+        settings: 'Ustawienia'
         rss: 'Kanał RSS'
         user_info: 'Informacje o użytkowniku'
         password: 'Hasło'
-        # rules: 'Tagging rules'
+        rules: 'Zasady tagowania'
         new_user: 'Dodaj użytkownika'
     form:
         save: 'Zapisz'
@@ -62,12 +62,12 @@ config:
         items_per_page_label: 'Ilość elementóœ na stronie'
         language_label: 'Język'
         reading_speed:
-            # label: 'Reading speed'
-            # help_message: 'You can use online tools to estimate your reading speed:'
-            # 100_word: 'I read ~100 words per minute'
-            # 200_word: 'I read ~200 words per minute'
-            # 300_word: 'I read ~300 words per minute'
-            # 400_word: 'I read ~400 words per minute'
+            label: 'Prędkość czytania'
+            help_message: 'Możesz skorzystać z narzędzi online do określenia twojej prędkości czytania:'
+            100_word: 'Czytam ~100 słów na minutę'
+            200_word: 'Czytam ~200 słów na minutę'
+            300_word: 'Czytam ~300 słów na minutę'
+            400_word: 'Czytam ~400 słów na minutę'
     form_rss:
         description: 'Kanały RSS prowadzone przez wallabag pozwalają Ci na czytanie twoich zapisanych artykułów w twoium ulubionym czytniku RSS. Musisz najpierw wynegenerować tokena.‌'
         token_label: 'Token RSS'
@@ -81,66 +81,66 @@ config:
             archive: 'archiwum'
         rss_limit: 'Link do RSS'
     form_user:
-        # two_factor_description: "Enabling two factor authentication means you'll receive an email with a code on every new untrusted connexion"
+        two_factor_description: "Włączenie autoryzacji dwuetapowej oznacza, że będziesz otrzymywał maile z kodem przy każdym nowym, niezaufanyum połączeniu"
         name_label: 'Nazwa'
         email_label: 'Adres email'
-        # twoFactorAuthentication_label: 'Two factor authentication'
+        twoFactorAuthentication_label: 'Autoryzacja dwuetapowa'
     form_password:
         old_password_label: 'Stare hasło'
         new_password_label: 'Nowe hasło'
         repeat_new_password_label: 'Powtórz nowe hasło'
     form_rules:
-        # if_label: 'if'
-        # then_tag_as_label: 'then tag as'
+        if_label: 'jeżeli'
+        then_tag_as_label: 'wtedy otaguj jako'
         delete_rule_label: 'usuń'
-        # rule_label: 'Rule'
-        # tags_label: 'Tags'
-        faq:
-            title: 'FAQ'
-        #     tagging_rules_definition_title: 'What does « tagging rules » mean?'
-        #     tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.'
-        #     how_to_use_them_title: 'How do I use them?'
-        #     how_to_use_them_description: 'Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »'
-        #     variables_available_title: 'Which variables and operators can I use to write rules?'
-        #     variables_available_description: 'The following variables and operators can be used to create tagging rules:'
-        #     meaning: 'Meaning'
-            variable_description:
-        #         label: 'Variable'
-        #         title: 'Title of the entry'
-        #         url: 'URL of the entry'
-        #         isArchived: 'Whether the entry is archived or not'
-        #         isStarred: 'Whether the entry is starred or not'
-        #         content: "The entry's content"
-        #         language: "The entry's language"
-        #         mimetype: "The entry's mime-type"
-        #         readingTime: "The estimated entry's reading time, in minutes"
-        #         domainName: 'The domain name of the entry'
-            operator_description:
-                label: 'Operator'
-        #         less_than: 'Less than...'
-        #         strictly_less_than: 'Strictly less than...'
-        #         greater_than: 'Greater than...'
-        #         strictly_greater_than: 'Strictly greater than...'
-        #         equal_to: 'Equal to...'
-        #         not_equal_to: 'Not equal to...'
-        #         or: 'One rule OR another'
-        #         and: 'One rule AND another'
-        #         matches: 'Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>'
+        rule_label: 'Reguła'
+        tags_label: 'Tagi'
+        faq:
+            title: 'FAQ'
+            tagging_rules_definition_title: 'Co oznaczają « reguły tagowania » ?'
+            tagging_rules_definition_description: 'Istnieją reguły używane przez wallabag służące do automatycznego tagowania nowych wpisów.<br />Za każdym razem kiedy dodasz nowi wpis, zostaną użyte wszystkie skonfigurowane przez ciebie regułu. Dzięki temu unikniesz konieczności ręcznego ich klasyfikowania.'
+            how_to_use_them_title: 'Jak ich użyć?'
+            how_to_use_them_description: 'Załóżmy, że chcesz otagować nowe wpisy jako « <i>do szybkiego przeczytania</i> » jeżeli czas czytania wynosi mniej niż 3 minuty.<br />W tym przypadku ponienieneś umieścić « czasCzytania &lt;= 3 » w  polu <i>Reguła</i> i « <i><do szybkiego przeczytania/i> » w polu <i>Tagi</i>.<br />Wiele tagów może zostać dodanych jednocześnie rozdzielając je przecinkami: « <i>do szybkiego przeczytania, koniecznie przeczytać</i> »<br />Kompleksowe reguły mogą być napisane przy użyciu operatorów: jeżeli « <i>czasCzytania &gt;= 5 I nazwaDomeny = "github.com"</i> » wtedy otagój jako « <i>dłuższy tekst, github </i> »'
+            variables_available_title: 'Jakich zmiennych i operatorów mogę użyć przy pisaniu reguł?'
+            variables_available_description: 'Następujące zmienne i operatory mogą być użyte przy tworzeniu reguł tagowania:'
+            meaning: 'Znaczenie'
+            variable_description:
+                label: 'Zmienna'
+                title: 'Tytuł wpisu'
+                url: 'Adres URL wpisu'
+                isArchived: 'Czy wpis został zarchiwizowany czy nie'
+                isStarred: 'Czy wpis został oznaczony gwiazdką czy nie'
+                content: 'Zawartość wpisu'
+                language: 'Język wpisu'
+                mimetype: 'Mime-type wpisu'
+                readingTime: 'Szacunkowy czas czytania wpisu w minutach'
+                domainName: 'Nazwa domeny wpisu'
+            operator_description:
+                label: 'Operator'
+                less_than: 'Mniej niż...'
+                strictly_less_than: 'Wyłącznie mniej niż...'
+                greater_than: 'Więcej niż...'
+                strictly_greater_than: 'Wyłącznie więcej niż...'
+                equal_to: 'Równe...'
+                not_equal_to: 'Nierówny...'
+                or: 'Jedna reguła LUB inna'
+                and: 'Jedna reguła I inna'
+                matches: 'Sprawdź czy <i>temat</i> pasuje <i>szukaj</i> (duże lub małe litery).<br />Przykład: <code>tytuł zawiera "piłka nożna"</code>'
     form_new_user:
         username_label: 'Nazwa użytkownika'
         password_label: 'Hasło'
         repeat_new_password_label: 'Powtórz nowe hasło'
-        plain_password_label: '????'
+        plain_password_label: 'Jawne hasło'
         email_label: 'Adres email'
 
 entry:
     page_titles:
-        # unread: 'Unread entries'
-        # starred: 'Starred entries'
-        # archive: 'Archived entries'
-        # filtered: 'Filtered entries'
+        unread: 'Nieprzeczytane wpisy'
+        starred: 'Wpisy oznaczone gwiazdką'
+        archive: 'Zarchiwizowane wpisy'
+        filtered: 'Odfiltrowane wpisy'
     list:
-        # number_on_the_page: '{0} There is no entry.|{1} There is one entry.|]1,Inf[ There are %count% entries.'
+        number_on_the_page: '{0} Nie ma wpisów.|{1} Jest jeden wpis.|]1,Inf[ Są %count% wpisy.'
         reading_time: 'szacunkowy czas czytania'
         reading_time_minutes: 'szacunkowy czas czytania: %readingTime% min'
         reading_time_less_one_minute: 'szacunkowy czas czytania: <small class="inferieur">&lt;</small> 1 min'
@@ -148,7 +148,7 @@ entry:
         toogle_as_read: 'Oznacz jako przeczytane'
         toogle_as_star: 'Oznacz jako ulubione'
         delete: 'Usuń'
-        export_title: 'Export'
+        export_title: 'Export'
     filters:
         title: 'Filtry'
         status_label: 'Status'
@@ -171,35 +171,35 @@ entry:
             filter: 'Filtruj'
     view:
         left_menu:
-            # back_to_top: 'Back to top'
+            back_to_top: 'Wróć na górę'
             back_to_homepage: 'Cofnij'
             set_as_read: 'Oznacz jako przeczytane'
-            # set_as_unread: 'Mark as unread'
+            set_as_unread: 'Oznacz jako nieprzeczytane'
             set_as_favorite: 'Ulubione'
             view_original_article: 'Oryginalny artykuł'
-            # re_fetch_content: 'Re-fetch content'
+            re_fetch_content: 'Pobierz ponownie treść'
             delete: 'Usuń'
             add_a_tag: 'Dodaj tag'
             share_content: 'Udostępnij'
             share_email_label: 'Adres email'
             download: 'Pobierz'
-            # print: 'Print'
+            print: 'Drukuj'
             problem:
                 label: 'Problemy'
                 description: 'Czy ten artykuł wygląda źle?'
         edit_title: 'Edytuj tytuł'
         original_article: 'oryginalny'
-        # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations'
+        annotations_on_the_entry: '{0} Nie ma adnotacji |{1} Jedna adnotacja |]1,Inf[ %nbAnnotations% adnotacji'
     new:
         page_title: 'Zapisz nowy wpis'
         placeholder: 'http://website.com'
         form_new:
             url_label: Url
     edit:
-        # page_title: 'Edit an entry'
-        # title_label: 'Title'
-        # url_label: 'Url'
-        # is_public_label: 'Public'
+        page_title: 'Edytuj wpis'
+        title_label: 'Tytuł'
+        url_label: 'Adres URL'
+        is_public_label: 'Publiczny'
         save_label: 'Zapisz'
 
 about:
@@ -208,8 +208,8 @@ about:
         who_behind_wallabag: 'Kto stoi za wallabag'
         getting_help: 'Pomoc'
         helping: 'Pomóż wallabag'
-        # contributors: 'Contributors'
-        # third_party: 'Third-party libraries'
+        contributors: 'Osoby, które pomogły przy projekcie'
+        third_party: 'Biblioteki Third-party'
     who_behind_wallabag:
         developped_by: 'Stworzony przez'
         website: 'strona internetowa'
@@ -220,22 +220,22 @@ about:
     getting_help:
         documentation: 'Dokumentacja'
         bug_reports: 'Raportuj błędy'
-        support: '<a href="https://support.wallabag.org">Na naszeej stronie wsparcia technicznego</a> lub <a href="https://github.com/wallabag/wallabag/issues">na GitHubie</a>'
+        support: '<a href="https://support.wallabag.org">Na naszej stronie wsparcia technicznego</a> lub <a href="https://github.com/wallabag/wallabag/issues">na GitHubie</a>'
     helping:
         description: 'wallabag jest darmowy i otwartoźródłowy. Możesz nam pomóc:'
         by_contributing: 'przez przyłączenie się do projektu:'
         by_contributing_2: 'lista wszystkich naszych potrzeb'
         by_paypal: 'przez Paypal'
     contributors:
-        # description: 'Thank you to contributors on wallabag web application'
+        description: 'Podziękuj osobą, które przyczyniły się do projektu przez aplikację webową'
     third_party:
-        # description: 'Here are the list of third-party libraries used in wallabag (with their licenses):'
-        # package: 'Package'
+        description: 'Tutaj znajduje się lista Third-party bibliotek użytych w wallabag (z ich licencjami):'
+        package: 'Paczka'
         license: 'Licencja'
 
 howto:
     page_title: 'Howto'
-    # page_description: 'There are several ways to save an article:'
+    page_description: 'Sposoby zapisania artykułu:'
     top_menu:
         browser_addons: 'Wtyczki dla przeglądarki'
         mobile_apps: 'Aplikacje mobilne'
@@ -243,148 +243,148 @@ howto:
     form:
         description: 'Podziękuj przez ten formularz'
     browser_addons:
-        firefox: 'Standardowe rozszerzenia dla Firefox'
+        firefox: 'Standardowe rozszerzenie dla Firefox'
         chrome: 'Rozszerzenie dla Chrome'
     mobile_apps:
         android:
-            via_f_droid: 'przez F-Droid'
-            via_google_play: 'przez Google Play'
-        ios: 'przez iTunes Store'
-        windows: 'przez Microsoft Store'
+            via_f_droid: 'w F-Droid'
+            via_google_play: 'w Google Play'
+        ios: 'w iTunes Store'
+        windows: 'w Microsoft Store'
     bookmarklet:
         description: 'Przeciągnij i upuść ten link na swój pasek zakładek'
 
 quickstart:
-    # page_title: 'Quickstart'
-    intro:
-    #     title: 'Welcome to wallabag!'
-    #     paragraph_1: "We'll accompany you to visit wallabag and show you some features which can interest you."
-    #     paragraph_2: 'Follow us!'
-    configure:
-    #     title: 'Configure the application'
-    #     language: 'Change language and design'
-    #     rss: 'Enable RSS feeds'
-    #     tagging_rules: 'Write rules to automatically tag your articles'
-    admin:
-    #     title: 'Administration'
-    #     description: 'As an administrator, you have privileges on wallabag. You can:'
-    #     new_user: 'Create a new user'
-    #     analytics: 'Configure analytics'
-    #     sharing: 'Enable some parameters about article sharing'
-    #     export: 'Configure export'
-    #     import: 'Configure import'
-    first_steps:
-    #     title: 'First steps'
-    #     new_article: 'Save your first article'
-    #     unread_articles: 'And classify it!'
-    migrate:
-    #     title: 'Migrate from an existing service'
-    #     description: "Are you using another service? We'll help you to retrieve your data on wallabag."
-    #     pocket: 'Migrate from Pocket'
-    #     wallabag_v1: 'Migrate from wallabag v1'
-    #     wallabag_v2: 'Migrate from wallabag v2'
-    developer:
-    #     title: 'Developers'
-    #     create_application: 'Create your third application'
-    docs:
-    #     title: 'Full documentation'
-    #     annotate: 'Annotate your article'
-    #     export: 'Convert your articles into ePUB or PDF'
-    #     search_filters: 'See how you can look for an article by using search engine and filters'
-    #     fetching_errors: 'What can I do if an article encounters errors during fetching?'
-    #     all_docs: 'And so many other articles!'
-    support:
-    #     title: 'Support'
-    #     description: 'If you need some help, we are here for you.'
-    #     github: 'On GitHub'
-    #     email: 'By email'
-    #     gitter: 'On Gitter'
+    page_title: 'Szybki start'
+    intro:
+         title: 'Witaj w wallabag!'
+         paragraph_1: "Będziemy ci towarzyszyli w Twojej poznaniu wallabag i pokażemy możliwości, które mogą cię zainteresować."
+         paragraph_2: 'Śledź nas!'
+    configure:
+         title: 'Konfiguruj aplikację'
+         language: 'Zmień język i wygląd'
+         rss: 'Włącz kanały RSS'
+         tagging_rules: 'Napisz reguły pozwalające na automatyczne otagowanie twoich artykułów'
+    admin:
+         title: 'Administracja'
+         description: 'Jako administrator wallabag, możesz:'
+         new_user: 'Tworzyć nowego użytkownika'
+         analytics: 'Configure analytics'
+         sharing: 'Włączyć pewne parametry dotyczące udostępniania artykułów'
+         export: 'Skonfigurować eksport'
+         import: 'Skonfigurować import'
+    first_steps:
+        title: 'Pierwsze kroki'
+        new_article: 'Zapisz swój pierwszy artukuł'
+        unread_articles: 'I sklasyfikuj go!'
+    migrate:
+        title: 'Migruj w istniejącej usługi'
+        description: "Używasz innej usługi? Pomożemy ci pobrać twoje dane do wallabag."
+        pocket: 'Migruj z Pocket'
+        wallabag_v1: 'Migruj z wallabag v1'
+        wallabag_v2: 'Migruj z wallabag v2'
+    developer:
+        title: 'Deweloperzy'
+        create_application: 'Stwórz swoją aplikację'
+    docs:
+        title: 'Pełna Dokumentacja'
+        annotate: 'Dadaj adnotację do swojego artykułu'
+        export: 'Konwertuj swoje artykuły do ePUB lub PDF'
+        search_filters: 'Zabacz jak możesz znaleźć artykuł dzięku użyciu silnika wyszukiwarki i filtrów'
+        fetching_errors: 'Co mogę zrobić jeżeli artukuł napotka błędy podczas pobierania?'
+        all_docs: 'I wiele innych artykułów!'
+    support:
+        title: 'Wsparcie'
+        description: 'Jeżeli potrzebujesz pomocy, jesteśmy tutaj dla ciebie.'
+        github: 'na GitHubie'
+        email: 'przez email'
+        gitter: 'na Gitterze'
 
 tag:
     page_title: 'Tagi'
     list:
-        # number_on_the_page: '{0} There is no tag.|{1} There is one tag.|]1,Inf[ There are %count% tags.'
+        number_on_the_page: '{0} Nie ma tagów.|{1} Jest jeden tag.|]1,Inf[ Są %count% tagi.'
 
 import:
-    page_title: 'Import'
-    # page_description: 'Welcome to wallabag importer. Please select your previous service that you want to migrate.'
-    action:
-    #     import_contents: 'Import contents'
-    form:
-    #     mark_as_read_title: 'Mark all as read?'
-    #     mark_as_read_label: 'Mark all imported entries as read'
-    #     file_label: 'File'
-    #     save_label: 'Upload file'
-    pocket:
-        page_title: 'Import > Pocket'
-    #     description: "This importer will import all your Pocket data. Pocket doesn't allow us to retrieve content from their service, so the readable content of each article will be re-fetched by wallabag."
-        config_missing:
-    #         description: "Pocket import isn't configured."
-    #         admin_message: 'You need to define %keyurls%a pocket_consumer_key%keyurle%.'
-    #         user_message: 'Your server admin needs to define an API Key for Pocket.'
-    #     authorize_message: 'You can import your data from your Pocket account. You just have to click on the below button and authorize the application to connect to getpocket.com.'
-    #     connect_to_pocket: 'Connect to Pocket and import data'
-    wallabag_v1:
-        page_title: 'Import > Wallabag v1'
-    #     description: 'This importer will import all your wallabag v1 articles. On your config page, click on "JSON export" in the "Export your wallabag data" section. You will have a "wallabag-export-1-xxxx-xx-xx.json" file.'
-    #     how_to: 'Please select your wallabag export and click on the below button to upload and import it.'
-    wallabag_v2:
-        page_title: 'Import > Wallabag v2'
-    #     description: 'This importer will import all your wallabag v2 articles. Go to All articles, then, on the export sidebar, click on "JSON". You will have a "All articles.json" file.'
+    page_title: 'Import'
+    page_description: 'Witaj w importerze Wallabag. Wybierz swoją poprzednią usługę, z której chcech migrować.'
+    action:
+        import_contents: 'Import zawartości'
+    form:
+        mark_as_read_title: 'Oznaczyć wszystkie jako przeczytane?'
+        mark_as_read_label: 'Oznacz wszystkie zaimportowane wpisy jako przeczytane'
+        file_label: 'Plik'
+        save_label: 'Właduj plik'
+    pocket:
+        page_title: 'Import > Pocket'
+        description: "Ten importer, zaimportuje dane z usługi Pocket. Pocket nie pozwala na nam na pobranie zawartości ze swojej usługi, więc kontent każdego arthykuł\u zostanie ponownie pobrany przez wallabag."
+        config_missing:
+            description: "Import z Pocket nie jest skonfigurowany."
+            admin_message: 'Musisz zdefiniować %keyurls%a pocket_consumer_key%keyurle%.'
+            user_message: 'Admin twojego servera musi zdefiniować API Key dla Pocket.'
+        authorize_message: 'Możesz zaimportować dane ze swojego konta Pocket. Kliknij poniższy przycisk i autoryzuj aplikacje aby połączyć się z getpocket.com.'
+        connect_to_pocket: 'Połącz z Pocket i importuj dane'
+    wallabag_v1:
+        page_title: 'Import > Wallabag v1'
+        description: 'Ten importer, zaimportuje wszystkie twoje artykułu z wallabag v1. Na swojej stronie konfiguracyjnej kliknij "JSON eksport" w sekcji "Eksportuj swoje dane wallabag". Otrzymasz plik "wallabag-export-1-xxxx-xx-xx.json".'
+        how_to: 'Wybierz swój plik eksportu z wallabag i kliknij poniższy przycisk, aby go załadować.'
+    wallabag_v2:
+        page_title: 'Import > Wallabag v2'
+        description: 'Ten importer, zaimportuje wszystkie twoje artykułu z wallabag v2. Idź do wszystkich artykułów, a następnie na panelu exportu kliknij na "JSON". Otrzymasz plik "All articles.json".'
 
 developer:
-    # page_title: 'Developer'
-    # welcome_message: 'Welcome to the wallabag API'
-    # documentation: 'Documentation'
-    # how_to_first_app: 'How to create my first application'
-    # full_documentation: 'View full API documentation'
-    clients:
-    #     title: 'Clients'
-    #     create_new: 'Create a new client'
-    existing_clients:
-    #     title: 'Existing clients'
-    #     field_id: 'Client ID'
-    #     field_secret: 'Client secret'
-    #     field_uris: 'Redirect URIs'
-    #     field_grant_types: 'Grant type allowed'
-    #     no_client: 'No client yet.'
-    remove:
-    #     warn_message_1: 'You have the ability to remove this client. This action is IRREVERSIBLE !'
-    #     warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag."
-    #     action: 'Remove this client'
-    client:
-    #     page_title: 'Developer > New client'
-    #     page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.'
-    #     form:
-    #         redirect_uris_label: 'Redirect URIs'
-    #         save_label: 'Create a new client'
-    #     action_back: 'Cofnij'
-    client_parameter:
-    #     page_title: 'Developer > Client parameters'
-    #     page_description: 'Here are your client parameters.'
-    #     field_id: 'Client ID'
-    #     field_secret: 'Client secret'
-    #     back: 'Cofnij'
-    #     read_howto: 'Read the howto "Create my first application"'
-    howto:
-    #     page_title: 'Developer > How to create my first application'
-    #     description:
-    #         paragraph_1: 'The following commands make use of the <a href="https://github.com/jkbrzt/httpie">HTTPie library</a>. Make sure it is installed on your system before using it.'
-    #         paragraph_2: 'You need a token to communicate between your 3rd application and wallabag API.'
-    #         paragraph_3: 'To create this token, you need <a href="%link%">to create a new client</a>.'
-    #         paragraph_4: 'Now, create your token (replace client_id, client_secret, username and password with the good values):'
-    #         paragraph_5: 'The API will return a response like this:'
-    #         paragraph_6: 'The access_token is useful to do a call to the API endpoint. For example:'
-    #         paragraph_7: 'This call will return all the entries for your user.'
-    #         paragraph_8: 'If you want to see all the API endpoints, you can have a look <a href="%link%">to our API documentation</a>.'
-    #     back: 'Cofnij'
+    page_title: 'Deweloper'
+    welcome_message: 'Witaj w API wallabag'
+    documentation: 'Dokumentacja'
+    how_to_first_app: 'Jak stworzyć moją pierwszą aplikację'
+    full_documentation: 'Pokaż pełne API'
+    clients:
+         title: 'Klienci'
+         create_new: 'Utwórz nowego klienta'
+    existing_clients:
+         title: 'Istniejący klienci'
+         field_id: 'Client ID'
+         field_secret: 'Client secret'
+         field_uris: 'Przekieruj URIs'
+         field_grant_types: 'Przyznaj pozwolenie'
+         no_client: 'Nie ma jeszcze klienta.'
+    remove:
+         warn_message_1: 'Masz możliwość usunięcia tego klienta. Ta akcja jest NIEODWRACALNA !'
+         warn_message_2: "Jeżeli go usuniesz, aplikacje skonfigurowane z tym klientem nię będa w stanie autoryzować twojego wallabag."
+         action: 'Usuń tego klienta'
+    client:
+         page_title: 'Deweloper > Nowy klient'
+         page_description: 'Tworzysz nowego klienta. Wypełnij poniższe pole w celu przekierowania URI twojej aplikacji.'
+         form:
+             redirect_uris_label: 'Przekieruj adresy URI'
+             save_label: 'Stwórz nowego klienta'
+         action_back: 'Cofnij'
+    client_parameter:
+         page_title: 'Deweloper > Parametry klienta'
+         page_description: 'Tutaj znajdują się parametry klienta.'
+         field_id: 'Client ID'
+         field_secret: 'Client secret'
+         back: 'Cofnij'
+         read_howto: 'Przeczytaj jak "Stworzyć moją pierwszą aplikację"'
+    howto:
+         page_title: 'Deweloper > Jak stworzyć moją pierwszą aplikację'
+         description:
+            paragraph_1: 'Następujące komendy korzystają <a href="https://github.com/jkbrzt/httpie">Biblioteka HTTPie</a>. Upewnij się, czy zainstalowałeś ją w swoim systemie zanim z niej skorzystasz'
+            paragraph_2: 'Potrzebujesz tokena w celu nawiązania komunikacji między swoją aplikacją a API wallabag.'
+            paragraph_3: 'W celu stworzenia tokena musisz <a href="%link%">stwórz nowego klienta</a>.'
+            paragraph_4: 'Teraz, utwórz tokena (zmień client_id, client_secret, username i password z poprawnymi wartościami):'
+            paragraph_5: 'API powinno zwrócić taką informację:'
+            paragraph_6: 'access_token jest użyteczny do wywołania API endpoint. Na przykład:'
+            paragraph_7: 'To wywołanie zwróci wszystkie twoje wpisy.'
+            paragraph_8: 'Jeżeli chcesz wyświetlić wszystkie punkty końcowe API, zobacz <a href="%link%">Dokumentacja naszego API</a>.'
+         back: 'Cofnij'
 
 validator:
     password_must_match: 'Hasło w polach musi być takie same'
     password_too_short: 'Hasło powinno mieć minimum 8 znaków długości'
-    # password_wrong_value: 'Wrong value for your current password'
-    # item_per_page_too_high: 'This will certainly kill the app'
-    # rss_limit_too_hight: 'This will certainly kill the app'
+    password_wrong_value: 'Twoje obecne hasło jest błędne'
+    item_per_page_too_high: 'To może spowodować problemy z aplikacją'
+    rss_limit_too_hight: 'To może spowodować problemy z aplikacją'
 
 flashes:
     config:
@@ -394,17 +394,17 @@ flashes:
             password_not_updated_demo: "In demonstration mode, you can't change password for this user."
             user_updated: 'Informacje zaktualizowane'
             rss_updated: 'Informacje RSS zaktualizowane'
-            # tagging_rules_updated: 'Tagging rules updated'
-            # tagging_rules_deleted: 'Tagging rule deleted'
-            # user_added: 'User "%username%" added'
-            # rss_token_updated: 'RSS token updated'
+            tagging_rules_updated: 'Reguły tagowania zaktualizowane'
+            tagging_rules_deleted: 'Reguła tagowania usunięta'
+            user_added: 'Użytkownik "%username%" dodany'
+            rss_token_updated: 'Token kanału RSS zaktualizowany'
     entry:
         notice:
-            # entry_already_saved: 'Entry already saved on %date%'
-            # entry_saved: 'Entry saved'
-            # entry_updated: 'Entry updated'
-            # entry_reloaded: 'Entry reloaded'
-            # entry_reload_failed: 'Failed to reload entry'
+            entry_already_saved: 'Wpis już został dodany %date%'
+            entry_saved: 'Wpis zapisany'
+            entry_updated: 'Wpis zaktualizowany'
+            entry_reloaded: 'Wpis ponownie załadowany'
+            entry_reload_failed: 'Błąd ponownego załadowania'
             entry_archived: 'Wpis dodany do archiwum'
             entry_unarchived: 'Wpis usunięty z archiwum'
             entry_starred: 'Wpis oznaczony gwiazdką'
@@ -412,13 +412,13 @@ flashes:
             entry_deleted: 'Wpis usunięty'
     tag:
         notice:
-            # tag_added: 'Tag added'
+            tag_added: 'Tag dodany'
     import:
         notice:
-            # failed: 'Import failed, please try again.'
-            # failed_on_file: 'Error while processing import. Please verify your import file.'
-            # summary: 'Import summary: %imported% imported, %skipped% already saved.'
+            failed: 'Nieudany import, prosimy spróbować ponownie.'
+            failed_on_file: 'Błąd podczas ptrzetwarzania pliku. Sprawdż swój importowany plik.'
+            summary: 'Podsumowanie importu: %imported% zaimportowane, %skipped% już zapisane.'
     developer:
         notice:
-            # client_created: 'New client created.'
-            # client_deleted: 'Client deleted'
+            client_created: 'Nowy klient utworzony.'
+            client_deleted: 'Klient usunięty'
index 0ce06962508d5930cef8190bd9164cd147b58b06..bac92ffa4928dd193d35b44a67148325229a412d 100644 (file)
@@ -66,7 +66,7 @@
     {% for flashMessage in app.session.flashbag.get('notice') %}
         <div class="messages success">
             <a href="#" class="closeMessage">×</a>
-            <p>{{ flashMessage }}</p>
+            <p>{{ flashMessage|trans }}</p>
         </div>
     {% endfor %}
 {% endblock %}
index 4eebf18fb370edd4b2d66ae8ac25412b7226c725..032d2d9b9b6278d3ce08a8cd3a253ada036f9b90 100644 (file)
                     {% if craue_setting('share_diaspora') %}
                         <li>
                             <a href="{{ craue_setting('diaspora_url') }}/bookmarklet?url={{ entry.url|url_encode }}&title={{ entry.title|url_encode }}&notes=&v=1&noui=1&jump=doclose" target="_blank" class="tool diaspora icon-image icon-image--diaspora" title="diaspora}">
-                                <span>diaspora}</span>
+                                <span>diaspora*</span>
                             </a>
                         </li>
                     {% endif %}
index f58b58288ede937da35499954e32fdee1e9b5a86..74bfb0547ca0a8df44f1c4933894d141a8bf6ce1 100644 (file)
@@ -10,6 +10,40 @@ use Wallabag\UserBundle\Entity\User;
 
 class ContentProxyTest extends \PHPUnit_Framework_TestCase
 {
+    public function testWithBadUrl()
+    {
+        $tagger = $this->getTaggerMock();
+        $tagger->expects($this->once())
+            ->method('tag');
+
+        $graby = $this->getMockBuilder('Graby\Graby')
+            ->setMethods(array('fetchContent'))
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $graby->expects($this->any())
+            ->method('fetchContent')
+            ->willReturn(array(
+                'html' => false,
+                'title' => '',
+                'url' => '',
+                'content_type' => '',
+                'language' => '',
+            ));
+
+        $proxy = new ContentProxy($graby, $tagger, $this->getTagRepositoryMock(), $this->getLogger());
+        $entry = $proxy->updateEntry(new Entry(new User()), 'http://user@:80');
+
+        $this->assertEquals('http://user@:80', $entry->getUrl());
+        $this->assertEmpty($entry->getTitle());
+        $this->assertEquals('<p>Unable to retrieve readable content.</p>', $entry->getContent());
+        $this->assertEmpty($entry->getPreviewPicture());
+        $this->assertEmpty($entry->getMimetype());
+        $this->assertEmpty($entry->getLanguage());
+        $this->assertEquals(0.0, $entry->getReadingTime());
+        $this->assertEquals(false, $entry->getDomainName());
+    }
+
     public function testWithEmptyContent()
     {
         $tagger = $this->getTaggerMock();
@@ -121,6 +155,57 @@ class ContentProxyTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals('1.1.1.1', $entry->getDomainName());
     }
 
+    public function testWithForcedContent()
+    {
+        $tagger = $this->getTaggerMock();
+        $tagger->expects($this->once())
+            ->method('tag');
+
+        $graby = $this->getMockBuilder('Graby\Graby')->getMock();
+
+        $proxy = new ContentProxy($graby, $tagger, $this->getTagRepositoryMock(), $this->getLogger());
+        $entry = $proxy->updateEntry(new Entry(new User()), 'http://0.0.0.0', [
+            'html' => str_repeat('this is my content', 325),
+            'title' => 'this is my title',
+            'url' => 'http://1.1.1.1',
+            'content_type' => 'text/html',
+            'language' => 'fr',
+        ]);
+
+        $this->assertEquals('http://1.1.1.1', $entry->getUrl());
+        $this->assertEquals('this is my title', $entry->getTitle());
+        $this->assertContains('this is my content', $entry->getContent());
+        $this->assertEquals('text/html', $entry->getMimetype());
+        $this->assertEquals('fr', $entry->getLanguage());
+        $this->assertEquals(4.0, $entry->getReadingTime());
+        $this->assertEquals('1.1.1.1', $entry->getDomainName());
+    }
+
+    public function testTaggerThrowException()
+    {
+        $graby = $this->getMockBuilder('Graby\Graby')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $tagger = $this->getTaggerMock();
+        $tagger->expects($this->once())
+            ->method('tag')
+            ->will($this->throwException(new \Exception()));
+
+        $tagRepo = $this->getTagRepositoryMock();
+        $proxy = new ContentProxy($graby, $tagger, $tagRepo, $this->getLogger());
+
+        $entry = $proxy->updateEntry(new Entry(new User()), 'http://0.0.0.0', [
+            'html' => str_repeat('this is my content', 325),
+            'title' => 'this is my title',
+            'url' => 'http://1.1.1.1',
+            'content_type' => 'text/html',
+            'language' => 'fr',
+        ]);
+
+        $this->assertCount(0, $entry->getTags());
+    }
+
     public function testAssignTagsWithArrayAndExtraSpaces()
     {
         $graby = $this->getMockBuilder('Graby\Graby')
index 1d80421923cac43ed008f2ff8317e2a583598271..11ce649d636952db55164b194fd780806678d326 100644 (file)
@@ -38,6 +38,15 @@ class PocketController extends Controller
         $requestToken = $this->get('wallabag_import.pocket.import')
             ->getRequestToken($this->generateUrl('import', array(), UrlGeneratorInterface::ABSOLUTE_URL));
 
+        if (false === $requestToken) {
+            $this->get('session')->getFlashBag()->add(
+                'notice',
+                'flashes.import.notice.failed'
+            );
+
+            return $this->redirect($this->generateUrl('import_pocket'));
+        }
+
         $this->get('session')->set('import.pocket.code', $requestToken);
         $this->get('session')->set('mark_as_read', $request->request->get('form')['mark_as_read']);
 
index 4499ce6993563f41d1eccfddbf1b22f1743cb9e7..f598e61127c60d2b920ef73496c1b425e4fc6a0b 100644 (file)
@@ -68,7 +68,7 @@ class PocketImport implements ImportInterface
      *
      * @param string $redirectUri Redirect url in case of error
      *
-     * @return string request_token for callback method
+     * @return string|false request_token for callback method
      */
     public function getRequestToken($redirectUri)
     {
index 173a587f1cd6ea4c472f6ce78ff4112e50da493b..82160bae1e3ffe55b65a59a89a28ff63bf006551 100644 (file)
@@ -7,7 +7,6 @@ use Psr\Log\NullLogger;
 use Doctrine\ORM\EntityManager;
 use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\UserBundle\Entity\User;
-use Wallabag\CoreBundle\Tools\Utils;
 use Wallabag\CoreBundle\Helper\ContentProxy;
 
 class WallabagV1Import implements ImportInterface
@@ -153,19 +152,25 @@ class WallabagV1Import implements ImportInterface
                 continue;
             }
 
-            // @see ContentProxy->updateEntry
-            $entry = new Entry($this->user);
-            $entry->setUrl($importedEntry['url']);
+            $data = [
+                'title' => $importedEntry['title'],
+                'html' => $importedEntry['content'],
+                'url' => $importedEntry['url'],
+                'content_type' => '',
+                'language' => '',
+            ];
 
+            // force content to be refreshed in case on bad fetch in the v1 installation
             if (in_array($importedEntry['title'], $untitled)) {
-                $entry = $this->contentProxy->updateEntry($entry, $importedEntry['url']);
-            } else {
-                $entry->setContent($importedEntry['content']);
-                $entry->setTitle($importedEntry['title']);
-                $entry->setReadingTime(Utils::getReadingTime($importedEntry['content']));
-                $entry->setDomainName(parse_url($importedEntry['url'], PHP_URL_HOST));
+                $data = [];
             }
 
+            $entry = $this->contentProxy->updateEntry(
+                new Entry($this->user),
+                $importedEntry['url'],
+                $data
+            );
+
             if (array_key_exists('tags', $importedEntry) && $importedEntry['tags'] != '') {
                 $this->contentProxy->assignTagsToEntry(
                     $entry,
index 0a32864eb04ae16a7efaa0c188fe860343f6d3e3..b31d63a3356f2cbed18870396ce8e3280a0711d4 100644 (file)
@@ -47,25 +47,29 @@ class WallabagV2Import extends WallabagV1Import implements ImportInterface
                 continue;
             }
 
-            // @see ContentProxy->updateEntry
-            $entry = new Entry($this->user);
-            $entry->setUrl($importedEntry['url']);
-            $entry->setTitle($importedEntry['title']);
-            $entry->setArchived($importedEntry['is_archived'] || $this->markAsRead);
-            $entry->setStarred($importedEntry['is_starred']);
-            $entry->setContent($importedEntry['content']);
-            $entry->setReadingTime($importedEntry['reading_time']);
-            $entry->setDomainName($importedEntry['domain_name']);
-            if (isset($importedEntry['mimetype'])) {
-                $entry->setMimetype($importedEntry['mimetype']);
-            }
-            if (isset($importedEntry['language'])) {
-                $entry->setLanguage($importedEntry['language']);
+            $importedEntry['html'] = $importedEntry['content'];
+            $importedEntry['content_type'] = $importedEntry['mimetype'];
+
+            $entry = $this->contentProxy->updateEntry(
+                new Entry($this->user),
+                $importedEntry['url'],
+                $importedEntry
+            );
+
+            if (array_key_exists('tags', $importedEntry) && !empty($importedEntry['tags'])) {
+                $this->contentProxy->assignTagsToEntry(
+                    $entry,
+                    $importedEntry['tags']
+                );
             }
+
             if (isset($importedEntry['preview_picture'])) {
                 $entry->setPreviewPicture($importedEntry['preview_picture']);
             }
 
+            $entry->setArchived($importedEntry['is_archived'] || $this->markAsRead);
+            $entry->setStarred($importedEntry['is_starred']);
+
             $this->em->persist($entry);
             ++$this->importedEntries;
 
index 174641fd5be758a74c007661e756225fd8997f8c..403fe9b0d603b5d859aaea4c410d986e1fd10062 100644 (file)
@@ -17,11 +17,34 @@ class PocketControllerTest extends WallabagCoreTestCase
         $this->assertEquals(1, $crawler->filter('button[type=submit]')->count());
     }
 
+    public function testImportPocketAuthBadToken()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $crawler = $client->request('GET', '/import/pocket/auth');
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+    }
+
     public function testImportPocketAuth()
     {
+        $this->markTestSkipped('PocketImport: Find a way to properly mock a service.');
+
         $this->logInAs('admin');
         $client = $this->getClient();
 
+        $pocketImport = $this->getMockBuilder('Wallabag\ImportBundle\Import\PocketImport')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $pocketImport
+            ->expects($this->once())
+            ->method('getRequestToken')
+            ->willReturn('token');
+
+        $client->getContainer()->set('wallabag_import.pocket.import', $pocketImport);
+
         $crawler = $client->request('GET', '/import/pocket/auth');
 
         $this->assertEquals(301, $client->getResponse()->getStatusCode());
index bcbd6305774632b9cb0e5e1587a3965ea01f9841..490f9edeac834a38903eb178ed57c14d1e1c748d 100644 (file)
@@ -53,6 +53,7 @@ class WallabagV2ControllerTest extends WallabagCoreTestCase
         $this->assertEmpty($content->getMimetype());
         $this->assertEmpty($content->getPreviewPicture());
         $this->assertEmpty($content->getLanguage());
+        $this->assertEquals(0, count($content->getTags()));
 
         $content = $client->getContainer()
             ->get('doctrine.orm.entity_manager')
@@ -65,6 +66,7 @@ class WallabagV2ControllerTest extends WallabagCoreTestCase
         $this->assertNotEmpty($content->getMimetype());
         $this->assertNotEmpty($content->getPreviewPicture());
         $this->assertNotEmpty($content->getLanguage());
+        $this->assertEquals(2, count($content->getTags()));
     }
 
     public function testImportWallabagWithEmptyFile()
index 496cf2d37dc23d44235297686eaf7cce8e70ab5c..3ef852e5f78f864bc2da2861794c7901fd554fb0 100644 (file)
@@ -2,8 +2,9 @@
 
 namespace Wallabag\ImportBundle\Tests\Import;
 
-use Wallabag\UserBundle\Entity\User;
 use Wallabag\ImportBundle\Import\WallabagV1Import;
+use Wallabag\UserBundle\Entity\User;
+use Wallabag\CoreBundle\Entity\Entry;
 use Monolog\Logger;
 use Monolog\Handler\TestHandler;
 
@@ -71,7 +72,7 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $this->contentProxy
-            ->expects($this->once())
+            ->expects($this->exactly(3))
             ->method('updateEntry')
             ->willReturn($entry);
 
@@ -99,6 +100,11 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
             ->method('getRepository')
             ->willReturn($entryRepo);
 
+        $this->contentProxy
+            ->expects($this->exactly(3))
+            ->method('updateEntry')
+            ->willReturn(new Entry($this->user));
+
         // check that every entry persisted are archived
         $this->em
             ->expects($this->any())
index 341b107620a619f9878a14f9f93a5b6c2ab69267..dbefdee3002916a478baf77ef3593e81c1f3ff95 100644 (file)
@@ -4,6 +4,7 @@ namespace Wallabag\ImportBundle\Tests\Import;
 
 use Wallabag\ImportBundle\Import\WallabagV2Import;
 use Wallabag\UserBundle\Entity\User;
+use Wallabag\CoreBundle\Entity\Entry;
 use Monolog\Logger;
 use Monolog\Handler\TestHandler;
 
@@ -66,6 +67,11 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
             ->method('getRepository')
             ->willReturn($entryRepo);
 
+        $this->contentProxy
+            ->expects($this->exactly(2))
+            ->method('updateEntry')
+            ->willReturn(new Entry($this->user));
+
         $res = $wallabagV2Import->import();
 
         $this->assertTrue($res);
@@ -90,6 +96,11 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
             ->method('getRepository')
             ->willReturn($entryRepo);
 
+        $this->contentProxy
+            ->expects($this->exactly(2))
+            ->method('updateEntry')
+            ->willReturn(new Entry($this->user));
+
         // check that every entry persisted are archived
         $this->em
             ->expects($this->any())
index 37d2d0ae8b60221d593bea8413c02aa4507c67f8..618ce546fb083f54b7db615426bd5db51cf4af81 100644 (file)
@@ -1,31 +1,34 @@
 [
     {
         "id": "23",
-        "title": "Site d'information fran\u00e7ais d'actualit\u00e9s ind\u00e9pendant et participatif en ligne | Mediapart",
-        "url": "https:\/\/www.mediapart.fr\/",
+        "title": "Site d'information français d'actualités indépendant et participatif en ligne | Mediapart",
+        "url": "https://www.mediapart.fr/",
         "is_archived": false,
         "is_starred": false,
-        "content": "<div alt=\"li\">\u00c9dition <a href=\"https:\/\/blogs.mediapart.fr\/edition\/camedia-0\">CAM\u00e9dia<\/a>\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/edition\/camedia\/article\/180116\/deux-nouvelles-editions-pour-debattre-dans-le-club-sur-la-laicite-et-sur-la-democratie\">Deux nouvelles \u00e9ditions pour d\u00e9battre dans le club sur la la\u00efcit\u00e9 et sur la d\u00e9mocratie<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>CAM\u00e9dia apr\u00e8s un \u00e9change sur \u00ab\u00a0l'\u00e9thique du d\u00e9bat\u00a0\u00bb a lanc\u00e9 deux discussions , l'une sur le th\u00e8me de la la\u00efcit\u00e9, l'autre ( encore en cours) sur celui de la d\u00e9mocratie. Nous sommes heureux de pouvoir signaler la cr\u00e9ation de deux nouvelles \u00e9ditions participatives sur ces th\u00e8mes. Nous vous invitons \u00e0 les lire et \u00e0 participer \u00e0 leurs d\u00e9bats.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/lucile-longre\/blog\/170116\/de-limportance-de-rever-eloge-du-merveilleux\">De l'importance de r\u00eaver, \u00e9loge du merveilleux<\/a><\/h3>\n<p>17 janv. 2016 | Par <\/p>\n<p>Je parlerai ici des r\u00eaves comme moteur de vie, de ces r\u00eaves qui vous rattachent et vous font esp\u00e9rer \u00e0 ce qu\u2019il y a de plus humain dans l\u2019homme, m\u00eame au milieu de la plus noire des d\u00e9tresses.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/barbara-romagnan\/blog\/180116\/fins-dune-toute-puissance\">Fin(s) d'une toute-puissance<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>En ce d\u00e9but d\u2019ann\u00e9e, je recommande la lecture du dernier ouvrage de Guillaume Duval, La France ne sera jamais plus une grande puissance ? Tant mieux !<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jean-pierre-thibaudat\/blog\/170116\/l-allier-departement-de-destruction-massive-du-tissu-culturel\">L\u2019Allier, d\u00e9partement de destruction massive du tissu culturel<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Les temps sont durs pour les petites structures, les associations culturelles qui, de bourgades en villages, travaillent au c\u0153ur des r\u00e9gions. Leurs subventions sont souvent revues \u00e0 la baisse. Le d\u00e9partement de l\u2019Allier les a carr\u00e9ment supprim\u00e9es. Pour favoriser \u00ab l\u2019\u00e9v\u00e9nementiel \u00bb.<\/p>\n<\/div><div alt=\"li\">\u00c9dition <a href=\"https:\/\/blogs.mediapart.fr\/edition\/les-invites-de-mediapart\">Les invit\u00e9s de Mediapart<\/a>\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/edition\/les-invites-de-mediapart\/article\/180116\/la-democratie-deja-attaquee-par-la-cooperation-reglementaire-transatlantiqu\">La d\u00e9mocratie d\u00e9j\u00e0 attaqu\u00e9e par la coop\u00e9ration r\u00e9glementaire transatlantique<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Lora Verheecke et David Lundy travaillent pour Corporate Europe Observatory, une ONG bas\u00e9e \u00e0 Bruxelles qui enqu\u00eate sur le pouvoir des lobbies des grandes entreprises sur la politique de l\u2019Union europ\u00e9enne. Ils r\u00e9v\u00e8lent que depuis 25 ans le projet de \u00ab coop\u00e9ration r\u00e9glementaire \u00bb men\u00e9 par l\u2019Union europ\u00e9enne et les \u00c9tats-Unis a \u00e9t\u00e9 domin\u00e9 par les grandes entreprises. ET que le TTIP cherche \u00e0 ent\u00e9riner ce projet.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jacqueline-derens\/blog\/180116\/2016-une-annee-test-pour-jacob-zuma-et-son-gouvernement\">2016, une ann\u00e9e test pour Jacob Zuma et son gouvernement<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Les turbulences de l\u2019an pass\u00e9 ont toutes les chances de continuer \u00e0 troubler le climat politique et social de l\u2019Afrique du Sud en 2016. La situation exige des changements profonds dans la conduite des affaires du pays. Jacob Zuma tout en admettant la n\u00e9cessit\u00e9 de ces changements, est-il l\u2019homme de la situation ? Son gouvernement r\u00e9pondra-t-il aux attentes des citoyens sud-africains ?<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/marie-cosnay\/blog\/140116\/un-mal-fou-janvier-2016\">Un mal fou (janvier 2016)<\/a><\/h3>\n<p>14 janv. 2016 | Par <\/p>\n<p>J\u2019ai une fringale d\u2019aventure, d\u2019aventures \u00e0 venir. J\u2019ai la fringale de la fringale des aventures et soudain, rupture. Je n\u2019y arrive plus, tout est bloqu\u00e9, tout emp\u00each\u00e9. Faut dire que depuis un an environ, tout est devenu plus compliqu\u00e9. Ecrire va de moins en moins de soi.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jean-pierre-veran\/blog\/170116\/redoublement-le-changement-bas-bruit\">Redoublement : le changement \u00e0 bas bruit ?<\/a><\/h3>\n<p>17 janv. 2016 | Par <\/p>\n<p>S\u2019il est une caract\u00e9ristique de la forme scolaire fran\u00e7aise bien \u00e9tablie dans la culture des personnels, des \u00e9l\u00e8ves et des parents, c\u2019est bien le redoublement, cens\u00e9 sanctionner des r\u00e9sultats insuffisants pour envisager le passage dans la classe sup\u00e9rieure. Or, en ce domaine, l\u2019\u00e9volution est nette.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/michel-de-pracontal\/blog\/160116\/samedi-sciences-196-des-chasseurs-de-mammouths-en-arctique-il-y-45-000-ans\">Samedi-sciences (196): des chasseurs de mammouths en Arctique il y a 45 000 ans<\/a><\/h3>\n<p>16 janv. 2016 | Par <a href=\"https:\/\/blogs.mediapart.fr\/michel-de-pracontal\" class=\"journalist\">Michel de Pracontal<\/a><\/p>\n<p>Les restes d\u2019un mammouth retrouv\u00e9s en Arctique sib\u00e9rien, dat\u00e9s de 45 000 ans, portent les traces de blessures inflig\u00e9es par des chasseurs humains. Les scientifiques pensaient jusqu\u2019ici que notre esp\u00e8ce ne s\u2019\u00e9tait pas aventur\u00e9e dans cette r\u00e9gion glaciale il y a plus de 30 000 ou 35 0000 ans. En r\u00e9alit\u00e9, des hommes ont r\u00e9ussi \u00e0 survivre en Arctique au moins 10 000 ans plus t\u00f4t que l\u2019on croyait.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/alain-zolty\/blog\/140116\/de-la-democratie-du-citoyen-et-de-lethique\">De la d\u00e9mocratie, du citoyen et de l'\u00e9thique<\/a><\/h3>\n<p>14 janv. 2016 | Par <\/p>\n<p>Trois ouvrages sont parus au Seuil, qui font \u00e9tat de la n\u00e9cessit\u00e9 d\u2019int\u00e9grer le citoyen dans la gouvernance de la nation. Non pas \u00e0 titre consultatif mais dot\u00e9 d\u2019un pouvoir d\u00e9lib\u00e9ratif pour constituer une contre-force face aux clans politico-financiers qui dominent la vie publique.<\/p>\n<\/div>",
-        "mimetype": "text\/html",
+        "content": "<div alt=\"li\">Édition <a href=\"https://blogs.mediapart.fr/edition/camedia-0\">CAMédia</a>\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/edition/camedia/article/180116/deux-nouvelles-editions-pour-debattre-dans-le-club-sur-la-laicite-et-sur-la-democratie\">Deux nouvelles éditions pour débattre dans le club sur la laïcité et sur la démocratie</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>CAMédia après un échange sur « l'éthique du débat » a lancé deux discussions , l'une sur le thème de la laïcité, l'autre ( encore en cours) sur celui de la démocratie. Nous sommes heureux de pouvoir signaler la création de deux nouvelles éditions participatives sur ces thèmes. Nous vous invitons à les lire et à participer à leurs débats.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/lucile-longre/blog/170116/de-limportance-de-rever-eloge-du-merveilleux\">De l'importance de rêver, éloge du merveilleux</a></h3>\n<p>17 janv. 2016 | Par </p>\n<p>Je parlerai ici des rêves comme moteur de vie, de ces rêves qui vous rattachent et vous font espérer à ce qu’il y a de plus humain dans l’homme, même au milieu de la plus noire des détresses.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/barbara-romagnan/blog/180116/fins-dune-toute-puissance\">Fin(s) d'une toute-puissance</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>En ce début d’année, je recommande la lecture du dernier ouvrage de Guillaume Duval, La France ne sera jamais plus une grande puissance ? Tant mieux !</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/jean-pierre-thibaudat/blog/170116/l-allier-departement-de-destruction-massive-du-tissu-culturel\">L’Allier, département de destruction massive du tissu culturel</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>Les temps sont durs pour les petites structures, les associations culturelles qui, de bourgades en villages, travaillent au cœur des régions. Leurs subventions sont souvent revues à la baisse. Le département de l’Allier les a carrément supprimées. Pour favoriser « l’événementiel ».</p>\n</div><div alt=\"li\">Édition <a href=\"https://blogs.mediapart.fr/edition/les-invites-de-mediapart\">Les invités de Mediapart</a>\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/edition/les-invites-de-mediapart/article/180116/la-democratie-deja-attaquee-par-la-cooperation-reglementaire-transatlantiqu\">La démocratie déjà attaquée par la coopération réglementaire transatlantique</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>Lora Verheecke et David Lundy travaillent pour Corporate Europe Observatory, une ONG basée à Bruxelles qui enquête sur le pouvoir des lobbies des grandes entreprises sur la politique de l’Union européenne. Ils révèlent que depuis 25 ans le projet de « coopération réglementaire » mené par l’Union européenne et les États-Unis a été dominé par les grandes entreprises. ET que le TTIP cherche à entériner ce projet.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/jacqueline-derens/blog/180116/2016-une-annee-test-pour-jacob-zuma-et-son-gouvernement\">2016, une année test pour Jacob Zuma et son gouvernement</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>Les turbulences de l’an passé ont toutes les chances de continuer à troubler le climat politique et social de l’Afrique du Sud en 2016. La situation exige des changements profonds dans la conduite des affaires du pays. Jacob Zuma tout en admettant la nécessité de ces changements, est-il l’homme de la situation ? Son gouvernement répondra-t-il aux attentes des citoyens sud-africains ?</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/marie-cosnay/blog/140116/un-mal-fou-janvier-2016\">Un mal fou (janvier 2016)</a></h3>\n<p>14 janv. 2016 | Par </p>\n<p>J’ai une fringale d’aventure, d’aventures à venir. J’ai la fringale de la fringale des aventures et soudain, rupture. Je n’y arrive plus, tout est bloqué, tout empêché. Faut dire que depuis un an environ, tout est devenu plus compliqué. Ecrire va de moins en moins de soi.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/jean-pierre-veran/blog/170116/redoublement-le-changement-bas-bruit\">Redoublement : le changement à bas bruit ?</a></h3>\n<p>17 janv. 2016 | Par </p>\n<p>S’il est une caractéristique de la forme scolaire française bien établie dans la culture des personnels, des élèves et des parents, c’est bien le redoublement, censé sanctionner des résultats insuffisants pour envisager le passage dans la classe supérieure. Or, en ce domaine, l’évolution est nette.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/michel-de-pracontal/blog/160116/samedi-sciences-196-des-chasseurs-de-mammouths-en-arctique-il-y-45-000-ans\">Samedi-sciences (196): des chasseurs de mammouths en Arctique il y a 45 000 ans</a></h3>\n<p>16 janv. 2016 | Par <a href=\"https://blogs.mediapart.fr/michel-de-pracontal\" class=\"journalist\">Michel de Pracontal</a></p>\n<p>Les restes d’un mammouth retrouvés en Arctique sibérien, datés de 45 000 ans, portent les traces de blessures infligées par des chasseurs humains. Les scientifiques pensaient jusqu’ici que notre espèce ne s’était pas aventurée dans cette région glaciale il y a plus de 30 000 ou 35 0000 ans. En réalité, des hommes ont réussi à survivre en Arctique au moins 10 000 ans plus tôt que l’on croyait.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/alain-zolty/blog/140116/de-la-democratie-du-citoyen-et-de-lethique\">De la démocratie, du citoyen et de l'éthique</a></h3>\n<p>14 janv. 2016 | Par </p>\n<p>Trois ouvrages sont parus au Seuil, qui font état de la nécessité d’intégrer le citoyen dans la gouvernance de la nation. Non pas à titre consultatif mais doté d’un pouvoir délibératif pour constituer une contre-force face aux clans politico-financiers qui dominent la vie publique.</p>\n</div>",
+        "mimetype": "text/html",
         "language": "fr",
         "reading_time": 3,
         "domain_name": "www.mediapart.fr",
-        "preview_picture": "https:\/\/www.mediapart.fr\/images\/social\/800\/mediapart.png",
-        "tags": []
-    }
-    ,
+        "preview_picture": "https://www.mediapart.fr/images/social/800/mediapart.png",
+        "tags": [
+            "mediapart",
+            "blog"
+        ]
+    },
     {
         "id": 22,
-        "title": "R\u00e9fugi\u00e9s: l'UE va cr\u00e9er 100\u00a0000\u00a0places d'accueil dans les Balkans",
-        "url": "http:\/\/www.liberation.fr\/planete\/2015\/10\/26\/refugies-l-ue-va-creer-100-000-places-d-accueil-dans-les-balkans_1408867",
+        "title": "Réfugiés: l'UE va créer 100 000 places d'accueil dans les Balkans",
+        "url": "http://www.liberation.fr/planete/2015/10/26/refugies-l-ue-va-creer-100-000-places-d-accueil-dans-les-balkans_1408867",
         "is_archived": false,
         "is_starred": false,
-        "content": "<p>Pour un sommet sur les r\u00e9fugi\u00e9s qui devait se concentrer sur des <em>\u00abmesures op\u00e9rationnelles imm\u00e9diates\u00bb<\/em> dans les Balkans, la r\u00e9union, dimanche \u00e0 Bruxelles, de 11\u00a0chefs d\u2019Etat et de gouvernement, dont 8 Europ\u00e9ens, a \u00e9t\u00e9 agit\u00e9e. D\u00e8s leur arriv\u00e9e, Viktor\u00a0Orb\u00e1n (Hongrie) et\u00a0Al\u00e9xis Ts\u00edpras (Gr\u00e8ce) se sont jet\u00e9 des anath\u00e8mes. Le Premier ministre grec a d\u00e9nonc\u00e9 l\u2019attitude <em>\u00abnot in my backyard\u00bb<\/em> (pas de \u00e7a chez moi) de certains Etats europ\u00e9ens, alors que son pays est montr\u00e9 du doigt par d\u2019autres dirigeants, dont\u00a0Orb\u00e1n\u00a0: ils reprochent \u00e0 la Gr\u00e8ce de ne pas suffisamment contr\u00f4ler ses fronti\u00e8res avec la Turquie et ne pas montrer assez de z\u00e8le dans l\u2019enregistrement des demandeurs d\u2019asile.<\/p>\n<p>Le sommet, convoqu\u00e9 par la Commission europ\u00e9enne, sur suggestion de l\u2019Allemagne, aura au moins permis \u00e0 ces 11\u00a0Etats \u2013\u00a0Autriche, Bulgarie, Croatie, Allemagne, Gr\u00e8ce, Hongrie, Roumanie, Slov\u00e9nie c\u00f4t\u00e9 europ\u00e9en, et 3 pays \u00abnon UE\u00bb, Albanie, Mac\u00e9doine et Serbie\u00a0\u2013 de discuter ensemble.<\/p>\n<h3>400\u00a0policiers europ\u00e9ens en Slov\u00e9nie<\/h3>\n<p>L\u2019objectif, rappel\u00e9 par Angela Merkel, \u00e9tait de trouver une <em>\u00abr\u00e9ponse coordonn\u00e9e\u00bb<\/em> \u00e0 la crise des r\u00e9fugi\u00e9s. Quelques mesures ont \u00e9t\u00e9 annonc\u00e9es\u00a0: 100\u00a0000\u00a0places d\u2019accueil seront cr\u00e9\u00e9es, dont 50\u00a0000 en Gr\u00e8ce, et le reste le long de la route des Balkans.\u00a0400\u00a0officiers de police de pays europ\u00e9ens partiront en Slov\u00e9nie, actuellement submerg\u00e9e, pour aider au contr\u00f4le des fronti\u00e8res. Frontex, l\u2019agence europ\u00e9enne de surveillance des fronti\u00e8res, s\u2019impliquera aux fronti\u00e8res gr\u00e9co-mac\u00e9donienne et gr\u00e9co-albanaise pour des contr\u00f4les et identifications.<\/p>\n<p>Ce sommet est intervenu dans un contexte de fortes tensions, marqu\u00e9 par des fermetures de fronti\u00e8res bloquant les r\u00e9fugi\u00e9s dans des zones tampon. Ces obstacles ont \u00e9t\u00e9 partiellement lev\u00e9s ces derniers jours, les autorit\u00e9s tentant d\u2019organiser un \u00abcorridor\u00bb informel vers l\u2019Allemagne, qui pourtant durcit sa politique d\u2019accueil et souhaite d\u00e9sormais ralentir le flux. Mais la situation des r\u00e9fugi\u00e9s est catastrophique. L\u2019ONG Human Rights Watch craint que des r\u00e9fugi\u00e9s ne meurent dans les Balkans. Des groupes de centaines, voire de milliers de personnes, bloqu\u00e9s pr\u00e8s des postes-fronti\u00e8res, se retrouvent dans des conditions humanitaires intenables.<\/p>\n<p>Depuis mi-septembre, 250\u00a0000\u00a0personnes ont travers\u00e9 les Balkans. En une semaine, la Slov\u00e9nie a vu 60\u00a0000\u00a0r\u00e9fugi\u00e9s fouler le sol de son territoire. Dimanche, 15\u00a0000\u00a0personnes ont transit\u00e9 en Slov\u00e9nie.<\/p>\n<h3>Des zones tampon<\/h3>\n<p>L\u2019enjeu principal du sommet, aux yeux de nombreux Etats de l\u2019Union europ\u00e9enne, \u00e9tait aussi que les pays des Balkans <em>\u00abprennent leur part\u00bb<\/em> face \u00e0 la crise\u00a0: qu\u2019ils accueillent et enregistrent davantage de r\u00e9fugi\u00e9s. Ces Etats craignent que l\u2019Autriche ou l\u2019Allemagne ne ferment leurs fronti\u00e8res et fassent de leurs pays des <em>\u00abzones tampon\u00bb<\/em>, comme s\u2019en inqui\u00e9tait Boyko Borissov, Premier ministre bulgare.<\/p>\n<p><em>\u00ab\u00a0Aujourd\u2019hui, plusieurs Etats du nord de l\u2019Europe veulent que l\u2019on enregistre les migrants puis que l\u2019on d\u00e9termine leur \u00e9ligibilit\u00e9 au statut de r\u00e9fugi\u00e9,<\/em> explique Marc Pierini, du think tank Carnegie Europe. <em>La difficult\u00e9, c\u2019est que les gens sont en mouvement. Pour le faire, il faut se poser quelque part. La crainte des pays interm\u00e9diaires, donc ceux des Balkans, est qu\u2019on enregistre ces personnes sur leur territoire et qu\u2019ils soient contraints de rester sur leur sol. Donc les pays des Balkans ne sont pas d\u00e9sireux d\u2019accueillir ces r\u00e9fugi\u00e9s et ces derniers veulent avancer.\u00bb<\/em><\/p>\n<p>Le sommet a \u00e9labor\u00e9 quelques principes. L\u2019id\u00e9e g\u00e9n\u00e9rale est de rendre effective la \u00ablogique de hotspot\u00bb\u00a0: un enregistrement des demandeurs d\u2019asile \u00e0 leur point d\u2019entr\u00e9e dans l\u2019Union europ\u00e9enne, suivi de l\u2019expulsion de ceux qui ne correspondraient pas aux crit\u00e8res de la Convention de Gen\u00e8ve, et la r\u00e9partition des autres, via le m\u00e9canisme de relocalisation.<\/p>\n<p>Dans ce cadre, l\u2019enregistrement des demandeurs d\u2019asile est un \u00e9l\u00e9ment cl\u00e9. <em>\u00abPas d\u2019enregistrement, pas de droit\u00bb<\/em>, a pr\u00e9venu le pr\u00e9sident de la Commission europ\u00e9enne, Jean-Claude Juncker, dimanche soir. Les Etats ont tenu \u00e0 rappeler que les migrants qui refusent de demander l\u2019asile \u00e0 la fronti\u00e8re peuvent se voir refuser l\u2019entr\u00e9e dans un pays.<\/p>\n<p>Et les Etats <em>\u00abd\u00e9courageront les mouvements de r\u00e9fugi\u00e9s\u00bb<\/em> de fronti\u00e8re en fronti\u00e8re. La politique consistant \u00e0 laisser passer les migrants vers un autre pays est officiellement jug\u00e9e <em>\u00abinacceptable\u00bb<\/em>.<\/p>\n<h3>Se jeter dans la gueule du loup<\/h3>\n<p>Voil\u00e0 pour la th\u00e9orie. En pratique, la relocalisation ne devrait concerner que 160\u00a0000\u00a0r\u00e9fugi\u00e9s en deux\u00a0ans, alors que pr\u00e8s de 700\u00a0000\u00a0personnes sont arriv\u00e9es en Europe depuis le d\u00e9but de l\u2019ann\u00e9e. De plus, les Etats ne jouent pas le jeu. La semaine pass\u00e9e, seules 854\u00a0places de relocalisation avaient \u00e9t\u00e9 propos\u00e9es.<\/p>\n<p>Dans ce contexte, il est probable que les Etats des Balkans ne s\u2019impliqueront pas outre mesure dans les solutions propos\u00e9es, craignant de devoir \u00abgarder\u00bb les r\u00e9fugi\u00e9s alors que l\u2019Union europ\u00e9enne tarde \u00e0 mettre en \u0153uvre leur r\u00e9partition.<\/p>\n<p>Quant aux r\u00e9fugi\u00e9s, ils pr\u00e9f\u00e8rent traverser les fronti\u00e8res par eux-m\u00eames, plut\u00f4t que de se jeter dans ces \u00abhotspots\u00bb, consid\u00e9r\u00e9s comme la gueule du loup.<\/p>\n<a itemprop=\"name\" href=\"http:\/\/www.liberation.fr\/auteur\/15743-cedric-vallet\">C\u00e9dric Vallet<\/a>",
+        "content": "<p>Pour un sommet sur les réfugiés qui devait se concentrer sur des <em>«mesures opérationnelles immédiates»</em> dans les Balkans, la réunion, dimanche à Bruxelles, de 11 chefs d’Etat et de gouvernement, dont 8 Européens, a été agitée. Dès leur arrivée, Viktor Orbán (Hongrie) et Aléxis Tsípras (Grèce) se sont jeté des anathèmes. Le Premier ministre grec a dénoncé l’attitude <em>«not in my backyard»</em> (pas de ça chez moi) de certains Etats européens, alors que son pays est montré du doigt par d’autres dirigeants, dont Orbán : ils reprochent à la Grèce de ne pas suffisamment contrôler ses frontières avec la Turquie et ne pas montrer assez de zèle dans l’enregistrement des demandeurs d’asile.</p>\n<p>Le sommet, convoqué par la Commission européenne, sur suggestion de l’Allemagne, aura au moins permis à ces 11 Etats – Autriche, Bulgarie, Croatie, Allemagne, Grèce, Hongrie, Roumanie, Slovénie côté européen, et 3 pays «non UE», Albanie, Macédoine et Serbie – de discuter ensemble.</p>\n<h3>400 policiers européens en Slovénie</h3>\n<p>L’objectif, rappelé par Angela Merkel, était de trouver une <em>«réponse coordonnée»</em> à la crise des réfugiés. Quelques mesures ont été annoncées : 100 000 places d’accueil seront créées, dont 50 000 en Grèce, et le reste le long de la route des Balkans. 400 officiers de police de pays européens partiront en Slovénie, actuellement submergée, pour aider au contrôle des frontières. Frontex, l’agence européenne de surveillance des frontières, s’impliquera aux frontières gréco-macédonienne et gréco-albanaise pour des contrôles et identifications.</p>\n<p>Ce sommet est intervenu dans un contexte de fortes tensions, marqué par des fermetures de frontières bloquant les réfugiés dans des zones tampon. Ces obstacles ont été partiellement levés ces derniers jours, les autorités tentant d’organiser un «corridor» informel vers l’Allemagne, qui pourtant durcit sa politique d’accueil et souhaite désormais ralentir le flux. Mais la situation des réfugiés est catastrophique. L’ONG Human Rights Watch craint que des réfugiés ne meurent dans les Balkans. Des groupes de centaines, voire de milliers de personnes, bloqués près des postes-frontières, se retrouvent dans des conditions humanitaires intenables.</p>\n<p>Depuis mi-septembre, 250 000 personnes ont traversé les Balkans. En une semaine, la Slovénie a vu 60 000 réfugiés fouler le sol de son territoire. Dimanche, 15 000 personnes ont transité en Slovénie.</p>\n<h3>Des zones tampon</h3>\n<p>L’enjeu principal du sommet, aux yeux de nombreux Etats de l’Union européenne, était aussi que les pays des Balkans <em>«prennent leur part»</em> face à la crise : qu’ils accueillent et enregistrent davantage de réfugiés. Ces Etats craignent que l’Autriche ou l’Allemagne ne ferment leurs frontières et fassent de leurs pays des <em>«zones tampon»</em>, comme s’en inquiétait Boyko Borissov, Premier ministre bulgare.</p>\n<p><em>« Aujourd’hui, plusieurs Etats du nord de l’Europe veulent que l’on enregistre les migrants puis que l’on détermine leur éligibilité au statut de réfugié,</em> explique Marc Pierini, du think tank Carnegie Europe. <em>La difficulté, c’est que les gens sont en mouvement. Pour le faire, il faut se poser quelque part. La crainte des pays intermédiaires, donc ceux des Balkans, est qu’on enregistre ces personnes sur leur territoire et qu’ils soient contraints de rester sur leur sol. Donc les pays des Balkans ne sont pas désireux d’accueillir ces réfugiés et ces derniers veulent avancer.»</em></p>\n<p>Le sommet a élaboré quelques principes. L’idée générale est de rendre effective la «logique de hotspot» : un enregistrement des demandeurs d’asile à leur point d’entrée dans l’Union européenne, suivi de l’expulsion de ceux qui ne correspondraient pas aux critères de la Convention de Genève, et la répartition des autres, via le mécanisme de relocalisation.</p>\n<p>Dans ce cadre, l’enregistrement des demandeurs d’asile est un élément clé. <em>«Pas d’enregistrement, pas de droit»</em>, a prévenu le président de la Commission européenne, Jean-Claude Juncker, dimanche soir. Les Etats ont tenu à rappeler que les migrants qui refusent de demander l’asile à la frontière peuvent se voir refuser l’entrée dans un pays.</p>\n<p>Et les Etats <em>«décourageront les mouvements de réfugiés»</em> de frontière en frontière. La politique consistant à laisser passer les migrants vers un autre pays est officiellement jugée <em>«inacceptable»</em>.</p>\n<h3>Se jeter dans la gueule du loup</h3>\n<p>Voilà pour la théorie. En pratique, la relocalisation ne devrait concerner que 160 000 réfugiés en deux ans, alors que près de 700 000 personnes sont arrivées en Europe depuis le début de l’année. De plus, les Etats ne jouent pas le jeu. La semaine passée, seules 854 places de relocalisation avaient été proposées.</p>\n<p>Dans ce contexte, il est probable que les Etats des Balkans ne s’impliqueront pas outre mesure dans les solutions proposées, craignant de devoir «garder» les réfugiés alors que l’Union européenne tarde à mettre en œuvre leur répartition.</p>\n<p>Quant aux réfugiés, ils préfèrent traverser les frontières par eux-mêmes, plutôt que de se jeter dans ces «hotspots», considérés comme la gueule du loup.</p>\n<a itemprop=\"name\" href=\"http://www.liberation.fr/auteur/15743-cedric-vallet\">Cédric Vallet</a>",
+        "mimetype": "",
+        "language": "",
         "reading_time": 4,
         "domain_name": "www.liberation.fr",
         "tags": []
-    }
-    ,
+    },
     {
         "id": "21",
         "title": "No title found",
@@ -33,6 +36,8 @@
         "is_archived": false,
         "is_starred": true,
         "content": "Oh, what a shame, no content",
+        "mimetype": "",
+        "language": "",
         "reading_time": 4,
         "domain_name": "news.nationalgeographic.com",
         "tags": []