]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #3332 from nclsHart/better-txt-export
authorNicolas Lœuillet <nicolas@loeuillet.org>
Wed, 6 Sep 2017 13:08:12 +0000 (15:08 +0200)
committerGitHub <noreply@github.com>
Wed, 6 Sep 2017 13:08:12 +0000 (15:08 +0200)
Better entry txt export using html2text

20 files changed:
app/DoctrineMigrations/Version20170719231144.php [new file with mode: 0644]
app/DoctrineMigrations/Version20170824113337.php [new file with mode: 0644]
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.de.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.oc.yml
src/Wallabag/ApiBundle/Controller/EntryRestController.php
src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Entity/Tag.php
src/Wallabag/CoreBundle/Helper/TagsAssigner.php
src/Wallabag/CoreBundle/Repository/EntryRepository.php
src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
src/Wallabag/CoreBundle/Resources/translations/validators.oc.yml
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
src/Wallabag/UserBundle/Resources/translations/wallabag_user.oc.yml
tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
tests/Wallabag/CoreBundle/Controller/TagControllerTest.php
tests/Wallabag/ImportBundle/Controller/PinboardControllerTest.php
tests/Wallabag/ImportBundle/Controller/WallabagV1ControllerTest.php

diff --git a/app/DoctrineMigrations/Version20170719231144.php b/app/DoctrineMigrations/Version20170719231144.php
new file mode 100644 (file)
index 0000000..0f5fa75
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+
+namespace Application\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Changed tags to lowercase.
+ */
+class Version20170719231144 extends AbstractMigration implements ContainerAwareInterface
+{
+    /**
+     * @var ContainerInterface
+     */
+    private $container;
+
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->skipIf($this->connection->getDatabasePlatform()->getName() === 'sqlite', 'Migration can only be executed safely on \'mysql\' or \'postgresql\'.');
+
+        // Find tags which need to be merged
+        $dupTags = $this->connection->query('
+            SELECT LOWER(label)
+            FROM   ' . $this->getTable('tag') . '
+            GROUP BY LOWER(label)
+            HAVING COUNT(*) > 1'
+        );
+        $dupTags->execute();
+
+        foreach ($dupTags->fetchAll() as $duplicates) {
+            $label = $duplicates['LOWER(label)'];
+
+            // Retrieve all duplicate tags for a given tag
+            $tags = $this->connection->query('
+                SELECT id
+                FROM   ' . $this->getTable('tag') . "
+                WHERE  LOWER(label) = '" . $label . "'
+                ORDER BY id ASC"
+            );
+            $tags->execute();
+
+            $first = true;
+            $newId = null;
+            $ids = [];
+
+            foreach ($tags->fetchAll() as $tag) {
+                // Ignore the first tag as we use it as the new reference tag
+                if ($first) {
+                    $first = false;
+                    $newId = $tag['id'];
+                } else {
+                    $ids[] = $tag['id'];
+                }
+            }
+
+            // Just in case...
+            if (count($ids) > 0) {
+                // Merge tags
+                $this->addSql('
+                    UPDATE ' . $this->getTable('entry_tag') . '
+                    SET    tag_id = ' . $newId . '
+                    WHERE  tag_id IN (' . implode(',', $ids) . ')'
+                );
+
+                // Delete unused tags
+                $this->addSql('
+                    DELETE FROM ' . $this->getTable('tag') . '
+                    WHERE id IN (' . implode(',', $ids) . ')'
+                );
+            }
+        }
+
+        // Iterate over all tags to lowercase them
+        $this->addSql('
+            UPDATE ' . $this->getTable('tag') . '
+            SET label = LOWER(label)'
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        throw new SkipMigrationException('Too complex ...');
+    }
+
+    private function getTable($tableName)
+    {
+        return $this->container->getParameter('database_table_prefix') . $tableName;
+    }
+}
diff --git a/app/DoctrineMigrations/Version20170824113337.php b/app/DoctrineMigrations/Version20170824113337.php
new file mode 100644 (file)
index 0000000..7393d68
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+namespace Application\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Add starred_at column and set its value to updated_at for is_starred entries.
+ */
+class Version20170824113337 extends AbstractMigration implements ContainerAwareInterface
+{
+    /**
+     * @var ContainerInterface
+     */
+    private $container;
+
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $entryTable = $schema->getTable($this->getTable('entry'));
+
+        $this->skipIf($entryTable->hasColumn('starred_at'), 'It seems that you already played this migration.');
+
+        $entryTable->addColumn('starred_at', 'datetime', [
+            'notnull' => false,
+        ]);
+    }
+
+    public function postUp(Schema $schema)
+    {
+        $entryTable = $schema->getTable($this->getTable('entry'));
+        $this->skipIf(!$entryTable->hasColumn('starred_at'), 'Unable to add starred_at colum');
+
+        $this->connection->executeQuery('UPDATE ' . $this->getTable('entry') . ' SET starred_at = updated_at WHERE is_starred = true');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $entryTable = $schema->getTable($this->getTable('entry'));
+
+        $this->skipIf(!$entryTable->hasColumn('starred_at'), 'It seems that you already played this migration.');
+
+        $entryTable->dropColumn('starred_at');
+    }
+
+    private function getTable($tableName)
+    {
+        return $this->container->getParameter('database_table_prefix') . $tableName;
+    }
+}
index f57db3032d976d68f58398923deb321dffd59d0f..a066c8e3fa4a0b68cd6d98fa97f866a9bd06dab9 100644 (file)
@@ -1,36 +1,36 @@
-# settings_changed: Configuration updated
-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
-import_with_rabbitmq: Aktiviere RabbitMQ, um Artikel asynchron zu importieren
-import_with_redis: Aktiviere Redis, um Artikel asynchron zu importieren
-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_scuttle: Teilen zu Scuttle aktiveren
-share_twitter: Teilen zu Twitter aktiveren
-share_unmark: Teilen zu Unmark.it aktiveren
-show_printlink: Link anzeigen, um den Inhalt auszudrucken
-wallabag_support_url: Support-URL für wallabag
-entry: "Artikel"
-export: "Export"
-import: "Import"
-misc: "Verschiedenes"
-modify_settings: "Übernehmen"
-piwik_host: Host deiner Webseite in Piwik (ohne http:// oder https://)
-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"
-share_public: Erlaube eine öffentliche URL für Einträge
-# download_images_enabled: Download images locally
-# restricted_access: Enable authentication for websites with paywall
-# api_user_registration: Enable user to be registered using the API
+settings_changed: 'Konfiguration aktualisiert'
+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'
+import_with_rabbitmq: 'Aktiviere RabbitMQ, um Artikel asynchron zu importieren'
+import_with_redis: 'Aktiviere Redis, um Artikel asynchron zu importieren'
+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'
+share_unmark: 'Teilen zu Unmark.it 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 (ohne http:// oder https://)'
+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'
+share_public: 'Erlaube eine öffentliche URL für Einträge'
+download_images_enabled: 'Bilder lokal herunterladen'
+restricted_access: 'Authentifizierung für Webseiten mit Paywall aktivieren'
+api_user_registration: 'Registrierung eines Benutzers über die API ermöglichen'
index 0861d59cc05549b31bde8f28384c2ccc6486ea1d..fb163ce768c14a5ec37ecd2971b78c2433b21841 100644 (file)
@@ -12,7 +12,7 @@ export_xml: Activar l'expòrt XML
 import_with_rabbitmq: Activar RabbitMQ per importar de donadas de manièra asincròna
 import_with_redis: Activar Redis per importar de donadas de manièra asincròna
 shaarli_url: URL de Shaarli, se lo servici Shaarli es activat
-share_diaspora: Activar lo partatge cap a Diaspora
+share_diaspora: Activar lo partatge cap a Diaspora*
 share_mail: Activar lo partatge per corrièl
 share_shaarli: Activar lo partatge cap a Shaarli
 share_scuttle: Activar lo partatge cap a Scuttle
index bc1b6f926ecbf28a04aeca3b8e4e7650199f599d..6db977310666e159fec81ef51558e572cacc3fcf 100644 (file)
@@ -361,7 +361,7 @@ class EntryRestController extends WallabagRestController
         }
 
         if (null !== $data['isStarred']) {
-            $entry->setStarred((bool) $data['isStarred']);
+            $entry->updateStar((bool) $data['isStarred']);
         }
 
         if (!empty($data['tags'])) {
@@ -464,7 +464,7 @@ class EntryRestController extends WallabagRestController
         }
 
         if (null !== $data['isStarred']) {
-            $entry->setStarred((bool) $data['isStarred']);
+            $entry->updateStar((bool) $data['isStarred']);
         }
 
         if (!empty($data['tags'])) {
index 3dcfbebeeb00f94afde4cf42dc658411a026b395..b0b74c381641c97425f6dca473f7ddd36bde89ea 100644 (file)
@@ -333,6 +333,7 @@ class EntryController extends Controller
         $this->checkUserAction($entry);
 
         $entry->toggleStar();
+        $entry->updateStar($entry->isStarred());
         $this->getDoctrine()->getManager()->flush();
 
         $message = 'flashes.entry.notice.entry_unstarred';
index 61d01bdcdadd5f0a52ceb3e66f08ae1eb0228cb9..4367902ee5b45bc4a410bf5fd54f533451fbba8f 100644 (file)
@@ -142,6 +142,15 @@ class Entry
      */
     private $publishedBy;
 
+    /**
+     * @var \DateTime
+     *
+     * @ORM\Column(name="starred_at", type="datetime", nullable=true)
+     *
+     * @Groups({"entries_for_user", "export_all"})
+     */
+    private $starredAt = null;
+
     /**
      * @ORM\OneToMany(targetEntity="Wallabag\AnnotationBundle\Entity\Annotation", mappedBy="entry", cascade={"persist", "remove"})
      * @ORM\JoinTable
@@ -475,6 +484,44 @@ class Entry
         return $this->updatedAt;
     }
 
+    /**
+     * @return \DateTime|null
+     */
+    public function getStarredAt()
+    {
+        return $this->starredAt;
+    }
+
+    /**
+     * @param \DateTime|null $starredAt
+     *
+     * @return Entry
+     */
+    public function setStarredAt($starredAt = null)
+    {
+        $this->starredAt = $starredAt;
+
+        return $this;
+    }
+
+    /**
+     * update isStarred and starred_at fields.
+     *
+     * @param bool $isStarred
+     *
+     * @return Entry
+     */
+    public function updateStar($isStarred = false)
+    {
+        $this->setStarred($isStarred);
+        $this->setStarredAt(null);
+        if ($this->isStarred()) {
+            $this->setStarredAt(new \DateTime());
+        }
+
+        return $this;
+    }
+
     /**
      * @return ArrayCollection<Annotation>
      */
index c19023af5bffdd8af1175840bea9b15a522a5251..a6dc8c50902ed26f3acb89a65b5dca8d4af073db 100644 (file)
@@ -78,7 +78,7 @@ class Tag
      */
     public function setLabel($label)
     {
-        $this->label = $label;
+        $this->label = mb_convert_case($label, MB_CASE_LOWER);
 
         return $this;
     }
index a2fb0b9a940c25588ec7d588b0ee0922daccb47d..0bfe5c572a5e1d72d338433ad81630c596755114 100644 (file)
@@ -45,7 +45,7 @@ class TagsAssigner
         }
 
         foreach ($tags as $label) {
-            $label = trim($label);
+            $label = trim(mb_convert_case($label, MB_CASE_LOWER));
 
             // avoid empty tag
             if (0 === strlen($label)) {
index eb5e3205ceeb8b41c81d182e2d9a99f1c33f3d83..ecc159fc0463b8585c75d90e1a8ba53d76e99d80 100644 (file)
@@ -65,7 +65,7 @@ class EntryRepository extends EntityRepository
     public function getBuilderForStarredByUser($userId)
     {
         return $this
-            ->getBuilderByUser($userId)
+            ->getBuilderByUser($userId, 'starredAt', 'desc')
             ->andWhere('e.isStarred = true')
         ;
     }
@@ -401,15 +401,16 @@ class EntryRepository extends EntityRepository
     /**
      * Return a query builder to used by other getBuilderFor* method.
      *
-     * @param int $userId
+     * @param int    $userId
+     * @param string $sortBy
+     * @param string $direction
      *
      * @return QueryBuilder
      */
-    private function getBuilderByUser($userId)
+    private function getBuilderByUser($userId, $sortBy = 'createdAt', $direction = 'desc')
     {
         return $this->createQueryBuilder('e')
             ->andWhere('e.user = :userId')->setParameter('userId', $userId)
-            ->orderBy('e.createdAt', 'desc')
-        ;
+            ->orderBy(sprintf('e.%s', $sortBy), $direction);
     }
 }
index 48f8a53539cb6f08b73b2cd7095aa81ca5a57304..360bf57163c4b88334978d88dc67c218156ba68e 100644 (file)
@@ -32,7 +32,7 @@ menu:
         save_link: 'Link speichern'
         back_to_unread: 'Zurück zu ungelesenen Artikeln'
         users_management: 'Benutzerverwaltung'
-        # site_credentials: 'Site credentials'
+        site_credentials: 'Zugangsdaten'
     top:
         add_new_entry: 'Neuen Artikel hinzufügen'
         search: 'Suche'
@@ -47,7 +47,7 @@ footer:
         social: 'Soziales'
         powered_by: 'angetrieben von'
         about: 'Über'
-    stats: Seit %user_creation% hast du %nb_archives% Artikel gelesen. Das sind ungefähr %per_day% pro Tag!
+    stats: 'Seit %user_creation% hast du %nb_archives% Artikel gelesen. Das sind ungefähr %per_day% pro Tag!'
 
 config:
     page_title: 'Einstellungen'
@@ -75,9 +75,9 @@ config:
             label: 'Wohin soll nach dem Gelesenmarkieren eines Artikels weitergeleitet werden?'
             redirect_homepage: 'Zur Homepage'
             redirect_current_page: 'Zur aktuellen Seite'
-        pocket_consumer_key_label: Consumer-Key für Pocket, um Inhalte zu importieren
-        android_configuration: Konfiguriere deine Android Application
-        # android_instruction: "Touch here to prefill your Android application"
+        pocket_consumer_key_label: 'Consumer-Key für Pocket, um Inhalte zu importieren'
+        android_configuration: 'Konfiguriere deine Android-App'
+        android_instruction: "Klicke hier, um deine Android-App auszufüllen"
         help_theme: "wallabag ist anpassbar. Du kannst dein bevorzugtes Theme hier auswählen."
         help_items_per_page: "Du kannst die Nummer von Artikeln pro Seite anpassen."
         help_reading_speed: "wallabag berechnet eine Lesezeit pro Artikel. Hier kannst du definieren, ob du ein schneller oder langsamer Leser bist. wallabag wird die Lesezeiten danach neu berechnen."
@@ -94,7 +94,7 @@ config:
             unread: 'Ungelesene'
             starred: 'Favoriten'
             archive: 'Archivierte'
-            # all: 'All'
+            all: 'Alle'
         rss_limit: 'Anzahl der Einträge pro Feed'
     form_user:
         two_factor_description: "Wenn du die Zwei-Faktor-Authentifizierung aktivierst, erhältst du eine E-Mail mit einem Code bei jeder nicht vertrauenswürdigen Verbindung"
@@ -103,18 +103,18 @@ config:
         twoFactorAuthentication_label: 'Zwei-Faktor-Authentifizierung'
         help_twoFactorAuthentication: "Wenn du 2FA aktivierst, wirst du bei jedem Login einen Code per E-Mail bekommen."
         delete:
-            title: Lösche mein Konto (a.k.a Gefahrenzone)
-            description: Wenn du dein Konto löschst, werden ALL deine Artikel, ALL deine Tags, ALL deine Anmerkungen und dein Konto dauerhaft gelöscht (kann NICHT RÜCKGÄNGIG gemacht werden). Du wirst anschließend ausgeloggt.
-            confirm: Bist du wirklich sicher? (DIES KANN NICHT RÜCKGÄNGIG GEMACHT WERDEN)
-            button: Lösche mein Konto
+            title: 'Lösche mein Konto (a.k.a Gefahrenzone)'
+            description: 'Wenn du dein Konto löschst, werden ALL deine Artikel, ALL deine Tags, ALL deine Anmerkungen und dein Konto dauerhaft gelöscht (kann NICHT RÜCKGÄNGIG gemacht werden). Du wirst anschließend ausgeloggt.'
+            confirm: 'Bist du wirklich sicher? (DIES KANN NICHT RÜCKGÄNGIG GEMACHT WERDEN)'
+            button: 'Lösche mein Konto'
     reset:
-        title: Zurücksetzen (a.k.a Gefahrenzone)
-        description: Beim Nutzen der folgenden Schaltflächenhast du die Möglichkeit, einige Informationen von deinem Konto zu entfernen. Sei dir bewusst, dass dies NICHT RÜCKGÄNGIG zu machen ist.
-        annotations: Entferne ALLE Annotationen
-        tags: Entferne ALLE Tags
-        entries: Entferne ALLE Einträge
-        archived: Entferne ALLE archivierten Einträge
-        confirm: Bist du wirklich sicher? (DIES KANN NICHT RÜCKGÄNGIG GEMACHT WERDEN)
+        title: 'Zurücksetzen (a.k.a Gefahrenzone)'
+        description: 'Beim Nutzen der folgenden Schaltflächenhast du die Möglichkeit, einige Informationen von deinem Konto zu entfernen. Sei dir bewusst, dass dies NICHT RÜCKGÄNGIG zu machen ist.'
+        annotations: 'Entferne ALLE Annotationen'
+        tags: 'Entferne ALLE Tags'
+        entries: 'Entferne ALLE Einträge'
+        archived: 'Entferne ALLE archivierten Einträge'
+        confirm: 'Bist du wirklich sicher? (DIES KANN NICHT RÜCKGÄNGIG GEMACHT WERDEN)'
     form_password:
         description: "Hier kannst du dein Kennwort ändern. Dieses sollte mindestens acht Zeichen enthalten."
         old_password_label: 'Altes Kennwort'
@@ -178,7 +178,7 @@ entry:
         number_of_tags: '{1}und ein anderer Tag|]1,Inf[und %count% andere Tags'
         reading_time_minutes_short: '%readingTime% min'
         reading_time_less_one_minute_short: '&lt; 1 min'
-        original_article: 'Original'
+        original_article: 'Originalartikel'
         toogle_as_read: 'Gelesen-Status ändern'
         toogle_as_star: 'Favoriten-Status ändern'
         delete: 'Löschen'
@@ -191,8 +191,8 @@ entry:
         unread_label: 'Ungelesene'
         preview_picture_label: 'Vorschaubild vorhanden'
         preview_picture_help: 'Vorschaubild'
-        # is_public_label: 'Has a public link'
-        # is_public_help: 'Public link'
+        is_public_label: 'Hat einen öffentlichen Link'
+        is_public_help: 'Öffentlicher Link'
         language_label: 'Sprache'
         http_status_label: 'HTTP-Status'
         reading_time:
@@ -228,7 +228,7 @@ entry:
                 label: 'Probleme?'
                 description: 'Erscheint dieser Artikel falsch?'
         edit_title: 'Titel ändern'
-        original_article: 'original'
+        original_article: 'Originalartikel'
         annotations_on_the_entry: '{0} Keine Anmerkungen|{1} Eine Anmerkung|]1,Inf[ %count% Anmerkungen'
         created_at: 'Erstellungsdatum'
         published_at: 'Erscheinungsdatum'
@@ -246,10 +246,10 @@ entry:
         url_label: 'URL'
         save_label: 'Speichern'
     public:
-        shared_by_wallabag: "Dieser Artikel wurde von %username% mittels <a href='%wallabag_instance%'>wallabag</a> geteilt"
+        shared_by_wallabag: 'Dieser Artikel wurde von %username% mittels <a href="%wallabag_instance%">wallabag</a> geteilt'
     confirm:
-        delete: "Bist du sicher, dass du diesen Artikel löschen möchtest?"
-        delete_tag: "Bist du sicher, dass du diesen Tag vom Artikel entfernen möchtest?"
+        delete: 'Bist du sicher, dass du diesen Artikel löschen möchtest?'
+        delete_tag: 'Bist du sicher, dass du diesen Tag vom Artikel entfernen möchtest?'
 
 about:
     page_title: 'Über'
@@ -307,32 +307,32 @@ howto:
     bookmarklet:
         description: 'Ziehe diesen Link in deine Lesezeichenleiste:'
     shortcuts:
-        page_description: Dies sind die verfügbaren Tastenkürzel in wallabag.
-        shortcut: Tastenkürzel
-        action: Aktion
-        all_pages_title: Tastenkürzel auf allen Seiten
-        go_unread: Zu ungelesen gehen
-        go_starred: Zu Favoriten gehen
-        go_archive: Zu archivierten gehen
-        go_all: Zu allen Artikel gehen
-        go_tags: Zu den Tags gehen
-        go_config: Einstellungen öffnen
-        go_import: Import-Sektion öffnen
-        go_developers: Zur Entwickler-Seite gehen
-        go_howto: Zum Howto gehen (diese Seite!)
-        go_logout: Abmelden
-        list_title: Tastenkürzel verfügbar auf den Listen-Seiten
-        search: Suche
-        article_title: Tastenkürzel verfügbar auf der Artikel-Seite
-        open_original: Original-Artikel öffnen
-        toggle_favorite: Favorit-Status für den Artikel ändern
-        toggle_archive: Archiviert-Status für den Artikel ändern
-        delete: Artikel löschen
-        material_title: Tastenkürzel des Material-Theme
-        add_link: Neuen Link hinzufügen
-        hide_form: Aktuelles Formular verstecken (Suche oder neuer Link)
-        arrows_navigation: Durch Artikel navigieren
-        open_article: Gewählten Artikel anzeigen
+        page_description: 'Dies sind die verfügbaren Tastenkürzel in wallabag.'
+        shortcut: 'Tastenkürzel'
+        action: 'Aktion'
+        all_pages_title: 'Tastenkürzel auf allen Seiten'
+        go_unread: 'Zu ungelesen gehen'
+        go_starred: 'Zu Favoriten gehen'
+        go_archive: 'Zu archivierten gehen'
+        go_all: 'Zu allen Artikel gehen'
+        go_tags: 'Zu den Tags gehen'
+        go_config: 'Einstellungen öffnen'
+        go_import: 'Import-Sektion öffnen'
+        go_developers: 'Zur Entwickler-Seite gehen'
+        go_howto: 'Zum Howto gehen (diese Seite!)'
+        go_logout: 'Abmelden'
+        list_title: 'Tastenkürzel verfügbar auf den Listen-Seiten'
+        search: 'Suche'
+        article_title: 'Tastenkürzel verfügbar auf der Artikel-Seite'
+        open_original: 'Original-Artikel öffnen'
+        toggle_favorite: 'Favorit-Status für den Artikel ändern'
+        toggle_archive: 'Archiviert-Status für den Artikel ändern'
+        delete: 'Artikel löschen'
+        material_title: 'Tastenkürzel des Material-Theme'
+        add_link: 'Neuen Link hinzufügen'
+        hide_form: 'Aktuelles Formular verstecken (Suche oder neuer Link)'
+        arrows_navigation: 'Durch Artikel navigieren'
+        open_article: 'Gewählten Artikel anzeigen'
 
 quickstart:
     page_title: 'Schnelleinstieg'
@@ -483,7 +483,7 @@ developer:
         field_id: 'Client-ID'
         field_secret: 'Client-Secret'
         back: 'Zurück'
-        read_howto: 'Lese des How-To zu "Wie erstelle ich meine erste Anwendung"'
+        read_howto: 'Lese das How-To zu "Wie erstelle ich meine erste Anwendung"'
     howto:
         page_title: 'API-Client-Verwaltung > Wie erstelle ich meine erste Anwendung'
         description:
@@ -498,16 +498,16 @@ developer:
         back: 'Zurück'
 
 user:
-    page_title: Benutzerverwaltung
-    new_user: Erstelle einen neuen Benutzer
-    edit_user: Bearbeite einen existierenden Benutzer
+    page_title: 'Benutzerverwaltung'
+    new_user: 'Erstelle einen neuen Benutzer'
+    edit_user: 'Bearbeite einen existierenden Benutzer'
     description: "Hier kannst du alle Benutzer verwalten (erstellen, bearbeiten und löschen)"
     list:
-        actions: Aktionen
-        edit_action: Bearbeiten
-        yes: Ja
-        no: Nein
-        create_new_one: Erstelle einen neuen Benutzer
+        actions: 'Aktionen'
+        edit_action: 'Bearbeiten'
+        yes: 'Ja'
+        no: 'Nein'
+        create_new_one: 'Erstelle einen neuen Benutzer'
     form:
         username_label: 'Benutzername'
         name_label: 'Name'
@@ -517,52 +517,52 @@ user:
         email_label: 'E-Mail-Adresse'
         enabled_label: 'Aktiviert'
         last_login_label: 'Letzter Login'
-        twofactor_label: Zwei-Faktor-Authentifizierung
-        save: Speichern
-        delete: Löschen
-        delete_confirm: Bist du sicher?
-        back_to_list: Zurück zur Liste
+        twofactor_label: 'Zwei-Faktor-Authentifizierung'
+        save: 'Speichern'
+        delete: 'Löschen'
+        delete_confirm: 'Bist du sicher?'
+        back_to_list: 'Zurück zur Liste'
     search:
-        placeholder: Filtere nach Benutzer oder E-Mail-Adresse
+        placeholder: 'Filtere nach Benutzer oder E-Mail-Adresse'
 
 site_credential:
-    # page_title: Site credentials management
-    # new_site_credential: Create a credential
-    # edit_site_credential: Edit an existing credential
-    # description: "Here you can manage all credentials for sites which required them (create, edit and delete), like a paywall, an authentication, etc."
+    page_title: 'Verwaltung Zugangsdaten'
+    new_site_credential: 'Zugangsdaten anlegen'
+    edit_site_credential: 'Bestehende Zugangsdaten bearbeiten'
+    description: 'Hier kannst du alle Zugangsdaten für Webseiten verwalten, die diese benötigen (anlegen, bearbeiten und löschen), wie z. B. eine Paywall, eine Authentifizierung, etc.'
     list:
-        actions: Aktionen
-        edit_action: Bearbeiten
-        yes: Ja
-        no: Nein
-        # create_new_one: Create a new credential
+        actions: 'Aktionen'
+        edit_action: 'Bearbeiten'
+        yes: 'Ja'
+        no: 'Nein'
+        create_new_one: 'Einen neuen Seitenzugang anlegen'
     form:
-        # username_label: 'Username'
-        host_label: 'Host'
-        # password_label: 'Password'
-        save: Speichern
-        delete: Löschen
-        delete_confirm: Bist du sicher?
-        back_to_list: Zurück zur Liste
+        username_label: 'Benutzername'
+        host_label: 'Host'
+        password_label: 'Passwort'
+        save: 'Speichern'
+        delete: 'Löschen'
+        delete_confirm: 'Bist du sicher?'
+        back_to_list: 'Zurück zur Liste'
 
 error:
-    page_title: Ein Fehler ist aufgetreten
+    page_title: 'Ein Fehler ist aufgetreten'
 
 flashes:
     config:
         notice:
             config_saved: 'Konfiguration gespeichert.'
             password_updated: 'Kennwort aktualisiert'
-            password_not_updated_demo: "Im Testmodus kannst du das Kennwort nicht ändern."
+            password_not_updated_demo: 'Im Testmodus kannst du das Kennwort nicht ändern.'
             user_updated: 'Information aktualisiert'
             rss_updated: 'RSS-Informationen aktualisiert'
             tagging_rules_updated: 'Tagging-Regeln aktualisiert'
             tagging_rules_deleted: 'Tagging-Regel gelöscht'
             rss_token_updated: 'RSS-Token aktualisiert'
-            annotations_reset: Anmerkungen zurücksetzen
-            tags_reset: Tags zurücksetzen
-            entries_reset: Einträge zurücksetzen
-            archived_reset: Archiverte Einträge zurücksetzen
+            annotations_reset: 'Anmerkungen zurücksetzen'
+            tags_reset: 'Tags zurücksetzen'
+            entries_reset: 'Einträge zurücksetzen'
+            archived_reset: 'Archiverte Einträge zurücksetzen'
     entry:
         notice:
             entry_already_saved: 'Eintrag bereits am %date% gespeichert'
@@ -599,6 +599,6 @@ flashes:
             deleted: 'Benutzer "%username%" gelöscht'
     site_credential:
         notice:
-            # added: 'Site credential for "%host%" added'
-            # updated: 'Site credential for "%host%" updated'
-            # deleted: 'Site credential for "%host%" deleted'
+            added: 'Zugangsdaten für "%host%" hinzugefügt'
+            updated: 'Zugangsdaten für "%host%" aktualisiert'
+            deleted: 'Zugangsdaten für "%host%" gelöscht'
index c2b4924711ea70da7c2c354108588fc9c3e9ed73..5e1f692e6db1db04820c47225d920ba8c415ad8c 100644 (file)
@@ -1,8 +1,8 @@
 security:
     login:
-        page_title: 'Benvenguda sus wallabag !'
+        page_title: 'Vos desirem la benvenguda a wallabag !'
         keep_logged_in: 'Demorar connectat'
-        forgot_password: 'Senhal oblidat ?'
+        forgot_password: 'Senhal oblidat?'
         submit: 'Se connectar'
         register: 'Crear un compte'
         username: "Nom d'utilizaire"
@@ -11,7 +11,7 @@ security:
     resetting:
         description: "Picatz vòstra adreça de corrièl çai-jos, vos mandarem las instruccions per reïnicializar vòstre senhal."
     register:
-        page_title: 'Se crear un compte'
+        page_title: 'Crear un compte'
         go_to_account: 'Anar a vòstre compte'
 
 menu:
@@ -47,7 +47,7 @@ footer:
         social: 'Social'
         powered_by: 'propulsat per'
         about: 'A prepaus'
-    stats: "Dempuèi %user_creation% avètz legit %nb_archives% articles. Es a l'entorn de %per_day% per jorn !"
+    stats: "Dempuèi %user_creation% avètz legit %nb_archives% articles. Es a l'entorn de %per_day% per jorn!"
 
 config:
     page_title: 'Configuracion'
@@ -66,16 +66,16 @@ config:
         language_label: 'Lenga'
         reading_speed:
             label: 'Velocitat  de lectura'
-            help_message: 'Podètz utilizar una aisina en linha per estimar vòstra velocitat de lectura :'
+            help_message: 'Podètz utilizar una aisina en linha per estimar vòstra velocitat de lectura:'
             100_word: "Legissi a l'entorn de 100 mots per minuta"
             200_word: "Legissi a l'entorn de 200 mots per minuta"
             300_word: "Legissi a l'entorn de 300 mots per minuta"
             400_word: "Legissi a l'entorn de 400 mots per minuta"
         action_mark_as_read:
-            label: 'Ont volètz èsser menat aprèp aver marcat un article coma legit ?'
-            redirect_homepage: "A la pagina d'acuèlh"
+            label: 'Ont volètz èsser menat aprèp aver marcat un article coma legit?'
+            redirect_homepage: "A la pagina dacuèlh"
             redirect_current_page: 'A la pagina actuala'
-        pocket_consumer_key_label: Clau d'autentificacion Pocket per importar las donadas
+        pocket_consumer_key_label: Clau dautentificacion Pocket per importar las donadas
         android_configuration: Configuratz vòstra aplicacion Android
         android_instruction: "Tocatz aquí per garnir las informacions de l'aplicacion Android"
         help_theme: "wallabag es personalizable. Podètz causir vòstre tèma preferit aquí."
@@ -105,7 +105,7 @@ config:
         delete:
             title: Suprimir mon compte (Mèfi zòna perilhosa)
             description: Se confirmatz la supression de vòstre compte, TOTES vòstres articles, TOTAS vòstras etiquetas, TOTAS vòstras anotacions e vòstre compte seràn suprimits per totjorn. E aquò es IRREVERSIBLE. Puèi seretz desconnectat.
-            confirm: Sètz vertadièrament segur ? (ES IRREVERSIBLE)
+            confirm: Sètz vertadièrament segur ? (AQUÒ ES IRREVERSIBLE)
             button: Suprimir mon compte
     reset:
         title: Zòna de reïnicializacion (Mèfi zòna perilhosa)
@@ -114,7 +114,7 @@ config:
         tags: Levar TOTAS las etiquetas
         entries: Levar TOTES los articles
         archived: Levar TOTES los articles archivats
-        confirm: Sètz vertadièrament segur ? (ES IRREVERSIBLE)
+        confirm: Sètz vertadièrament segur ? (AQUÒ ES IRREVERSIBLE)
     form_password:
         description: "Podètz cambiar vòstre senhal aquí. Vòstre senhal deu èsser long d'almens 8 caractèrs."
         old_password_label: 'Senhal actual'
@@ -129,12 +129,12 @@ config:
         tags_label: 'Etiquetas'
         faq:
             title: 'FAQ'
-            tagging_rules_definition_title: "Qué significa las règlas d'etiquetas automaticas ?"
+            tagging_rules_definition_title: "Qué significa las règlas d'etiquetas automaticas?"
             tagging_rules_definition_description: "Son de règlas utilizadas per wallabad per classar automaticament vòstres novèls articles.<br />Cada còp qu'un novèl article es apondut, totas las règlas d'etiquetas automaticas seràn utilizadas per ajustar d'etiquetas qu'avètz configuradas, en vos esparnhant l'esfòrç de classificar vòstres articles manualament."
-            how_to_use_them_title: 'Cossí las utilizar ?'
-            how_to_use_them_description: "Imaginem que volètz atribuir als novèls article l'etiqueta « <i>lectura corta</i> » quand lo temps per legir es inferior a 3 minutas.<br />Dins aquel cas, deuriatz metre « readingTime &lt;= 3 » dins lo camp <i>Règla</i> e « <i>lectura corta</i> » dins lo camp <i>Etiqueta</i>.<br />Mai d'una etiquetas pòdon èsser apondudas simultanèament ne las separant amb de virgulas : « <i>lectura corta, per ligir</i> »<br />De règlas complèxas pòdon èsser creadas en emplegant d'operators predefinits :  se « <i>readingTime &gt;= 5 AND domainName = \"github.com\"</i> » alara atribuir las etiquetas « <i>lectura longa, github </i> »"
-            variables_available_title: 'Quinas variablas e operators pòdi utilizar per escriure de règlas ?'
-            variables_available_description: "Las variablas e operators seguents pòdon èsser utilizats per escriure de règlas d'etiquetas automaticas :"
+            how_to_use_them_title: 'Cossí las utilizar?'
+            how_to_use_them_description: "Imaginem que volètz atribuir als novèls article l'etiqueta « <i>lectura corta</i> » quand lo temps per legir es inferior a 3 minutas.<br />Dins aquel cas, deuriatz metre « readingTime &lt;= 3 » dins lo camp <i>Règla</i> e « <i>lectura corta</i> » dins lo camp <i>Etiqueta</i>.<br />Mai d'una etiquetas pòdon èsser apondudas simultanèament ne las separant amb de virgulas : « <i>lectura corta, per ligir</i> »<br />De règlas complèxas pòdon èsser creadas n'emplegant d'operators predefinits : se « <i>readingTime &gt;= 5 AND domainName = \"github.com\"</i> » alara atribuir las etiquetas « <i>lectura longa, github </i> »"
+            variables_available_title: 'Quinas variablas e operators pòdi utilizar per escriure de règlas?'
+            variables_available_description: "Las variablas e operators seguents pòdon èsser utilizats per escriure de règlas d'etiquetas automaticas : "
             meaning: 'Significacion'
             variable_description:
                 label: 'Variabla'
@@ -157,8 +157,8 @@ config:
                 not_equal_to: 'Diferent de…'
                 or: "Una règla O l'autra"
                 and: "Una règla E l'autra"
-                matches: 'Teste se un <i>subjècte</i> correspond a una <i>recèrca</i> (non sensibla a la cassa).<br />Exemple : <code>title matches \"football\"</code>'
-                notmatches: 'Teste se <i>subjècte</i> correspond pas a una <i>recèrca</i> (sensibla a la cassa).<br />Example : <code>title notmatches "football"</code>'
+                matches: 'Teste se un <i>subjècte</i> correspond a una <i>recèrca</i> (non sensibla a la cassa).<br />Exemple : <code>title matches \"football\"</code>'
+                notmatches: 'Teste se <i>subjècte</i> correspond pas a una <i>recèrca</i> (sensibla a la cassa).<br />Example : <code>title notmatches "football"</code>'
 
 entry:
     page_titles:
@@ -166,15 +166,15 @@ entry:
         starred: 'Articles favorits'
         archived: 'Articles legits'
         filtered: 'Articles filtrats'
-        filtered_tags: 'Articles filtrats per etiquetas :'
-        filtered_search: 'Articles filtrats per recèrca :'
+        filtered_tags: 'Articles filtrats per etiquetas:'
+        filtered_search: 'Articles filtrats per recèrca:'
         untagged: 'Articles sens etiqueta'
         all: 'Totes los articles'
     list:
         number_on_the_page: "{0} I a pas cap d'article.|{1} I a un article.|]1,Inf[ I a %count% articles."
         reading_time: 'durada de lectura'
-        reading_time_minutes: 'durada de lectura : %readingTime% min'
-        reading_time_less_one_minute: 'durada de lectura : &lt; 1 min'
+        reading_time_minutes: 'durada de lectura : %readingTime% min'
+        reading_time_less_one_minute: 'durada de lectura : &lt; 1 min'
         number_of_tags: '{1}e una autra etiqueta|]1,Inf[e %count% autras etiquetas'
         reading_time_minutes_short: '%readingTime% min'
         reading_time_less_one_minute_short: '&lt; 1 min'
@@ -225,8 +225,8 @@ entry:
             export: 'Exportar'
             print: 'Imprimir'
             problem:
-                label: 'Un problèma ?'
-                description: "Marca mal la presentacion d'aqueste article ?"
+                label: 'Un problèma?'
+                description: "Marca mal la presentacion d'aqueste article?"
         edit_title: 'Modificar lo títol'
         original_article: 'original'
         annotations_on_the_entry: "{0} Pas cap d'anotacion|{1} Una anotacion|]1,Inf[ %count% anotacions"
@@ -239,7 +239,7 @@ entry:
         form_new:
             url_label: Url
     search:
-        placeholder: 'Qué cercatz ?'
+        placeholder: 'Qué cercatz?'
     edit:
         page_title: 'Modificar un article'
         title_label: 'Títol'
@@ -248,8 +248,8 @@ entry:
     public:
         shared_by_wallabag: "Aqueste article es estat partejat per <a href='%wallabag_instance%'>wallabag</a>"
     confirm:
-        delete: "Sètz segur de voler suprimir aqueste article ?"
-        delete_tag: "Sètz segur de voler levar aquesta etiqueta de l'article ?"
+        delete: "Sètz segur de voler suprimir aqueste article?"
+        delete_tag: "Sètz segur de voler levar aquesta etiqueta de l'article?"
 
 about:
     page_title: 'A prepaus'
@@ -271,27 +271,27 @@ about:
         bug_reports: 'Rapòrt de bugs'
         support: "<a href=\"https://github.com/wallabag/wallabag/issues\">sur GitHub</a>"
     helping:
-        description: 'wallabag es a gratuit e opensource. Nos podètz ajudar :'
-        by_contributing: 'en ajudant lo projècte :'
+        description: 'wallabag es a gratuit e opensource. Nos podètz ajudar : '
+        by_contributing: 'en participant lo projècte : '
         by_contributing_2: 'un bilhet recensa totes nòstres besonhs'
         by_paypal: 'via Paypal'
     contributors:
         description: "Mercés als contributors de l'aplicacion web de wallabag"
     third_party:
-        description: 'Aquí la lista de las dependéncias utilizadas dins wallabag (e lor licéncia) :'
+        description: 'Aquí la lista de las dependéncias utilizadas dins wallabag (e lor licéncia):'
         package: 'Dependéncia'
         license: 'Licéncia'
 
 howto:
     page_title: 'Ajuda'
-    page_description: "I a mai d'un biais d'enregistrar un article :"
+    page_description: "I a mai d'un biais d'enregistrar un article:"
     tab_menu:
         add_link: "Ajustar un ligam"
         shortcuts: "Utilizar d'acorchis"
     top_menu:
         browser_addons: 'Extensions de navigator'
         mobile_apps: 'Aplicacions mobil'
-        bookmarklet: 'Bookmarklet'
+        bookmarklet: 'Marcapaginas'
     form:
         description: 'Gràcias a aqueste formulari'
     browser_addons:
@@ -305,7 +305,7 @@ howto:
         ios: 'sus iTunes Store'
         windows: 'sus Microsoft Store'
     bookmarklet:
-        description: 'Lisatz-depausatz aqueste ligam dins vòstra barra de favorits :'
+        description: 'Lisatz-depausatz aqueste ligam dins vòstra barra de favorits:'
     shortcuts:
         page_description: Aquí son los acorchis disponibles dins wallabag.
         shortcut: Acorchis
@@ -319,7 +319,7 @@ howto:
         go_config: Anar a la config
         go_import: Anar per importar
         go_developers: Anar al canton desvolopaires
-        go_howto: Anar a l'ajuda (aquesta quita pagina !)
+        go_howto: Anar a l'ajuda (aquesta quita pagina!)
         go_logout: Desconnexion
         list_title: Acorchis disponibles dins las paginas de lista
         search: Afichar lo formulari de recèrca
@@ -338,9 +338,9 @@ quickstart:
     page_title: 'Per ben començar'
     more: 'Mai…'
     intro:
-        title: 'Benvenguda sus wallabag !'
+        title: 'Benvenguda sus wallabag!'
         paragraph_1: "Anem vos guidar per far lo torn de la proprietat e vos presentar unas foncionalitats que vos poirián interessar per vos apropriar aquesta aisina."
-        paragraph_2: 'Seguètz-nos !'
+        paragraph_2: 'Seguètz-nos!'
     configure:
         title: "Configuratz l'aplicacion"
         description: "Per fin d'aver una aplicacion que vos va ben, anatz veire la configuracion de wallabag."
@@ -349,7 +349,7 @@ quickstart:
         tagging_rules: 'Escrivètz de règlas per classar automaticament vòstres articles'
     admin:
         title: 'Administracion'
-        description: "En qualitat d'adminitrastor sus wallabag, avètz de privilègis que vos permeton de :"
+        description: "En qualitat d'adminitrastor sus wallabag, avètz de privilègis que vos permeton de:"
         new_user: 'Crear un novèl utilizaire'
         analytics: 'Configurar las estadisticas'
         sharing: 'Activar de paramètres de partatge'
@@ -359,10 +359,10 @@ quickstart:
         title: 'Primièrs passes'
         description: "Ara wallabag es ben configurat, es lo moment d'archivar lo web. Podètz clicar sul signe + a man drecha amont per ajustar un ligam."
         new_article: 'Ajustatz vòstre primièr article'
-        unread_articles: 'E recaptatz-lo !'
+        unread_articles: 'E recaptatz-lo!'
     migrate:
         title: 'Migrar dempuèi un servici existent'
-        description: "Sètz un ancian utilizaire d'un servici existent ? Vos ajudarem a trapar vòstras donadas sus wallabag."
+        description: "Sètz un ancian utilizaire d'un servici existent ? Vos ajudarem a trapar vòstras donadas sus wallabag."
         pocket: 'Migrar dempuèi Pocket'
         wallabag_v1: 'Migrar dempuèi wallabag v1'
         wallabag_v2: 'Migrar dempuèi wallabag v2'
@@ -370,7 +370,7 @@ quickstart:
         instapaper: 'Migrar dempuèi Instapaper'
     developer:
         title: 'Pels desvolopaires'
-        description: 'Avèm tanben pensat als desvolopaires : Docker, API, traduccions, etc.'
+        description: 'Avèm tanben pensat als desvolopaires : Docker, API, traduccions, etc.'
         create_application: 'Crear vòstra aplicacion tèrça'
         use_docker: 'Utilizar Docker per installar wallabag'
     docs:
@@ -379,8 +379,8 @@ quickstart:
         annotate: 'Anotar vòstre article'
         export: 'Convertissètz vòstres articles en ePub o en PDF'
         search_filters: "Aprenètz a utilizar lo motor de recèrca e los filtres per retrobar l'article que vos interèssa"
-        fetching_errors: "Qué far se mon article es pas recuperat coma cal ?"
-        all_docs: "E encara plen de causas mai !"
+        fetching_errors: "Qué far se mon article es pas recuperat coma cal?"
+        all_docs: "E encara plen de causas mai!"
     support:
         title: 'Assisténcia'
         description: 'Perque avètz benlèu besonh de nos pausar una question, sèm disponibles per vosautres.'
@@ -401,10 +401,10 @@ import:
     page_title: 'Importar'
     page_description: "Benvenguda sus l'aisina de migracion de wallabag. Causissètz çai-jos lo servici dempuèi lo qual volètz migrar."
     action:
-        import_contents: 'Importar los contenguts'
+        import_contents: 'Importar lo contengut'
     form:
-        mark_as_read_title: 'Tot marcar coma legit ?'
-        mark_as_read_label: 'Marcar tot los contenguts importats coma legits'
+        mark_as_read_title: 'O marcar tot coma legit ?'
+        mark_as_read_label: 'Marcar tot lo contengut importats coma legit'
         file_label: 'Fichièr'
         save_label: 'Importar lo fichièr'
     pocket:
@@ -428,7 +428,7 @@ import:
         description: "Aquesta aisina importarà totas vòstres articles de Readability. Sus la pagina de l'aisina (https://www.readability.com/tools/), clicatz sus \"Export your data\" dins la seccion \"Data Export\". Recebretz un corrièl per telecargar un json (qu'acaba pas amb un .json de fach)."
         how_to: "Mercés de seleccionar vòstre Readability fichièr e de clicar sul boton dejós per lo telecargar e l'importar."
     worker:
-        enabled: "L'importacion se fa de manièra asincròna. Un còp l'importacion lançada, una aisina extèrna s'ocuparà dels messatges un per un. Lo servici actual es : "
+        enabled: "L'importacion se fa de manièra asincròna. Un còp l'importacion lançada, una aisina extèrna s'ocuparà dels articles un per un. Lo servici actual es : "
         download_images_warning: "Avètz activat lo telecargament de los imatges de vòstres articles. Combinat amb l'importacion classica, aquò pòt tardar un long moment (o benlèu fracassar). <strong>Recomandem fòrtament</strong> l'activacion de l'importacion asincròna per evitar las errors."
     firefox:
         page_title: 'Importar > Firefox'
@@ -436,7 +436,7 @@ import:
         how_to: "Mercés de causir lo fichièr de salvagarda e de clicar sul boton dejós per l'importar. Notatz que lo tractament pòt durar un moment ja que totes los articles an d'èsser recuperats."
     chrome:
         page_title: 'Importar > Chrome'
-        description: "Aquesta aisina importarà totas vòstres favorits de Chrome. L'emplaçament del fichièr depend de vòstre sistèma operatiu : <ul><li>Sus Linux, anatz al dorsièr <code>~/.config/chromium/Default/</code></li><li>Sus Windows, deu èsser dins <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>sus OS X, deu èsser dins <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Un còp enlà, copiatz lo fichièr de favorits dins un endrech que volètz.<em><br>Notatz que s'avètz Chromium al lòc de Chrome, vos cal cambiar lo camin segon aquesta situacion.</em></p>"
+        description: "Aquesta aisina importarà totas vòstres favorits de Chrome. L'emplaçament del fichièr depend de vòstre sistèma operatiu : <ul><li>Sus Linux, anatz al dorsièr <code>~/.config/chromium/Default/</code></li><li>Sus Windows, deu èsser dins <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>sus OS X, deu èsser dins <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Un còp enlà, copiatz lo fichièr de favorits dins un endrech que volètz.<em><br>Notatz que s'avètz Chromium al lòc de Chrome, vos cal cambiar lo camin segon aquesta situacion.</em></p>"
         how_to: "Mercés de causir lo fichièr de salvagarda e de clicar sul boton dejós per l'importar. Notatz que lo tractament pòt durar un moment ja que totes los articles an d'èsser recuperats."
     instapaper:
         page_title: 'Importar > Instapaper'
@@ -449,7 +449,7 @@ import:
 
 developer:
     page_title: 'Gestion dels clients API'
-    welcome_message: "Benvenguda sus l'API de wallabag"
+    welcome_message: "Vos desirem la benvenguda sus l'API de wallabag"
     documentation: 'Documentacion'
     how_to_first_app: 'Cossí crear vòstra primièra aplicacion'
     full_documentation: "Veire la documentacion completa de l'API"
@@ -465,7 +465,7 @@ developer:
         field_grant_types: 'Tipe de privilègi acordat'
         no_client: 'Pas cap de client pel moment.'
     remove:
-        warn_message_1: 'Avètz la possibilitat de suprimir un client. Aquesta accion es IRREVERSIBLA !'
+        warn_message_1: 'Avètz la possibilitat de suprimir un client. Aquesta accion es IRREVERSIBLA!'
         warn_message_2: "Se suprimissètz un client, totas las aplicacions que l'emplegan foncionaràn pas mai amb vòstre compte wallabag."
         action: 'Suprimir aqueste client'
     client:
@@ -489,10 +489,10 @@ developer:
         description:
             paragraph_1: "Las comandas seguentas utilizan la <a href=\"https://github.com/jkbrzt/httpie\">bibliotèca HTTPie</a>. Asseguratz-vos que siasqueòu installadas abans de l'utilizar."
             paragraph_2: "Vos cal un geton per escambiar entre vòstra aplicacion e l'API de wallabar."
-            paragraph_3: 'Per crear un geton, vos cal crear <a href=\"%link%\">crear un novèl client</a>.'
-            paragraph_4: 'Ara creatz un geton (remplaçar client_id, client_secret, username e password amb las bonas valors) :'
-            paragraph_5: "L'API vos tornarà una responsa coma aquò :"
-            paragraph_6: "L'access_token deu èsser emplegat per far una requèsta a l'API. Per exemple :"
+            paragraph_3: 'Per crear un geton, vos cal <a href=\"%link%\">crear un novèl client</a>.'
+            paragraph_4: 'Ara creatz un geton (remplaçar client_id, client_secret, username e password amb las bonas valors):'
+            paragraph_5: "L'API vos tornarà una responsa coma aquò:"
+            paragraph_6: "L'access_token deu èsser emplegat per far una requèsta a l'API. Per exemple:"
             paragraph_7: "Aquesta requèsta tornarà totes los articles de l'utilizaire."
             paragraph_8: "Se volètz totas las adreças d'accès de l'API, donatz un còp d’uèlh <a href=\"%link%\">a la documentacion de l'API</a>."
         back: 'Retorn'
@@ -520,7 +520,7 @@ user:
         twofactor_label: 'Autentificacion doble-factor'
         save: 'Enregistrar'
         delete: 'Suprimir'
-        delete_confirm: 'Sètz segur ?'
+        delete_confirm: 'Sètz segur?'
         back_to_list: 'Tornar a la lista'
     search:
         placeholder: "Filtrar per nom d'utilizaire o corrièl"
@@ -542,7 +542,7 @@ site_credential:
         password_label: 'Senhal'
         save: 'Enregistrar'
         delete: 'Suprimir'
-        delete_confirm: 'Sètz segur ?'
+        delete_confirm: 'Sètz segur?'
         back_to_list: 'Tornar a la lista'
 
 error:
@@ -584,7 +584,7 @@ flashes:
             failed: "L'importacion a fracassat, mercés de tornar ensajar."
             failed_on_file: "Error en tractar l'impòrt. Mercés de verificar vòstre fichièr."
             summary: "Rapòrt d'impòrt: %imported% importats, %skipped% ja presents."
-            summary_with_queue: "Rapòrt d'impòrt : %queued% en espèra de tractament."
+            summary_with_queue: "Rapòrt d'impòrt : %queued% en espèra de tractament."
         error:
             redis_enabled_not_installed: "Redis es capable d'importar de manièra asincròna mai sembla que <u>podèm pas nos conectar amb el</u>. Mercés de verificar la configuracion de Redis."
             rabbit_enabled_not_installed: "RabbitMQ es capable d'importar de manièra asincròna mai sembla que <u>podèm pas nos conectar amb el</u>. Mercés de verificar la configuracion de RabbitMQ."
index fb4aa5923b50626310134f4b77181f02099ddcaf..87f00f101359fbca1a67ac3f72d2f34c822884ad 100644 (file)
@@ -1,7 +1,7 @@
 validator:
-    password_must_match: 'Cal que los dos senhals siasquen los meteisses'
+    password_must_match: 'Cal que los dos senhals correspondan'
     password_too_short: 'Lo senhal deu aver almens 8 caractèrs'
     password_wrong_value: 'Vòstre senhal actual es pas bon'
     item_per_page_too_high: "Aquò li agradarà pas a l'aplicacion"
     rss_limit_too_high: "Aquò li agradarà pas a l'aplicacion"
-    # quote_length_too_high: 'The quote is too long. It should have {{ limit }} characters or less.'
+    quote_length_too_high: 'Aquesta citacion es tròpa longa. Cal que faga {{ limit }} caractèrs o mens.'
index 6424df8d3ba710f064bb94f00612f0fc6ae36c94..12cead487af8f21aeff0e071abcff87a67942fec 100644 (file)
@@ -86,7 +86,7 @@
 
     <!-- Export -->
     <aside id="download-form">
-    {% set currentTag = '' %}
+    {% set currentTag = null %}
     {% if tag is defined %}
         {% set currentTag = tag %}
     {% endif %}
index 0c4dc80b6333491cc6b79adf75120a9b28e49b49..9d6fb3f56b77390418d3b289eb799404782c811b 100644 (file)
@@ -57,7 +57,7 @@
 
     <!-- Export -->
     <div id="export" class="side-nav right-aligned">
-    {% set currentTag = '' %}
+    {% set currentTag = null %}
     {% if tag is defined %}
         {% set currentTag = tag.slug %}
     {% endif %}
index cebf8f28645a84c60952692ebcedf9231cf6e0bf..e62ea2bcf58a6a6eba07df3488471b42469145e3 100644 (file)
@@ -6,6 +6,6 @@ auth_code:
         body:
             hello: "Bonjorn %user%,"
             first_para: "Estant qu'avètz activat l'autentificacion en dos temps sus vòstre compte wallabag e que venètz de vos connectar dempuèi un novèl periferic (ordinador, mobil, etc.) vos mandem un còdi per validar la connexion."
-            second_para: "Vaquí lo còdi per dintrar :"
-            support: "S'avètz un problèma de connexion, dobtetz pas a contactar l'assisténcia : "
+            second_para: "Vaquí lo còdi per dintrar : "
+            support: "S'avètz un problèma de connexion, dobtetz pas a contactar l'assisténcia : "
             signature: "La còla de wallabag"
index 2dc08be2e1174a51284e4d8f7593f6b24a4cdd56..f4c8a6304f7477b1907932384793472cb652cc14 100644 (file)
@@ -407,6 +407,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
         $this->assertSame('http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html', $content['url']);
         $this->assertSame(0, $content['is_archived']);
         $this->assertSame(0, $content['is_starred']);
+        $this->assertNull($content['starred_at']);
         $this->assertSame('New title for my article', $content['title']);
         $this->assertSame(1, $content['user_id']);
         $this->assertCount(2, $content['tags']);
@@ -483,6 +484,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
 
     public function testPostArchivedAndStarredEntry()
     {
+        $now = new \DateTime();
         $this->client->request('POST', '/api/entries.json', [
             'url' => 'http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html',
             'archive' => '1',
@@ -497,6 +499,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
         $this->assertSame('http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html', $content['url']);
         $this->assertSame(1, $content['is_archived']);
         $this->assertSame(1, $content['is_starred']);
+        $this->assertGreaterThanOrEqual($now->getTimestamp(), (new \DateTime($content['starred_at']))->getTimestamp());
         $this->assertSame(1, $content['user_id']);
     }
 
@@ -753,6 +756,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
 
     public function testSaveIsStarredAfterPatch()
     {
+        $now = new \DateTime();
         $entry = $this->client->getContainer()
             ->get('doctrine.orm.entity_manager')
             ->getRepository('WallabagCoreBundle:Entry')
@@ -770,6 +774,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
         $content = json_decode($this->client->getResponse()->getContent(), true);
 
         $this->assertSame(1, $content['is_starred']);
+        $this->assertGreaterThanOrEqual($now->getTimestamp(), (new \DateTime($content['starred_at']))->getTimestamp());
     }
 
     public function dataForEntriesExistWithUrl()
index be25a8b5e1c91863947795f799417e248e15b81c..5a973a7e0409988ff306e9ee1848ccf2c1c26a81 100644 (file)
@@ -9,6 +9,7 @@ use Wallabag\CoreBundle\Entity\Tag;
 class TagControllerTest extends WallabagCoreTestCase
 {
     public $tagName = 'opensource';
+    public $caseTagName = 'OpenSource';
 
     public function testList()
     {
@@ -36,7 +37,7 @@ class TagControllerTest extends WallabagCoreTestCase
         $form = $crawler->filter('form[name=tag]')->form();
 
         $data = [
-            'tag[label]' => $this->tagName,
+            'tag[label]' => $this->caseTagName,
         ];
 
         $client->submit($form, $data);
@@ -45,6 +46,7 @@ class TagControllerTest extends WallabagCoreTestCase
         // be sure to reload the entry
         $entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId());
         $this->assertCount(1, $entry->getTags());
+        $this->assertContains($this->tagName, $entry->getTags());
 
         // tag already exists and already assigned
         $client->submit($form, $data);
@@ -80,7 +82,7 @@ class TagControllerTest extends WallabagCoreTestCase
         $form = $crawler->filter('form[name=tag]')->form();
 
         $data = [
-            'tag[label]' => 'foo2, bar2',
+            'tag[label]' => 'foo2, Bar2',
         ];
 
         $client->submit($form, $data);
index c307f96c94be3b61f34752b9033fb0e42546bab5..9bb597664de95e959f21dd1db5e32213cbaf1bb1 100644 (file)
@@ -125,7 +125,7 @@ class PinboardControllerTest extends WallabagCoreTestCase
         $tags = $content->getTags();
         $this->assertContains('foot', $tags, 'It includes the "foot" tag');
         $this->assertContains('varnish', $tags, 'It includes the "varnish" tag');
-        $this->assertContains('PHP', $tags, 'It includes the "PHP" tag');
+        $this->assertContains('php', $tags, 'It includes the "php" tag');
         $this->assertSame(3, count($tags));
 
         $this->assertInstanceOf(\DateTime::class, $content->getCreatedAt());
index 25625c35e0eda6bc8f429c0736fa9d2a64156142..4bc982e0ae977c774b8ab259e7b2fa81f1c76e57 100644 (file)
@@ -125,7 +125,7 @@ class WallabagV1ControllerTest extends WallabagCoreTestCase
 
         $tags = $content->getTags();
         $this->assertContains('foot', $tags, 'It includes the "foot" tag');
-        $this->assertContains('Framabag', $tags, 'It includes the "Framabag" tag');
+        $this->assertContains('framabag', $tags, 'It includes the "framabag" tag');
         $this->assertSame(2, count($tags));
 
         $this->assertInstanceOf(\DateTime::class, $content->getCreatedAt());